@gnapi/cotester 1.2.4 → 1.2.6
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/dist/analyzer.d.ts +5 -0
- package/dist/analyzer.js +7 -2
- package/dist/analyzer.js.map +1 -1
- package/dist/auditLogger.d.ts +46 -0
- package/dist/auditLogger.js +107 -0
- package/dist/auditLogger.js.map +1 -0
- package/dist/checker.d.ts +3 -1
- package/dist/checker.js +1 -0
- package/dist/checker.js.map +1 -1
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -1
- package/dist/configManager.d.ts +27 -0
- package/dist/configManager.js +87 -17
- package/dist/configManager.js.map +1 -1
- package/dist/fileWorker.js +6 -1
- package/dist/fileWorker.js.map +1 -1
- package/dist/frameworkAdapter.d.ts +51 -0
- package/dist/frameworkAdapter.js +77 -0
- package/dist/frameworkAdapter.js.map +1 -0
- package/dist/generator.d.ts +24 -1
- package/dist/generator.js +167 -69
- package/dist/generator.js.map +1 -1
- package/dist/hooksInstaller.d.ts +1 -0
- package/dist/hooksInstaller.js +246 -0
- package/dist/hooksInstaller.js.map +1 -0
- package/dist/importRepairer.d.ts +22 -0
- package/dist/importRepairer.js +226 -0
- package/dist/importRepairer.js.map +1 -0
- package/dist/interfaceShapeResolver.js +8 -3
- package/dist/interfaceShapeResolver.js.map +1 -1
- package/dist/migrator.d.ts +49 -0
- package/dist/migrator.js +335 -0
- package/dist/migrator.js.map +1 -0
- package/dist/mockGenerator.js +25 -1
- package/dist/mockGenerator.js.map +1 -1
- package/dist/reporter.d.ts +10 -0
- package/dist/reporter.js +270 -0
- package/dist/reporter.js.map +1 -0
- package/dist/scenarioEngine.js +4 -1
- package/dist/scenarioEngine.js.map +1 -1
- package/dist/sensitiveValueDetector.d.ts +62 -0
- package/dist/sensitiveValueDetector.js +147 -0
- package/dist/sensitiveValueDetector.js.map +1 -0
- package/dist/sharedMockRegistry.d.ts +27 -0
- package/dist/sharedMockRegistry.js +223 -0
- package/dist/sharedMockRegistry.js.map +1 -0
- package/dist/watcher.js +10 -1
- package/dist/watcher.js.map +1 -1
- package/package.json +1 -1
package/dist/reporter.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.runReport = runReport;
|
|
37
|
+
/**
|
|
38
|
+
* CoTester Coverage Reporter (Feature 15)
|
|
39
|
+
*
|
|
40
|
+
* Reads Istanbul/c8 `coverage/coverage-summary.json`, overlays it with
|
|
41
|
+
* cotester's own function-level tracking (via checker.ts), and outputs
|
|
42
|
+
* a combined report in HTML, JSON, or Markdown format.
|
|
43
|
+
*
|
|
44
|
+
* Usage: cotester report [--format html|json|md] [--coverage <path>] [-o <file>]
|
|
45
|
+
*/
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const checker_1 = require("./checker");
|
|
49
|
+
const configManager_1 = require("./configManager");
|
|
50
|
+
const utils_1 = require("./utils");
|
|
51
|
+
// ── Entry point ───────────────────────────────────────────────────────────────
|
|
52
|
+
function runReport(options) {
|
|
53
|
+
const projectRoot = (0, utils_1.getProjectRoot)();
|
|
54
|
+
const summaryPath = options.coverageSummaryPath ??
|
|
55
|
+
path.join(projectRoot, "coverage", "coverage-summary.json");
|
|
56
|
+
// Load Istanbul summary (optional — report works without it)
|
|
57
|
+
let istanbul = {};
|
|
58
|
+
if (fs.existsSync(summaryPath)) {
|
|
59
|
+
try {
|
|
60
|
+
istanbul = JSON.parse(fs.readFileSync(summaryPath, "utf-8"));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
(0, utils_1.log)(`Warning: could not parse ${path.relative(projectRoot, summaryPath)} — Istanbul metrics omitted.`, "warn");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
(0, utils_1.log)(`Info: ${path.relative(projectRoot, summaryPath)} not found — run your test runner with coverage first for Istanbul metrics.`, "info");
|
|
68
|
+
}
|
|
69
|
+
// Get cotester function-level data
|
|
70
|
+
const config = (0, configManager_1.loadConfig)(projectRoot);
|
|
71
|
+
const baseAbsolute = path.resolve(projectRoot, config.srcDir);
|
|
72
|
+
const scanRoot = options.folder
|
|
73
|
+
? path.resolve(baseAbsolute, options.folder)
|
|
74
|
+
: baseAbsolute;
|
|
75
|
+
const checkResult = (0, checker_1.computeCoverage)(scanRoot, projectRoot, config);
|
|
76
|
+
const rows = buildRows(checkResult, istanbul, projectRoot);
|
|
77
|
+
const content = renderReport(rows, checkResult, options.format, projectRoot);
|
|
78
|
+
if (options.output) {
|
|
79
|
+
const outPath = path.resolve(options.output);
|
|
80
|
+
fs.writeFileSync(outPath, content, "utf-8");
|
|
81
|
+
(0, utils_1.log)(`Report written → ${path.relative(projectRoot, outPath)}`, "success");
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
process.stdout.write(content);
|
|
85
|
+
if (!content.endsWith("\n"))
|
|
86
|
+
process.stdout.write("\n");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ── Build combined rows ───────────────────────────────────────────────────────
|
|
90
|
+
function buildRows(checkResult, istanbul, projectRoot) {
|
|
91
|
+
// Build a lookup: normalised absolute path → Istanbul summary
|
|
92
|
+
const istMap = new Map();
|
|
93
|
+
for (const [key, val] of Object.entries(istanbul)) {
|
|
94
|
+
if (key === "total")
|
|
95
|
+
continue;
|
|
96
|
+
// Istanbul keys are absolute paths on most OS; normalise separators
|
|
97
|
+
istMap.set(path.normalize(key), val);
|
|
98
|
+
}
|
|
99
|
+
return checkResult.fileCoverages.map((fc) => {
|
|
100
|
+
const cotesterPct = fc.totalCount === 0
|
|
101
|
+
? 100
|
|
102
|
+
: Math.round((fc.coveredCount / fc.totalCount) * 100);
|
|
103
|
+
const ist = istMap.get(path.normalize(fc.srcPath));
|
|
104
|
+
return {
|
|
105
|
+
relPath: fc.relPath,
|
|
106
|
+
testExists: fc.testFileExists,
|
|
107
|
+
cotesterPct,
|
|
108
|
+
coveredFns: fc.coveredCount,
|
|
109
|
+
totalFns: fc.totalCount,
|
|
110
|
+
staleCount: fc.staleCount,
|
|
111
|
+
linesPct: ist?.lines.pct,
|
|
112
|
+
branchesPct: ist?.branches.pct,
|
|
113
|
+
fnPct: ist?.functions.pct,
|
|
114
|
+
stmtPct: ist?.statements.pct,
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// ── Renderers ─────────────────────────────────────────────────────────────────
|
|
119
|
+
function renderReport(rows, checkResult, format, projectRoot) {
|
|
120
|
+
switch (format) {
|
|
121
|
+
case "json":
|
|
122
|
+
return renderJson(rows, checkResult);
|
|
123
|
+
case "html":
|
|
124
|
+
return renderHtml(rows, checkResult, projectRoot);
|
|
125
|
+
default:
|
|
126
|
+
return renderMarkdown(rows, checkResult);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ── JSON ──────────────────────────────────────────────────────────────────────
|
|
130
|
+
function renderJson(rows, checkResult) {
|
|
131
|
+
return JSON.stringify({
|
|
132
|
+
summary: {
|
|
133
|
+
totalFunctions: checkResult.totalFunctions,
|
|
134
|
+
coveredFunctions: checkResult.coveredFunctions,
|
|
135
|
+
coveragePercent: checkResult.coveragePercent,
|
|
136
|
+
minCoverage: checkResult.minCoverage,
|
|
137
|
+
passed: checkResult.passed,
|
|
138
|
+
totalStale: checkResult.totalStale,
|
|
139
|
+
},
|
|
140
|
+
files: rows,
|
|
141
|
+
}, null, 2);
|
|
142
|
+
}
|
|
143
|
+
// ── Markdown ──────────────────────────────────────────────────────────────────
|
|
144
|
+
function renderMarkdown(rows, checkResult) {
|
|
145
|
+
const lines = [];
|
|
146
|
+
lines.push("# CoTester Coverage Report");
|
|
147
|
+
lines.push("");
|
|
148
|
+
lines.push(`**Overall function coverage:** ${checkResult.coveragePercent}% (${checkResult.coveredFunctions}/${checkResult.totalFunctions})`);
|
|
149
|
+
lines.push(`**Status:** ${checkResult.passed ? "PASS" : "FAIL"} (threshold: ${checkResult.minCoverage}%)`);
|
|
150
|
+
if (checkResult.totalStale > 0) {
|
|
151
|
+
lines.push(`**Stale tests:** ${checkResult.totalStale} function(s) with changed signatures`);
|
|
152
|
+
}
|
|
153
|
+
lines.push("");
|
|
154
|
+
lines.push("| File | CoTester% | Covered/Total | Stale | Lines% | Branches% | Fns% | Stmts% |");
|
|
155
|
+
lines.push("|------|-----------|--------------|-------|--------|-----------|------|--------|");
|
|
156
|
+
for (const r of rows) {
|
|
157
|
+
const testIcon = r.testExists ? "✔" : "✖";
|
|
158
|
+
const stale = r.staleCount > 0 ? `⚠ ${r.staleCount}` : "-";
|
|
159
|
+
const fmtPct = (v) => (v !== undefined ? `${v}%` : "—");
|
|
160
|
+
lines.push(`| ${r.relPath} ${testIcon} | ${r.cotesterPct}% | ${r.coveredFns}/${r.totalFns} | ${stale} | ${fmtPct(r.linesPct)} | ${fmtPct(r.branchesPct)} | ${fmtPct(r.fnPct)} | ${fmtPct(r.stmtPct)} |`);
|
|
161
|
+
}
|
|
162
|
+
lines.push("");
|
|
163
|
+
return lines.join("\n");
|
|
164
|
+
}
|
|
165
|
+
// ── HTML ──────────────────────────────────────────────────────────────────────
|
|
166
|
+
function pctColor(pct) {
|
|
167
|
+
if (pct >= 80)
|
|
168
|
+
return "#22c55e"; // green
|
|
169
|
+
if (pct >= 50)
|
|
170
|
+
return "#f59e0b"; // amber
|
|
171
|
+
return "#ef4444"; // red
|
|
172
|
+
}
|
|
173
|
+
function fmtPct(v) {
|
|
174
|
+
return v !== undefined ? `${v}%` : "—";
|
|
175
|
+
}
|
|
176
|
+
function renderHtml(rows, checkResult, projectRoot) {
|
|
177
|
+
const passColor = checkResult.passed ? "#22c55e" : "#ef4444";
|
|
178
|
+
const passLabel = checkResult.passed ? "PASS" : "FAIL";
|
|
179
|
+
const generatedAt = new Date().toISOString();
|
|
180
|
+
const rowHtml = rows
|
|
181
|
+
.map((r) => {
|
|
182
|
+
const testBadge = r.testExists
|
|
183
|
+
? `<span style="color:#22c55e">✔</span>`
|
|
184
|
+
: `<span style="color:#ef4444">✖</span>`;
|
|
185
|
+
const staleBadge = r.staleCount > 0
|
|
186
|
+
? `<span style="color:#f59e0b">⚠ ${r.staleCount}</span>`
|
|
187
|
+
: `<span style="color:#6b7280">—</span>`;
|
|
188
|
+
const ctPct = r.cotesterPct;
|
|
189
|
+
return `
|
|
190
|
+
<tr>
|
|
191
|
+
<td style="max-width:360px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${r.relPath}">${r.relPath} ${testBadge}</td>
|
|
192
|
+
<td style="color:${pctColor(ctPct)};font-weight:600;text-align:center">${ctPct}%</td>
|
|
193
|
+
<td style="text-align:center">${r.coveredFns}/${r.totalFns}</td>
|
|
194
|
+
<td style="text-align:center">${staleBadge}</td>
|
|
195
|
+
<td style="text-align:center;color:${r.linesPct !== undefined ? pctColor(r.linesPct) : "#6b7280"}">${fmtPct(r.linesPct)}</td>
|
|
196
|
+
<td style="text-align:center;color:${r.branchesPct !== undefined ? pctColor(r.branchesPct) : "#6b7280"}">${fmtPct(r.branchesPct)}</td>
|
|
197
|
+
<td style="text-align:center;color:${r.fnPct !== undefined ? pctColor(r.fnPct) : "#6b7280"}">${fmtPct(r.fnPct)}</td>
|
|
198
|
+
<td style="text-align:center;color:${r.stmtPct !== undefined ? pctColor(r.stmtPct) : "#6b7280"}">${fmtPct(r.stmtPct)}</td>
|
|
199
|
+
</tr>`;
|
|
200
|
+
})
|
|
201
|
+
.join("");
|
|
202
|
+
return `<!DOCTYPE html>
|
|
203
|
+
<html lang="en">
|
|
204
|
+
<head>
|
|
205
|
+
<meta charset="UTF-8" />
|
|
206
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
207
|
+
<title>CoTester Coverage Report</title>
|
|
208
|
+
<style>
|
|
209
|
+
body { font-family: system-ui, sans-serif; background: #0f172a; color: #e2e8f0; margin: 0; padding: 2rem; }
|
|
210
|
+
h1 { color: #f8fafc; margin-bottom: 0.5rem; }
|
|
211
|
+
.meta { color: #94a3b8; font-size: 0.875rem; margin-bottom: 1.5rem; }
|
|
212
|
+
.summary { display: flex; gap: 1.5rem; margin-bottom: 2rem; flex-wrap: wrap; }
|
|
213
|
+
.card { background: #1e293b; border-radius: 0.75rem; padding: 1rem 1.5rem; min-width: 160px; }
|
|
214
|
+
.card-label { font-size: 0.75rem; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; }
|
|
215
|
+
.card-value { font-size: 1.75rem; font-weight: 700; margin-top: 0.25rem; }
|
|
216
|
+
table { width: 100%; border-collapse: collapse; background: #1e293b; border-radius: 0.75rem; overflow: hidden; }
|
|
217
|
+
th { background: #0f172a; padding: 0.75rem 1rem; text-align: left; font-size: 0.75rem; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; }
|
|
218
|
+
td { padding: 0.625rem 1rem; border-top: 1px solid #0f172a; font-size: 0.875rem; }
|
|
219
|
+
tr:hover td { background: #263548; }
|
|
220
|
+
</style>
|
|
221
|
+
</head>
|
|
222
|
+
<body>
|
|
223
|
+
<h1>CoTester Coverage Report</h1>
|
|
224
|
+
<p class="meta">Generated at ${generatedAt} — project root: ${projectRoot.replace(/\\/g, "/")}</p>
|
|
225
|
+
|
|
226
|
+
<div class="summary">
|
|
227
|
+
<div class="card">
|
|
228
|
+
<div class="card-label">Function Coverage</div>
|
|
229
|
+
<div class="card-value" style="color:${pctColor(checkResult.coveragePercent)}">${checkResult.coveragePercent}%</div>
|
|
230
|
+
</div>
|
|
231
|
+
<div class="card">
|
|
232
|
+
<div class="card-label">Covered / Total</div>
|
|
233
|
+
<div class="card-value">${checkResult.coveredFunctions} / ${checkResult.totalFunctions}</div>
|
|
234
|
+
</div>
|
|
235
|
+
<div class="card">
|
|
236
|
+
<div class="card-label">Status</div>
|
|
237
|
+
<div class="card-value" style="color:${passColor}">${passLabel}</div>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="card">
|
|
240
|
+
<div class="card-label">Threshold</div>
|
|
241
|
+
<div class="card-value">${checkResult.minCoverage}%</div>
|
|
242
|
+
</div>
|
|
243
|
+
${checkResult.totalStale > 0 ? `
|
|
244
|
+
<div class="card">
|
|
245
|
+
<div class="card-label">Stale Tests</div>
|
|
246
|
+
<div class="card-value" style="color:#f59e0b">${checkResult.totalStale}</div>
|
|
247
|
+
</div>` : ""}
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
<table>
|
|
251
|
+
<thead>
|
|
252
|
+
<tr>
|
|
253
|
+
<th>File</th>
|
|
254
|
+
<th>CoTester%</th>
|
|
255
|
+
<th>Covered/Total</th>
|
|
256
|
+
<th>Stale</th>
|
|
257
|
+
<th>Lines%</th>
|
|
258
|
+
<th>Branches%</th>
|
|
259
|
+
<th>Fns%</th>
|
|
260
|
+
<th>Stmts%</th>
|
|
261
|
+
</tr>
|
|
262
|
+
</thead>
|
|
263
|
+
<tbody>${rowHtml}
|
|
264
|
+
</tbody>
|
|
265
|
+
</table>
|
|
266
|
+
</body>
|
|
267
|
+
</html>
|
|
268
|
+
`;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/scenarioEngine.js
CHANGED
|
@@ -144,7 +144,10 @@ function buildCases(fn, config, projectRoot) {
|
|
|
144
144
|
label: trueLabel,
|
|
145
145
|
argLiterals: fallbackArgs,
|
|
146
146
|
paramNames,
|
|
147
|
-
|
|
147
|
+
// Async functions must use "rejects" for throw-path guards, not "throws"
|
|
148
|
+
kind: branch.kind === "guard"
|
|
149
|
+
? (fn.throwsErrors ? (fn.isAsync ? "rejects" : "throws") : "standard")
|
|
150
|
+
: "standard",
|
|
148
151
|
});
|
|
149
152
|
}
|
|
150
153
|
// False-path scenario
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenarioEngine.js","sourceRoot":"","sources":["../src/scenarioEngine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scenarioEngine.js","sourceRoot":"","sources":["../src/scenarioEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sensitive Value Detector (Security)
|
|
3
|
+
*
|
|
4
|
+
* Scans string literals that are about to be written into generated mock files
|
|
5
|
+
* and replaces any that match known credential/secret patterns with the safe
|
|
6
|
+
* placeholder `'REDACTED_FOR_TESTS'`.
|
|
7
|
+
*
|
|
8
|
+
* Covers:
|
|
9
|
+
* • JWT tokens (three base64url segments with realistic lengths)
|
|
10
|
+
* • OpenAI / Anthropic / generic sk- prefixed keys
|
|
11
|
+
* • Stripe live/test keys (pk_live_, sk_live_, pk_test_, sk_test_)
|
|
12
|
+
* • AWS access key IDs (AKIA…)
|
|
13
|
+
* • Google API keys (AIza…)
|
|
14
|
+
* • GitHub personal access tokens (ghp_, ghs_)
|
|
15
|
+
* • PEM private-key headers
|
|
16
|
+
* • Database connection strings that embed a password (scheme://user:pass@)
|
|
17
|
+
* • High-entropy hex blobs (≥ 32 hex chars)
|
|
18
|
+
*
|
|
19
|
+
* Design decisions:
|
|
20
|
+
* - All patterns require a minimum length to avoid false positives on
|
|
21
|
+
* short/obviously-fake values used in unit-test fixtures.
|
|
22
|
+
* - The JWT pattern requires a signature segment of ≥ 20 chars so the
|
|
23
|
+
* intentionally short placeholder in mockDataEngine is NOT redacted.
|
|
24
|
+
* - Detection is case-sensitive where real credentials always match a
|
|
25
|
+
* fixed casing (AWS, JWT headers), case-insensitive for word patterns.
|
|
26
|
+
*/
|
|
27
|
+
/** The safe placeholder substituted for any detected sensitive value. */
|
|
28
|
+
export declare const REDACTED_PLACEHOLDER = "'REDACTED_FOR_TESTS'";
|
|
29
|
+
/**
|
|
30
|
+
* Check whether a raw string value (no surrounding quotes) matches any
|
|
31
|
+
* sensitive pattern.
|
|
32
|
+
*
|
|
33
|
+
* @returns The matched pattern name, or `null` when the value is clean.
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectSensitiveValue(rawValue: string): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Sanitize a TypeScript **string literal** (including its surrounding single
|
|
38
|
+
* or double quotes) that is about to be written into a mock file.
|
|
39
|
+
*
|
|
40
|
+
* - If the extracted value matches a sensitive pattern → returns
|
|
41
|
+
* `'REDACTED_FOR_TESTS'` and logs a security warning.
|
|
42
|
+
* - Otherwise → returns the original literal unchanged.
|
|
43
|
+
*
|
|
44
|
+
* Non-string literals (numbers, booleans, object literals, `null`, etc.) are
|
|
45
|
+
* returned unchanged — they cannot carry credential strings.
|
|
46
|
+
*
|
|
47
|
+
* @param literal The TypeScript source literal, e.g. `'sk-live-abc123'`
|
|
48
|
+
* @param context Optional description of where the literal came from
|
|
49
|
+
* (used only in the warning message).
|
|
50
|
+
*/
|
|
51
|
+
export declare function sanitizeLiteral(literal: string, context?: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Sanitize a **raw string value** (without surrounding quotes) that is about
|
|
54
|
+
* to be embedded inside a larger generated literal (e.g. an object property).
|
|
55
|
+
*
|
|
56
|
+
* - If sensitive → returns the string `REDACTED_FOR_TESTS` (no quotes).
|
|
57
|
+
* - Otherwise → returns the original value unchanged.
|
|
58
|
+
*
|
|
59
|
+
* @param rawValue The bare string value, e.g. `sk-live-abc123`
|
|
60
|
+
* @param context Optional description for the warning message.
|
|
61
|
+
*/
|
|
62
|
+
export declare function sanitizeRawValue(rawValue: string, context?: string): string;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sensitive Value Detector (Security)
|
|
4
|
+
*
|
|
5
|
+
* Scans string literals that are about to be written into generated mock files
|
|
6
|
+
* and replaces any that match known credential/secret patterns with the safe
|
|
7
|
+
* placeholder `'REDACTED_FOR_TESTS'`.
|
|
8
|
+
*
|
|
9
|
+
* Covers:
|
|
10
|
+
* • JWT tokens (three base64url segments with realistic lengths)
|
|
11
|
+
* • OpenAI / Anthropic / generic sk- prefixed keys
|
|
12
|
+
* • Stripe live/test keys (pk_live_, sk_live_, pk_test_, sk_test_)
|
|
13
|
+
* • AWS access key IDs (AKIA…)
|
|
14
|
+
* • Google API keys (AIza…)
|
|
15
|
+
* • GitHub personal access tokens (ghp_, ghs_)
|
|
16
|
+
* • PEM private-key headers
|
|
17
|
+
* • Database connection strings that embed a password (scheme://user:pass@)
|
|
18
|
+
* • High-entropy hex blobs (≥ 32 hex chars)
|
|
19
|
+
*
|
|
20
|
+
* Design decisions:
|
|
21
|
+
* - All patterns require a minimum length to avoid false positives on
|
|
22
|
+
* short/obviously-fake values used in unit-test fixtures.
|
|
23
|
+
* - The JWT pattern requires a signature segment of ≥ 20 chars so the
|
|
24
|
+
* intentionally short placeholder in mockDataEngine is NOT redacted.
|
|
25
|
+
* - Detection is case-sensitive where real credentials always match a
|
|
26
|
+
* fixed casing (AWS, JWT headers), case-insensitive for word patterns.
|
|
27
|
+
*/
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.REDACTED_PLACEHOLDER = void 0;
|
|
30
|
+
exports.detectSensitiveValue = detectSensitiveValue;
|
|
31
|
+
exports.sanitizeLiteral = sanitizeLiteral;
|
|
32
|
+
exports.sanitizeRawValue = sanitizeRawValue;
|
|
33
|
+
const utils_1 = require("./utils");
|
|
34
|
+
const SENSITIVE_PATTERNS = [
|
|
35
|
+
// JWT — header.payload.signature (all three segments must be non-trivial)
|
|
36
|
+
{
|
|
37
|
+
name: "JWT",
|
|
38
|
+
pattern: /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{20,}/,
|
|
39
|
+
},
|
|
40
|
+
// OpenAI / Anthropic / generic sk- keys (supports sk-XXXX and sk-proj-XXXX formats)
|
|
41
|
+
{
|
|
42
|
+
name: "API key (sk- prefix)",
|
|
43
|
+
pattern: /\bsk-[A-Za-z0-9_-]{15,}\b/,
|
|
44
|
+
},
|
|
45
|
+
// Stripe-style keys
|
|
46
|
+
{
|
|
47
|
+
name: "Stripe API key",
|
|
48
|
+
pattern: /\b(?:pk_live|sk_live|pk_test|sk_test)_[A-Za-z0-9]{20,}\b/,
|
|
49
|
+
},
|
|
50
|
+
// AWS Access Key ID
|
|
51
|
+
{
|
|
52
|
+
name: "AWS access key ID",
|
|
53
|
+
pattern: /\bAKIA[0-9A-Z]{16}\b/,
|
|
54
|
+
},
|
|
55
|
+
// Google API key
|
|
56
|
+
{
|
|
57
|
+
name: "Google API key",
|
|
58
|
+
pattern: /\bAIza[0-9A-Za-z_-]{35}\b/,
|
|
59
|
+
},
|
|
60
|
+
// GitHub personal / server / actions tokens (ghp_, ghs_, gha_, ghr_)
|
|
61
|
+
{
|
|
62
|
+
name: "GitHub token",
|
|
63
|
+
pattern: /\bgh[psar]_[A-Za-z0-9]{30,}\b/,
|
|
64
|
+
},
|
|
65
|
+
// PEM private key block header
|
|
66
|
+
{
|
|
67
|
+
name: "PEM private key header",
|
|
68
|
+
pattern: /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,
|
|
69
|
+
},
|
|
70
|
+
// Database URLs with embedded credentials: scheme://user:pass@host
|
|
71
|
+
{
|
|
72
|
+
name: "database URL with credentials",
|
|
73
|
+
pattern: /(?:mongodb|postgres(?:ql)?|mysql|redis|mariadb):\/\/[^:/?#\s]+:[^@\s]{4,}@/i,
|
|
74
|
+
},
|
|
75
|
+
// High-entropy hex blobs (≥ 32 consecutive hex chars — typical of secrets/hashes)
|
|
76
|
+
{
|
|
77
|
+
name: "high-entropy hex string",
|
|
78
|
+
pattern: /\b[0-9a-f]{32,}\b/i,
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
82
|
+
/** The safe placeholder substituted for any detected sensitive value. */
|
|
83
|
+
exports.REDACTED_PLACEHOLDER = "'REDACTED_FOR_TESTS'";
|
|
84
|
+
/**
|
|
85
|
+
* Check whether a raw string value (no surrounding quotes) matches any
|
|
86
|
+
* sensitive pattern.
|
|
87
|
+
*
|
|
88
|
+
* @returns The matched pattern name, or `null` when the value is clean.
|
|
89
|
+
*/
|
|
90
|
+
function detectSensitiveValue(rawValue) {
|
|
91
|
+
for (const { name, pattern } of SENSITIVE_PATTERNS) {
|
|
92
|
+
if (pattern.test(rawValue))
|
|
93
|
+
return name;
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Sanitize a TypeScript **string literal** (including its surrounding single
|
|
99
|
+
* or double quotes) that is about to be written into a mock file.
|
|
100
|
+
*
|
|
101
|
+
* - If the extracted value matches a sensitive pattern → returns
|
|
102
|
+
* `'REDACTED_FOR_TESTS'` and logs a security warning.
|
|
103
|
+
* - Otherwise → returns the original literal unchanged.
|
|
104
|
+
*
|
|
105
|
+
* Non-string literals (numbers, booleans, object literals, `null`, etc.) are
|
|
106
|
+
* returned unchanged — they cannot carry credential strings.
|
|
107
|
+
*
|
|
108
|
+
* @param literal The TypeScript source literal, e.g. `'sk-live-abc123'`
|
|
109
|
+
* @param context Optional description of where the literal came from
|
|
110
|
+
* (used only in the warning message).
|
|
111
|
+
*/
|
|
112
|
+
function sanitizeLiteral(literal, context) {
|
|
113
|
+
// Only process string literals — must start with ' or "
|
|
114
|
+
const trimmed = literal.trim();
|
|
115
|
+
if (!trimmed.startsWith("'") && !trimmed.startsWith('"')) {
|
|
116
|
+
return literal;
|
|
117
|
+
}
|
|
118
|
+
// Extract raw value by stripping outer quotes
|
|
119
|
+
const rawValue = trimmed.slice(1, trimmed.length - 1);
|
|
120
|
+
const matched = detectSensitiveValue(rawValue);
|
|
121
|
+
if (matched) {
|
|
122
|
+
const where = context ? ` (from ${context})` : "";
|
|
123
|
+
(0, utils_1.log)(` ⚠ Security: sensitive value matching "${matched}" detected${where} — replaced with REDACTED_FOR_TESTS`, "warn");
|
|
124
|
+
return exports.REDACTED_PLACEHOLDER;
|
|
125
|
+
}
|
|
126
|
+
return literal;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Sanitize a **raw string value** (without surrounding quotes) that is about
|
|
130
|
+
* to be embedded inside a larger generated literal (e.g. an object property).
|
|
131
|
+
*
|
|
132
|
+
* - If sensitive → returns the string `REDACTED_FOR_TESTS` (no quotes).
|
|
133
|
+
* - Otherwise → returns the original value unchanged.
|
|
134
|
+
*
|
|
135
|
+
* @param rawValue The bare string value, e.g. `sk-live-abc123`
|
|
136
|
+
* @param context Optional description for the warning message.
|
|
137
|
+
*/
|
|
138
|
+
function sanitizeRawValue(rawValue, context) {
|
|
139
|
+
const matched = detectSensitiveValue(rawValue);
|
|
140
|
+
if (matched) {
|
|
141
|
+
const where = context ? ` (from ${context})` : "";
|
|
142
|
+
(0, utils_1.log)(` ⚠ Security: sensitive value matching "${matched}" detected${where} — replaced with REDACTED_FOR_TESTS`, "warn");
|
|
143
|
+
return "REDACTED_FOR_TESTS";
|
|
144
|
+
}
|
|
145
|
+
return rawValue;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=sensitiveValueDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensitiveValueDetector.js","sourceRoot":"","sources":["../src/sensitiveValueDetector.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAwEH,oDAKC;AAiBD,0CAqBC;AAYD,4CAWC;AAxID,mCAA8B;AAW9B,MAAM,kBAAkB,GAAuB;IAC3C,0EAA0E;IAC1E;QACI,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,+DAA+D;KAC3E;IACD,oFAAoF;IACpF;QACI,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,2BAA2B;KACvC;IACD,oBAAoB;IACpB;QACI,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,0DAA0D;KACtE;IACD,oBAAoB;IACpB;QACI,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,sBAAsB;KAClC;IACD,iBAAiB;IACjB;QACI,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,2BAA2B;KACvC;IACD,qEAAqE;IACrE;QACI,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,+BAA+B;KAC3C;IACD,+BAA+B;IAC/B;QACI,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,wDAAwD;KACpE;IACD,mEAAmE;IACnE;QACI,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,6EAA6E;KACzF;IACD,kFAAkF;IAClF;QACI,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,oBAAoB;KAChC;CACJ,CAAC;AAEF,iFAAiF;AAEjF,yEAAyE;AAC5D,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,QAAgB;IACjD,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,kBAAkB,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,eAAe,CAAC,OAAe,EAAE,OAAgB;IAC7D,wDAAwD;IACxD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,IAAA,WAAG,EACC,2CAA2C,OAAO,aAAa,KAAK,qCAAqC,EACzG,MAAM,CACT,CAAC;QACF,OAAO,4BAAoB,CAAC;IAChC,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,OAAgB;IAC/D,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,IAAA,WAAG,EACC,2CAA2C,OAAO,aAAa,KAAK,qCAAqC,EACzG,MAAM,CACT,CAAC;QACF,OAAO,oBAAoB,CAAC;IAChC,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TestScenario } from "./scenarioEngine";
|
|
2
|
+
export interface RegistryUpdateResult {
|
|
3
|
+
/** Absolute path to the shared registry file */
|
|
4
|
+
registryPath: string;
|
|
5
|
+
/** Map: typeName → factory function name, e.g. "User" → "mockUser" */
|
|
6
|
+
factories: Map<string, string>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Collect all custom (non-primitive) parameter types from the given scenarios,
|
|
10
|
+
* ensure each one has an entry in the shared registry file, and return the
|
|
11
|
+
* registry path + factory name map so `generateMockFile` can import them.
|
|
12
|
+
*
|
|
13
|
+
* @param scenarios All scenarios for the current file being processed.
|
|
14
|
+
* @param projectRoot Absolute project root.
|
|
15
|
+
* @param mockDir Mock directory relative to projectRoot (e.g. "cotester/mocks").
|
|
16
|
+
* @param dryRun When true, nothing is written to disk.
|
|
17
|
+
* @param srcFilePath Source file path used for AST-based interface resolution.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureSharedRegistry(scenarios: TestScenario[], projectRoot: string, mockDir: string, dryRun?: boolean, srcFilePath?: string): RegistryUpdateResult | null;
|
|
20
|
+
/**
|
|
21
|
+
* Compute the relative import path from an individual mock file to the
|
|
22
|
+
* shared registry.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getRegistryImportPath(fromMockFilePath: string, registryPath: string): string;
|
|
25
|
+
export declare function extractBaseTypeName(typeStr: string): string;
|
|
26
|
+
export declare function isCustomTypeName(typeName: string): boolean;
|
|
27
|
+
export declare function buildFactoryName(typeName: string): string;
|