mitnick-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/dist/analyzers/analyzer.interface.d.ts +32 -0
- package/dist/analyzers/analyzer.interface.d.ts.map +1 -0
- package/dist/analyzers/analyzer.interface.js +2 -0
- package/dist/analyzers/analyzer.interface.js.map +1 -0
- package/dist/analyzers/analyzer.registry.d.ts +16 -0
- package/dist/analyzers/analyzer.registry.d.ts.map +1 -0
- package/dist/analyzers/analyzer.registry.js +40 -0
- package/dist/analyzers/analyzer.registry.js.map +1 -0
- package/dist/analyzers/dependency-confusion/index.d.ts +14 -0
- package/dist/analyzers/dependency-confusion/index.d.ts.map +1 -0
- package/dist/analyzers/dependency-confusion/index.js +147 -0
- package/dist/analyzers/dependency-confusion/index.js.map +1 -0
- package/dist/analyzers/dormant-package/index.d.ts +14 -0
- package/dist/analyzers/dormant-package/index.d.ts.map +1 -0
- package/dist/analyzers/dormant-package/index.js +137 -0
- package/dist/analyzers/dormant-package/index.js.map +1 -0
- package/dist/analyzers/file-based-analyzer.d.ts +20 -0
- package/dist/analyzers/file-based-analyzer.d.ts.map +1 -0
- package/dist/analyzers/file-based-analyzer.js +35 -0
- package/dist/analyzers/file-based-analyzer.js.map +1 -0
- package/dist/analyzers/install-scripts/index.d.ts +13 -0
- package/dist/analyzers/install-scripts/index.d.ts.map +1 -0
- package/dist/analyzers/install-scripts/index.js +125 -0
- package/dist/analyzers/install-scripts/index.js.map +1 -0
- package/dist/analyzers/license/index.d.ts +12 -0
- package/dist/analyzers/license/index.d.ts.map +1 -0
- package/dist/analyzers/license/index.js +199 -0
- package/dist/analyzers/license/index.js.map +1 -0
- package/dist/analyzers/maintainer/index.d.ts +12 -0
- package/dist/analyzers/maintainer/index.d.ts.map +1 -0
- package/dist/analyzers/maintainer/index.js +93 -0
- package/dist/analyzers/maintainer/index.js.map +1 -0
- package/dist/analyzers/network-calls/index.d.ts +15 -0
- package/dist/analyzers/network-calls/index.d.ts.map +1 -0
- package/dist/analyzers/network-calls/index.js +212 -0
- package/dist/analyzers/network-calls/index.js.map +1 -0
- package/dist/analyzers/obfuscation/index.d.ts +19 -0
- package/dist/analyzers/obfuscation/index.d.ts.map +1 -0
- package/dist/analyzers/obfuscation/index.js +218 -0
- package/dist/analyzers/obfuscation/index.js.map +1 -0
- package/dist/analyzers/prototype-pollution/index.d.ts +18 -0
- package/dist/analyzers/prototype-pollution/index.d.ts.map +1 -0
- package/dist/analyzers/prototype-pollution/index.js +257 -0
- package/dist/analyzers/prototype-pollution/index.js.map +1 -0
- package/dist/analyzers/sensitive-data/index.d.ts +16 -0
- package/dist/analyzers/sensitive-data/index.d.ts.map +1 -0
- package/dist/analyzers/sensitive-data/index.js +254 -0
- package/dist/analyzers/sensitive-data/index.js.map +1 -0
- package/dist/analyzers/typosquatting/index.d.ts +14 -0
- package/dist/analyzers/typosquatting/index.d.ts.map +1 -0
- package/dist/analyzers/typosquatting/index.js +127 -0
- package/dist/analyzers/typosquatting/index.js.map +1 -0
- package/dist/analyzers/typosquatting/popular-packages.d.ts +9 -0
- package/dist/analyzers/typosquatting/popular-packages.d.ts.map +1 -0
- package/dist/analyzers/typosquatting/popular-packages.js +236 -0
- package/dist/analyzers/typosquatting/popular-packages.js.map +1 -0
- package/dist/analyzers/vulnerability/index.d.ts +12 -0
- package/dist/analyzers/vulnerability/index.d.ts.map +1 -0
- package/dist/analyzers/vulnerability/index.js +147 -0
- package/dist/analyzers/vulnerability/index.js.map +1 -0
- package/dist/cli/commands/check.d.ts +21 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +204 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/formatters/formatter.interface.d.ts +14 -0
- package/dist/cli/formatters/formatter.interface.d.ts.map +1 -0
- package/dist/cli/formatters/formatter.interface.js +2 -0
- package/dist/cli/formatters/formatter.interface.js.map +1 -0
- package/dist/cli/formatters/json.d.ts +12 -0
- package/dist/cli/formatters/json.d.ts.map +1 -0
- package/dist/cli/formatters/json.js +12 -0
- package/dist/cli/formatters/json.js.map +1 -0
- package/dist/cli/formatters/sarif.d.ts +13 -0
- package/dist/cli/formatters/sarif.d.ts.map +1 -0
- package/dist/cli/formatters/sarif.js +101 -0
- package/dist/cli/formatters/sarif.js.map +1 -0
- package/dist/cli/formatters/terminal.d.ts +13 -0
- package/dist/cli/formatters/terminal.d.ts.map +1 -0
- package/dist/cli/formatters/terminal.js +110 -0
- package/dist/cli/formatters/terminal.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +86 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/engine.d.ts +23 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +55 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/scorer.d.ts +30 -0
- package/dist/core/scorer.d.ts.map +1 -0
- package/dist/core/scorer.js +88 -0
- package/dist/core/scorer.js.map +1 -0
- package/dist/core/types.d.ts +76 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/client.d.ts +27 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +189 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/tarball.d.ts +34 -0
- package/dist/registry/tarball.d.ts.map +1 -0
- package/dist/registry/tarball.js +103 -0
- package/dist/registry/tarball.js.map +1 -0
- package/dist/utils/ast.d.ts +74 -0
- package/dist/utils/ast.d.ts.map +1 -0
- package/dist/utils/ast.js +150 -0
- package/dist/utils/ast.js.map +1 -0
- package/dist/utils/fs.d.ts +28 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +78 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/http.d.ts +40 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +116 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/strings.d.ts +8 -0
- package/dist/utils/strings.d.ts.map +1 -0
- package/dist/utils/strings.js +12 -0
- package/dist/utils/strings.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis engine that orchestrates all security analyzers.
|
|
3
|
+
*
|
|
4
|
+
* Accepts analyzers via constructor injection (DI) and runs them
|
|
5
|
+
* in parallel using Promise.allSettled. Individual analyzer failures
|
|
6
|
+
* are caught without stopping the remaining analyzers.
|
|
7
|
+
*/
|
|
8
|
+
import type { Analyzer } from '../analyzers/analyzer.interface.js';
|
|
9
|
+
import type { AnalysisContext, SecurityReport } from './types.js';
|
|
10
|
+
export declare class AnalysisEngine {
|
|
11
|
+
private readonly analyzers;
|
|
12
|
+
constructor(analyzers: readonly Analyzer[]);
|
|
13
|
+
/**
|
|
14
|
+
* Run all registered analyzers against the given context in parallel.
|
|
15
|
+
*
|
|
16
|
+
* - Uses Promise.allSettled so one failure does not cancel others
|
|
17
|
+
* - Failed analyzers produce an empty result with zero findings
|
|
18
|
+
* - Measures total wall-clock duration
|
|
19
|
+
* - Computes aggregate score via the scorer module
|
|
20
|
+
*/
|
|
21
|
+
analyze(context: AnalysisContext): Promise<SecurityReport>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAkB,cAAc,EAAE,MAAM,YAAY,CAAC;AAGlF,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;gBAEpC,SAAS,EAAE,SAAS,QAAQ,EAAE;IAI1C;;;;;;;OAOG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CA0CjE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis engine that orchestrates all security analyzers.
|
|
3
|
+
*
|
|
4
|
+
* Accepts analyzers via constructor injection (DI) and runs them
|
|
5
|
+
* in parallel using Promise.allSettled. Individual analyzer failures
|
|
6
|
+
* are caught without stopping the remaining analyzers.
|
|
7
|
+
*/
|
|
8
|
+
import { calculateScore } from './scorer.js';
|
|
9
|
+
export class AnalysisEngine {
|
|
10
|
+
analyzers;
|
|
11
|
+
constructor(analyzers) {
|
|
12
|
+
this.analyzers = analyzers;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Run all registered analyzers against the given context in parallel.
|
|
16
|
+
*
|
|
17
|
+
* - Uses Promise.allSettled so one failure does not cancel others
|
|
18
|
+
* - Failed analyzers produce an empty result with zero findings
|
|
19
|
+
* - Measures total wall-clock duration
|
|
20
|
+
* - Computes aggregate score via the scorer module
|
|
21
|
+
*/
|
|
22
|
+
async analyze(context) {
|
|
23
|
+
const startTime = performance.now();
|
|
24
|
+
const settled = await Promise.allSettled(this.analyzers.map((analyzer) => analyzer.analyze(context)));
|
|
25
|
+
const results = settled.map((outcome, index) => {
|
|
26
|
+
if (outcome.status === 'fulfilled') {
|
|
27
|
+
return outcome.value;
|
|
28
|
+
}
|
|
29
|
+
// Analyzer threw — produce a graceful empty result
|
|
30
|
+
const analyzer = this.analyzers[index];
|
|
31
|
+
const analyzerName = analyzer?.name ?? `unknown-analyzer-${index}`;
|
|
32
|
+
const errorMessage = outcome.reason instanceof Error ? outcome.reason.message : String(outcome.reason);
|
|
33
|
+
console.error(`[mitnick] Analyzer "${analyzerName}" failed: ${errorMessage}`);
|
|
34
|
+
return {
|
|
35
|
+
analyzer: analyzerName,
|
|
36
|
+
findings: [],
|
|
37
|
+
duration: 0,
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
const duration = Math.round(performance.now() - startTime);
|
|
41
|
+
const { score, grade, totalFindings, findingsBySeverity } = calculateScore(results);
|
|
42
|
+
return {
|
|
43
|
+
packageName: context.packageName,
|
|
44
|
+
version: context.version,
|
|
45
|
+
score,
|
|
46
|
+
grade,
|
|
47
|
+
results,
|
|
48
|
+
totalFindings,
|
|
49
|
+
findingsBySeverity,
|
|
50
|
+
analyzedAt: new Date().toISOString(),
|
|
51
|
+
duration,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/core/engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAO,cAAc;IACR,SAAS,CAAsB;IAEhD,YAAY,SAA8B;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,OAAO,CAAC,OAAwB;QACpC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAC5D,CAAC;QAEF,MAAM,OAAO,GAAqB,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACnC,OAAO,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;YAED,mDAAmD;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ,EAAE,IAAI,IAAI,oBAAoB,KAAK,EAAE,CAAC;YACnE,MAAM,YAAY,GAChB,OAAO,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEpF,OAAO,CAAC,KAAK,CAAC,uBAAuB,YAAY,aAAa,YAAY,EAAE,CAAC,CAAC;YAE9E,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,CAAC;aACa,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;QAC3D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAEpF,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK;YACL,KAAK;YACL,OAAO;YACP,aAAa;YACb,kBAAkB;YAClB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,QAAQ;SACT,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security scoring engine.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions that compute a security score and grade
|
|
5
|
+
* from analyzer findings. No side effects.
|
|
6
|
+
*/
|
|
7
|
+
import { type AnalyzerResult, type Grade, type Severity } from './types.js';
|
|
8
|
+
export interface ScoreResult {
|
|
9
|
+
readonly score: number;
|
|
10
|
+
readonly grade: Grade;
|
|
11
|
+
readonly totalFindings: number;
|
|
12
|
+
readonly findingsBySeverity: Readonly<Record<Severity, number>>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Calculate a complete security score from analyzer results.
|
|
16
|
+
*
|
|
17
|
+
* - Starts at 100
|
|
18
|
+
* - Deducts points per finding based on severity
|
|
19
|
+
* - Clamps to [0, 100]
|
|
20
|
+
* - Maps to letter grade (A/B/C/D/F)
|
|
21
|
+
*
|
|
22
|
+
* This is a pure function with no side effects.
|
|
23
|
+
*/
|
|
24
|
+
export declare function calculateScore(results: readonly AnalyzerResult[]): ScoreResult;
|
|
25
|
+
/**
|
|
26
|
+
* Check whether any finding meets or exceeds the given severity threshold.
|
|
27
|
+
* Used by --fail-on to determine exit code.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasFindsAtOrAbove(results: readonly AnalyzerResult[], threshold: Severity): boolean;
|
|
30
|
+
//# sourceMappingURL=scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../../src/core/scorer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,KAAK,EACV,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;CACjE;AA4DD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,WAAW,CAa9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,SAAS,EAAE,QAAQ,GAClB,OAAO,CAKT"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security scoring engine.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions that compute a security score and grade
|
|
5
|
+
* from analyzer findings. No side effects.
|
|
6
|
+
*/
|
|
7
|
+
import { GRADE_THRESHOLDS, SEVERITY_DEDUCTIONS, SEVERITY_LEVELS, } from './types.js';
|
|
8
|
+
// ─── Helpers ─────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Collect all findings from analyzer results into a flat array.
|
|
11
|
+
*/
|
|
12
|
+
function collectFindings(results) {
|
|
13
|
+
return results.flatMap((r) => r.findings);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Count findings grouped by severity level.
|
|
17
|
+
*/
|
|
18
|
+
function countBySeverity(findings) {
|
|
19
|
+
const counts = {
|
|
20
|
+
critical: 0,
|
|
21
|
+
high: 0,
|
|
22
|
+
medium: 0,
|
|
23
|
+
low: 0,
|
|
24
|
+
info: 0,
|
|
25
|
+
};
|
|
26
|
+
for (const finding of findings) {
|
|
27
|
+
counts[finding.severity] += 1;
|
|
28
|
+
}
|
|
29
|
+
return counts;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compute raw score by deducting points per finding severity.
|
|
33
|
+
* Clamped to [0, 100].
|
|
34
|
+
*/
|
|
35
|
+
function computeScore(findings) {
|
|
36
|
+
let score = 100;
|
|
37
|
+
for (const finding of findings) {
|
|
38
|
+
score -= SEVERITY_DEDUCTIONS[finding.severity];
|
|
39
|
+
}
|
|
40
|
+
return Math.max(0, Math.min(100, score));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Map a numeric score to a letter grade using GRADE_THRESHOLDS.
|
|
44
|
+
*/
|
|
45
|
+
function computeGrade(score) {
|
|
46
|
+
for (const threshold of GRADE_THRESHOLDS) {
|
|
47
|
+
if (score >= threshold.min) {
|
|
48
|
+
return threshold.grade;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// GRADE_THRESHOLDS always includes min: 0, so this is unreachable.
|
|
52
|
+
// Satisfy the compiler with a fallback.
|
|
53
|
+
return 'F';
|
|
54
|
+
}
|
|
55
|
+
// ─── Public API ──────────────────────────────────────────
|
|
56
|
+
/**
|
|
57
|
+
* Calculate a complete security score from analyzer results.
|
|
58
|
+
*
|
|
59
|
+
* - Starts at 100
|
|
60
|
+
* - Deducts points per finding based on severity
|
|
61
|
+
* - Clamps to [0, 100]
|
|
62
|
+
* - Maps to letter grade (A/B/C/D/F)
|
|
63
|
+
*
|
|
64
|
+
* This is a pure function with no side effects.
|
|
65
|
+
*/
|
|
66
|
+
export function calculateScore(results) {
|
|
67
|
+
const findings = collectFindings(results);
|
|
68
|
+
const score = computeScore(findings);
|
|
69
|
+
const grade = computeGrade(score);
|
|
70
|
+
const findingsBySeverity = countBySeverity(findings);
|
|
71
|
+
const totalFindings = findings.length;
|
|
72
|
+
return {
|
|
73
|
+
score,
|
|
74
|
+
grade,
|
|
75
|
+
totalFindings,
|
|
76
|
+
findingsBySeverity,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check whether any finding meets or exceeds the given severity threshold.
|
|
81
|
+
* Used by --fail-on to determine exit code.
|
|
82
|
+
*/
|
|
83
|
+
export function hasFindsAtOrAbove(results, threshold) {
|
|
84
|
+
const thresholdIndex = SEVERITY_LEVELS.indexOf(threshold);
|
|
85
|
+
const findings = collectFindings(results);
|
|
86
|
+
return findings.some((f) => SEVERITY_LEVELS.indexOf(f.severity) <= thresholdIndex);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../../src/core/scorer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAKhB,MAAM,YAAY,CAAC;AAWpB,4DAA4D;AAE5D;;GAEG;AACH,SAAS,eAAe,CAAC,OAAkC;IACzD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAA4B;IACnD,MAAM,MAAM,GAA6B;QACvC,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;KACR,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAA4B;IAChD,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAa;IACjC,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;QACzC,IAAI,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IACD,mEAAmE;IACnE,wCAAwC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4DAA4D;AAE5D;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,OAAkC;IAC/D,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,kBAAkB,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEtC,OAAO;QACL,KAAK;QACL,KAAK;QACL,aAAa;QACb,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAkC,EAClC,SAAmB;IAEnB,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for the Mitnick security analysis engine.
|
|
3
|
+
*
|
|
4
|
+
* All types use readonly properties and discriminated unions
|
|
5
|
+
* to enforce immutability and type safety throughout the system.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SEVERITY_LEVELS: readonly ["critical", "high", "medium", "low", "info"];
|
|
8
|
+
export type Severity = (typeof SEVERITY_LEVELS)[number];
|
|
9
|
+
export declare const SEVERITY_ORDER: Readonly<Record<Severity, number>>;
|
|
10
|
+
export declare const SEVERITY_DEDUCTIONS: Readonly<Record<Severity, number>>;
|
|
11
|
+
export type Grade = 'A' | 'B' | 'C' | 'D' | 'F';
|
|
12
|
+
export declare const GRADE_THRESHOLDS: readonly {
|
|
13
|
+
readonly min: number;
|
|
14
|
+
readonly grade: Grade;
|
|
15
|
+
}[];
|
|
16
|
+
export interface Finding {
|
|
17
|
+
readonly analyzer: string;
|
|
18
|
+
readonly severity: Severity;
|
|
19
|
+
readonly title: string;
|
|
20
|
+
readonly description: string;
|
|
21
|
+
readonly file?: string;
|
|
22
|
+
readonly line?: number;
|
|
23
|
+
readonly recommendation?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface AnalyzerResult {
|
|
26
|
+
readonly analyzer: string;
|
|
27
|
+
readonly findings: readonly Finding[];
|
|
28
|
+
readonly duration: number;
|
|
29
|
+
}
|
|
30
|
+
export interface MaintainerInfo {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly email?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface RegistryMetadata {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
readonly version: string;
|
|
37
|
+
readonly description?: string;
|
|
38
|
+
readonly license?: string;
|
|
39
|
+
readonly maintainers: readonly MaintainerInfo[];
|
|
40
|
+
readonly publishedAt?: string;
|
|
41
|
+
readonly versions: readonly string[];
|
|
42
|
+
readonly timeMap: Readonly<Record<string, string>>;
|
|
43
|
+
readonly distTags: Readonly<Record<string, string>>;
|
|
44
|
+
readonly homepage?: string;
|
|
45
|
+
readonly repository?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface AnalysisContext {
|
|
48
|
+
readonly packageName: string;
|
|
49
|
+
readonly version: string;
|
|
50
|
+
readonly packageJson: Readonly<Record<string, unknown>>;
|
|
51
|
+
readonly extractedPath: string;
|
|
52
|
+
readonly registryMetadata: RegistryMetadata;
|
|
53
|
+
}
|
|
54
|
+
export interface SecurityReport {
|
|
55
|
+
readonly packageName: string;
|
|
56
|
+
readonly version: string;
|
|
57
|
+
readonly score: number;
|
|
58
|
+
readonly grade: Grade;
|
|
59
|
+
readonly results: readonly AnalyzerResult[];
|
|
60
|
+
readonly totalFindings: number;
|
|
61
|
+
readonly findingsBySeverity: Readonly<Record<Severity, number>>;
|
|
62
|
+
readonly analyzedAt: string;
|
|
63
|
+
readonly duration: number;
|
|
64
|
+
}
|
|
65
|
+
export type OutputFormat = 'terminal' | 'json' | 'sarif';
|
|
66
|
+
export interface CheckOptions {
|
|
67
|
+
readonly packages: readonly string[];
|
|
68
|
+
readonly format: OutputFormat;
|
|
69
|
+
readonly failOn?: Severity;
|
|
70
|
+
readonly verbose: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface PackageSpecifier {
|
|
73
|
+
readonly name: string;
|
|
74
|
+
readonly version?: string;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for the Mitnick security analysis engine.
|
|
3
|
+
*
|
|
4
|
+
* All types use readonly properties and discriminated unions
|
|
5
|
+
* to enforce immutability and type safety throughout the system.
|
|
6
|
+
*/
|
|
7
|
+
// ─── Severity ──────────────────────────────────────────────
|
|
8
|
+
export const SEVERITY_LEVELS = ['critical', 'high', 'medium', 'low', 'info'];
|
|
9
|
+
export const SEVERITY_ORDER = {
|
|
10
|
+
critical: 0,
|
|
11
|
+
high: 1,
|
|
12
|
+
medium: 2,
|
|
13
|
+
low: 3,
|
|
14
|
+
info: 4,
|
|
15
|
+
};
|
|
16
|
+
export const SEVERITY_DEDUCTIONS = {
|
|
17
|
+
critical: 25,
|
|
18
|
+
high: 15,
|
|
19
|
+
medium: 8,
|
|
20
|
+
low: 3,
|
|
21
|
+
info: 0,
|
|
22
|
+
};
|
|
23
|
+
export const GRADE_THRESHOLDS = [
|
|
24
|
+
{ min: 90, grade: 'A' },
|
|
25
|
+
{ min: 80, grade: 'B' },
|
|
26
|
+
{ min: 70, grade: 'C' },
|
|
27
|
+
{ min: 50, grade: 'D' },
|
|
28
|
+
{ min: 0, grade: 'F' },
|
|
29
|
+
];
|
|
30
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8DAA8D;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAItF,MAAM,CAAC,MAAM,cAAc,GAAuC;IAChE,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAuC;IACrE,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACC,CAAC;AAMX,MAAM,CAAC,MAAM,gBAAgB,GAA+D;IAC1F,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;IACvB,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;IACvB,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;IACvB,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;IACvB,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;CACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mitnick — Public programmatic API.
|
|
3
|
+
*
|
|
4
|
+
* Provides the core analysis engine, types, and utilities
|
|
5
|
+
* so consumers can use mitnick as a library, not just a CLI.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { AnalysisEngine, createAnalyzers, fetchPackageMetadata, downloadAndExtract } from 'mitnick';
|
|
10
|
+
*
|
|
11
|
+
* const result = await fetchPackageMetadata('express');
|
|
12
|
+
* if (result.ok) {
|
|
13
|
+
* const tarball = await downloadAndExtract(result.tarballUrl, result.metadata.name);
|
|
14
|
+
* if (tarball.ok) {
|
|
15
|
+
* const engine = new AnalysisEngine(createAnalyzers());
|
|
16
|
+
* const report = await engine.analyze({ ... });
|
|
17
|
+
* await tarball.cleanup();
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export { AnalysisEngine } from './core/engine.js';
|
|
23
|
+
export { calculateScore, hasFindsAtOrAbove } from './core/scorer.js';
|
|
24
|
+
export type { ScoreResult } from './core/scorer.js';
|
|
25
|
+
export type { Severity, Grade, Finding, AnalyzerResult, AnalysisContext, SecurityReport, RegistryMetadata, MaintainerInfo, PackageSpecifier, OutputFormat, CheckOptions, } from './core/types.js';
|
|
26
|
+
export { SEVERITY_LEVELS, SEVERITY_ORDER, SEVERITY_DEDUCTIONS, GRADE_THRESHOLDS, } from './core/types.js';
|
|
27
|
+
export type { Analyzer } from './analyzers/analyzer.interface.js';
|
|
28
|
+
export { createAnalyzers } from './analyzers/analyzer.registry.js';
|
|
29
|
+
export { fetchPackageMetadata } from './registry/client.js';
|
|
30
|
+
export type { RegistryResult, RegistrySuccess, RegistryError, RegistryErrorKind, } from './registry/client.js';
|
|
31
|
+
export { downloadAndExtract } from './registry/tarball.js';
|
|
32
|
+
export type { TarballResult, TarballSuccess, TarballError, TarballErrorKind, } from './registry/tarball.js';
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,YAAY,EACV,QAAQ,EACR,KAAK,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,gBAAgB,GACjB,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mitnick — Public programmatic API.
|
|
3
|
+
*
|
|
4
|
+
* Provides the core analysis engine, types, and utilities
|
|
5
|
+
* so consumers can use mitnick as a library, not just a CLI.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { AnalysisEngine, createAnalyzers, fetchPackageMetadata, downloadAndExtract } from 'mitnick';
|
|
10
|
+
*
|
|
11
|
+
* const result = await fetchPackageMetadata('express');
|
|
12
|
+
* if (result.ok) {
|
|
13
|
+
* const tarball = await downloadAndExtract(result.tarballUrl, result.metadata.name);
|
|
14
|
+
* if (tarball.ok) {
|
|
15
|
+
* const engine = new AnalysisEngine(createAnalyzers());
|
|
16
|
+
* const report = await engine.analyze({ ... });
|
|
17
|
+
* await tarball.cleanup();
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
// ─── Core ─────────────────────────────────────────────────
|
|
23
|
+
export { AnalysisEngine } from './core/engine.js';
|
|
24
|
+
export { calculateScore, hasFindsAtOrAbove } from './core/scorer.js';
|
|
25
|
+
export { SEVERITY_LEVELS, SEVERITY_ORDER, SEVERITY_DEDUCTIONS, GRADE_THRESHOLDS, } from './core/types.js';
|
|
26
|
+
export { createAnalyzers } from './analyzers/analyzer.registry.js';
|
|
27
|
+
// ─── Registry ─────────────────────────────────────────────
|
|
28
|
+
export { fetchPackageMetadata } from './registry/client.js';
|
|
29
|
+
export { downloadAndExtract } from './registry/tarball.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,6DAA6D;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAkBrE,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,6DAA6D;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQ5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm registry API client.
|
|
3
|
+
*
|
|
4
|
+
* Fetches package metadata from the public npm registry,
|
|
5
|
+
* validates responses with zod, and maps them to RegistryMetadata.
|
|
6
|
+
*/
|
|
7
|
+
import type { RegistryMetadata } from '../core/types.js';
|
|
8
|
+
export interface RegistrySuccess {
|
|
9
|
+
readonly ok: true;
|
|
10
|
+
readonly metadata: RegistryMetadata;
|
|
11
|
+
readonly tarballUrl: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RegistryError {
|
|
14
|
+
readonly ok: false;
|
|
15
|
+
readonly error: RegistryErrorKind;
|
|
16
|
+
readonly message: string;
|
|
17
|
+
}
|
|
18
|
+
export type RegistryResult = RegistrySuccess | RegistryError;
|
|
19
|
+
export type RegistryErrorKind = 'not_found' | 'version_not_found' | 'rate_limited' | 'network_error' | 'validation_error';
|
|
20
|
+
/**
|
|
21
|
+
* Fetch package metadata from the npm registry.
|
|
22
|
+
*
|
|
23
|
+
* @param packageName - The npm package name (supports scoped packages)
|
|
24
|
+
* @param version - Optional version or dist-tag. Defaults to "latest".
|
|
25
|
+
*/
|
|
26
|
+
export declare function fetchPackageMetadata(packageName: string, version?: string): Promise<RegistryResult>;
|
|
27
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/registry/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,kBAAkB,CAAC;AA0CzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,aAAa,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GACzB,WAAW,GACX,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,kBAAkB,CAAC;AAoFvB;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAsFzB"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm registry API client.
|
|
3
|
+
*
|
|
4
|
+
* Fetches package metadata from the public npm registry,
|
|
5
|
+
* validates responses with zod, and maps them to RegistryMetadata.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import semver from 'semver';
|
|
9
|
+
import { fetchJson } from '../utils/http.js';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
// ─── Constants ────────────────────────────────────────────
|
|
12
|
+
const NPM_REGISTRY = 'https://registry.npmjs.org';
|
|
13
|
+
// ─── Zod Schemas ──────────────────────────────────────────
|
|
14
|
+
const MaintainerSchema = z.object({
|
|
15
|
+
name: z.string(),
|
|
16
|
+
email: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
const VersionInfoSchema = z.object({
|
|
19
|
+
version: z.string(),
|
|
20
|
+
dist: z.object({
|
|
21
|
+
tarball: z.string().url(),
|
|
22
|
+
shasum: z.string().optional(),
|
|
23
|
+
integrity: z.string().optional(),
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
const PackageDocumentSchema = z.object({
|
|
27
|
+
name: z.string(),
|
|
28
|
+
description: z.string().optional(),
|
|
29
|
+
'dist-tags': z.record(z.string(), z.string()).default({}),
|
|
30
|
+
versions: z.record(z.string(), VersionInfoSchema),
|
|
31
|
+
time: z.record(z.string(), z.string()).optional(),
|
|
32
|
+
maintainers: z.array(MaintainerSchema).optional(),
|
|
33
|
+
license: z.string().optional(),
|
|
34
|
+
homepage: z.string().optional(),
|
|
35
|
+
repository: z
|
|
36
|
+
.union([z.string(), z.object({ url: z.string() }).transform((r) => r.url)])
|
|
37
|
+
.optional(),
|
|
38
|
+
});
|
|
39
|
+
// ─── Client ───────────────────────────────────────────────
|
|
40
|
+
/**
|
|
41
|
+
* Encode a package name for use in registry URLs.
|
|
42
|
+
* Scoped packages (@scope/name) become %40scope%2Fname.
|
|
43
|
+
*/
|
|
44
|
+
function encodePackageName(name) {
|
|
45
|
+
return name.startsWith('@') ? `@${encodeURIComponent(name.slice(1))}` : encodeURIComponent(name);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a version specifier to a concrete version string.
|
|
49
|
+
*
|
|
50
|
+
* Supports:
|
|
51
|
+
* - Exact versions: "4.19.2"
|
|
52
|
+
* - Dist-tags: "latest", "next"
|
|
53
|
+
* - Semver ranges: "^4.0.0", "~4.17.0", ">=4.0.0 <5.0.0"
|
|
54
|
+
*
|
|
55
|
+
* If no version is given, resolves to the `latest` dist-tag.
|
|
56
|
+
*/
|
|
57
|
+
function resolveVersion(doc, requestedVersion) {
|
|
58
|
+
if (requestedVersion !== undefined) {
|
|
59
|
+
// Direct version match
|
|
60
|
+
if (requestedVersion in doc.versions) {
|
|
61
|
+
return requestedVersion;
|
|
62
|
+
}
|
|
63
|
+
// Check dist-tags (e.g., "latest", "next")
|
|
64
|
+
const tagged = doc['dist-tags'][requestedVersion];
|
|
65
|
+
if (tagged !== undefined) {
|
|
66
|
+
return tagged;
|
|
67
|
+
}
|
|
68
|
+
// Try semver range resolution
|
|
69
|
+
const availableVersions = Object.keys(doc.versions);
|
|
70
|
+
const maxSatisfying = semver.maxSatisfying(availableVersions, requestedVersion);
|
|
71
|
+
if (maxSatisfying !== null) {
|
|
72
|
+
return maxSatisfying;
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
// Default to latest
|
|
77
|
+
return doc['dist-tags']['latest'];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Map a validated registry document to our internal RegistryMetadata type.
|
|
81
|
+
*
|
|
82
|
+
* Uses Object.assign to conditionally add optional fields, avoiding
|
|
83
|
+
* assignment of `undefined` (required by exactOptionalPropertyTypes).
|
|
84
|
+
*/
|
|
85
|
+
function toMetadata(doc, version) {
|
|
86
|
+
const maintainers = doc.maintainers?.map((m) => {
|
|
87
|
+
if (m.email !== undefined) {
|
|
88
|
+
return { name: m.name, email: m.email };
|
|
89
|
+
}
|
|
90
|
+
return { name: m.name };
|
|
91
|
+
}) ?? [];
|
|
92
|
+
const result = {
|
|
93
|
+
name: doc.name,
|
|
94
|
+
version,
|
|
95
|
+
maintainers,
|
|
96
|
+
versions: Object.keys(doc.versions),
|
|
97
|
+
timeMap: doc.time ?? {},
|
|
98
|
+
distTags: doc['dist-tags'],
|
|
99
|
+
...(doc.description !== undefined ? { description: doc.description } : {}),
|
|
100
|
+
...(doc.license !== undefined ? { license: doc.license } : {}),
|
|
101
|
+
...(doc.homepage !== undefined ? { homepage: doc.homepage } : {}),
|
|
102
|
+
...(typeof doc.repository === 'string' ? { repository: doc.repository } : {}),
|
|
103
|
+
...(doc.time?.[version] !== undefined ? { publishedAt: doc.time[version] } : {}),
|
|
104
|
+
};
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Fetch package metadata from the npm registry.
|
|
109
|
+
*
|
|
110
|
+
* @param packageName - The npm package name (supports scoped packages)
|
|
111
|
+
* @param version - Optional version or dist-tag. Defaults to "latest".
|
|
112
|
+
*/
|
|
113
|
+
export async function fetchPackageMetadata(packageName, version) {
|
|
114
|
+
const encodedName = encodePackageName(packageName);
|
|
115
|
+
const url = `${NPM_REGISTRY}/${encodedName}`;
|
|
116
|
+
logger.debug(`Fetching registry metadata for ${packageName}`, { url });
|
|
117
|
+
const result = await fetchJson(url, {
|
|
118
|
+
headers: {
|
|
119
|
+
// Abbreviated metadata is faster; we need full doc for time/maintainers
|
|
120
|
+
Accept: 'application/json',
|
|
121
|
+
},
|
|
122
|
+
timeout: 15_000,
|
|
123
|
+
});
|
|
124
|
+
if (!result.ok) {
|
|
125
|
+
logger.debug(`Registry request failed: ${result.message}`);
|
|
126
|
+
switch (result.error) {
|
|
127
|
+
case 'not_found':
|
|
128
|
+
return {
|
|
129
|
+
ok: false,
|
|
130
|
+
error: 'not_found',
|
|
131
|
+
message: `Package "${packageName}" not found on npm registry`,
|
|
132
|
+
};
|
|
133
|
+
case 'rate_limited':
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
error: 'rate_limited',
|
|
137
|
+
message: 'npm registry rate limit exceeded. Please retry later.',
|
|
138
|
+
};
|
|
139
|
+
case 'timeout':
|
|
140
|
+
case 'network':
|
|
141
|
+
case 'server_error':
|
|
142
|
+
case 'parse_error':
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
error: 'network_error',
|
|
146
|
+
message: `Failed to fetch package metadata: ${result.message}`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Validate shape with zod
|
|
151
|
+
const parsed = PackageDocumentSchema.safeParse(result.data);
|
|
152
|
+
if (!parsed.success) {
|
|
153
|
+
logger.debug('Registry response validation failed', {
|
|
154
|
+
errors: parsed.error.issues.map((i) => i.message),
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
ok: false,
|
|
158
|
+
error: 'validation_error',
|
|
159
|
+
message: `Invalid registry response: ${parsed.error.issues.map((i) => i.message).join(', ')}`,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const doc = parsed.data;
|
|
163
|
+
const resolvedVersion = resolveVersion(doc, version);
|
|
164
|
+
if (resolvedVersion === undefined) {
|
|
165
|
+
return {
|
|
166
|
+
ok: false,
|
|
167
|
+
error: 'version_not_found',
|
|
168
|
+
message: `Version "${version ?? 'latest'}" not found for package "${packageName}"`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const versionInfo = doc.versions[resolvedVersion];
|
|
172
|
+
if (versionInfo === undefined) {
|
|
173
|
+
return {
|
|
174
|
+
ok: false,
|
|
175
|
+
error: 'version_not_found',
|
|
176
|
+
message: `Version "${resolvedVersion}" not found for package "${packageName}"`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const metadata = toMetadata(doc, resolvedVersion);
|
|
180
|
+
logger.debug(`Resolved ${packageName}@${resolvedVersion}`, {
|
|
181
|
+
tarball: versionInfo.dist.tarball,
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
ok: true,
|
|
185
|
+
metadata,
|
|
186
|
+
tarballUrl: versionInfo.dist.tarball,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/registry/client.ts"],"names":[],"mappings":"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"}
|