@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
@@ -0,0 +1,98 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ const VALID_DEPTHS = new Set(['direct', 'local-graph']);
4
+ const VALID_FAIL_ON = new Set(['mismatch', 'unused', 'any']);
5
+ export function parseArgs(argv) {
6
+ const args = {
7
+ command: 'project',
8
+ interactive: false,
9
+ sourceDirs: [],
10
+ depth: 'local-graph',
11
+ workspacePackages: [],
12
+ writeManifest: false,
13
+ outputDir: '.',
14
+ manifestFiles: [],
15
+ };
16
+ if (argv[0] === 'federation') {
17
+ args.command = 'federation';
18
+ for (let i = 1; i < argv.length; i++) {
19
+ if (argv[i] === '--help' || argv[i] === '-h') {
20
+ args.command = 'help';
21
+ break;
22
+ }
23
+ if (!argv[i].startsWith('-')) {
24
+ args.manifestFiles.push(argv[i]);
25
+ }
26
+ }
27
+ return args;
28
+ }
29
+ for (let i = 0; i < argv.length; i++) {
30
+ const arg = argv[i];
31
+ switch (arg) {
32
+ case '--help':
33
+ case '-h':
34
+ args.command = 'help';
35
+ break;
36
+ case '--version':
37
+ case '-v':
38
+ args.command = 'version';
39
+ break;
40
+ case '--interactive':
41
+ case '-i':
42
+ args.interactive = true;
43
+ break;
44
+ case '--source':
45
+ case '-s':
46
+ args.sourceDirs.push(...(argv[++i] ?? '').split(',').filter(Boolean));
47
+ break;
48
+ case '--depth': {
49
+ const val = argv[++i] ?? '';
50
+ if (!VALID_DEPTHS.has(val)) {
51
+ throw new Error(`Invalid --depth value "${val}". Expected: direct | local-graph`);
52
+ }
53
+ args.depth = val;
54
+ break;
55
+ }
56
+ case '--shared':
57
+ args.sharedConfig = parseSharedValue(argv[++i] ?? '');
58
+ break;
59
+ case '--tsconfig':
60
+ args.tsconfigPath = argv[++i];
61
+ break;
62
+ case '--workspace-packages':
63
+ args.workspacePackages.push(...(argv[++i] ?? '').split(',').filter(Boolean));
64
+ break;
65
+ case '--fail-on': {
66
+ const val = argv[++i] ?? '';
67
+ if (!VALID_FAIL_ON.has(val)) {
68
+ throw new Error(`Invalid --fail-on value "${val}". Expected: mismatch | unused | any`);
69
+ }
70
+ args.failOn = val;
71
+ break;
72
+ }
73
+ case '--write-manifest':
74
+ args.writeManifest = true;
75
+ break;
76
+ case '--output-dir':
77
+ args.outputDir = argv[++i] ?? '.';
78
+ break;
79
+ case '--name':
80
+ args.name = argv[++i];
81
+ break;
82
+ }
83
+ }
84
+ if (!args.interactive && args.sourceDirs.length === 0) {
85
+ args.sourceDirs = ['./src'];
86
+ }
87
+ return args;
88
+ }
89
+ export function parseSharedValue(value) {
90
+ if (!value)
91
+ return {};
92
+ if (value.endsWith('.json')) {
93
+ const content = readFileSync(resolve(process.cwd(), value), 'utf-8');
94
+ return JSON.parse(content);
95
+ }
96
+ return Object.fromEntries(value.split(',').filter(Boolean).map((p) => [p.trim(), {}]));
97
+ }
98
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Adds ANSI colors to a formatted report string.
3
+ * Returns the original string unchanged when stdout is not a TTY.
4
+ */
5
+ export declare function colorizeReport(text: string): string;
6
+ //# sourceMappingURL=colorize-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorize-report.d.ts","sourceRoot":"","sources":["../../src/cli/colorize-report.ts"],"names":[],"mappings":"AAmDA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD"}
@@ -0,0 +1,71 @@
1
+ // ─── Report colorizer ─────────────────────────────────────────────────────────
2
+ //
3
+ // Post-processes the plain-text output of formatReport / formatFederationReport,
4
+ // adding ANSI colors line-by-line.
5
+ //
6
+ // Separated from the reporters so the library API stays color-free
7
+ // (useful for programmatic consumers, JSON pipelines, etc.)
8
+ import { isTTY, bold, dim, red, yellow, green, cyan, gray, combine } from './colors.js';
9
+ // ─── Line matchers ────────────────────────────────────────────────────────────
10
+ function colorizeLine(line) {
11
+ // ── Issue titles ────────────────────────────────────────────────────────────
12
+ if (/^⚠ Version (Mismatch|Conflict)/.test(line))
13
+ return combine(bold, red)(line);
14
+ if (/^⚠ (Singleton Risk|Singleton Mismatch|Eager Risk)/.test(line))
15
+ return combine(bold, yellow)(line);
16
+ if (/^→ (Not Shared|Host Gap)/.test(line))
17
+ return combine(bold, cyan)(line);
18
+ if (/^✗ (Unused Shared|Ghost Share)/.test(line))
19
+ return dim(line);
20
+ // ── Card detail lines ───────────────────────────────────────────────────────
21
+ if (/→ Risk:/.test(line))
22
+ return line.replace('→ Risk:', red('→ Risk:'));
23
+ if (/💡 Fix:/.test(line))
24
+ return green(line);
25
+ if (/Remove ".+" from/.test(line))
26
+ return green(line);
27
+ // ── Score block ─────────────────────────────────────────────────────────────
28
+ if (/^Score:\s+\d+\/100/.test(line)) {
29
+ if (line.includes('CRITICAL'))
30
+ return combine(bold, red)(line);
31
+ if (line.includes('RISKY'))
32
+ return combine(bold, yellow)(line);
33
+ if (line.includes('GOOD'))
34
+ return combine(bold, cyan)(line);
35
+ if (line.includes('HEALTHY'))
36
+ return combine(bold, green)(line);
37
+ return bold(line);
38
+ }
39
+ // ── Section markers ─────────────────────────────────────────────────────────
40
+ if (/^\[MfSharedInspector\]/.test(line))
41
+ return bold(line);
42
+ if (/^[─]{10,}/.test(line))
43
+ return gray(line);
44
+ if (/^Total:/.test(line))
45
+ return dim(line);
46
+ if (/^Issues:/.test(line))
47
+ return bold(line);
48
+ // ── Score issue rows ─────────────────────────────────────────────────────────
49
+ if (/🔴/.test(line))
50
+ return line; // emoji already colored in supported terminals
51
+ if (/🟠/.test(line))
52
+ return line;
53
+ if (/🟡/.test(line))
54
+ return line;
55
+ // ── Clean / no-issues ────────────────────────────────────────────────────────
56
+ if (/✓\s+No issues/.test(line))
57
+ return combine(bold, green)(line);
58
+ if (/✓\s+No federation/.test(line))
59
+ return combine(bold, green)(line);
60
+ return line;
61
+ }
62
+ /**
63
+ * Adds ANSI colors to a formatted report string.
64
+ * Returns the original string unchanged when stdout is not a TTY.
65
+ */
66
+ export function colorizeReport(text) {
67
+ if (!isTTY)
68
+ return text;
69
+ return text.split('\n').map(colorizeLine).join('\n');
70
+ }
71
+ //# sourceMappingURL=colorize-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorize-report.js","sourceRoot":"","sources":["../../src/cli/colorize-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare const isTTY: boolean;
2
+ export declare const bold: (s: string) => string;
3
+ export declare const dim: (s: string) => string;
4
+ export declare const italic: (s: string) => string;
5
+ export declare const red: (s: string) => string;
6
+ export declare const yellow: (s: string) => string;
7
+ export declare const green: (s: string) => string;
8
+ export declare const cyan: (s: string) => string;
9
+ export declare const blue: (s: string) => string;
10
+ export declare const magenta: (s: string) => string;
11
+ export declare const gray: (s: string) => string;
12
+ /** Combine two color transforms. */
13
+ export declare function combine(...fns: Array<(s: string) => string>): (s: string) => string;
14
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK,EAAE,OAGY,CAAC;AAQjC,eAAO,MAAM,IAAI,MAHJ,MAAM,WAGoB,CAAC;AACxC,eAAO,MAAM,GAAG,MAJH,MAAM,WAIoB,CAAC;AACxC,eAAO,MAAM,MAAM,MALN,MAAM,WAKoB,CAAC;AACxC,eAAO,MAAM,GAAG,MANH,MAAM,WAMoB,CAAC;AACxC,eAAO,MAAM,MAAM,MAPN,MAAM,WAOoB,CAAC;AACxC,eAAO,MAAM,KAAK,MARL,MAAM,WAQoB,CAAC;AACxC,eAAO,MAAM,IAAI,MATJ,MAAM,WASoB,CAAC;AACxC,eAAO,MAAM,IAAI,MAVJ,MAAM,WAUoB,CAAC;AACxC,eAAO,MAAM,OAAO,MAXP,MAAM,WAWoB,CAAC;AACxC,eAAO,MAAM,IAAI,MAZJ,MAAM,WAYoB,CAAC;AAExC,oCAAoC;AACpC,wBAAgB,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAEnF"}
@@ -0,0 +1,26 @@
1
+ // ─── ANSI color helpers ───────────────────────────────────────────────────────
2
+ //
3
+ // No external dependencies — plain escape codes.
4
+ // Auto-disabled when stdout is not a TTY or NO_COLOR env var is set.
5
+ export const isTTY = Boolean(process.stdout.isTTY) &&
6
+ !process.env['NO_COLOR'] &&
7
+ process.env['TERM'] !== 'dumb';
8
+ const ESC = '\x1b[';
9
+ function wrap(code, reset) {
10
+ return (s) => (isTTY ? `${ESC}${code}m${s}${ESC}${reset}m` : s);
11
+ }
12
+ export const bold = wrap('1', '22');
13
+ export const dim = wrap('2', '22');
14
+ export const italic = wrap('3', '23');
15
+ export const red = wrap('31', '39');
16
+ export const yellow = wrap('33', '39');
17
+ export const green = wrap('32', '39');
18
+ export const cyan = wrap('36', '39');
19
+ export const blue = wrap('34', '39');
20
+ export const magenta = wrap('35', '39');
21
+ export const gray = wrap('90', '39');
22
+ /** Combine two color transforms. */
23
+ export function combine(...fns) {
24
+ return (s) => fns.reduce((acc, fn) => fn(acc), s);
25
+ }
26
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,iDAAiD;AACjD,qEAAqE;AAErE,MAAM,CAAC,MAAM,KAAK,GAChB,OAAO,CAAE,OAAO,CAAC,MAA6B,CAAC,KAAK,CAAC;IACrD,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;AAEjC,MAAM,GAAG,GAAG,OAAO,CAAC;AAEpB,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAM,IAAI,CAAC,GAAG,EAAG,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,GAAG,GAAO,IAAI,CAAC,GAAG,EAAG,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,MAAM,GAAI,IAAI,CAAC,GAAG,EAAG,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,GAAG,GAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,MAAM,GAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,KAAK,GAAK,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,IAAI,GAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,IAAI,GAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,IAAI,GAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAExC,oCAAoC;AACpC,MAAM,UAAU,OAAO,CAAC,GAAG,GAAiC;IAC1D,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const HELP = "Usage:\n mf-inspector [options] Analyse project shared config\n mf-inspector --interactive Step-by-step interactive wizard\n mf-inspector federation <manifest> ... Cross-MF federation analysis\n\nProject options:\n --source, -s <dirs> Source dirs to scan, comma-separated (default: ./src)\n --depth <depth> Scan depth: direct | local-graph (default: local-graph)\n --shared <packages|file> Comma-separated package names or path to .json config\n --tsconfig <path> tsconfig.json for path alias resolution\n --workspace-packages <pkgs> Comma-separated workspace packages to exclude\n --name <name> Project name (default: auto from package.json)\n --fail-on <rule> Exit 1 when findings match: mismatch | unused | any\n --write-manifest Write project-manifest.json to output dir\n --output-dir <dir> Output directory for manifest (default: .)\n --interactive, -i Launch step-by-step wizard instead of flags\n --version, -v Print version and exit\n --help, -h Show this help\n\nFederation:\n mf-inspector federation checkout.json catalog.json cart.json\n\nExamples:\n mf-inspector\n mf-inspector --interactive\n mf-inspector --source ./src --shared react,react-dom --fail-on mismatch\n mf-inspector --shared ./shared-config.json --write-manifest\n mf-inspector federation ./manifests/checkout.json ./manifests/catalog.json\n";
2
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,4+CA4BhB,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const HELP = `Usage:
2
+ mf-inspector [options] Analyse project shared config
3
+ mf-inspector --interactive Step-by-step interactive wizard
4
+ mf-inspector federation <manifest> ... Cross-MF federation analysis
5
+
6
+ Project options:
7
+ --source, -s <dirs> Source dirs to scan, comma-separated (default: ./src)
8
+ --depth <depth> Scan depth: direct | local-graph (default: local-graph)
9
+ --shared <packages|file> Comma-separated package names or path to .json config
10
+ --tsconfig <path> tsconfig.json for path alias resolution
11
+ --workspace-packages <pkgs> Comma-separated workspace packages to exclude
12
+ --name <name> Project name (default: auto from package.json)
13
+ --fail-on <rule> Exit 1 when findings match: mismatch | unused | any
14
+ --write-manifest Write project-manifest.json to output dir
15
+ --output-dir <dir> Output directory for manifest (default: .)
16
+ --interactive, -i Launch step-by-step wizard instead of flags
17
+ --version, -v Print version and exit
18
+ --help, -h Show this help
19
+
20
+ Federation:
21
+ mf-inspector federation checkout.json catalog.json cart.json
22
+
23
+ Examples:
24
+ mf-inspector
25
+ mf-inspector --interactive
26
+ mf-inspector --source ./src --shared react,react-dom --fail-on mismatch
27
+ mf-inspector --shared ./shared-config.json --write-manifest
28
+ mf-inspector federation ./manifests/checkout.json ./manifests/catalog.json
29
+ `;
30
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PromptFn } from './types.js';
2
+ export { parseArgs, parseSharedValue } from './args.js';
3
+ export { shouldFail } from './run-project.js';
4
+ export { runInteractive } from './interactive.js';
5
+ export { HELP } from './help.js';
6
+ export type { CliArgs, PromptFn } from './types.js';
7
+ export declare function main(argv: string[], write?: (s: string) => void, prompt?: PromptFn): Promise<number>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkBpD,wBAAsB,IAAI,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAqC,EAC3D,MAAM,CAAC,EAAE,QAAQ,GAChB,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
@@ -0,0 +1,62 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { parseArgs } from './args.js';
3
+ import { HELP } from './help.js';
4
+ import { runInteractive, makeReadlinePrompt } from './interactive.js';
5
+ import { runProject } from './run-project.js';
6
+ import { runFederation } from './run-federation.js';
7
+ import { bold, cyan, gray, red, isTTY } from './colors.js';
8
+ export { parseArgs, parseSharedValue } from './args.js';
9
+ export { shouldFail } from './run-project.js';
10
+ export { runInteractive } from './interactive.js';
11
+ export { HELP } from './help.js';
12
+ function getVersion() {
13
+ try {
14
+ const pkgUrl = new URL('../../package.json', import.meta.url);
15
+ const pkg = JSON.parse(readFileSync(pkgUrl, 'utf-8'));
16
+ return pkg.version;
17
+ }
18
+ catch {
19
+ return 'unknown';
20
+ }
21
+ }
22
+ function printBanner(write, version) {
23
+ if (!isTTY)
24
+ return;
25
+ const v = gray(`v${version}`);
26
+ write(`\n ${bold(cyan('mf-inspector'))} ${v}\n\n`);
27
+ }
28
+ export async function main(argv, write = (s) => process.stdout.write(s), prompt) {
29
+ let args;
30
+ try {
31
+ args = parseArgs(argv);
32
+ }
33
+ catch (err) {
34
+ write(`${red('Error:')} ${err.message}\n`);
35
+ return 1;
36
+ }
37
+ if (args.command === 'help') {
38
+ write(HELP);
39
+ return 0;
40
+ }
41
+ const version = getVersion();
42
+ if (args.command === 'version') {
43
+ write(`@mf-toolkit/shared-inspector ${version}\n`);
44
+ return 0;
45
+ }
46
+ printBanner(write, version);
47
+ if (args.command === 'federation') {
48
+ return runFederation(args, write);
49
+ }
50
+ if (args.interactive) {
51
+ let rl;
52
+ if (!prompt) {
53
+ const readline = await makeReadlinePrompt();
54
+ prompt = readline.prompt;
55
+ rl = readline;
56
+ }
57
+ args = await runInteractive(args, write, prompt);
58
+ rl?.close();
59
+ }
60
+ return runProject(args, write);
61
+ }
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CliArgs, PromptFn } from './types.js';
2
+ export declare function runInteractive(args: CliArgs, write: (s: string) => void, prompt: PromptFn): Promise<CliArgs>;
3
+ /** Creates a readline-based PromptFn using Node built-ins (no extra deps). */
4
+ export declare function makeReadlinePrompt(): Promise<{
5
+ prompt: PromptFn;
6
+ close: () => void;
7
+ }>;
8
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGpD,wBAAsB,cAAc,CAClC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,EAC1B,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,OAAO,CAAC,CAsClB;AAED,8EAA8E;AAC9E,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAO3F"}
@@ -0,0 +1,41 @@
1
+ import { parseSharedValue } from './args.js';
2
+ export async function runInteractive(args, write, prompt) {
3
+ write('\n[MfSharedInspector] Interactive setup\n\n');
4
+ const sourceDirsRaw = await prompt('Source directories to scan (default: ./src): ');
5
+ args.sourceDirs = sourceDirsRaw.trim()
6
+ ? sourceDirsRaw.split(',').map((s) => s.trim()).filter(Boolean)
7
+ : ['./src'];
8
+ const depthRaw = await prompt('Scan depth — direct or local-graph (default: local-graph): ');
9
+ args.depth = depthRaw.trim() === 'direct' ? 'direct' : 'local-graph';
10
+ const sharedRaw = await prompt('Shared packages — comma-separated names or path to .json (empty to skip): ');
11
+ args.sharedConfig = sharedRaw.trim() ? parseSharedValue(sharedRaw.trim()) : undefined;
12
+ const tsconfigRaw = await prompt('Path to tsconfig.json for alias resolution (empty to skip): ');
13
+ args.tsconfigPath = tsconfigRaw.trim() || undefined;
14
+ const wsRaw = await prompt('Workspace packages to exclude, comma-separated (empty to skip): ');
15
+ args.workspacePackages = wsRaw.trim()
16
+ ? wsRaw.split(',').map((s) => s.trim()).filter(Boolean)
17
+ : [];
18
+ const failOnRaw = await prompt('Fail build on findings — mismatch / unused / any / none (default: none): ');
19
+ const failOnVal = failOnRaw.trim();
20
+ args.failOn = ['mismatch', 'unused', 'any'].includes(failOnVal)
21
+ ? failOnVal
22
+ : undefined;
23
+ const writeManifestRaw = await prompt('Write project-manifest.json? (y/N): ');
24
+ args.writeManifest = writeManifestRaw.trim().toLowerCase() === 'y';
25
+ if (args.writeManifest) {
26
+ const outputDirRaw = await prompt('Output directory for manifest (default: .): ');
27
+ args.outputDir = outputDirRaw.trim() || '.';
28
+ }
29
+ write('\n');
30
+ return args;
31
+ }
32
+ /** Creates a readline-based PromptFn using Node built-ins (no extra deps). */
33
+ export async function makeReadlinePrompt() {
34
+ const { createInterface } = await import('node:readline/promises');
35
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
36
+ return {
37
+ prompt: (question) => rl.question(question),
38
+ close: () => rl.close(),
39
+ };
40
+ }
41
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliArgs } from './types.js';
2
+ export declare function runFederation(args: CliArgs, write: (s: string) => void): Promise<number>;
3
+ //# sourceMappingURL=run-federation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-federation.d.ts","sourceRoot":"","sources":["../../src/cli/run-federation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAsB,aAAa,CACjC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -0,0 +1,41 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { analyzeFederation } from '../analyzer/analyze-federation.js';
4
+ import { formatFederationReport } from '../reporter/format-federation-report.js';
5
+ import { createSpinner } from './spinner.js';
6
+ import { colorizeReport } from './colorize-report.js';
7
+ export async function runFederation(args, write) {
8
+ if (args.manifestFiles.length === 0) {
9
+ write('Error: federation command requires at least one manifest file\n');
10
+ write('Usage: mf-inspector federation <manifest1.json> [manifest2.json...]\n');
11
+ return 1;
12
+ }
13
+ const spinner = createSpinner();
14
+ spinner.start(`Loading ${args.manifestFiles.length} manifest${args.manifestFiles.length > 1 ? 's' : ''}`);
15
+ const manifests = [];
16
+ for (const file of args.manifestFiles) {
17
+ const filePath = resolve(process.cwd(), file);
18
+ let content;
19
+ try {
20
+ content = readFileSync(filePath, 'utf-8');
21
+ }
22
+ catch {
23
+ spinner.stop();
24
+ write(`Error: cannot read file "${file}"\n`);
25
+ return 1;
26
+ }
27
+ try {
28
+ manifests.push(JSON.parse(content));
29
+ }
30
+ catch {
31
+ spinner.stop();
32
+ write(`Error: "${file}" is not valid JSON\n`);
33
+ return 1;
34
+ }
35
+ }
36
+ spinner.succeed(`Loaded ${manifests.length} manifest${manifests.length > 1 ? 's' : ''}`);
37
+ const report = analyzeFederation(manifests);
38
+ write(colorizeReport(formatFederationReport(report)));
39
+ return 0;
40
+ }
41
+ //# sourceMappingURL=run-federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-federation.js","sourceRoot":"","sources":["../../src/cli/run-federation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAa,EACb,KAA0B;IAE1B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACzE,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC/E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,MAAM,YAAY,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1G,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,CAAC,4BAA4B,IAAI,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,CAAC,WAAW,IAAI,uBAAuB,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,UAAU,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzF,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ProjectReport } from '../types.js';
2
+ import type { CliArgs } from './types.js';
3
+ export declare function shouldFail(report: ProjectReport, failOn: 'mismatch' | 'unused' | 'any'): boolean;
4
+ export declare function runProject(args: CliArgs, write: (s: string) => void): Promise<number>;
5
+ //# sourceMappingURL=run-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-project.d.ts","sourceRoot":"","sources":["../../src/cli/run-project.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAUhG;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,CA0CjB"}
@@ -0,0 +1,57 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { buildProjectManifest } from '../collector/build-project-manifest.js';
4
+ import { analyzeProject } from '../analyzer/analyze-project.js';
5
+ import { formatReport } from '../reporter/format-report.js';
6
+ import { writeManifest } from '../reporter/write-report.js';
7
+ import { createSpinner } from './spinner.js';
8
+ import { colorizeReport } from './colorize-report.js';
9
+ export function shouldFail(report, failOn) {
10
+ if (failOn === 'mismatch')
11
+ return report.mismatched.length > 0;
12
+ if (failOn === 'unused')
13
+ return report.unused.length > 0;
14
+ return (report.mismatched.length > 0 ||
15
+ report.unused.length > 0 ||
16
+ report.candidates.length > 0 ||
17
+ report.singletonRisks.length > 0 ||
18
+ report.eagerRisks.length > 0);
19
+ }
20
+ export async function runProject(args, write) {
21
+ let name = args.name;
22
+ if (!name) {
23
+ try {
24
+ const pkg = JSON.parse(readFileSync(resolve(process.cwd(), 'package.json'), 'utf-8'));
25
+ name = pkg.name ?? 'project';
26
+ }
27
+ catch {
28
+ name = 'project';
29
+ }
30
+ }
31
+ const spinner = createSpinner();
32
+ spinner.start(`Scanning ${args.sourceDirs.join(', ')}`);
33
+ const manifest = await buildProjectManifest({
34
+ name,
35
+ sourceDirs: args.sourceDirs,
36
+ depth: args.depth,
37
+ sharedConfig: args.sharedConfig,
38
+ tsconfigPath: args.tsconfigPath,
39
+ workspacePackages: args.workspacePackages,
40
+ });
41
+ spinner.succeed(`Scanned ${manifest.source.filesScanned} files`);
42
+ const report = analyzeProject(manifest);
43
+ write(colorizeReport(formatReport(report, {
44
+ name: manifest.project.name,
45
+ depth: manifest.source.depth,
46
+ filesScanned: manifest.source.filesScanned,
47
+ })));
48
+ if (args.writeManifest) {
49
+ const outPath = resolve(args.outputDir, 'project-manifest.json');
50
+ await writeManifest(manifest, outPath);
51
+ write(`\n Manifest written to ${outPath}\n`);
52
+ }
53
+ if (args.failOn && shouldFail(report, args.failOn))
54
+ return 1;
55
+ return 0;
56
+ }
57
+ //# sourceMappingURL=run-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-project.js","sourceRoot":"","sources":["../../src/cli/run-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface Spinner {
2
+ /** Start animating with a label. */
3
+ start(text: string): void;
4
+ /** Stop animation and print a success line. */
5
+ succeed(text: string): void;
6
+ /** Stop animation silently (clears the line). */
7
+ stop(): void;
8
+ }
9
+ export declare function createSpinner(): Spinner;
10
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/cli/spinner.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,OAAO;IACtB,oCAAoC;IACpC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+CAA+C;IAC/C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,aAAa,IAAI,OAAO,CAsCvC"}