@mf-toolkit/shared-inspector 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +320 -156
- package/dist/cli/args.d.ts +5 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +98 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/colorize-report.d.ts +6 -0
- package/dist/cli/colorize-report.d.ts.map +1 -0
- package/dist/cli/colorize-report.js +71 -0
- package/dist/cli/colorize-report.js.map +1 -0
- package/dist/cli/colors.d.ts +14 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +26 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +30 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +62 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +8 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +41 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/run-federation.d.ts +3 -0
- package/dist/cli/run-federation.d.ts.map +1 -0
- package/dist/cli/run-federation.js +41 -0
- package/dist/cli/run-federation.js.map +1 -0
- package/dist/cli/run-project.d.ts +5 -0
- package/dist/cli/run-project.d.ts.map +1 -0
- package/dist/cli/run-project.js +57 -0
- package/dist/cli/run-project.js.map +1 -0
- package/dist/cli/spinner.d.ts +10 -0
- package/dist/cli/spinner.d.ts.map +1 -0
- package/dist/cli/spinner.js +45 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/types.d.ts +17 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/reporter/diagnostics.d.ts +23 -0
- package/dist/reporter/diagnostics.d.ts.map +1 -0
- package/dist/reporter/diagnostics.js +138 -0
- package/dist/reporter/diagnostics.js.map +1 -0
- package/dist/reporter/format-federation-report.d.ts +11 -5
- package/dist/reporter/format-federation-report.d.ts.map +1 -1
- package/dist/reporter/format-federation-report.js +78 -37
- package/dist/reporter/format-federation-report.js.map +1 -1
- package/dist/reporter/format-report.d.ts +14 -7
- package/dist/reporter/format-report.d.ts.map +1 -1
- package/dist/reporter/format-report.js +67 -38
- package/dist/reporter/format-report.js.map +1 -1
- package/dist/reporter/scoring.d.ts +28 -0
- package/dist/reporter/scoring.d.ts.map +1 -0
- package/dist/reporter/scoring.js +74 -0
- package/dist/reporter/scoring.js.map +1 -0
- package/package.json +8 -3
|
@@ -1,73 +1,102 @@
|
|
|
1
|
+
import { getDiagnostic, buildFixSnippet } from './diagnostics.js';
|
|
2
|
+
import { scoreProjectReport, formatScoreBlock } from './scoring.js';
|
|
3
|
+
const HR = '─'.repeat(60);
|
|
1
4
|
/**
|
|
2
|
-
* Formats a ProjectReport as
|
|
5
|
+
* Formats a ProjectReport as actionable diagnostic cards.
|
|
3
6
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Each finding is rendered as a card with:
|
|
8
|
+
* - Issue title + package name
|
|
9
|
+
* - Concrete detail (version numbers, import count, etc.)
|
|
10
|
+
* - Risk description (what breaks at runtime)
|
|
11
|
+
* - Ready-to-paste fix snippet
|
|
12
|
+
*
|
|
13
|
+
* Section order (by severity):
|
|
14
|
+
* 1. Version mismatch — most dangerous, sharing silently broken
|
|
15
|
+
* 2. Unused shared — easy wins, safe to remove
|
|
16
|
+
* 3. Candidates — not shared but should be
|
|
17
|
+
* 4. Singleton risks — missing singleton: true
|
|
18
|
+
* 5. Eager risks — eager without singleton
|
|
19
|
+
* 6. Summary line
|
|
10
20
|
*/
|
|
11
21
|
export function formatReport(report, ctx) {
|
|
12
22
|
const lines = [];
|
|
13
23
|
const { unused, candidates, mismatched, singletonRisks, eagerRisks, summary } = report;
|
|
14
|
-
|
|
15
|
-
const header = buildHeader(ctx);
|
|
16
|
-
lines.push('', header, '');
|
|
24
|
+
lines.push('', buildHeader(ctx), HR, '');
|
|
17
25
|
const hasFindings = mismatched.length > 0 ||
|
|
18
26
|
unused.length > 0 ||
|
|
19
27
|
candidates.length > 0 ||
|
|
20
28
|
singletonRisks.length > 0 ||
|
|
21
29
|
eagerRisks.length > 0;
|
|
22
30
|
if (!hasFindings) {
|
|
23
|
-
lines.push(' No issues found. Shared config looks good.');
|
|
31
|
+
lines.push(' ✓ No issues found. Shared config looks good.');
|
|
32
|
+
lines.push('');
|
|
24
33
|
}
|
|
25
34
|
// ── 1. Version mismatch ────────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
for (const m of mismatched) {
|
|
36
|
+
const { risk } = getDiagnostic(m.package, 'mismatch');
|
|
37
|
+
lines.push(`⚠ Version Mismatch — ${m.package}`);
|
|
38
|
+
lines.push(` configured: ${m.configured} | installed: ${m.installed}`);
|
|
39
|
+
lines.push(` → Risk: ${risk}`);
|
|
40
|
+
lines.push(` 💡 Fix:`);
|
|
41
|
+
for (const l of buildFixSnippet(m.package, { singleton: true, requiredVersion: m.configured }).split('\n')) {
|
|
42
|
+
lines.push(` ${l}`);
|
|
30
43
|
}
|
|
31
44
|
lines.push('');
|
|
32
45
|
}
|
|
33
46
|
// ── 2. Unused shared ──────────────────────────────────────────────────────
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
47
|
+
for (const u of unused) {
|
|
48
|
+
const { risk } = getDiagnostic(u.package, 'unused');
|
|
49
|
+
const note = u.singleton ? 'shared as singleton' : 'shared without singleton';
|
|
50
|
+
lines.push(`✗ Unused Shared — ${u.package}`);
|
|
51
|
+
lines.push(` 0 imports, ${note}`);
|
|
52
|
+
lines.push(` → ${risk}`);
|
|
53
|
+
lines.push(` 💡 Fix: Remove "${u.package}" from shared config`);
|
|
40
54
|
lines.push('');
|
|
41
55
|
}
|
|
42
56
|
// ── 3. Candidates ─────────────────────────────────────────────────────────
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
for (const c of candidates) {
|
|
58
|
+
const { risk } = getDiagnostic(c.package, 'candidate');
|
|
59
|
+
const fileCount = c.files.length;
|
|
60
|
+
const filesLabel = fileCount === 1 ? '1 file' : `${fileCount} files`;
|
|
61
|
+
const viaLabel = c.via === 'reexport' ? ` via re-export in ${c.files[0]}` : '';
|
|
62
|
+
lines.push(`→ Not Shared — ${c.package} (${c.importCount} imports in ${filesLabel}${viaLabel})`);
|
|
63
|
+
lines.push(` → Risk: ${risk}`);
|
|
64
|
+
lines.push(` 💡 Fix:`);
|
|
65
|
+
for (const l of buildFixSnippet(c.package, { singleton: true }).split('\n')) {
|
|
66
|
+
lines.push(` ${l}`);
|
|
50
67
|
}
|
|
51
68
|
lines.push('');
|
|
52
69
|
}
|
|
53
70
|
// ── 4. Singleton risks ────────────────────────────────────────────────────
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
71
|
+
for (const r of singletonRisks) {
|
|
72
|
+
const { risk } = getDiagnostic(r.package, 'singleton-risk');
|
|
73
|
+
lines.push(`⚠ Singleton Risk — ${r.package}`);
|
|
74
|
+
lines.push(` singleton: true is missing`);
|
|
75
|
+
lines.push(` → Risk: ${risk}`);
|
|
76
|
+
lines.push(` 💡 Fix:`);
|
|
77
|
+
for (const l of buildFixSnippet(r.package, { singleton: true }).split('\n')) {
|
|
78
|
+
lines.push(` ${l}`);
|
|
58
79
|
}
|
|
59
80
|
lines.push('');
|
|
60
81
|
}
|
|
61
82
|
// ── 5. Eager risks ────────────────────────────────────────────────────────
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
83
|
+
for (const r of eagerRisks) {
|
|
84
|
+
const { risk } = getDiagnostic(r.package, 'eager-risk');
|
|
85
|
+
lines.push(`⚠ Eager Risk — ${r.package}`);
|
|
86
|
+
lines.push(` eager: true without singleton: true`);
|
|
87
|
+
lines.push(` → Risk: ${risk}`);
|
|
88
|
+
lines.push(` 💡 Fix:`);
|
|
89
|
+
for (const l of buildFixSnippet(r.package, { singleton: true, eager: true }).split('\n')) {
|
|
90
|
+
lines.push(` ${l}`);
|
|
66
91
|
}
|
|
67
92
|
lines.push('');
|
|
68
93
|
}
|
|
69
|
-
// ── 6. Summary
|
|
70
|
-
|
|
94
|
+
// ── 6. Score + Summary ───────────────────────────────────────────────────
|
|
95
|
+
const score = scoreProjectReport(report);
|
|
96
|
+
lines.push(HR);
|
|
97
|
+
lines.push(formatScoreBlock(score, 'version mismatch', 'singleton gaps, duplicate libs', 'over-sharing'));
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push(`Total: ${summary.totalShared} shared, ${summary.usedShared} used, ` +
|
|
71
100
|
`${summary.unusedCount} unused, ${summary.candidatesCount} candidates, ` +
|
|
72
101
|
`${summary.mismatchedCount} mismatch, ${summary.eagerRisksCount} eager risks`);
|
|
73
102
|
lines.push('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-report.js","sourceRoot":"","sources":["../../src/reporter/format-report.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format-report.js","sourceRoot":"","sources":["../../src/reporter/format-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ProjectReport, FederationReport } from '../types.js';
|
|
2
|
+
export interface RiskScore {
|
|
3
|
+
/** 0–100. Higher is better. */
|
|
4
|
+
score: number;
|
|
5
|
+
/** Verbal label derived from score range. */
|
|
6
|
+
label: 'HEALTHY' | 'GOOD' | 'RISKY' | 'CRITICAL';
|
|
7
|
+
/** Count of high-severity findings (version mismatches). */
|
|
8
|
+
high: number;
|
|
9
|
+
/** Count of medium-severity findings (singleton gaps, duplicate libs). */
|
|
10
|
+
medium: number;
|
|
11
|
+
/** Count of low-severity findings (over-sharing). */
|
|
12
|
+
low: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function scoreProjectReport(report: ProjectReport): RiskScore;
|
|
15
|
+
export declare function scoreFederationReport(report: FederationReport): RiskScore;
|
|
16
|
+
/**
|
|
17
|
+
* Renders the score block appended to reports.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* Score: 62/100 🟠 RISKY
|
|
21
|
+
*
|
|
22
|
+
* Issues:
|
|
23
|
+
* 🔴 1 high — version mismatch
|
|
24
|
+
* 🟠 2 medium — singleton gaps, duplicate libs
|
|
25
|
+
* 🟡 0 low — over-sharing
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatScoreBlock(score: RiskScore, highLabel: string, mediumLabel: string, lowLabel: string): string;
|
|
28
|
+
//# sourceMappingURL=scoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/reporter/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAInE,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;CACb;AAsBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAKnE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAKzE;AA0BD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ─── Severity mapping ─────────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// ProjectReport:
|
|
4
|
+
// HIGH — mismatched versions (sharing silently broken, runtime crash)
|
|
5
|
+
// MEDIUM — singletonRisks + eagerRisks + candidates (duplicate instances / bundles)
|
|
6
|
+
// LOW — unused (dead config, over-sharing)
|
|
7
|
+
//
|
|
8
|
+
// FederationReport:
|
|
9
|
+
// HIGH — versionConflicts (cross-MF singleton negotiation fails)
|
|
10
|
+
// MEDIUM — singletonMismatches + hostGaps (inconsistent setup / unbundled copies)
|
|
11
|
+
// LOW — ghostShares (one-sided dead coupling)
|
|
12
|
+
const PENALTY = {
|
|
13
|
+
high: 20,
|
|
14
|
+
medium: 8,
|
|
15
|
+
low: 3,
|
|
16
|
+
};
|
|
17
|
+
// ─── Scorers ─────────────────────────────────────────────────────────────────
|
|
18
|
+
export function scoreProjectReport(report) {
|
|
19
|
+
const high = report.mismatched.length;
|
|
20
|
+
const medium = report.singletonRisks.length + report.eagerRisks.length + report.candidates.length;
|
|
21
|
+
const low = report.unused.length;
|
|
22
|
+
return buildScore(high, medium, low);
|
|
23
|
+
}
|
|
24
|
+
export function scoreFederationReport(report) {
|
|
25
|
+
const high = report.versionConflicts.length;
|
|
26
|
+
const medium = report.singletonMismatches.length + report.hostGaps.length;
|
|
27
|
+
const low = report.ghostShares.length;
|
|
28
|
+
return buildScore(high, medium, low);
|
|
29
|
+
}
|
|
30
|
+
// ─── Internal ─────────────────────────────────────────────────────────────────
|
|
31
|
+
function buildScore(high, medium, low) {
|
|
32
|
+
const penalty = high * PENALTY.high + medium * PENALTY.medium + low * PENALTY.low;
|
|
33
|
+
const score = Math.max(0, 100 - penalty);
|
|
34
|
+
return { score, label: scoreLabel(score), high, medium, low };
|
|
35
|
+
}
|
|
36
|
+
function scoreLabel(score) {
|
|
37
|
+
if (score >= 90)
|
|
38
|
+
return 'HEALTHY';
|
|
39
|
+
if (score >= 70)
|
|
40
|
+
return 'GOOD';
|
|
41
|
+
if (score >= 40)
|
|
42
|
+
return 'RISKY';
|
|
43
|
+
return 'CRITICAL';
|
|
44
|
+
}
|
|
45
|
+
// ─── Formatter helper ─────────────────────────────────────────────────────────
|
|
46
|
+
const LABEL_ICON = {
|
|
47
|
+
HEALTHY: '✅',
|
|
48
|
+
GOOD: '🟡',
|
|
49
|
+
RISKY: '🟠',
|
|
50
|
+
CRITICAL: '🔴',
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Renders the score block appended to reports.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* Score: 62/100 🟠 RISKY
|
|
57
|
+
*
|
|
58
|
+
* Issues:
|
|
59
|
+
* 🔴 1 high — version mismatch
|
|
60
|
+
* 🟠 2 medium — singleton gaps, duplicate libs
|
|
61
|
+
* 🟡 0 low — over-sharing
|
|
62
|
+
*/
|
|
63
|
+
export function formatScoreBlock(score, highLabel, mediumLabel, lowLabel) {
|
|
64
|
+
const icon = LABEL_ICON[score.label];
|
|
65
|
+
const lines = [];
|
|
66
|
+
lines.push(`Score: ${score.score}/100 ${icon} ${score.label}`);
|
|
67
|
+
lines.push('');
|
|
68
|
+
lines.push('Issues:');
|
|
69
|
+
lines.push(` 🔴 ${score.high} high — ${highLabel}`);
|
|
70
|
+
lines.push(` 🟠 ${score.medium} medium — ${mediumLabel}`);
|
|
71
|
+
lines.push(` 🟡 ${score.low} low — ${lowLabel}`);
|
|
72
|
+
return lines.join('\n');
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/reporter/scoring.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mf-toolkit/shared-inspector",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.4.1",
|
|
4
|
+
"description": "Stop debugging Module Federation in production. Audit shared config at build time.",
|
|
5
5
|
"author": "Vitaly Zheltko",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mf-inspector": "./dist/cli.js"
|
|
10
|
+
},
|
|
8
11
|
"exports": {
|
|
9
12
|
".": {
|
|
10
13
|
"types": "./dist/index.d.ts",
|
|
@@ -45,7 +48,9 @@
|
|
|
45
48
|
"typescript": ">=4.7"
|
|
46
49
|
},
|
|
47
50
|
"peerDependenciesMeta": {
|
|
48
|
-
"typescript": {
|
|
51
|
+
"typescript": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
49
54
|
},
|
|
50
55
|
"devDependencies": {
|
|
51
56
|
"@types/semver": "^7.5.8",
|