@perfonext/build-mcp 0.1.0 → 0.2.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 +7 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/parser/analysis.d.ts +8 -1
- package/dist/parser/analysis.d.ts.map +1 -1
- package/dist/parser/analysis.js +238 -8
- package/dist/parser/analysis.js.map +1 -1
- package/dist/parser/types.d.ts +45 -0
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/tools/explain-growth.d.ts +3 -0
- package/dist/tools/explain-growth.d.ts.map +1 -0
- package/dist/tools/explain-growth.js +97 -0
- package/dist/tools/explain-growth.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
- loads Next.js build artifacts from a `.next` directory
|
|
10
10
|
- ranks the largest user-facing routes by emitted bundle footprint
|
|
11
11
|
- identifies the heaviest shared chunks that affect multiple routes
|
|
12
|
+
- compares two builds and explains which routes and chunks drove bundle growth, with
|
|
13
|
+
severity-ranked, evidence-backed fix suggestions
|
|
14
|
+
- matches chunks across builds even though Next.js fingerprints filenames with content hashes
|
|
12
15
|
- keeps loaded build snapshots in memory so an MCP client can inspect them without re-reading the same build
|
|
13
16
|
|
|
14
17
|
## Inputs
|
|
@@ -28,9 +31,12 @@ The MVP reads build artifacts developers already have after running `next build`
|
|
|
28
31
|
| `get_largest_routes` | Rank the heaviest user-facing routes by total emitted chunk bytes |
|
|
29
32
|
| `get_shared_chunks` | Rank shared chunks by size and show which routes depend on them |
|
|
30
33
|
| `compare_builds` | Compare a baseline and current build snapshot to show which routes and chunks grew or shrank |
|
|
34
|
+
| `explain_growth` | Severity-rank which routes and chunks drove bundle growth between two builds, with evidence-backed fix suggestions |
|
|
31
35
|
|
|
32
36
|
The output stays machine-readable and includes raw byte counts so Copilot can explain regressions, prioritise fixes, and suggest concrete dependency or import-level follow-up.
|
|
33
37
|
|
|
38
|
+
Because Next.js content-hashes emitted filenames (`framework-<hash>.js`, and CSS files named purely by hash), `compare_builds` and `explain_growth` match chunks across builds by a hash-normalized identity. This prevents a rehashed-but-unchanged chunk from being misreported as removed-and-recreated, while still flagging genuinely new chunks.
|
|
39
|
+
|
|
34
40
|
## Install
|
|
35
41
|
|
|
36
42
|
Run directly with `npx`:
|
|
@@ -70,6 +76,7 @@ Add this server to VS Code settings:
|
|
|
70
76
|
- "Which shared chunks are affecting the most routes in this build?"
|
|
71
77
|
- "Summarize the build footprint and tell me which routes ship the most JavaScript."
|
|
72
78
|
- "Compare my baseline and current `.next` builds and show me which routes or shared chunks grew the most."
|
|
79
|
+
- "Explain what grew between my baseline and current `.next` builds and what I should fix first."
|
|
73
80
|
|
|
74
81
|
## Development
|
|
75
82
|
|
package/dist/index.js
CHANGED
|
@@ -5,14 +5,16 @@ import { registerLoadBuildStats } from './tools/load-build-stats.js';
|
|
|
5
5
|
import { registerGetLargestRoutes } from './tools/get-largest-routes.js';
|
|
6
6
|
import { registerGetSharedChunks } from './tools/get-shared-chunks.js';
|
|
7
7
|
import { registerCompareBuilds } from './tools/compare-builds.js';
|
|
8
|
+
import { registerExplainGrowth } from './tools/explain-growth.js';
|
|
8
9
|
const server = new McpServer({
|
|
9
10
|
name: 'perfonext-build-mcp',
|
|
10
|
-
version: '0.
|
|
11
|
+
version: '0.2.0',
|
|
11
12
|
});
|
|
12
13
|
registerLoadBuildStats(server);
|
|
13
14
|
registerGetLargestRoutes(server);
|
|
14
15
|
registerGetSharedChunks(server);
|
|
15
16
|
registerCompareBuilds(server);
|
|
17
|
+
registerExplainGrowth(server);
|
|
16
18
|
const transport = new StdioServerTransport();
|
|
17
19
|
await server.connect(transport);
|
|
18
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,qBAAqB;IAC3B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAE9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,qBAAqB;IAC3B,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAE9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type { BuildComparison, ParsedBuildStats, RouteSummaryEntry, SharedChunkSummaryEntry } from './types.js';
|
|
1
|
+
import type { BuildComparison, GrowthExplanation, ParsedBuildStats, RouteSummaryEntry, SharedChunkSummaryEntry } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Strip Next.js content-hash suffixes (`framework-<hash>.js` → `framework.js`) so the same
|
|
4
|
+
* chunk matches across builds. Pure-hash basenames (e.g. CSS `4c7ae03ab6df2350.css`) have no
|
|
5
|
+
* stable prefix and are left untouched — their hash is already a content-stable identity.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeChunkKey(chunkPath: string): string;
|
|
2
8
|
export declare function getBuildSummary(build: ParsedBuildStats): {
|
|
3
9
|
buildId: string;
|
|
4
10
|
buildDir: string;
|
|
@@ -12,4 +18,5 @@ export declare function getBuildSummary(build: ParsedBuildStats): {
|
|
|
12
18
|
export declare function getLargestRoutes(build: ParsedBuildStats, limit: number): RouteSummaryEntry[];
|
|
13
19
|
export declare function getSharedChunks(build: ParsedBuildStats, limit: number): SharedChunkSummaryEntry[];
|
|
14
20
|
export declare function compareBuilds(baseline: ParsedBuildStats, current: ParsedBuildStats, limit: number): BuildComparison;
|
|
21
|
+
export declare function explainGrowth(baseline: ParsedBuildStats, current: ParsedBuildStats, limit: number): GrowthExplanation;
|
|
15
22
|
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,iBAAiB,EAGjB,gBAAgB,EAGhB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAUpB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAe3D;AAyCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAWA;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAc5F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAWjG;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,GACZ,eAAe,CAqEjB;AAsID,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,GACZ,iBAAiB,CA+FnB"}
|
package/dist/parser/analysis.js
CHANGED
|
@@ -4,6 +4,53 @@ function calculateDeltaRatio(baseline, current) {
|
|
|
4
4
|
}
|
|
5
5
|
return (current - baseline) / baseline;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Strip Next.js content-hash suffixes (`framework-<hash>.js` → `framework.js`) so the same
|
|
9
|
+
* chunk matches across builds. Pure-hash basenames (e.g. CSS `4c7ae03ab6df2350.css`) have no
|
|
10
|
+
* stable prefix and are left untouched — their hash is already a content-stable identity.
|
|
11
|
+
*/
|
|
12
|
+
export function normalizeChunkKey(chunkPath) {
|
|
13
|
+
const clean = chunkPath.replace(/^\//, '');
|
|
14
|
+
const lastSlash = clean.lastIndexOf('/');
|
|
15
|
+
const dir = lastSlash >= 0 ? clean.slice(0, lastSlash + 1) : '';
|
|
16
|
+
const file = lastSlash >= 0 ? clean.slice(lastSlash + 1) : clean;
|
|
17
|
+
const lastDot = file.lastIndexOf('.');
|
|
18
|
+
const base = lastDot >= 0 ? file.slice(0, lastDot) : file;
|
|
19
|
+
const ext = lastDot >= 0 ? file.slice(lastDot) : '';
|
|
20
|
+
// Strip a trailing "-<contenthash>" segment. Pure-hash basenames have no dash and are left
|
|
21
|
+
// as-is, preserving their content-stable identity.
|
|
22
|
+
const normalizedBase = base.replace(/-[0-9a-f]{8,}$/i, '');
|
|
23
|
+
return `${dir}${normalizedBase}${ext}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Collapse a build's chunks into hash-normalized buckets so they can be matched across builds.
|
|
27
|
+
* Distinct chunks that normalize to the same key are summed and their routes unioned.
|
|
28
|
+
*/
|
|
29
|
+
function aggregateChunksByKey(build) {
|
|
30
|
+
const map = new Map();
|
|
31
|
+
for (const chunk of build.chunks) {
|
|
32
|
+
const key = normalizeChunkKey(chunk.chunkPath);
|
|
33
|
+
const existing = map.get(key);
|
|
34
|
+
if (existing) {
|
|
35
|
+
existing.sizeBytes += chunk.sizeBytes;
|
|
36
|
+
for (const route of chunk.sharedByRoutes) {
|
|
37
|
+
existing.routeSet.add(route);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
map.set(key, {
|
|
42
|
+
displayPath: chunk.chunkPath,
|
|
43
|
+
sizeBytes: chunk.sizeBytes,
|
|
44
|
+
routeCount: chunk.routeCount,
|
|
45
|
+
routeSet: new Set(chunk.sharedByRoutes),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const entry of map.values()) {
|
|
50
|
+
entry.routeCount = entry.routeSet.size;
|
|
51
|
+
}
|
|
52
|
+
return map;
|
|
53
|
+
}
|
|
7
54
|
export function getBuildSummary(build) {
|
|
8
55
|
return {
|
|
9
56
|
buildId: build.id,
|
|
@@ -63,17 +110,17 @@ export function compareBuilds(baseline, current, limit) {
|
|
|
63
110
|
})
|
|
64
111
|
.sort((left, right) => Math.abs(right.deltaBytes) - Math.abs(left.deltaBytes))
|
|
65
112
|
.slice(0, limit);
|
|
66
|
-
const baselineChunks =
|
|
67
|
-
const currentChunks =
|
|
68
|
-
const
|
|
69
|
-
const chunkDeltas =
|
|
70
|
-
.map(
|
|
71
|
-
const baselineChunk = baselineChunks.get(
|
|
72
|
-
const currentChunk = currentChunks.get(
|
|
113
|
+
const baselineChunks = aggregateChunksByKey(baseline);
|
|
114
|
+
const currentChunks = aggregateChunksByKey(current);
|
|
115
|
+
const allChunkKeys = Array.from(new Set([...baselineChunks.keys(), ...currentChunks.keys()]));
|
|
116
|
+
const chunkDeltas = allChunkKeys
|
|
117
|
+
.map(key => {
|
|
118
|
+
const baselineChunk = baselineChunks.get(key);
|
|
119
|
+
const currentChunk = currentChunks.get(key);
|
|
73
120
|
const baselineBytes = baselineChunk?.sizeBytes ?? 0;
|
|
74
121
|
const currentBytes = currentChunk?.sizeBytes ?? 0;
|
|
75
122
|
return {
|
|
76
|
-
chunkPath,
|
|
123
|
+
chunkPath: currentChunk?.displayPath ?? baselineChunk?.displayPath ?? key,
|
|
77
124
|
baselineBytes,
|
|
78
125
|
currentBytes,
|
|
79
126
|
deltaBytes: currentBytes - baselineBytes,
|
|
@@ -107,4 +154,187 @@ export function compareBuilds(baseline, current, limit) {
|
|
|
107
154
|
chunkDeltas,
|
|
108
155
|
};
|
|
109
156
|
}
|
|
157
|
+
const SEVERITY_CRITICAL_BYTES = 50 * 1024;
|
|
158
|
+
const SEVERITY_WARNING_BYTES = 10 * 1024;
|
|
159
|
+
const SEVERITY_CRITICAL_RATIO = 0.2;
|
|
160
|
+
const SEVERITY_WARNING_RATIO = 0.05;
|
|
161
|
+
function classifySeverity(deltaBytes, deltaRatio) {
|
|
162
|
+
if (deltaBytes >= SEVERITY_CRITICAL_BYTES ||
|
|
163
|
+
(deltaRatio !== null && deltaRatio >= SEVERITY_CRITICAL_RATIO)) {
|
|
164
|
+
return 'critical';
|
|
165
|
+
}
|
|
166
|
+
if (deltaBytes >= SEVERITY_WARNING_BYTES ||
|
|
167
|
+
(deltaRatio !== null && deltaRatio >= SEVERITY_WARNING_RATIO)) {
|
|
168
|
+
return 'warning';
|
|
169
|
+
}
|
|
170
|
+
return 'info';
|
|
171
|
+
}
|
|
172
|
+
const SEVERITY_RANK = {
|
|
173
|
+
info: 0,
|
|
174
|
+
warning: 1,
|
|
175
|
+
critical: 2,
|
|
176
|
+
};
|
|
177
|
+
function buildGrowthSuggestions(chunkContributions, routeFindings, limit) {
|
|
178
|
+
const suggestions = [];
|
|
179
|
+
const explainedChunks = new Set();
|
|
180
|
+
for (const chunk of chunkContributions) {
|
|
181
|
+
const severity = classifySeverity(chunk.deltaBytes, chunk.deltaRatio);
|
|
182
|
+
if (severity === 'info') {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (chunk.isNew) {
|
|
186
|
+
explainedChunks.add(chunk.chunkPath);
|
|
187
|
+
suggestions.push({
|
|
188
|
+
kind: 'new-chunk',
|
|
189
|
+
severity,
|
|
190
|
+
chunkPath: chunk.chunkPath,
|
|
191
|
+
routePath: null,
|
|
192
|
+
deltaBytes: chunk.deltaBytes,
|
|
193
|
+
deltaRatio: chunk.deltaRatio,
|
|
194
|
+
affectedRouteCount: chunk.affectedRouteCount,
|
|
195
|
+
message: `New chunk ${chunk.chunkPath} appeared in the current build and is loaded by ` +
|
|
196
|
+
`${chunk.affectedRouteCount} route(s).`,
|
|
197
|
+
recommendedAction: chunk.isShared
|
|
198
|
+
? 'Confirm the dependency that introduced it. If it is only needed on some routes, load it with a dynamic import so it stays out of the shared bundle.'
|
|
199
|
+
: 'Confirm the dependency that introduced it and consider a dynamic import if it is not required on initial load.',
|
|
200
|
+
});
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (chunk.isShared) {
|
|
204
|
+
explainedChunks.add(chunk.chunkPath);
|
|
205
|
+
suggestions.push({
|
|
206
|
+
kind: 'shared-chunk-growth',
|
|
207
|
+
severity,
|
|
208
|
+
chunkPath: chunk.chunkPath,
|
|
209
|
+
routePath: null,
|
|
210
|
+
deltaBytes: chunk.deltaBytes,
|
|
211
|
+
deltaRatio: chunk.deltaRatio,
|
|
212
|
+
affectedRouteCount: chunk.affectedRouteCount,
|
|
213
|
+
message: `Shared chunk ${chunk.chunkPath} grew and is loaded by ${chunk.affectedRouteCount} routes, ` +
|
|
214
|
+
'so the regression multiplies across the app.',
|
|
215
|
+
recommendedAction: 'Identify the package driving the growth and move it out of the shared chunk (route-level or dynamic import) so only the routes that need it pay the cost.',
|
|
216
|
+
});
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
explainedChunks.add(chunk.chunkPath);
|
|
220
|
+
suggestions.push({
|
|
221
|
+
kind: 'chunk-growth',
|
|
222
|
+
severity,
|
|
223
|
+
chunkPath: chunk.chunkPath,
|
|
224
|
+
routePath: null,
|
|
225
|
+
deltaBytes: chunk.deltaBytes,
|
|
226
|
+
deltaRatio: chunk.deltaRatio,
|
|
227
|
+
affectedRouteCount: chunk.affectedRouteCount,
|
|
228
|
+
message: `Chunk ${chunk.chunkPath} grew and is exclusive to ${chunk.affectedRouteCount} route(s).`,
|
|
229
|
+
recommendedAction: 'Inspect the import chain for this chunk and split or lazy-load heavy dependencies that are not needed on initial render.',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
for (const route of routeFindings) {
|
|
233
|
+
if (route.severity !== 'critical') {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const topChunk = route.topContributingChunks[0];
|
|
237
|
+
if (topChunk && explainedChunks.has(topChunk.chunkPath)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
suggestions.push({
|
|
241
|
+
kind: 'route-regression',
|
|
242
|
+
severity: route.severity,
|
|
243
|
+
chunkPath: topChunk?.chunkPath ?? null,
|
|
244
|
+
routePath: route.path,
|
|
245
|
+
deltaBytes: route.deltaBytes,
|
|
246
|
+
deltaRatio: route.deltaRatio,
|
|
247
|
+
affectedRouteCount: null,
|
|
248
|
+
message: topChunk
|
|
249
|
+
? `Route ${route.path} regressed critically; its largest contributor is ${topChunk.chunkPath}.`
|
|
250
|
+
: `Route ${route.path} regressed critically.`,
|
|
251
|
+
recommendedAction: "Compare this route's chunk list against the baseline and inspect the import chain of its largest contributor.",
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return suggestions
|
|
255
|
+
.sort((left, right) => SEVERITY_RANK[right.severity] - SEVERITY_RANK[left.severity] ||
|
|
256
|
+
right.deltaBytes - left.deltaBytes)
|
|
257
|
+
.slice(0, limit);
|
|
258
|
+
}
|
|
259
|
+
export function explainGrowth(baseline, current, limit) {
|
|
260
|
+
const baselineChunks = aggregateChunksByKey(baseline);
|
|
261
|
+
const currentChunks = aggregateChunksByKey(current);
|
|
262
|
+
const allChunkKeys = Array.from(new Set([...baselineChunks.keys(), ...currentChunks.keys()]));
|
|
263
|
+
const chunkContributions = allChunkKeys
|
|
264
|
+
.map(key => {
|
|
265
|
+
const baselineChunk = baselineChunks.get(key);
|
|
266
|
+
const currentChunk = currentChunks.get(key);
|
|
267
|
+
const baselineBytes = baselineChunk?.sizeBytes ?? 0;
|
|
268
|
+
const currentBytes = currentChunk?.sizeBytes ?? 0;
|
|
269
|
+
const deltaBytes = currentBytes - baselineBytes;
|
|
270
|
+
return {
|
|
271
|
+
key,
|
|
272
|
+
chunkPath: currentChunk?.displayPath ?? baselineChunk?.displayPath ?? key,
|
|
273
|
+
deltaBytes,
|
|
274
|
+
deltaRatio: calculateDeltaRatio(baselineBytes, currentBytes),
|
|
275
|
+
isNew: baselineChunk === undefined,
|
|
276
|
+
isShared: (currentChunk?.routeCount ?? baselineChunk?.routeCount ?? 0) > 1,
|
|
277
|
+
affectedRouteCount: currentChunk?.routeCount ?? baselineChunk?.routeCount ?? 0,
|
|
278
|
+
};
|
|
279
|
+
})
|
|
280
|
+
.filter(entry => entry.deltaBytes > 0)
|
|
281
|
+
.sort((left, right) => right.deltaBytes - left.deltaBytes);
|
|
282
|
+
const topGrowingChunks = chunkContributions
|
|
283
|
+
.slice(0, limit)
|
|
284
|
+
.map(({ key: _key, ...rest }) => rest);
|
|
285
|
+
const baselineRoutes = new Map(baseline.routes.map(route => [route.path, route]));
|
|
286
|
+
const currentRoutes = new Map(current.routes.map(route => [route.path, route]));
|
|
287
|
+
const allRoutePaths = Array.from(new Set([...baselineRoutes.keys(), ...currentRoutes.keys()]));
|
|
288
|
+
const routeFindings = allRoutePaths
|
|
289
|
+
.map(path => {
|
|
290
|
+
const baselineRoute = baselineRoutes.get(path);
|
|
291
|
+
const currentRoute = currentRoutes.get(path);
|
|
292
|
+
const baselineBytes = baselineRoute?.totalBytes ?? 0;
|
|
293
|
+
const currentBytes = currentRoute?.totalBytes ?? 0;
|
|
294
|
+
const deltaBytes = currentBytes - baselineBytes;
|
|
295
|
+
const deltaRatio = calculateDeltaRatio(baselineBytes, currentBytes);
|
|
296
|
+
const routeChunkKeys = new Set([
|
|
297
|
+
...(baselineRoute?.chunkPaths ?? []).map(normalizeChunkKey),
|
|
298
|
+
...(currentRoute?.chunkPaths ?? []).map(normalizeChunkKey),
|
|
299
|
+
]);
|
|
300
|
+
const topContributingChunks = chunkContributions
|
|
301
|
+
.filter(chunk => routeChunkKeys.has(chunk.key))
|
|
302
|
+
.slice(0, 5)
|
|
303
|
+
.map(({ key: _key, ...rest }) => rest);
|
|
304
|
+
return {
|
|
305
|
+
path,
|
|
306
|
+
deltaBytes,
|
|
307
|
+
deltaRatio,
|
|
308
|
+
severity: classifySeverity(deltaBytes, deltaRatio),
|
|
309
|
+
topContributingChunks,
|
|
310
|
+
};
|
|
311
|
+
})
|
|
312
|
+
.filter(finding => finding.deltaBytes > 0)
|
|
313
|
+
.sort((left, right) => right.deltaBytes - left.deltaBytes)
|
|
314
|
+
.slice(0, limit);
|
|
315
|
+
const allDeltas = allChunkKeys.map(key => {
|
|
316
|
+
const baselineBytes = baselineChunks.get(key)?.sizeBytes ?? 0;
|
|
317
|
+
const currentBytes = currentChunks.get(key)?.sizeBytes ?? 0;
|
|
318
|
+
return currentBytes - baselineBytes;
|
|
319
|
+
});
|
|
320
|
+
const totalDeltaBytes = current.totalChunkBytes - baseline.totalChunkBytes;
|
|
321
|
+
const overallSeverity = classifySeverity(Math.abs(totalDeltaBytes), calculateDeltaRatio(baseline.totalChunkBytes, current.totalChunkBytes));
|
|
322
|
+
const suggestions = buildGrowthSuggestions(chunkContributions, routeFindings, limit);
|
|
323
|
+
return {
|
|
324
|
+
baselineBuildId: baseline.id,
|
|
325
|
+
currentBuildId: current.id,
|
|
326
|
+
overall: {
|
|
327
|
+
totalDeltaBytes,
|
|
328
|
+
totalDeltaRatio: calculateDeltaRatio(baseline.totalChunkBytes, current.totalChunkBytes),
|
|
329
|
+
severity: totalDeltaBytes > 0 ? overallSeverity : 'info',
|
|
330
|
+
newChunkCount: allChunkKeys.filter(key => !baselineChunks.has(key)).length,
|
|
331
|
+
removedChunkCount: allChunkKeys.filter(key => !currentChunks.has(key)).length,
|
|
332
|
+
grownChunkCount: allDeltas.filter(d => d > 0).length,
|
|
333
|
+
shrunkChunkCount: allDeltas.filter(d => d < 0).length,
|
|
334
|
+
},
|
|
335
|
+
routeFindings,
|
|
336
|
+
topGrowingChunks,
|
|
337
|
+
suggestions,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
110
340
|
//# sourceMappingURL=analysis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AASA,SAAS,mBAAmB,CAAC,QAAgB,EAAE,OAAe;IAC5D,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,CAAC;IAED,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAuB;IAUrD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC/B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC/B,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM;QACrE,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB,EAAE,KAAa;IACrE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,WAAW,EAAE,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,UAAU;QACnF,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;QACnC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAuB,EAAE,KAAa;IACpE,OAAO,KAAK,CAAC,MAAM;SAChB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACb,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,oBAAoB,EAAE,KAAK,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe;KAChG,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAA0B,EAC1B,OAAyB,EACzB,KAAa;IAEb,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/F,MAAM,WAAW,GAAsB,aAAa;SACjD,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,aAAa,GAAG,aAAa,EAAE,UAAU,IAAI,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,YAAY,EAAE,UAAU,IAAI,CAAC,CAAC;QACnD,OAAO;YACL,IAAI;YACJ,aAAa;YACb,YAAY;YACZ,UAAU,EAAE,YAAY,GAAG,aAAa;YACxC,UAAU,EAAE,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC;SACnC,CAAC;IAC9B,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC7E,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/F,MAAM,WAAW,GAAsB,aAAa;SACjD,GAAG,CAAC,SAAS,CAAC,EAAE;QACf,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,aAAa,GAAG,aAAa,EAAE,SAAS,IAAI,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,YAAY,EAAE,SAAS,IAAI,CAAC,CAAC;QAClD,OAAO;YACL,SAAS;YACT,aAAa;YACb,YAAY;YACZ,UAAU,EAAE,YAAY,GAAG,aAAa;YACxC,UAAU,EAAE,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC;YAC5D,kBAAkB,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC;YAClD,iBAAiB,EAAE,YAAY,EAAE,UAAU,IAAI,CAAC;SACvB,CAAC;IAC9B,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC7E,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,OAAO;QACL,eAAe,EAAE,QAAQ,CAAC,EAAE;QAC5B,cAAc,EAAE,OAAO,CAAC,EAAE;QAC1B,uBAAuB,EAAE,QAAQ,CAAC,eAAe;QACjD,sBAAsB,EAAE,OAAO,CAAC,eAAe;QAC/C,oBAAoB,EAAE,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe;QACxE,oBAAoB,EAAE,mBAAmB,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC;QAC5F,wBAAwB,EAAE,QAAQ,CAAC,gBAAgB;QACnD,uBAAuB,EAAE,OAAO,CAAC,gBAAgB;QACjD,qBAAqB,EAAE,OAAO,CAAC,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB;QAC3E,qBAAqB,EAAE,mBAAmB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,CAAC;QAC/F,mBAAmB,EAAE,QAAQ,CAAC,WAAW;QACzC,kBAAkB,EAAE,OAAO,CAAC,WAAW;QACvC,gBAAgB,EACd,QAAQ,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI;YAC3D,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW;QAChD,mBAAmB,EACjB,QAAQ,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI;YAC3D,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC;QACpE,WAAW;QACX,WAAW;KACc,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"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"}
|
package/dist/parser/types.d.ts
CHANGED
|
@@ -83,4 +83,49 @@ export interface BuildComparison {
|
|
|
83
83
|
routeDeltas: RouteDeltaEntry[];
|
|
84
84
|
chunkDeltas: ChunkDeltaEntry[];
|
|
85
85
|
}
|
|
86
|
+
export type GrowthSeverity = 'info' | 'warning' | 'critical';
|
|
87
|
+
export interface ChunkGrowthContribution {
|
|
88
|
+
chunkPath: string;
|
|
89
|
+
deltaBytes: number;
|
|
90
|
+
deltaRatio: number | null;
|
|
91
|
+
isNew: boolean;
|
|
92
|
+
isShared: boolean;
|
|
93
|
+
affectedRouteCount: number;
|
|
94
|
+
}
|
|
95
|
+
export interface RouteGrowthFinding {
|
|
96
|
+
path: string;
|
|
97
|
+
deltaBytes: number;
|
|
98
|
+
deltaRatio: number | null;
|
|
99
|
+
severity: GrowthSeverity;
|
|
100
|
+
topContributingChunks: ChunkGrowthContribution[];
|
|
101
|
+
}
|
|
102
|
+
export interface OverallGrowthSummary {
|
|
103
|
+
totalDeltaBytes: number;
|
|
104
|
+
totalDeltaRatio: number | null;
|
|
105
|
+
severity: GrowthSeverity;
|
|
106
|
+
newChunkCount: number;
|
|
107
|
+
removedChunkCount: number;
|
|
108
|
+
grownChunkCount: number;
|
|
109
|
+
shrunkChunkCount: number;
|
|
110
|
+
}
|
|
111
|
+
export type GrowthSuggestionKind = 'shared-chunk-growth' | 'new-chunk' | 'chunk-growth' | 'route-regression';
|
|
112
|
+
export interface GrowthSuggestion {
|
|
113
|
+
kind: GrowthSuggestionKind;
|
|
114
|
+
severity: GrowthSeverity;
|
|
115
|
+
chunkPath: string | null;
|
|
116
|
+
routePath: string | null;
|
|
117
|
+
deltaBytes: number;
|
|
118
|
+
deltaRatio: number | null;
|
|
119
|
+
affectedRouteCount: number | null;
|
|
120
|
+
message: string;
|
|
121
|
+
recommendedAction: string;
|
|
122
|
+
}
|
|
123
|
+
export interface GrowthExplanation {
|
|
124
|
+
baselineBuildId: string;
|
|
125
|
+
currentBuildId: string;
|
|
126
|
+
overall: OverallGrowthSummary;
|
|
127
|
+
routeFindings: RouteGrowthFinding[];
|
|
128
|
+
topGrowingChunks: ChunkGrowthContribution[];
|
|
129
|
+
suggestions: GrowthSuggestion[];
|
|
130
|
+
}
|
|
86
131
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain-growth.d.ts","sourceRoot":"","sources":["../../src/tools/explain-growth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+F7D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { formatBytes, formatPct } from '../format.js';
|
|
3
|
+
import { explainGrowth as explainBuildGrowth } from '../parser/analysis.js';
|
|
4
|
+
import { getBuildStats, listBuildStats } from '../store.js';
|
|
5
|
+
function formatNullableRatio(value) {
|
|
6
|
+
return value === null ? null : formatPct(value);
|
|
7
|
+
}
|
|
8
|
+
export function registerExplainGrowth(server) {
|
|
9
|
+
server.registerTool('explain_growth', {
|
|
10
|
+
title: 'Explain Growth',
|
|
11
|
+
description: 'Identify which routes and chunks are responsible for bundle size growth between two loaded builds. ' +
|
|
12
|
+
'Returns severity-ranked route findings, the top growing chunks, and an overall regression summary.',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
baselineBuildId: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('Baseline build ID from load_build_stats. Omit to list loaded builds.'),
|
|
18
|
+
currentBuildId: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Current build ID from load_build_stats. Omit to list loaded builds.'),
|
|
22
|
+
limit: z
|
|
23
|
+
.number()
|
|
24
|
+
.int()
|
|
25
|
+
.positive()
|
|
26
|
+
.max(25)
|
|
27
|
+
.optional()
|
|
28
|
+
.describe('Max route findings and top growing chunks to return. Defaults to 10.'),
|
|
29
|
+
},
|
|
30
|
+
}, async ({ baselineBuildId, currentBuildId, limit }) => {
|
|
31
|
+
if (!baselineBuildId || !currentBuildId) {
|
|
32
|
+
return {
|
|
33
|
+
content: [{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: JSON.stringify({
|
|
36
|
+
builds: listBuildStats().map(build => ({
|
|
37
|
+
id: build.id,
|
|
38
|
+
buildDir: build.buildDir,
|
|
39
|
+
routeCount: build.routeCount,
|
|
40
|
+
totalChunkBytes: build.totalChunkBytes,
|
|
41
|
+
totalChunkBytesText: formatBytes(build.totalChunkBytes),
|
|
42
|
+
})),
|
|
43
|
+
}, null, 2),
|
|
44
|
+
}],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const baseline = getBuildStats(baselineBuildId);
|
|
48
|
+
if (!baseline) {
|
|
49
|
+
throw new Error(`Build "${baselineBuildId}" not found. Call explain_growth without IDs to list loaded builds.`);
|
|
50
|
+
}
|
|
51
|
+
const current = getBuildStats(currentBuildId);
|
|
52
|
+
if (!current) {
|
|
53
|
+
throw new Error(`Build "${currentBuildId}" not found. Call explain_growth without IDs to list loaded builds.`);
|
|
54
|
+
}
|
|
55
|
+
const explanation = explainBuildGrowth(baseline, current, limit ?? 10);
|
|
56
|
+
const hasGrowth = explanation.routeFindings.length > 0 || explanation.topGrowingChunks.length > 0;
|
|
57
|
+
const nextStep = hasGrowth
|
|
58
|
+
? `Inspect the largest contributors with get_shared_chunks and get_largest_routes on build '${current.id}', then apply the recommended actions.`
|
|
59
|
+
: `No bundle growth detected between '${baseline.id}' and '${current.id}'.`;
|
|
60
|
+
return {
|
|
61
|
+
content: [{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: JSON.stringify({
|
|
64
|
+
...explanation,
|
|
65
|
+
overall: {
|
|
66
|
+
...explanation.overall,
|
|
67
|
+
totalDeltaBytesText: formatBytes(Math.abs(explanation.overall.totalDeltaBytes)),
|
|
68
|
+
totalDeltaDirection: explanation.overall.totalDeltaBytes >= 0 ? 'growth' : 'shrink',
|
|
69
|
+
totalDeltaRatioText: formatNullableRatio(explanation.overall.totalDeltaRatio),
|
|
70
|
+
},
|
|
71
|
+
routeFindings: explanation.routeFindings.map(finding => ({
|
|
72
|
+
...finding,
|
|
73
|
+
deltaBytesText: formatBytes(finding.deltaBytes),
|
|
74
|
+
deltaRatioText: formatNullableRatio(finding.deltaRatio),
|
|
75
|
+
topContributingChunks: finding.topContributingChunks.map(chunk => ({
|
|
76
|
+
...chunk,
|
|
77
|
+
deltaBytesText: formatBytes(chunk.deltaBytes),
|
|
78
|
+
deltaRatioText: formatNullableRatio(chunk.deltaRatio),
|
|
79
|
+
})),
|
|
80
|
+
})),
|
|
81
|
+
topGrowingChunks: explanation.topGrowingChunks.map(chunk => ({
|
|
82
|
+
...chunk,
|
|
83
|
+
deltaBytesText: formatBytes(chunk.deltaBytes),
|
|
84
|
+
deltaRatioText: formatNullableRatio(chunk.deltaRatio),
|
|
85
|
+
})),
|
|
86
|
+
suggestions: explanation.suggestions.map(suggestion => ({
|
|
87
|
+
...suggestion,
|
|
88
|
+
deltaBytesText: formatBytes(suggestion.deltaBytes),
|
|
89
|
+
deltaRatioText: formatNullableRatio(suggestion.deltaRatio),
|
|
90
|
+
})),
|
|
91
|
+
nextStep,
|
|
92
|
+
}, null, 2),
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=explain-growth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain-growth.js","sourceRoot":"","sources":["../../src/tools/explain-growth.ts"],"names":[],"mappings":"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"}
|