@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.
Files changed (49) hide show
  1. package/dist/analyzer.d.ts +5 -0
  2. package/dist/analyzer.js +7 -2
  3. package/dist/analyzer.js.map +1 -1
  4. package/dist/auditLogger.d.ts +46 -0
  5. package/dist/auditLogger.js +107 -0
  6. package/dist/auditLogger.js.map +1 -0
  7. package/dist/checker.d.ts +3 -1
  8. package/dist/checker.js +1 -0
  9. package/dist/checker.js.map +1 -1
  10. package/dist/cli.js +39 -0
  11. package/dist/cli.js.map +1 -1
  12. package/dist/configManager.d.ts +27 -0
  13. package/dist/configManager.js +87 -17
  14. package/dist/configManager.js.map +1 -1
  15. package/dist/fileWorker.js +6 -1
  16. package/dist/fileWorker.js.map +1 -1
  17. package/dist/frameworkAdapter.d.ts +51 -0
  18. package/dist/frameworkAdapter.js +77 -0
  19. package/dist/frameworkAdapter.js.map +1 -0
  20. package/dist/generator.d.ts +24 -1
  21. package/dist/generator.js +167 -69
  22. package/dist/generator.js.map +1 -1
  23. package/dist/hooksInstaller.d.ts +1 -0
  24. package/dist/hooksInstaller.js +246 -0
  25. package/dist/hooksInstaller.js.map +1 -0
  26. package/dist/importRepairer.d.ts +22 -0
  27. package/dist/importRepairer.js +226 -0
  28. package/dist/importRepairer.js.map +1 -0
  29. package/dist/interfaceShapeResolver.js +8 -3
  30. package/dist/interfaceShapeResolver.js.map +1 -1
  31. package/dist/migrator.d.ts +49 -0
  32. package/dist/migrator.js +335 -0
  33. package/dist/migrator.js.map +1 -0
  34. package/dist/mockGenerator.js +25 -1
  35. package/dist/mockGenerator.js.map +1 -1
  36. package/dist/reporter.d.ts +10 -0
  37. package/dist/reporter.js +270 -0
  38. package/dist/reporter.js.map +1 -0
  39. package/dist/scenarioEngine.js +4 -1
  40. package/dist/scenarioEngine.js.map +1 -1
  41. package/dist/sensitiveValueDetector.d.ts +62 -0
  42. package/dist/sensitiveValueDetector.js +147 -0
  43. package/dist/sensitiveValueDetector.js.map +1 -0
  44. package/dist/sharedMockRegistry.d.ts +27 -0
  45. package/dist/sharedMockRegistry.js +223 -0
  46. package/dist/sharedMockRegistry.js.map +1 -0
  47. package/dist/watcher.js +10 -1
  48. package/dist/watcher.js.map +1 -1
  49. package/package.json +1 -1
@@ -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} &mdash; 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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"}
@@ -144,7 +144,10 @@ function buildCases(fn, config, projectRoot) {
144
144
  label: trueLabel,
145
145
  argLiterals: fallbackArgs,
146
146
  paramNames,
147
- kind: branch.kind === "guard" ? (fn.throwsErrors ? "throws" : "standard") : "standard",
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":";;AAgDA,8CAyBC;AAvED,mDAAsF;AAwCtF;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC7B,SAAyB,EACzB,MAAqB,EACrB,WAAoB;IAEpB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAClD,OAAO;YACH,YAAY,EAAE,EAAE,CAAC,IAAI;YACrB,SAAS,EAAE,EAAE,CAAC,SAAS;YACvB,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtE,UAAU,EAAE,EAAE,CAAC,UAAU;YACzB,KAAK;YACL,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,iBAAiB,EAAE,EAAE,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjD,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;aACf,CAAC,CAAC;YACH,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ;SACxB,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,UAAU,CAAC,EAAgB,EAAE,MAAqB,EAAE,WAAoB;IAC7E,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,uEAAuE;IACvE,MAAM,QAAQ,GAAiB,IAAA,gCAAgB,EAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAE/F,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC;gBACP,KAAK,EAAE,EAAE,CAAC,aAAa;gBACvB,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1C,UAAU;gBACV,IAAI,EAAE,UAAU;aACnB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,MAAM,WAAW,GAAG,IAAA,qCAAqB,EAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACzD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,KAAK,CAAC,IAAI,CAAC;gBACP,KAAK;gBACL,WAAW,EAAE,YAAY;gBACzB,UAAU;gBACV,IAAI,EAAE,UAAU;aACnB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACb,iDAAiD;YACjD,MAAM,KAAK,GAAG,0BAA0B,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChB,kEAAkE;gBAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACjC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC1D,CAAC,CAAC,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACP,KAAK;oBACL,WAAW,EAAE,SAAS;oBACtB,UAAU;oBACV,IAAI,EAAE,SAAS;iBAClB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,8CAA8C;YAC9C,MAAM,KAAK,GAAG,yBAAyB,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChB,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACjC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;oBAC1D,CAAC,CAAC,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACP,KAAK;oBACL,WAAW,EAAE,SAAS;oBACtB,UAAU;oBACV,IAAI,EAAE,QAAQ;iBACjB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;SAAM,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACpB,sEAAsE;QACtE,MAAM,KAAK,GAAG,8BAA8B,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACpC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC;gBACP,KAAK;gBACL,WAAW,EAAE,YAAY;gBACzB,UAAU;gBACV,IAAI,EAAE,SAAS;aAClB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,kCAAkC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACpC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;gBACxC,CAAC,CAAC,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC;gBACP,KAAK;gBACL,WAAW,EAAE,YAAY;gBACzB,UAAU;gBACV,IAAI,EAAE,UAAU;aACnB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC/B,qBAAqB;YACrB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACpB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACpC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;oBACxC,CAAC,CAAC,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACP,KAAK,EAAE,SAAS;oBAChB,WAAW,EAAE,YAAY;oBACzB,UAAU;oBACV,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU;iBACzF,CAAC,CAAC;YACP,CAAC;YAED,sBAAsB;YACtB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACrB,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACpC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;oBACvE,CAAC,CAAC,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC;oBACP,KAAK,EAAE,UAAU;oBACjB,WAAW,EAAE,YAAY;oBACzB,UAAU;oBACV,IAAI,EAAE,UAAU;iBACnB,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,EAAE;YACd,IAAI,EAAE,UAAU;SACnB,CAAC,CAAC;IACP,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"}
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;