@gnapi/cotester 1.2.5 → 1.2.7
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 +4 -0
- package/dist/analyzer.js +4 -0
- 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 +11 -0
- package/dist/checker.js +32 -0
- package/dist/checker.js.map +1 -1
- package/dist/cli.js +22 -3
- package/dist/cli.js.map +1 -1
- package/dist/configManager.d.ts +16 -0
- package/dist/configManager.js +84 -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 +8 -0
- package/dist/frameworkAdapter.js +13 -1
- package/dist/frameworkAdapter.js.map +1 -1
- package/dist/generator.d.ts +24 -1
- package/dist/generator.js +161 -36
- package/dist/generator.js.map +1 -1
- 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/mockDataEngine.js +128 -0
- package/dist/mockDataEngine.js.map +1 -1
- package/dist/mockGenerator.js +3 -1
- package/dist/mockGenerator.js.map +1 -1
- package/dist/reporter.d.ts +1 -1
- package/dist/reporter.js +84 -0
- package/dist/reporter.js.map +1 -1
- package/dist/scenarioEngine.d.ts +3 -0
- package/dist/scenarioEngine.js +70 -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/validator.d.ts +25 -0
- package/dist/validator.js +150 -0
- package/dist/validator.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
CHANGED
|
@@ -122,6 +122,10 @@ function renderReport(rows, checkResult, format, projectRoot) {
|
|
|
122
122
|
return renderJson(rows, checkResult);
|
|
123
123
|
case "html":
|
|
124
124
|
return renderHtml(rows, checkResult, projectRoot);
|
|
125
|
+
case "junit":
|
|
126
|
+
return renderJunit(rows, checkResult);
|
|
127
|
+
case "lcov":
|
|
128
|
+
return renderLcov(rows);
|
|
125
129
|
default:
|
|
126
130
|
return renderMarkdown(rows, checkResult);
|
|
127
131
|
}
|
|
@@ -267,4 +271,84 @@ function renderHtml(rows, checkResult, projectRoot) {
|
|
|
267
271
|
</html>
|
|
268
272
|
`;
|
|
269
273
|
}
|
|
274
|
+
// ── JUnit XML ─────────────────────────────────────────────────────────────────
|
|
275
|
+
/**
|
|
276
|
+
* Render a JUnit XML report consumable by Jenkins, GitLab CI, Azure Pipelines,
|
|
277
|
+
* and GitHub Actions test-reporter integrations.
|
|
278
|
+
*
|
|
279
|
+
* Structure: one <testsuite> per source file, one <testcase> per function.
|
|
280
|
+
* Uncovered functions are emitted as <testcase> with a <failure> child.
|
|
281
|
+
*/
|
|
282
|
+
function renderJunit(rows, checkResult) {
|
|
283
|
+
const lines = [];
|
|
284
|
+
lines.push(`<?xml version="1.0" encoding="UTF-8"?>`);
|
|
285
|
+
lines.push(`<testsuites name="CoTester Coverage" tests="${checkResult.totalFunctions}" ` +
|
|
286
|
+
`failures="${checkResult.totalFunctions - checkResult.coveredFunctions}" ` +
|
|
287
|
+
`timestamp="${new Date().toISOString()}">`);
|
|
288
|
+
for (const row of rows) {
|
|
289
|
+
const uncovered = row.totalFns - row.coveredFns;
|
|
290
|
+
lines.push(` <testsuite name="${escapeXml(row.relPath)}" ` +
|
|
291
|
+
`tests="${row.totalFns}" failures="${uncovered}" ` +
|
|
292
|
+
`skipped="${row.staleCount}">`);
|
|
293
|
+
if (row.coveredFns > 0) {
|
|
294
|
+
lines.push(` <testcase name="covered functions (${row.coveredFns}/${row.totalFns})" ` +
|
|
295
|
+
`classname="${escapeXml(row.relPath)}"/>`);
|
|
296
|
+
}
|
|
297
|
+
if (uncovered > 0) {
|
|
298
|
+
lines.push(` <testcase name="uncovered functions (${uncovered}/${row.totalFns})" ` +
|
|
299
|
+
`classname="${escapeXml(row.relPath)}">`);
|
|
300
|
+
lines.push(` <failure message="${uncovered} function(s) in ${escapeXml(row.relPath)} have no generated test describe block" ` +
|
|
301
|
+
`type="MissingTestCoverage"/>`);
|
|
302
|
+
lines.push(` </testcase>`);
|
|
303
|
+
}
|
|
304
|
+
if (row.staleCount > 0) {
|
|
305
|
+
lines.push(` <testcase name="stale tests (${row.staleCount})" ` +
|
|
306
|
+
`classname="${escapeXml(row.relPath)}">`);
|
|
307
|
+
lines.push(` <skipped message="${row.staleCount} function(s) have stale @testgen-sig signatures — rerun cotester generate"/>`);
|
|
308
|
+
lines.push(` </testcase>`);
|
|
309
|
+
}
|
|
310
|
+
lines.push(` </testsuite>`);
|
|
311
|
+
}
|
|
312
|
+
lines.push(`</testsuites>`);
|
|
313
|
+
return lines.join("\n") + "\n";
|
|
314
|
+
}
|
|
315
|
+
function escapeXml(s) {
|
|
316
|
+
return s
|
|
317
|
+
.replace(/&/g, "&")
|
|
318
|
+
.replace(/</g, "<")
|
|
319
|
+
.replace(/>/g, ">")
|
|
320
|
+
.replace(/"/g, """)
|
|
321
|
+
.replace(/'/g, "'");
|
|
322
|
+
}
|
|
323
|
+
// ── LCOV ──────────────────────────────────────────────────────────────────────
|
|
324
|
+
/**
|
|
325
|
+
* Render an LCOV tracefile consumable by SonarQube, CodeCov, Coveralls, and
|
|
326
|
+
* most enterprise quality-gate platforms.
|
|
327
|
+
*
|
|
328
|
+
* Format: one SF:/FN:/FNDA:/FNF:/FNH: block per source file.
|
|
329
|
+
* Since cotester tracks function-level coverage (not line-level), only
|
|
330
|
+
* function coverage records (FN/FNDA/FNF/FNH) are emitted.
|
|
331
|
+
*/
|
|
332
|
+
function renderLcov(rows) {
|
|
333
|
+
const lines = [];
|
|
334
|
+
for (const row of rows) {
|
|
335
|
+
lines.push(`SF:${row.relPath}`);
|
|
336
|
+
// FN:<line>,<function_name> — line numbers unavailable, use 0 as placeholder
|
|
337
|
+
for (let i = 1; i <= row.totalFns; i++) {
|
|
338
|
+
lines.push(`FN:0,fn_${i}`);
|
|
339
|
+
}
|
|
340
|
+
// FNDA:<execution_count>,<function_name> — covered=1, uncovered=0
|
|
341
|
+
for (let i = 1; i <= row.coveredFns; i++) {
|
|
342
|
+
lines.push(`FNDA:1,fn_${i}`);
|
|
343
|
+
}
|
|
344
|
+
for (let i = row.coveredFns + 1; i <= row.totalFns; i++) {
|
|
345
|
+
lines.push(`FNDA:0,fn_${i}`);
|
|
346
|
+
}
|
|
347
|
+
lines.push(`FNF:${row.totalFns}`); // functions found
|
|
348
|
+
lines.push(`FNH:${row.coveredFns}`); // functions hit
|
|
349
|
+
lines.push("end_of_record");
|
|
350
|
+
lines.push("");
|
|
351
|
+
}
|
|
352
|
+
return lines.join("\n");
|
|
353
|
+
}
|
|
270
354
|
//# sourceMappingURL=reporter.js.map
|
package/dist/reporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
package/dist/scenarioEngine.d.ts
CHANGED
|
@@ -17,9 +17,12 @@ export interface ScenarioCase {
|
|
|
17
17
|
export interface TestScenario {
|
|
18
18
|
functionName: string;
|
|
19
19
|
className?: string;
|
|
20
|
+
/** true when this is a static class method */
|
|
21
|
+
isStatic?: boolean;
|
|
20
22
|
parameters: {
|
|
21
23
|
name: string;
|
|
22
24
|
type: string;
|
|
25
|
+
isOptional?: boolean;
|
|
23
26
|
}[];
|
|
24
27
|
returnType: string;
|
|
25
28
|
cases: ScenarioCase[];
|
package/dist/scenarioEngine.js
CHANGED
|
@@ -14,7 +14,8 @@ function generateScenarios(functions, config, projectRoot) {
|
|
|
14
14
|
return {
|
|
15
15
|
functionName: fn.name,
|
|
16
16
|
className: fn.className,
|
|
17
|
-
|
|
17
|
+
isStatic: fn.isStatic,
|
|
18
|
+
parameters: fn.parameters.map((p) => ({ name: p.name, type: p.type, isOptional: p.isOptional })),
|
|
18
19
|
returnType: fn.returnType,
|
|
19
20
|
cases,
|
|
20
21
|
isAsync: fn.isAsync,
|
|
@@ -166,6 +167,50 @@ function buildCases(fn, config, projectRoot) {
|
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
}
|
|
170
|
+
// ── Union-type exhaustion scenarios ─────────────────────────────────
|
|
171
|
+
// For parameters whose type is a string/number literal union, generate
|
|
172
|
+
// one scenario per union member (capped at 5 to avoid explosion).
|
|
173
|
+
for (const param of fn.parameters) {
|
|
174
|
+
const unionMembers = extractLiteralUnionMembers(param.type);
|
|
175
|
+
if (unionMembers.length > 1 && unionMembers.length <= 5) {
|
|
176
|
+
for (const member of unionMembers) {
|
|
177
|
+
const label = `handles ${param.name} = ${member}`;
|
|
178
|
+
if (!seen.has(label)) {
|
|
179
|
+
seen.add(label);
|
|
180
|
+
// Replace this param's literal with the union member; keep others from first mock set
|
|
181
|
+
const baseArgs = mockSets.length > 0
|
|
182
|
+
? mockSets[0].args.map((a) => a.literal)
|
|
183
|
+
: paramNames.map(() => "undefined");
|
|
184
|
+
const argLiterals = paramNames.map((n, i) => n === param.name ? member : (baseArgs[i] ?? "undefined"));
|
|
185
|
+
cases.push({ label, argLiterals, paramNames, kind: "standard" });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// ── Optional-param omission scenario ────────────────────────────────
|
|
191
|
+
// When the function has optional parameters, add one scenario that
|
|
192
|
+
// calls it with only the required parameters (optional ones omitted).
|
|
193
|
+
const hasOptional = fn.parameters.some((p) => p.isOptional);
|
|
194
|
+
if (hasOptional) {
|
|
195
|
+
const label = "handles optional params omitted";
|
|
196
|
+
if (!seen.has(label)) {
|
|
197
|
+
seen.add(label);
|
|
198
|
+
const requiredNames = fn.parameters
|
|
199
|
+
.filter((p) => !p.isOptional)
|
|
200
|
+
.map((p) => p.name);
|
|
201
|
+
const requiredArgs = mockSets.length > 0
|
|
202
|
+
? mockSets[0].args
|
|
203
|
+
.filter((_, i) => !fn.parameters[i]?.isOptional)
|
|
204
|
+
.map((a) => a.literal)
|
|
205
|
+
: [];
|
|
206
|
+
cases.push({
|
|
207
|
+
label,
|
|
208
|
+
argLiterals: requiredArgs,
|
|
209
|
+
paramNames: requiredNames,
|
|
210
|
+
kind: "standard",
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
169
214
|
// ── Fallback ────────────────────────────────────────────────────────
|
|
170
215
|
if (cases.length === 0) {
|
|
171
216
|
cases.push({
|
|
@@ -177,4 +222,28 @@ function buildCases(fn, config, projectRoot) {
|
|
|
177
222
|
}
|
|
178
223
|
return cases;
|
|
179
224
|
}
|
|
225
|
+
// ─── Union type helpers ───────────────────────────────────────────────────────
|
|
226
|
+
/**
|
|
227
|
+
* Parse a TypeScript type string and return the individual literal members
|
|
228
|
+
* if it is a string or number literal union (e.g. `'active' | 'inactive'`).
|
|
229
|
+
*
|
|
230
|
+
* Returns [] when the type is not a recognisable literal union or when it
|
|
231
|
+
* contains more than 5 members (to avoid scenario explosion).
|
|
232
|
+
*
|
|
233
|
+
* Examples:
|
|
234
|
+
* `'active' | 'inactive' | 'pending'` → [`'active'`, `'inactive'`, `'pending'`]
|
|
235
|
+
* `200 | 400 | 404 | 500` → [`200`, `400`, `404`, `500`]
|
|
236
|
+
* `string | number` → [] (not literal union)
|
|
237
|
+
*/
|
|
238
|
+
function extractLiteralUnionMembers(typeStr) {
|
|
239
|
+
const trimmed = typeStr.trim();
|
|
240
|
+
if (!trimmed.includes("|"))
|
|
241
|
+
return [];
|
|
242
|
+
const members = trimmed.split("|").map((m) => m.trim());
|
|
243
|
+
// Each member must be a string literal ('...'), a number literal, or null/undefined/boolean
|
|
244
|
+
const LITERAL_RE = /^(?:'[^']*'|"[^"]*"|`[^`]*`|-?\d+(\.\d+)?|true|false|null|undefined)$/;
|
|
245
|
+
if (!members.every((m) => LITERAL_RE.test(m)))
|
|
246
|
+
return [];
|
|
247
|
+
return members;
|
|
248
|
+
}
|
|
180
249
|
//# sourceMappingURL=scenarioEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenarioEngine.js","sourceRoot":"","sources":["../src/scenarioEngine.ts"],"names":[],"mappings":";;
|
|
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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cotester validate` — Compile-check Generated Tests
|
|
3
|
+
*
|
|
4
|
+
* Spawns `tsc --noEmit` scoped to the project's testDir and parses the output.
|
|
5
|
+
* Maps TypeScript errors back to source files and reports them clearly.
|
|
6
|
+
*
|
|
7
|
+
* Exits with code 1 if any compile errors are found, making it CI-safe.
|
|
8
|
+
*/
|
|
9
|
+
export interface ValidateOptions {
|
|
10
|
+
/** Restrict validation to a subfolder of testDir (e.g. "services") */
|
|
11
|
+
folder?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ValidateResult {
|
|
14
|
+
errorCount: number;
|
|
15
|
+
warningCount: number;
|
|
16
|
+
passed: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run TypeScript compile-check on generated test files.
|
|
20
|
+
*
|
|
21
|
+
* Uses the project's own tsconfig.json (if present) so the check respects
|
|
22
|
+
* the same compiler options the developer uses. Falls back to a minimal
|
|
23
|
+
* inline config when no tsconfig.json is found.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runValidate(opts?: ValidateOptions): ValidateResult;
|