@mf-toolkit/shared-inspector 0.4.0 → 0.5.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/README.md +278 -100
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +42 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +12 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/run-federation.d.ts.map +1 -1
- package/dist/cli/run-federation.js +49 -10
- package/dist/cli/run-federation.js.map +1 -1
- package/dist/cli/run-project.d.ts.map +1 -1
- package/dist/cli/run-project.js +19 -8
- package/dist/cli/run-project.js.map +1 -1
- package/dist/cli/spinner.d.ts +1 -0
- package/dist/cli/spinner.d.ts.map +1 -1
- package/dist/cli/spinner.js +3 -0
- package/dist/cli/spinner.js.map +1 -1
- package/dist/cli/types.d.ts +3 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -6,81 +6,108 @@
|
|
|
6
6
|
|
|
7
7
|
**Stop debugging Module Federation in production.**
|
|
8
8
|
|
|
9
|
-
`shared` config breaks in silence — wrong versions ship,
|
|
9
|
+
`shared` config breaks in silence — wrong versions ship, duplicate React copies can end up in the bundle, singleton negotiation fails, and teams get paged for "Invalid hook call" on Friday night. `shared-inspector` catches these mistakes at build time. Every finding comes with a risk score and a ready-to-paste fix.
|
|
10
10
|
|
|
11
11
|
## The problem
|
|
12
12
|
|
|
13
13
|
Module Federation teams manually manage `shared` config and make three kinds of mistakes:
|
|
14
14
|
|
|
15
15
|
- **Over-sharing** — packages listed in `shared` that the microfrontend never imports. Creates artificial version coupling between independent teams.
|
|
16
|
-
- **Under-sharing** — packages used by both host and remote but missing from `shared`. Each microfrontend
|
|
16
|
+
- **Under-sharing** — packages used by both host and remote but missing from `shared`. Each microfrontend may bundle its own copy (e.g. multiple React instances, each ~130 KB).
|
|
17
17
|
- **Version mismatch** — `requiredVersion` doesn't match the installed version. Module Federation silently falls back to a local bundle. For packages with global state (React, styled-components) this causes "Invalid hook call" in production.
|
|
18
18
|
|
|
19
19
|
Existing tools (webpack-bundle-analyzer, source-map-explorer) show *what ended up in the bundle*, not *why shared config is suboptimal*. Different questions.
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Why not bundle analyzer?
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
npm install --save-dev @mf-toolkit/shared-inspector
|
|
25
|
-
```
|
|
23
|
+
Bundle analyzers (webpack-bundle-analyzer, source-map-explorer, stats.json inspection) answer a different question: *what is in the output?* They are useful for auditing final bundle size, but they don't model Module Federation's shared dependency negotiation.
|
|
26
24
|
|
|
27
|
-
|
|
25
|
+
| Question | Bundle analyzer | shared-inspector |
|
|
26
|
+
|----------|----------------|-----------------|
|
|
27
|
+
| Which packages are large? | ✅ | — |
|
|
28
|
+
| Is React duplicated across MFs? | Visible after the fact | ✅ Detected before build ships |
|
|
29
|
+
| Is `requiredVersion` out of sync with the installed version? | ✗ | ✅ |
|
|
30
|
+
| Is a package marked `singleton` in one MF but not another? | ✗ | ✅ |
|
|
31
|
+
| Which packages are declared `shared` but never imported? | ✗ | ✅ |
|
|
32
|
+
| Which used packages are missing from `shared` entirely? | ✗ | ✅ |
|
|
33
|
+
| Cross-MF version conflicts across teams? | ✗ | ✅ via federation manifests |
|
|
28
34
|
|
|
29
|
-
|
|
35
|
+
In short: bundle analyzers are useful for post-build inspection. `shared-inspector` is focused on the `shared` config itself — catching misconfiguration at build time and explaining what the runtime consequences would be.
|
|
30
36
|
|
|
31
|
-
|
|
32
|
-
# Analyse the current project (auto-reads name from package.json)
|
|
33
|
-
npx @mf-toolkit/shared-inspector
|
|
37
|
+
## Example
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
npx @mf-toolkit/shared-inspector --interactive
|
|
39
|
+
A `shell` host app (React 18) and a `checkout` remote have been developed by separate teams. Their `shared` configs have drifted:
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
```js
|
|
42
|
+
// shell — webpack.config.js
|
|
43
|
+
shared: {
|
|
44
|
+
react: { singleton: true, requiredVersion: '^18.2.0' },
|
|
45
|
+
'react-dom': { singleton: true, requiredVersion: '^18.2.0' },
|
|
46
|
+
zustand: { singleton: true },
|
|
47
|
+
}
|
|
40
48
|
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
// checkout — webpack.config.js
|
|
50
|
+
shared: {
|
|
51
|
+
react: { singleton: true, requiredVersion: '^17.0.2' }, // ← stale version
|
|
52
|
+
'react-dom': { singleton: true, requiredVersion: '^17.0.2' },
|
|
53
|
+
lodash: {}, // ← never imported
|
|
54
|
+
// zustand: missing — checkout imports it, but it's not in shared
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Running `npx @mf-toolkit/shared-inspector` in the `checkout` project:
|
|
43
59
|
|
|
44
|
-
# Cross-MF federation analysis from saved manifests
|
|
45
|
-
npx @mf-toolkit/shared-inspector federation checkout.json catalog.json cart.json
|
|
46
60
|
```
|
|
61
|
+
[MfSharedInspector] checkout (depth: local-graph, 34 files scanned)
|
|
62
|
+
────────────────────────────────────────────────────────────
|
|
63
|
+
|
|
64
|
+
⚠ Version Mismatch — react
|
|
65
|
+
configured: ^17.0.2 | installed: 17.0.2
|
|
66
|
+
→ Risk: Invalid hook call, broken context across MFs
|
|
67
|
+
💡 Fix:
|
|
68
|
+
shared: {
|
|
69
|
+
react: { singleton: true, requiredVersion: "^18.2.0" }
|
|
70
|
+
}
|
|
47
71
|
|
|
48
|
-
|
|
72
|
+
→ Not Shared — zustand (8 imports in 5 files)
|
|
73
|
+
→ Risk: Each MF may get its own store instance — state changes may not propagate across MFs
|
|
74
|
+
💡 Fix:
|
|
75
|
+
shared: {
|
|
76
|
+
zustand: { singleton: true }
|
|
77
|
+
}
|
|
49
78
|
|
|
79
|
+
✗ Unused Shared — lodash
|
|
80
|
+
0 imports, shared without singleton
|
|
81
|
+
→ Wastes bundle negotiation overhead with no benefit
|
|
82
|
+
💡 Fix: Remove "lodash" from shared config
|
|
83
|
+
|
|
84
|
+
────────────────────────────────────────────────────────────
|
|
85
|
+
Score: 69/100 🟠 RISKY
|
|
50
86
|
```
|
|
51
|
-
$ npx @mf-toolkit/shared-inspector --interactive
|
|
52
87
|
|
|
53
|
-
|
|
88
|
+
**After manually updating the config based on the suggestions above** — `react` version aligned, `zustand` added to `shared`, `lodash` removed:
|
|
54
89
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
Shared packages — comma-separated names or path to .json (empty to skip): react,react-dom,mobx
|
|
58
|
-
Path to tsconfig.json for alias resolution (empty to skip):
|
|
59
|
-
Workspace packages to exclude, comma-separated (empty to skip):
|
|
60
|
-
Fail build on findings — mismatch / unused / any / none (default: none): mismatch
|
|
61
|
-
Write project-manifest.json? (y/N): n
|
|
90
|
+
```
|
|
91
|
+
Score: 100/100 ✅ HEALTHY
|
|
62
92
|
```
|
|
63
93
|
|
|
64
|
-
|
|
94
|
+
The cross-team federation report also clears: `shell` and `checkout` now negotiate a single React instance and a single Zustand store at runtime.
|
|
65
95
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
| `--write-manifest` | `false` | Write `project-manifest.json` to output dir |
|
|
76
|
-
| `--output-dir <dir>` | `.` | Output directory for manifest |
|
|
77
|
-
| `--interactive, -i` | — | Launch step-by-step wizard |
|
|
78
|
-
| `--version, -v` | — | Print version and exit |
|
|
79
|
-
| `--help, -h` | — | Show help |
|
|
96
|
+
## Installation
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm install --save-dev @mf-toolkit/shared-inspector
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Quick start
|
|
103
|
+
|
|
104
|
+
Run against any MF project — no config file needed:
|
|
80
105
|
|
|
81
|
-
|
|
106
|
+
```bash
|
|
107
|
+
npx @mf-toolkit/shared-inspector
|
|
108
|
+
```
|
|
82
109
|
|
|
83
|
-
|
|
110
|
+
The tool scans `./src`, reads installed versions from `package.json`, and prints a diagnostic report. Each finding includes what's wrong, what breaks at runtime, and a ready-to-paste fix:
|
|
84
111
|
|
|
85
112
|
```
|
|
86
113
|
mf-inspector v0.4.0
|
|
@@ -104,7 +131,7 @@ Each finding is rendered as a diagnostic card: what's wrong, what breaks at runt
|
|
|
104
131
|
💡 Fix: Remove "lodash" from shared config
|
|
105
132
|
|
|
106
133
|
→ Not Shared — mobx (12 imports in 8 files via re-export in src/shared/index.ts)
|
|
107
|
-
→ Risk: Each MF
|
|
134
|
+
→ Risk: Each MF may get its own MobX instance — observables and reactions can fail to sync between MFs
|
|
108
135
|
💡 Fix:
|
|
109
136
|
shared: {
|
|
110
137
|
mobx: { singleton: true }
|
|
@@ -123,7 +150,7 @@ Total: 12 shared, 10 used, 1 unused, 1 candidates, 1 mismatch, 0 eager risks
|
|
|
123
150
|
|
|
124
151
|
Colors are auto-applied in TTY terminals and disabled in CI / piped output (`NO_COLOR` / `TERM=dumb` respected).
|
|
125
152
|
|
|
126
|
-
|
|
153
|
+
### Risk scoring
|
|
127
154
|
|
|
128
155
|
Every report ends with a score out of 100:
|
|
129
156
|
|
|
@@ -140,7 +167,43 @@ Every report ends with a score out of 100:
|
|
|
140
167
|
| 40–69 | 🟠 RISKY |
|
|
141
168
|
| 0–39 | 🔴 CRITICAL |
|
|
142
169
|
|
|
143
|
-
|
|
170
|
+
## CI mode
|
|
171
|
+
|
|
172
|
+
Integrate into build pipelines to fail on findings, gate on score, or emit manifests for later federation analysis.
|
|
173
|
+
|
|
174
|
+
### Failing the build
|
|
175
|
+
|
|
176
|
+
Use `--fail-on` to exit with code 1 when specific findings are detected:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
npx @mf-toolkit/shared-inspector --source ./src --shared react,react-dom --fail-on mismatch
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
With the webpack plugin:
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
import { MfSharedInspectorPlugin } from '@mf-toolkit/shared-inspector/webpack';
|
|
186
|
+
|
|
187
|
+
module.exports = {
|
|
188
|
+
plugins: [
|
|
189
|
+
new ModuleFederationPlugin({
|
|
190
|
+
name: 'checkout',
|
|
191
|
+
shared: { react: { singleton: true }, mobx: { singleton: true } },
|
|
192
|
+
}),
|
|
193
|
+
|
|
194
|
+
// sharedConfig not needed — auto-extracted from ModuleFederationPlugin above
|
|
195
|
+
new MfSharedInspectorPlugin({
|
|
196
|
+
sourceDirs: ['./src'],
|
|
197
|
+
failOn: 'mismatch', // 'mismatch' | 'unused' | 'any'
|
|
198
|
+
warn: true,
|
|
199
|
+
}),
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Gating on score
|
|
205
|
+
|
|
206
|
+
Use `scoreProjectReport` programmatically to set custom thresholds:
|
|
144
207
|
|
|
145
208
|
```typescript
|
|
146
209
|
import { analyzeProject, scoreProjectReport } from '@mf-toolkit/shared-inspector';
|
|
@@ -154,9 +217,121 @@ if (score < 70) {
|
|
|
154
217
|
}
|
|
155
218
|
```
|
|
156
219
|
|
|
157
|
-
|
|
220
|
+
### Writing manifests for federation analysis
|
|
221
|
+
|
|
222
|
+
Each MF can emit a `project-manifest.json` as a build artifact to enable cross-team analysis in a later step:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npx @mf-toolkit/shared-inspector --shared ./shared-config.json --write-manifest
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
With the webpack plugin:
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
new MfSharedInspectorPlugin({
|
|
232
|
+
sourceDirs: ['./src'],
|
|
233
|
+
writeManifest: true, // writes project-manifest.json for CI aggregation
|
|
234
|
+
warn: true,
|
|
235
|
+
})
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Upload the manifest as a CI artifact:
|
|
239
|
+
|
|
240
|
+
```yaml
|
|
241
|
+
# .github/workflows/build.yml
|
|
242
|
+
jobs:
|
|
243
|
+
build-checkout:
|
|
244
|
+
steps:
|
|
245
|
+
- run: npm run build # MfSharedInspectorPlugin writes project-manifest.json
|
|
246
|
+
- uses: actions/upload-artifact@v4
|
|
247
|
+
with: { name: manifest-checkout, path: project-manifest.json }
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Federation mode
|
|
251
|
+
|
|
252
|
+
Once each MF has emitted its manifest, aggregate them to detect cross-team conflicts: version mismatches, singleton inconsistencies, and shared-config gaps across host and remotes.
|
|
253
|
+
|
|
254
|
+
Manifests can be local files or HTTP/HTTPS URLs — making federation analysis work across separate repositories without manual file passing.
|
|
158
255
|
|
|
159
|
-
###
|
|
256
|
+
### CLI
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# Local files (monorepo or pre-downloaded)
|
|
260
|
+
npx @mf-toolkit/shared-inspector federation checkout.json catalog.json cart.json
|
|
261
|
+
|
|
262
|
+
# URLs — fetch manifests directly from remote storage
|
|
263
|
+
npx @mf-toolkit/shared-inspector federation \
|
|
264
|
+
https://storage.example.com/manifests/checkout.json \
|
|
265
|
+
https://storage.example.com/manifests/cart.json \
|
|
266
|
+
https://storage.example.com/manifests/catalog.json
|
|
267
|
+
|
|
268
|
+
# Mix of local files and URLs
|
|
269
|
+
npx @mf-toolkit/shared-inspector federation checkout.json https://storage.example.com/cart.json
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Polyrepo setup
|
|
273
|
+
|
|
274
|
+
In a polyrepo, each team owns a separate repository. The recommended workflow:
|
|
275
|
+
|
|
276
|
+
**Step 1 — each MF repo publishes its manifest on every build:**
|
|
277
|
+
|
|
278
|
+
```yaml
|
|
279
|
+
# .github/workflows/build.yml (in each MF repo)
|
|
280
|
+
jobs:
|
|
281
|
+
build:
|
|
282
|
+
steps:
|
|
283
|
+
- run: npm run build # MfSharedInspectorPlugin writes project-manifest.json
|
|
284
|
+
- uses: actions/upload-artifact@v4
|
|
285
|
+
with: { name: manifest-${{ github.event.repository.name }}, path: project-manifest.json }
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Step 2 — a dedicated federation-check job downloads all manifests and runs analysis:**
|
|
289
|
+
|
|
290
|
+
```yaml
|
|
291
|
+
# .github/workflows/federation-check.yml (in a shared/platform repo)
|
|
292
|
+
jobs:
|
|
293
|
+
federation-check:
|
|
294
|
+
steps:
|
|
295
|
+
- uses: actions/download-artifact@v4
|
|
296
|
+
with: { name: manifest-checkout, github-token: ${{ secrets.GITHUB_TOKEN }}, repository: org/checkout, run-id: ... }
|
|
297
|
+
- uses: actions/download-artifact@v4
|
|
298
|
+
with: { name: manifest-cart, github-token: ${{ secrets.GITHUB_TOKEN }}, repository: org/cart, run-id: ... }
|
|
299
|
+
- run: |
|
|
300
|
+
npx @mf-toolkit/shared-inspector federation \
|
|
301
|
+
manifest-checkout/project-manifest.json \
|
|
302
|
+
manifest-cart/project-manifest.json
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Alternatively, upload manifests to a shared HTTP storage (S3, CDN, object store) and use URL inputs directly — no artifact coordination required:
|
|
306
|
+
|
|
307
|
+
```yaml
|
|
308
|
+
- run: |
|
|
309
|
+
npx @mf-toolkit/shared-inspector federation \
|
|
310
|
+
https://manifests.internal/checkout/latest.json \
|
|
311
|
+
https://manifests.internal/cart/latest.json
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Programmatic
|
|
315
|
+
|
|
316
|
+
```typescript
|
|
317
|
+
import { analyzeFederation, formatFederationReport, scoreFederationReport } from '@mf-toolkit/shared-inspector';
|
|
318
|
+
|
|
319
|
+
const report = analyzeFederation([checkoutManifest, catalogManifest, cartManifest]);
|
|
320
|
+
const { score, label } = scoreFederationReport(report);
|
|
321
|
+
|
|
322
|
+
console.log(formatFederationReport(report));
|
|
323
|
+
// ⚠ Version Conflict — react
|
|
324
|
+
// checkout: ^17.0.0
|
|
325
|
+
// catalog: ^18.0.0
|
|
326
|
+
// → Risk: MF singleton negotiation may silently load the wrong version → Invalid hook call
|
|
327
|
+
// 💡 Fix: shared: { react: { singleton: true, requiredVersion: "^18.0.0" } }
|
|
328
|
+
//
|
|
329
|
+
// Score: 60/100 🟠 RISKY
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## Programmatic API
|
|
333
|
+
|
|
334
|
+
### Two-phase API
|
|
160
335
|
|
|
161
336
|
```typescript
|
|
162
337
|
import { buildProjectManifest, analyzeProject, formatReport } from '@mf-toolkit/shared-inspector';
|
|
@@ -203,30 +378,6 @@ const report = await inspect({
|
|
|
203
378
|
});
|
|
204
379
|
```
|
|
205
380
|
|
|
206
|
-
### Webpack plugin
|
|
207
|
-
|
|
208
|
-
`sharedConfig` is optional — the plugin auto-extracts it from `ModuleFederationPlugin` when not provided:
|
|
209
|
-
|
|
210
|
-
```typescript
|
|
211
|
-
import { MfSharedInspectorPlugin } from '@mf-toolkit/shared-inspector/webpack';
|
|
212
|
-
|
|
213
|
-
module.exports = {
|
|
214
|
-
plugins: [
|
|
215
|
-
new ModuleFederationPlugin({
|
|
216
|
-
name: 'checkout',
|
|
217
|
-
shared: { react: { singleton: true }, mobx: { singleton: true } },
|
|
218
|
-
}),
|
|
219
|
-
|
|
220
|
-
// sharedConfig not needed — auto-extracted from ModuleFederationPlugin above
|
|
221
|
-
new MfSharedInspectorPlugin({
|
|
222
|
-
sourceDirs: ['./src'],
|
|
223
|
-
warn: true,
|
|
224
|
-
writeManifest: true, // writes project-manifest.json for CI aggregation
|
|
225
|
-
}),
|
|
226
|
-
],
|
|
227
|
-
};
|
|
228
|
-
```
|
|
229
|
-
|
|
230
381
|
## Analysis depth
|
|
231
382
|
|
|
232
383
|
| Depth | What it finds | Speed |
|
|
@@ -262,42 +413,58 @@ await buildProjectManifest({
|
|
|
262
413
|
|
|
263
414
|
Without `tsconfigPath`, `@components/Button` is treated as an external package and packages imported inside it are invisible in `local-graph` mode.
|
|
264
415
|
|
|
265
|
-
##
|
|
416
|
+
## Interactive wizard
|
|
266
417
|
|
|
267
|
-
|
|
418
|
+
Not sure which flags to pass? Run the step-by-step wizard:
|
|
268
419
|
|
|
269
|
-
```yaml
|
|
270
|
-
# .github/workflows/build.yml
|
|
271
|
-
jobs:
|
|
272
|
-
build-checkout:
|
|
273
|
-
steps:
|
|
274
|
-
- run: npm run build # MfSharedInspectorPlugin writes project-manifest.json
|
|
275
|
-
- uses: actions/upload-artifact@v4
|
|
276
|
-
with: { name: manifest-checkout, path: project-manifest.json }
|
|
277
420
|
```
|
|
421
|
+
$ npx @mf-toolkit/shared-inspector --interactive
|
|
278
422
|
|
|
279
|
-
|
|
280
|
-
import { analyzeFederation, formatFederationReport, scoreFederationReport } from '@mf-toolkit/shared-inspector';
|
|
281
|
-
|
|
282
|
-
const report = analyzeFederation([checkoutManifest, catalogManifest, cartManifest]);
|
|
283
|
-
const { score, label } = scoreFederationReport(report);
|
|
423
|
+
[MfSharedInspector] Interactive setup
|
|
284
424
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
// Score: 60/100 🟠 RISKY
|
|
425
|
+
Source directories to scan (default: ./src):
|
|
426
|
+
Scan depth — direct or local-graph (default: local-graph):
|
|
427
|
+
Shared packages — comma-separated names or path to .json (empty to skip): react,react-dom,mobx
|
|
428
|
+
Path to tsconfig.json for alias resolution (empty to skip):
|
|
429
|
+
Workspace packages to exclude, comma-separated (empty to skip):
|
|
430
|
+
Fail build on findings — mismatch / unused / any / none (default: none): mismatch
|
|
431
|
+
Write project-manifest.json? (y/N): n
|
|
293
432
|
```
|
|
294
433
|
|
|
295
|
-
|
|
434
|
+
## CLI reference
|
|
435
|
+
|
|
436
|
+
| Flag | Default | Description |
|
|
437
|
+
|------|---------|-------------|
|
|
438
|
+
| `--source, -s <dirs>` | `./src` | Source dirs to scan, comma-separated |
|
|
439
|
+
| `--depth <depth>` | `local-graph` | Scan depth: `direct` \| `local-graph` |
|
|
440
|
+
| `--shared <packages\|file>` | — | Comma-separated package names or path to `.json` config |
|
|
441
|
+
| `--tsconfig <path>` | — | tsconfig.json for path alias resolution |
|
|
442
|
+
| `--workspace-packages <pkgs>` | — | Comma-separated workspace packages to exclude |
|
|
443
|
+
| `--name <name>` | auto from `package.json` | Project name |
|
|
444
|
+
| `--kind <kind>` | `unknown` | Project role: `host` \| `remote` \| `unknown` |
|
|
445
|
+
| `--fail-on <rule>` | — | Exit 1 when findings match: `mismatch` \| `unused` \| `any` |
|
|
446
|
+
| `--min-score <n>` | — | Exit 1 when score is below n (0–100) |
|
|
447
|
+
| `--json` | `false` | Output findings as JSON (suppresses spinner and banner) |
|
|
448
|
+
| `--write-manifest` | `false` | Write `project-manifest.json` to output dir |
|
|
449
|
+
| `--output-dir <dir>` | `.` | Output directory for manifest |
|
|
450
|
+
| `--interactive, -i` | — | Launch step-by-step wizard |
|
|
451
|
+
| `--version, -v` | — | Print version and exit |
|
|
452
|
+
| `--help, -h` | — | Show help |
|
|
453
|
+
|
|
454
|
+
**Federation subcommand:**
|
|
296
455
|
|
|
297
456
|
```bash
|
|
298
|
-
|
|
457
|
+
mf-inspector federation <manifest1> [manifest2...] [--fail-on <rule>] [--min-score <n>] [--json]
|
|
299
458
|
```
|
|
300
459
|
|
|
460
|
+
Each manifest can be a local file path or an `http(s)://` URL. Local paths are resolved relative to the current working directory.
|
|
461
|
+
|
|
462
|
+
| Flag | Description |
|
|
463
|
+
|------|-------------|
|
|
464
|
+
| `--fail-on <rule>` | Exit 1 when findings match: `mismatch` (version conflicts) \| `unused` (ghost shares) \| `any` |
|
|
465
|
+
| `--min-score <n>` | Exit 1 when federation score is below n |
|
|
466
|
+
| `--json` | Output findings as JSON |
|
|
467
|
+
|
|
301
468
|
## API reference
|
|
302
469
|
|
|
303
470
|
### `buildProjectManifest(options)`
|
|
@@ -345,6 +512,17 @@ Accepts N `ProjectManifest` objects (one per microfrontend) and returns a `Feder
|
|
|
345
512
|
|--------|------|---------|-------------|
|
|
346
513
|
| `alwaysShared` | `string[]` | `['react','react-dom']` | Exclude from ghost/gap detection |
|
|
347
514
|
|
|
515
|
+
### `writeReport(report, outputPath)` / `writeManifest(manifest, outputPath)`
|
|
516
|
+
|
|
517
|
+
Write a `ProjectReport` or `ProjectManifest` to a JSON file. Parent directories are created automatically.
|
|
518
|
+
|
|
519
|
+
```typescript
|
|
520
|
+
import { writeReport, writeManifest } from '@mf-toolkit/shared-inspector';
|
|
521
|
+
|
|
522
|
+
await writeReport(report, './dist/shared-report.json');
|
|
523
|
+
await writeManifest(manifest, './dist/project-manifest.json');
|
|
524
|
+
```
|
|
525
|
+
|
|
348
526
|
### `MfSharedInspectorPlugin` options
|
|
349
527
|
|
|
350
528
|
Extends all `buildProjectManifest` options (except `name`, auto-resolved from compiler) plus:
|
package/dist/cli/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA0HjD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAS/E"}
|
package/dist/cli/args.js
CHANGED
|
@@ -2,6 +2,7 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
const VALID_DEPTHS = new Set(['direct', 'local-graph']);
|
|
4
4
|
const VALID_FAIL_ON = new Set(['mismatch', 'unused', 'any']);
|
|
5
|
+
const VALID_KINDS = new Set(['host', 'remote', 'unknown']);
|
|
5
6
|
export function parseArgs(argv) {
|
|
6
7
|
const args = {
|
|
7
8
|
command: 'project',
|
|
@@ -12,16 +13,35 @@ export function parseArgs(argv) {
|
|
|
12
13
|
writeManifest: false,
|
|
13
14
|
outputDir: '.',
|
|
14
15
|
manifestFiles: [],
|
|
16
|
+
json: false,
|
|
15
17
|
};
|
|
16
18
|
if (argv[0] === 'federation') {
|
|
17
19
|
args.command = 'federation';
|
|
18
20
|
for (let i = 1; i < argv.length; i++) {
|
|
19
|
-
|
|
21
|
+
const arg = argv[i];
|
|
22
|
+
if (arg === '--help' || arg === '-h') {
|
|
20
23
|
args.command = 'help';
|
|
21
24
|
break;
|
|
22
25
|
}
|
|
23
|
-
if (
|
|
24
|
-
|
|
26
|
+
if (arg === '--fail-on') {
|
|
27
|
+
const val = argv[++i] ?? '';
|
|
28
|
+
if (!VALID_FAIL_ON.has(val)) {
|
|
29
|
+
throw new Error(`Invalid --fail-on value "${val}". Expected: mismatch | unused | any`);
|
|
30
|
+
}
|
|
31
|
+
args.failOn = val;
|
|
32
|
+
}
|
|
33
|
+
else if (arg === '--min-score') {
|
|
34
|
+
const val = Number(argv[++i]);
|
|
35
|
+
if (isNaN(val) || val < 0 || val > 100) {
|
|
36
|
+
throw new Error(`Invalid --min-score value. Expected a number between 0 and 100`);
|
|
37
|
+
}
|
|
38
|
+
args.minScore = val;
|
|
39
|
+
}
|
|
40
|
+
else if (arg === '--json') {
|
|
41
|
+
args.json = true;
|
|
42
|
+
}
|
|
43
|
+
else if (!arg.startsWith('-')) {
|
|
44
|
+
args.manifestFiles.push(arg);
|
|
25
45
|
}
|
|
26
46
|
}
|
|
27
47
|
return args;
|
|
@@ -70,6 +90,22 @@ export function parseArgs(argv) {
|
|
|
70
90
|
args.failOn = val;
|
|
71
91
|
break;
|
|
72
92
|
}
|
|
93
|
+
case '--min-score': {
|
|
94
|
+
const val = Number(argv[++i]);
|
|
95
|
+
if (isNaN(val) || val < 0 || val > 100) {
|
|
96
|
+
throw new Error(`Invalid --min-score value. Expected a number between 0 and 100`);
|
|
97
|
+
}
|
|
98
|
+
args.minScore = val;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case '--kind': {
|
|
102
|
+
const val = argv[++i] ?? '';
|
|
103
|
+
if (!VALID_KINDS.has(val)) {
|
|
104
|
+
throw new Error(`Invalid --kind value "${val}". Expected: host | remote | unknown`);
|
|
105
|
+
}
|
|
106
|
+
args.kind = val;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
73
109
|
case '--write-manifest':
|
|
74
110
|
args.writeManifest = true;
|
|
75
111
|
break;
|
|
@@ -79,6 +115,9 @@ export function parseArgs(argv) {
|
|
|
79
115
|
case '--name':
|
|
80
116
|
args.name = argv[++i];
|
|
81
117
|
break;
|
|
118
|
+
case '--json':
|
|
119
|
+
args.json = true;
|
|
120
|
+
break;
|
|
82
121
|
}
|
|
83
122
|
}
|
|
84
123
|
if (!args.interactive && args.sourceDirs.length === 0) {
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AACxD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/help.d.ts
CHANGED
|
@@ -1,2 +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";
|
|
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 --kind <kind> Project role: host | remote | unknown (default: unknown)\n --fail-on <rule> Exit 1 when findings match: mismatch | unused | any\n --min-score <n> Exit 1 when score is below n (0\u2013100)\n --json Output findings as JSON (suppresses spinner and banner)\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 options:\n --fail-on <rule> Exit 1 when findings match: mismatch | unused | any\n --min-score <n> Exit 1 when federation score is below n (0\u2013100)\n --json Output findings as JSON\n\nFederation:\n mf-inspector federation checkout.json catalog.json cart.json\n mf-inspector federation https://cdn.example.com/checkout.json https://cdn.example.com/cart.json\n mf-inspector federation checkout.json https://cdn.example.com/cart.json --fail-on mismatch\n\nExamples:\n mf-inspector\n mf-inspector --interactive\n mf-inspector --source ./src --shared react,react-dom --fail-on mismatch\n mf-inspector --source ./src --kind host --min-score 80\n mf-inspector --shared ./shared-config.json --write-manifest\n mf-inspector federation ./manifests/checkout.json ./manifests/catalog.json --fail-on any\n";
|
|
2
2
|
//# sourceMappingURL=help.d.ts.map
|
package/dist/cli/help.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,wuEAuChB,CAAC"}
|
package/dist/cli/help.js
CHANGED
|
@@ -10,21 +10,32 @@ Project options:
|
|
|
10
10
|
--tsconfig <path> tsconfig.json for path alias resolution
|
|
11
11
|
--workspace-packages <pkgs> Comma-separated workspace packages to exclude
|
|
12
12
|
--name <name> Project name (default: auto from package.json)
|
|
13
|
+
--kind <kind> Project role: host | remote | unknown (default: unknown)
|
|
13
14
|
--fail-on <rule> Exit 1 when findings match: mismatch | unused | any
|
|
15
|
+
--min-score <n> Exit 1 when score is below n (0–100)
|
|
16
|
+
--json Output findings as JSON (suppresses spinner and banner)
|
|
14
17
|
--write-manifest Write project-manifest.json to output dir
|
|
15
18
|
--output-dir <dir> Output directory for manifest (default: .)
|
|
16
19
|
--interactive, -i Launch step-by-step wizard instead of flags
|
|
17
20
|
--version, -v Print version and exit
|
|
18
21
|
--help, -h Show this help
|
|
19
22
|
|
|
23
|
+
Federation options:
|
|
24
|
+
--fail-on <rule> Exit 1 when findings match: mismatch | unused | any
|
|
25
|
+
--min-score <n> Exit 1 when federation score is below n (0–100)
|
|
26
|
+
--json Output findings as JSON
|
|
27
|
+
|
|
20
28
|
Federation:
|
|
21
29
|
mf-inspector federation checkout.json catalog.json cart.json
|
|
30
|
+
mf-inspector federation https://cdn.example.com/checkout.json https://cdn.example.com/cart.json
|
|
31
|
+
mf-inspector federation checkout.json https://cdn.example.com/cart.json --fail-on mismatch
|
|
22
32
|
|
|
23
33
|
Examples:
|
|
24
34
|
mf-inspector
|
|
25
35
|
mf-inspector --interactive
|
|
26
36
|
mf-inspector --source ./src --shared react,react-dom --fail-on mismatch
|
|
37
|
+
mf-inspector --source ./src --kind host --min-score 80
|
|
27
38
|
mf-inspector --shared ./shared-config.json --write-manifest
|
|
28
|
-
mf-inspector federation ./manifests/checkout.json ./manifests/catalog.json
|
|
39
|
+
mf-inspector federation ./manifests/checkout.json ./manifests/catalog.json --fail-on any
|
|
29
40
|
`;
|
|
30
41
|
//# sourceMappingURL=help.js.map
|
package/dist/cli/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCnB,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -43,7 +43,8 @@ export async function main(argv, write = (s) => process.stdout.write(s), prompt)
|
|
|
43
43
|
write(`@mf-toolkit/shared-inspector ${version}\n`);
|
|
44
44
|
return 0;
|
|
45
45
|
}
|
|
46
|
-
|
|
46
|
+
if (!args.json)
|
|
47
|
+
printBanner(write, version);
|
|
47
48
|
if (args.command === 'federation') {
|
|
48
49
|
return runFederation(args, write);
|
|
49
50
|
}
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG3D,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;AAGjC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAwB,CAAC;QAC7E,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAA0B,EAAE,OAAe;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC9B,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,IAAc,EACd,QAA6B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAC3D,MAAiB;IAEjB,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAK,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,gCAAgC,OAAO,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-federation.d.ts","sourceRoot":"","sources":["../../src/cli/run-federation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-federation.d.ts","sourceRoot":"","sources":["../../src/cli/run-federation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAiB1C,wBAAsB,aAAa,CACjC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,CAkDjB"}
|
|
@@ -2,26 +2,45 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { analyzeFederation } from '../analyzer/analyze-federation.js';
|
|
4
4
|
import { formatFederationReport } from '../reporter/format-federation-report.js';
|
|
5
|
-
import {
|
|
5
|
+
import { scoreFederationReport } from '../reporter/scoring.js';
|
|
6
|
+
import { createSpinner, createNullSpinner } from './spinner.js';
|
|
6
7
|
import { colorizeReport } from './colorize-report.js';
|
|
8
|
+
function isUrl(source) {
|
|
9
|
+
return source.startsWith('http://') || source.startsWith('https://');
|
|
10
|
+
}
|
|
11
|
+
async function loadManifestContent(source) {
|
|
12
|
+
if (isUrl(source)) {
|
|
13
|
+
const res = await fetch(source);
|
|
14
|
+
if (!res.ok) {
|
|
15
|
+
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
|
16
|
+
}
|
|
17
|
+
return res.text();
|
|
18
|
+
}
|
|
19
|
+
return readFileSync(resolve(process.cwd(), source), 'utf-8');
|
|
20
|
+
}
|
|
7
21
|
export async function runFederation(args, write) {
|
|
8
22
|
if (args.manifestFiles.length === 0) {
|
|
9
23
|
write('Error: federation command requires at least one manifest file\n');
|
|
10
|
-
write('Usage: mf-inspector federation <manifest1.json> [manifest2.json...]\n');
|
|
24
|
+
write('Usage: mf-inspector federation <manifest1.json|url> [manifest2.json|url...]\n');
|
|
11
25
|
return 1;
|
|
12
26
|
}
|
|
13
|
-
const spinner = createSpinner();
|
|
27
|
+
const spinner = args.json ? createNullSpinner() : createSpinner();
|
|
14
28
|
spinner.start(`Loading ${args.manifestFiles.length} manifest${args.manifestFiles.length > 1 ? 's' : ''}`);
|
|
15
29
|
const manifests = [];
|
|
16
|
-
for (const
|
|
17
|
-
const filePath = resolve(process.cwd(), file);
|
|
30
|
+
for (const source of args.manifestFiles) {
|
|
18
31
|
let content;
|
|
19
32
|
try {
|
|
20
|
-
content =
|
|
33
|
+
content = await loadManifestContent(source);
|
|
21
34
|
}
|
|
22
|
-
catch {
|
|
35
|
+
catch (err) {
|
|
23
36
|
spinner.stop();
|
|
24
|
-
|
|
37
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
38
|
+
if (isUrl(source)) {
|
|
39
|
+
write(`Error: cannot fetch "${source}": ${reason}\n`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
write(`Error: cannot read file "${source}"\n`);
|
|
43
|
+
}
|
|
25
44
|
return 1;
|
|
26
45
|
}
|
|
27
46
|
try {
|
|
@@ -29,13 +48,33 @@ export async function runFederation(args, write) {
|
|
|
29
48
|
}
|
|
30
49
|
catch {
|
|
31
50
|
spinner.stop();
|
|
32
|
-
write(`Error: "${
|
|
51
|
+
write(`Error: "${source}" is not valid JSON\n`);
|
|
33
52
|
return 1;
|
|
34
53
|
}
|
|
35
54
|
}
|
|
36
55
|
spinner.succeed(`Loaded ${manifests.length} manifest${manifests.length > 1 ? 's' : ''}`);
|
|
37
56
|
const report = analyzeFederation(manifests);
|
|
38
|
-
|
|
57
|
+
const score = scoreFederationReport(report);
|
|
58
|
+
if (args.json) {
|
|
59
|
+
write(JSON.stringify({ ...report, score }, null, 2) + '\n');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
write(colorizeReport(formatFederationReport(report)));
|
|
63
|
+
}
|
|
64
|
+
if (args.failOn && shouldFailFederation(report, args.failOn))
|
|
65
|
+
return 1;
|
|
66
|
+
if (args.minScore !== undefined && score.score < args.minScore)
|
|
67
|
+
return 1;
|
|
39
68
|
return 0;
|
|
40
69
|
}
|
|
70
|
+
function shouldFailFederation(report, failOn) {
|
|
71
|
+
switch (failOn) {
|
|
72
|
+
case 'mismatch': return report.versionConflicts.length > 0;
|
|
73
|
+
case 'unused': return report.ghostShares.length > 0;
|
|
74
|
+
case 'any': return (report.versionConflicts.length > 0 ||
|
|
75
|
+
report.singletonMismatches.length > 0 ||
|
|
76
|
+
report.hostGaps.length > 0 ||
|
|
77
|
+
report.ghostShares.length > 0);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
41
80
|
//# sourceMappingURL=run-federation.js.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"run-federation.js","sourceRoot":"","sources":["../../src/cli/run-federation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-project.d.ts","sourceRoot":"","sources":["../../src/cli/run-project.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-project.d.ts","sourceRoot":"","sources":["../../src/cli/run-project.ts"],"names":[],"mappings":"AASA,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,CAkDjB"}
|
package/dist/cli/run-project.js
CHANGED
|
@@ -4,7 +4,8 @@ import { buildProjectManifest } from '../collector/build-project-manifest.js';
|
|
|
4
4
|
import { analyzeProject } from '../analyzer/analyze-project.js';
|
|
5
5
|
import { formatReport } from '../reporter/format-report.js';
|
|
6
6
|
import { writeManifest } from '../reporter/write-report.js';
|
|
7
|
-
import {
|
|
7
|
+
import { scoreProjectReport } from '../reporter/scoring.js';
|
|
8
|
+
import { createSpinner, createNullSpinner } from './spinner.js';
|
|
8
9
|
import { colorizeReport } from './colorize-report.js';
|
|
9
10
|
export function shouldFail(report, failOn) {
|
|
10
11
|
if (failOn === 'mismatch')
|
|
@@ -28,7 +29,7 @@ export async function runProject(args, write) {
|
|
|
28
29
|
name = 'project';
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
|
-
const spinner = createSpinner();
|
|
32
|
+
const spinner = args.json ? createNullSpinner() : createSpinner();
|
|
32
33
|
spinner.start(`Scanning ${args.sourceDirs.join(', ')}`);
|
|
33
34
|
const manifest = await buildProjectManifest({
|
|
34
35
|
name,
|
|
@@ -37,21 +38,31 @@ export async function runProject(args, write) {
|
|
|
37
38
|
sharedConfig: args.sharedConfig,
|
|
38
39
|
tsconfigPath: args.tsconfigPath,
|
|
39
40
|
workspacePackages: args.workspacePackages,
|
|
41
|
+
kind: args.kind,
|
|
40
42
|
});
|
|
41
43
|
spinner.succeed(`Scanned ${manifest.source.filesScanned} files`);
|
|
42
44
|
const report = analyzeProject(manifest);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
const score = scoreProjectReport(report);
|
|
46
|
+
if (args.json) {
|
|
47
|
+
write(JSON.stringify({ ...report, score }, null, 2) + '\n');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
write(colorizeReport(formatReport(report, {
|
|
51
|
+
name: manifest.project.name,
|
|
52
|
+
depth: manifest.source.depth,
|
|
53
|
+
filesScanned: manifest.source.filesScanned,
|
|
54
|
+
})));
|
|
55
|
+
}
|
|
48
56
|
if (args.writeManifest) {
|
|
49
57
|
const outPath = resolve(args.outputDir, 'project-manifest.json');
|
|
50
58
|
await writeManifest(manifest, outPath);
|
|
51
|
-
|
|
59
|
+
if (!args.json)
|
|
60
|
+
write(`\n Manifest written to ${outPath}\n`);
|
|
52
61
|
}
|
|
53
62
|
if (args.failOn && shouldFail(report, args.failOn))
|
|
54
63
|
return 1;
|
|
64
|
+
if (args.minScore !== undefined && score.score < args.minScore)
|
|
65
|
+
return 1;
|
|
55
66
|
return 0;
|
|
56
67
|
}
|
|
57
68
|
//# sourceMappingURL=run-project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-project.js","sourceRoot":"","sources":["../../src/cli/run-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"run-project.js","sourceRoot":"","sources":["../../src/cli/run-project.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/spinner.d.ts
CHANGED
|
@@ -1 +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"}
|
|
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,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,aAAa,IAAI,OAAO,CAsCvC"}
|
package/dist/cli/spinner.js
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
import { isTTY, green, gray } from './colors.js';
|
|
7
7
|
const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
8
8
|
const INTERVAL_MS = 80;
|
|
9
|
+
export function createNullSpinner() {
|
|
10
|
+
return { start() { }, succeed() { }, stop() { } };
|
|
11
|
+
}
|
|
9
12
|
export function createSpinner() {
|
|
10
13
|
if (!isTTY) {
|
|
11
14
|
// Non-TTY (CI, piped): emit plain text lines via stdout
|
package/dist/cli/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/cli/spinner.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,iFAAiF;AAEjF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAClE,MAAM,WAAW,GAAG,EAAE,CAAC;AAWvB,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,wDAAwD;QACxD,OAAO;YACL,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,KAAI,CAAC;SACV,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAiD,CAAC;IAEtD,SAAS,SAAS;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,yCAAyC;IAC7E,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YACjD,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxE,KAAK,EAAE,CAAC;YACV,CAAC,EAAE,WAAW,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI;YACV,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QACnD,CAAC;QACD,IAAI;YACF,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/cli/spinner.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,iFAAiF;AAEjF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAClE,MAAM,WAAW,GAAG,EAAE,CAAC;AAWvB,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,KAAK,KAAI,CAAC,EAAE,OAAO,KAAI,CAAC,EAAE,IAAI,KAAI,CAAC,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,wDAAwD;QACxD,OAAO;YACL,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACxD,IAAI,KAAI,CAAC;SACV,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAiD,CAAC;IAEtD,SAAS,SAAS;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,yCAAyC;IAC7E,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YACjD,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxE,KAAK,EAAE,CAAC;YACV,CAAC,EAAE,WAAW,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI;YACV,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QACnD,CAAC;QACD,IAAI;YACF,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/cli/types.d.ts
CHANGED
|
@@ -8,6 +8,9 @@ export interface CliArgs {
|
|
|
8
8
|
tsconfigPath?: string;
|
|
9
9
|
workspacePackages: string[];
|
|
10
10
|
failOn?: 'mismatch' | 'unused' | 'any';
|
|
11
|
+
minScore?: number;
|
|
12
|
+
kind?: 'host' | 'remote' | 'unknown';
|
|
13
|
+
json?: boolean;
|
|
11
14
|
writeManifest: boolean;
|
|
12
15
|
outputDir: string;
|
|
13
16
|
name?: string;
|
package/dist/cli/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,WAAW,EAAE,OAAO,CAAC;IAErB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,SAAS,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;IACvD,WAAW,EAAE,OAAO,CAAC;IAErB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -47,7 +47,11 @@ export interface CollectorOptions {
|
|
|
47
47
|
* @example ['@my-org/design-system', '@my-org/*']
|
|
48
48
|
*/
|
|
49
49
|
workspacePackages?: string[];
|
|
50
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Parser strategy for import extraction.
|
|
52
|
+
* @default 'regex'
|
|
53
|
+
* @planned 'typescript' (AST-based) — not yet implemented; value is accepted but has no effect.
|
|
54
|
+
*/
|
|
51
55
|
parser?: ParserStrategy;
|
|
52
56
|
}
|
|
53
57
|
export interface ProjectManifest {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,YAAY,CAAC;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;IACjC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrC,sDAAsD;IACtD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mf-toolkit/shared-inspector",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Stop debugging Module Federation in production. Audit shared config at build time.",
|
|
5
5
|
"author": "Vitaly Zheltko",
|
|
6
6
|
"license": "MIT",
|
|
@@ -48,7 +48,9 @@
|
|
|
48
48
|
"typescript": ">=4.7"
|
|
49
49
|
},
|
|
50
50
|
"peerDependenciesMeta": {
|
|
51
|
-
"typescript": {
|
|
51
|
+
"typescript": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
52
54
|
},
|
|
53
55
|
"devDependencies": {
|
|
54
56
|
"@types/semver": "^7.5.8",
|