@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.
Files changed (66) hide show
  1. package/README.md +320 -156
  2. package/dist/cli/args.d.ts +5 -0
  3. package/dist/cli/args.d.ts.map +1 -0
  4. package/dist/cli/args.js +98 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/colorize-report.d.ts +6 -0
  7. package/dist/cli/colorize-report.d.ts.map +1 -0
  8. package/dist/cli/colorize-report.js +71 -0
  9. package/dist/cli/colorize-report.js.map +1 -0
  10. package/dist/cli/colors.d.ts +14 -0
  11. package/dist/cli/colors.d.ts.map +1 -0
  12. package/dist/cli/colors.js +26 -0
  13. package/dist/cli/colors.js.map +1 -0
  14. package/dist/cli/help.d.ts +2 -0
  15. package/dist/cli/help.d.ts.map +1 -0
  16. package/dist/cli/help.js +30 -0
  17. package/dist/cli/help.js.map +1 -0
  18. package/dist/cli/index.d.ts +8 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +62 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/interactive.d.ts +8 -0
  23. package/dist/cli/interactive.d.ts.map +1 -0
  24. package/dist/cli/interactive.js +41 -0
  25. package/dist/cli/interactive.js.map +1 -0
  26. package/dist/cli/run-federation.d.ts +3 -0
  27. package/dist/cli/run-federation.d.ts.map +1 -0
  28. package/dist/cli/run-federation.js +41 -0
  29. package/dist/cli/run-federation.js.map +1 -0
  30. package/dist/cli/run-project.d.ts +5 -0
  31. package/dist/cli/run-project.d.ts.map +1 -0
  32. package/dist/cli/run-project.js +57 -0
  33. package/dist/cli/run-project.js.map +1 -0
  34. package/dist/cli/spinner.d.ts +10 -0
  35. package/dist/cli/spinner.d.ts.map +1 -0
  36. package/dist/cli/spinner.js +45 -0
  37. package/dist/cli/spinner.js.map +1 -0
  38. package/dist/cli/types.d.ts +17 -0
  39. package/dist/cli/types.d.ts.map +1 -0
  40. package/dist/cli/types.js +2 -0
  41. package/dist/cli/types.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +13 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/reporter/diagnostics.d.ts +23 -0
  51. package/dist/reporter/diagnostics.d.ts.map +1 -0
  52. package/dist/reporter/diagnostics.js +138 -0
  53. package/dist/reporter/diagnostics.js.map +1 -0
  54. package/dist/reporter/format-federation-report.d.ts +11 -5
  55. package/dist/reporter/format-federation-report.d.ts.map +1 -1
  56. package/dist/reporter/format-federation-report.js +78 -37
  57. package/dist/reporter/format-federation-report.js.map +1 -1
  58. package/dist/reporter/format-report.d.ts +14 -7
  59. package/dist/reporter/format-report.d.ts.map +1 -1
  60. package/dist/reporter/format-report.js +67 -38
  61. package/dist/reporter/format-report.js.map +1 -1
  62. package/dist/reporter/scoring.d.ts +28 -0
  63. package/dist/reporter/scoring.d.ts.map +1 -0
  64. package/dist/reporter/scoring.js +74 -0
  65. package/dist/reporter/scoring.js.map +1 -0
  66. 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 a human-readable terminal string.
5
+ * Formats a ProjectReport as actionable diagnostic cards.
3
6
  *
4
- * Section order (by severity / determinism):
5
- * 1. Version mismatch — deterministic, most dangerous
6
- * 2. Unused shared — deterministic, easy wins
7
- * 3. Candidates — heuristic, actionable suggestions
8
- * 4. Singleton risks — heuristic, potential runtime issues
9
- * 5. Summary line
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
- // Header
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
- if (mismatched.length > 0) {
27
- lines.push(' Version mismatch (sharing silently broken):');
28
- for (const m of mismatched) {
29
- lines.push(` ${m.package} requires ${m.configured}, installed ${m.installed}`);
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
- if (unused.length > 0) {
35
- lines.push(' Unused shared (safe to remove):');
36
- for (const u of unused) {
37
- const note = u.singleton ? 'shared as singleton' : 'shared without singleton';
38
- lines.push(` ✗ ${u.package} — 0 imports, ${note}`);
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
- if (candidates.length > 0) {
44
- lines.push(' Candidates (consider adding to shared):');
45
- for (const c of candidates) {
46
- const fileCount = c.files.length;
47
- const filesLabel = fileCount === 1 ? '1 file' : `${fileCount} files`;
48
- const viaLabel = c.via === 'reexport' ? `, via re-export in ${c.files[0]}` : '';
49
- lines.push(` ${c.package} (${c.importCount} imports in ${filesLabel}${viaLabel})`);
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
- if (singletonRisks.length > 0) {
55
- lines.push(' Singleton risks (add singleton: true):');
56
- for (const r of singletonRisks) {
57
- lines.push(` ⚠ ${r.package} — manages global state, singleton: true recommended`);
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
- if (eagerRisks.length > 0) {
63
- lines.push(' Eager risks (add singleton: true or remove eager: true):');
64
- for (const r of eagerRisks) {
65
- lines.push(` ⚠ ${r.package} — eager: true without singleton: true, risk of duplicate instances`);
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
- lines.push(` Total: ${summary.totalShared} shared, ${summary.usedShared} used, ` +
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":"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"}
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.3.2",
4
- "description": "Build-time shared dependency analyzer for Module Federation.",
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": { "optional": true }
51
+ "typescript": {
52
+ "optional": true
53
+ }
49
54
  },
50
55
  "devDependencies": {
51
56
  "@types/semver": "^7.5.8",