@tomnieuwland/sls-bundle-analyser 1.1.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/LICENSE.md +21 -0
- package/README.md +126 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/compare.d.ts +10 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +82 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/shared-modules.d.ts +6 -0
- package/dist/commands/shared-modules.d.ts.map +1 -0
- package/dist/commands/shared-modules.js +27 -0
- package/dist/commands/shared-modules.js.map +1 -0
- package/dist/commands/sizes.d.ts +6 -0
- package/dist/commands/sizes.d.ts.map +1 -0
- package/dist/commands/sizes.js +70 -0
- package/dist/commands/sizes.js.map +1 -0
- package/dist/commands/visualize.d.ts +11 -0
- package/dist/commands/visualize.d.ts.map +1 -0
- package/dist/commands/visualize.js +29 -0
- package/dist/commands/visualize.js.map +1 -0
- package/dist/compare.d.ts +47 -0
- package/dist/compare.d.ts.map +1 -0
- package/dist/compare.js +181 -0
- package/dist/compare.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/dependency-graph.d.ts +29 -0
- package/dist/dependency-graph.d.ts.map +1 -0
- package/dist/dependency-graph.js +87 -0
- package/dist/dependency-graph.js.map +1 -0
- package/dist/esbuild-config.d.ts +4 -0
- package/dist/esbuild-config.d.ts.map +1 -0
- package/dist/esbuild-config.js +20 -0
- package/dist/esbuild-config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/parse-serverless.d.ts +53 -0
- package/dist/parse-serverless.d.ts.map +1 -0
- package/dist/parse-serverless.js +195 -0
- package/dist/parse-serverless.js.map +1 -0
- package/dist/report.d.ts +36 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +154 -0
- package/dist/report.js.map +1 -0
- package/dist/shared-modules.d.ts +17 -0
- package/dist/shared-modules.d.ts.map +1 -0
- package/dist/shared-modules.js +104 -0
- package/dist/shared-modules.js.map +1 -0
- package/dist/visualize.d.ts +20 -0
- package/dist/visualize.d.ts.map +1 -0
- package/dist/visualize.js +139 -0
- package/dist/visualize.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseServerlessHandlers = parseServerlessHandlers;
|
|
4
|
+
exports.matchesAnyPattern = matchesAnyPattern;
|
|
5
|
+
exports.extractHandlerLines = extractHandlerLines;
|
|
6
|
+
exports.extractHandlerLinesFromJs = extractHandlerLinesFromJs;
|
|
7
|
+
exports.extractFunctionFileRefs = extractFunctionFileRefs;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
10
|
+
/**
|
|
11
|
+
* Extract all Lambda handler entry points from serverless*.yml files in a directory.
|
|
12
|
+
*
|
|
13
|
+
* Uses regex-based extraction to avoid issues with Serverless Framework's
|
|
14
|
+
* custom ${...} variable interpolation syntax that breaks standard YAML parsers.
|
|
15
|
+
*/
|
|
16
|
+
function parseServerlessHandlers(cwd, excludePatterns) {
|
|
17
|
+
const ymlFiles = findServerlessFiles(cwd, excludePatterns);
|
|
18
|
+
const entries = new Map();
|
|
19
|
+
let totalFunctions = 0;
|
|
20
|
+
for (const ymlFile of ymlFiles) {
|
|
21
|
+
const content = (0, node_fs_1.readFileSync)(ymlFile, "utf-8");
|
|
22
|
+
const handlers = extractHandlers(content, ymlFile, cwd);
|
|
23
|
+
for (const handler of handlers) {
|
|
24
|
+
totalFunctions += 1;
|
|
25
|
+
const existing = entries.get(handler.filePath);
|
|
26
|
+
if (existing) {
|
|
27
|
+
existing.functionNames.push(...handler.functionNames);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
entries.set(handler.filePath, handler);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { entries, totalFunctions };
|
|
35
|
+
}
|
|
36
|
+
function findServerlessFiles(cwd, excludePatterns) {
|
|
37
|
+
const files = (0, node_fs_1.readdirSync)(cwd)
|
|
38
|
+
.filter((f) => /^serverless.*\.(ya?ml|js)$/.test(f))
|
|
39
|
+
.filter((f) => !matchesAnyPattern(f, excludePatterns))
|
|
40
|
+
.map((f) => (0, node_path_1.join)(cwd, f));
|
|
41
|
+
return files;
|
|
42
|
+
}
|
|
43
|
+
function matchesAnyPattern(filename, patterns) {
|
|
44
|
+
return patterns.some((pattern) => {
|
|
45
|
+
const regex = new RegExp(`^${pattern.replace(/\*/g, ".*").replace(/\?/g, ".")}$`);
|
|
46
|
+
return regex.test(filename);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function extractHandlers(content, serverlessFile, cwd) {
|
|
50
|
+
const results = [];
|
|
51
|
+
const isJs = serverlessFile.endsWith(".js");
|
|
52
|
+
if (!isJs) {
|
|
53
|
+
// Follow ${file(...)} references in YAML functions blocks
|
|
54
|
+
const fileRefs = extractFunctionFileRefs(content, serverlessFile);
|
|
55
|
+
for (const refFile of fileRefs) {
|
|
56
|
+
if ((0, node_fs_1.existsSync)(refFile)) {
|
|
57
|
+
const refContent = (0, node_fs_1.readFileSync)(refFile, "utf-8");
|
|
58
|
+
const refHandlers = extractHandlerLines(refContent);
|
|
59
|
+
for (const raw of refHandlers) {
|
|
60
|
+
const entry = resolveHandler(raw, refFile, cwd);
|
|
61
|
+
if (entry)
|
|
62
|
+
results.push(entry);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const handlers = isJs
|
|
68
|
+
? extractHandlerLinesFromJs(content)
|
|
69
|
+
: extractHandlerLines(content);
|
|
70
|
+
for (const raw of handlers) {
|
|
71
|
+
const entry = resolveHandler(raw, serverlessFile, cwd);
|
|
72
|
+
if (entry)
|
|
73
|
+
results.push(entry);
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract handler: lines from YAML content.
|
|
79
|
+
*
|
|
80
|
+
* We look for lines matching the pattern:
|
|
81
|
+
* handler: src/path/to/file.exportName
|
|
82
|
+
*
|
|
83
|
+
* We track function names by looking for top-level keys under `functions:`
|
|
84
|
+
* that are followed by a `handler:` property.
|
|
85
|
+
*/
|
|
86
|
+
function extractHandlerLines(content) {
|
|
87
|
+
const results = [];
|
|
88
|
+
const lines = content.split("\n");
|
|
89
|
+
let inFunctions = false;
|
|
90
|
+
let currentFunction = null;
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
// Detect `functions:` block
|
|
93
|
+
if (/^functions:\s*$/.test(line)) {
|
|
94
|
+
inFunctions = true;
|
|
95
|
+
}
|
|
96
|
+
else if (inFunctions && /^\S/.test(line) && !line.startsWith("#")) {
|
|
97
|
+
// Exit functions block when we hit another top-level key
|
|
98
|
+
inFunctions = false;
|
|
99
|
+
currentFunction = null;
|
|
100
|
+
}
|
|
101
|
+
else if (inFunctions) {
|
|
102
|
+
// Detect function name (indented once, not a comment)
|
|
103
|
+
const funcMatch = line.match(/^ {2}(\w[\w-]*):\s*$/);
|
|
104
|
+
if (funcMatch) {
|
|
105
|
+
;
|
|
106
|
+
[, currentFunction] = funcMatch;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Detect handler value
|
|
110
|
+
const handlerMatch = line.match(/^\s+handler:\s+(.+)$/);
|
|
111
|
+
if (handlerMatch && currentFunction) {
|
|
112
|
+
const handlerPath = handlerMatch[1].trim();
|
|
113
|
+
// Skip handlers that are purely variable references like ${self:...}
|
|
114
|
+
if (!handlerPath.startsWith("${")) {
|
|
115
|
+
results.push({ functionName: currentFunction, handlerPath });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Extract handler lines from JavaScript serverless config files.
|
|
125
|
+
*
|
|
126
|
+
* Scans for `handler: 'src/path/to/file.exportName'` patterns and looks
|
|
127
|
+
* backwards from each match to find the enclosing function name key.
|
|
128
|
+
*/
|
|
129
|
+
function extractHandlerLinesFromJs(content) {
|
|
130
|
+
const results = [];
|
|
131
|
+
const lines = content.split("\n");
|
|
132
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
133
|
+
const handlerMatch = lines[i].match(/handler:\s*['"]([^'"]+)['"]/);
|
|
134
|
+
if (handlerMatch) {
|
|
135
|
+
const handlerPath = handlerMatch[1];
|
|
136
|
+
if (!handlerPath.startsWith("${")) {
|
|
137
|
+
// Look backwards for the function name (nearest `key: {` pattern)
|
|
138
|
+
let functionName = "unknown";
|
|
139
|
+
for (let j = i - 1; j >= 0; j -= 1) {
|
|
140
|
+
const keyMatch = lines[j].match(/^\s+(?:'([^']+)'|"([^"]+)"|(\w[\w-]*)):\s*\{/);
|
|
141
|
+
if (keyMatch) {
|
|
142
|
+
functionName = keyMatch[1] ?? keyMatch[2] ?? keyMatch[3];
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
results.push({ functionName, handlerPath });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return results;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Find ${file(...)} references within the functions: block.
|
|
154
|
+
* e.g. `functions: ${file(./some-other-file.yml):functions}`
|
|
155
|
+
* or individual function definitions loaded via file()
|
|
156
|
+
*/
|
|
157
|
+
function extractFunctionFileRefs(content, ymlFile) {
|
|
158
|
+
const refs = [];
|
|
159
|
+
const dir = (0, node_path_1.join)(ymlFile, "..");
|
|
160
|
+
// Match `functions: ${file(path)}` or `functions: ${file(path):key}`
|
|
161
|
+
const functionsFileMatch = content.match(/^functions:\s*\$\{file\(([^)]+)\)(?::[^}]*)?\}/m);
|
|
162
|
+
if (functionsFileMatch) {
|
|
163
|
+
refs.push((0, node_path_1.resolve)(dir, functionsFileMatch[1]));
|
|
164
|
+
}
|
|
165
|
+
// Also match inline file references within functions block
|
|
166
|
+
const inlineFileRegex = /^\s+\$\{file\(([^)]+)\)(?::[^}]*)?\}/gm;
|
|
167
|
+
for (const match of content.matchAll(inlineFileRegex)) {
|
|
168
|
+
refs.push((0, node_path_1.resolve)(dir, match[1]));
|
|
169
|
+
}
|
|
170
|
+
return refs;
|
|
171
|
+
}
|
|
172
|
+
function resolveHandler(raw, serverlessFile, cwd) {
|
|
173
|
+
// Handler format: "src/path/to/file.exportName"
|
|
174
|
+
// Split on the last dot to separate file path from export name
|
|
175
|
+
const lastDot = raw.handlerPath.lastIndexOf(".");
|
|
176
|
+
if (lastDot === -1)
|
|
177
|
+
return null;
|
|
178
|
+
const relativePath = raw.handlerPath.substring(0, lastDot);
|
|
179
|
+
const exportName = raw.handlerPath.substring(lastDot + 1);
|
|
180
|
+
// Try resolving as .ts, .js, /index.ts, /index.js
|
|
181
|
+
const extensions = [".ts", ".js", "/index.ts", "/index.js"];
|
|
182
|
+
for (const ext of extensions) {
|
|
183
|
+
const fullPath = (0, node_path_1.resolve)(cwd, relativePath + ext);
|
|
184
|
+
if ((0, node_fs_1.existsSync)(fullPath)) {
|
|
185
|
+
return {
|
|
186
|
+
filePath: fullPath,
|
|
187
|
+
exportName,
|
|
188
|
+
functionNames: [raw.functionName],
|
|
189
|
+
serverlessFile,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=parse-serverless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-serverless.js","sourceRoot":"","sources":["../src/parse-serverless.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ComparisonResult } from "./compare.js";
|
|
2
|
+
export interface ReportOptions {
|
|
3
|
+
verbose: boolean;
|
|
4
|
+
json: boolean;
|
|
5
|
+
threshold: number;
|
|
6
|
+
cwd: string;
|
|
7
|
+
}
|
|
8
|
+
interface FunctionDelta {
|
|
9
|
+
entryPoint: string;
|
|
10
|
+
currentBytes: number;
|
|
11
|
+
baseBytes: number;
|
|
12
|
+
deltaBytes: number;
|
|
13
|
+
deltaPercent: number;
|
|
14
|
+
isNew: boolean;
|
|
15
|
+
isRemoved: boolean;
|
|
16
|
+
}
|
|
17
|
+
interface ModuleDelta {
|
|
18
|
+
module: string;
|
|
19
|
+
deltaBytes: number;
|
|
20
|
+
affectedFunctions: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ReportData {
|
|
23
|
+
directory: string;
|
|
24
|
+
changedFiles: number;
|
|
25
|
+
affectedFunctions: number;
|
|
26
|
+
totalFunctions: number;
|
|
27
|
+
functions: FunctionDelta[];
|
|
28
|
+
topGrowingModules: ModuleDelta[];
|
|
29
|
+
}
|
|
30
|
+
export declare function buildReportData(comparison: ComparisonResult, changedFileCount: number, totalFunctions: number, cwd: string): ReportData;
|
|
31
|
+
export declare function computeModuleDeltas(comparison: ComparisonResult): ModuleDelta[];
|
|
32
|
+
export declare function formatBytes(bytes: number): string;
|
|
33
|
+
export declare function formatTextReport(data: ReportData, options: ReportOptions): string;
|
|
34
|
+
export declare function formatJsonReport(data: ReportData): string;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACX;AAED,UAAU,aAAa;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;CAClB;AAED,UAAU,WAAW;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,iBAAiB,EAAE,WAAW,EAAE,CAAA;CAChC;AAED,wBAAgB,eAAe,CAC9B,UAAU,EAAE,gBAAgB,EAC5B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,MAAM,GACT,UAAU,CAoDZ;AAED,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,gBAAgB,GAC1B,WAAW,EAAE,CA8Bf;AAQD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD;AASD,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,aAAa,GACpB,MAAM,CAiER;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEzD"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildReportData = buildReportData;
|
|
4
|
+
exports.computeModuleDeltas = computeModuleDeltas;
|
|
5
|
+
exports.formatBytes = formatBytes;
|
|
6
|
+
exports.formatTextReport = formatTextReport;
|
|
7
|
+
exports.formatJsonReport = formatJsonReport;
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
function buildReportData(comparison, changedFileCount, totalFunctions, cwd) {
|
|
10
|
+
const functions = [];
|
|
11
|
+
// Existing + changed functions
|
|
12
|
+
for (const [ep, currentSize] of comparison.current) {
|
|
13
|
+
const baseSize = comparison.base.get(ep);
|
|
14
|
+
const isNew = comparison.newEntryPoints.has(ep);
|
|
15
|
+
const baseBytes = baseSize?.bytes ?? 0;
|
|
16
|
+
const deltaBytes = currentSize.bytes - baseBytes;
|
|
17
|
+
const deltaPercent = baseBytes > 0 ? (deltaBytes / baseBytes) * 100 : 0;
|
|
18
|
+
functions.push({
|
|
19
|
+
entryPoint: ep,
|
|
20
|
+
currentBytes: currentSize.bytes,
|
|
21
|
+
baseBytes,
|
|
22
|
+
deltaBytes,
|
|
23
|
+
deltaPercent,
|
|
24
|
+
isNew,
|
|
25
|
+
isRemoved: false,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Removed functions
|
|
29
|
+
for (const ep of comparison.removedEntryPoints) {
|
|
30
|
+
const baseSize = comparison.base.get(ep);
|
|
31
|
+
if (baseSize) {
|
|
32
|
+
functions.push({
|
|
33
|
+
entryPoint: ep,
|
|
34
|
+
currentBytes: 0,
|
|
35
|
+
baseBytes: baseSize.bytes,
|
|
36
|
+
deltaBytes: -baseSize.bytes,
|
|
37
|
+
deltaPercent: -100,
|
|
38
|
+
isNew: false,
|
|
39
|
+
isRemoved: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Sort by absolute delta descending
|
|
44
|
+
functions.sort((a, b) => Math.abs(b.deltaBytes) - Math.abs(a.deltaBytes));
|
|
45
|
+
// Compute top growing modules across all functions
|
|
46
|
+
const moduleDeltas = computeModuleDeltas(comparison);
|
|
47
|
+
return {
|
|
48
|
+
directory: (0, node_path_1.relative)(process.cwd(), cwd) || ".",
|
|
49
|
+
changedFiles: changedFileCount,
|
|
50
|
+
affectedFunctions: functions.length,
|
|
51
|
+
totalFunctions,
|
|
52
|
+
functions,
|
|
53
|
+
topGrowingModules: moduleDeltas,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function computeModuleDeltas(comparison) {
|
|
57
|
+
const moduleMap = new Map();
|
|
58
|
+
for (const [ep, currentSize] of comparison.current) {
|
|
59
|
+
const baseSize = comparison.base.get(ep);
|
|
60
|
+
const baseModules = baseSize?.modules ?? new Map();
|
|
61
|
+
for (const [mod, currentBytes] of currentSize.modules) {
|
|
62
|
+
const baseBytes = baseModules.get(mod) ?? 0;
|
|
63
|
+
const delta = currentBytes - baseBytes;
|
|
64
|
+
if (delta !== 0) {
|
|
65
|
+
const existing = moduleMap.get(mod);
|
|
66
|
+
if (existing) {
|
|
67
|
+
existing.totalDelta += delta;
|
|
68
|
+
existing.count += 1;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
moduleMap.set(mod, { totalDelta: delta, count: 1 });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return Array.from(moduleMap.entries())
|
|
77
|
+
.map(([module, { totalDelta, count }]) => ({
|
|
78
|
+
module,
|
|
79
|
+
deltaBytes: totalDelta,
|
|
80
|
+
affectedFunctions: count,
|
|
81
|
+
}))
|
|
82
|
+
.sort((a, b) => Math.abs(b.deltaBytes) - Math.abs(a.deltaBytes))
|
|
83
|
+
.slice(0, 10);
|
|
84
|
+
}
|
|
85
|
+
const green = (s) => `\x1b[32m${s}\x1b[0m`;
|
|
86
|
+
const red = (s) => `\x1b[31m${s}\x1b[0m`;
|
|
87
|
+
const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
88
|
+
const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
89
|
+
const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
|
|
90
|
+
function formatBytes(bytes) {
|
|
91
|
+
const abs = Math.abs(bytes);
|
|
92
|
+
if (abs < 1024)
|
|
93
|
+
return `${bytes} B`;
|
|
94
|
+
if (abs < 1024 * 1024)
|
|
95
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
96
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
97
|
+
}
|
|
98
|
+
function formatDelta(bytes, percent) {
|
|
99
|
+
if (bytes === 0)
|
|
100
|
+
return dim("no change");
|
|
101
|
+
const sign = bytes > 0 ? "+" : "";
|
|
102
|
+
const text = `${sign}${formatBytes(bytes)} (${sign}${percent.toFixed(1)}%)`;
|
|
103
|
+
return bytes > 0 ? red(text) : green(text);
|
|
104
|
+
}
|
|
105
|
+
function formatTextReport(data, options) {
|
|
106
|
+
const lines = [];
|
|
107
|
+
lines.push(bold(`sls-bundle-analyser — ${data.directory}`));
|
|
108
|
+
lines.push("=".repeat(40 + data.directory.length));
|
|
109
|
+
lines.push(`Changed files: ${data.changedFiles}`);
|
|
110
|
+
lines.push(`Affected functions: ${data.affectedFunctions} of ${data.totalFunctions}`);
|
|
111
|
+
lines.push("");
|
|
112
|
+
const filtered = options.threshold > 0
|
|
113
|
+
? data.functions.filter((f) => Math.abs(f.deltaBytes) >= options.threshold)
|
|
114
|
+
: data.functions;
|
|
115
|
+
if (filtered.length === 0) {
|
|
116
|
+
lines.push(dim("No significant bundle size changes."));
|
|
117
|
+
return lines.join("\n");
|
|
118
|
+
}
|
|
119
|
+
// Table header
|
|
120
|
+
const nameWidth = Math.max(30, ...filtered.map((f) => f.entryPoint.length));
|
|
121
|
+
lines.push(` ${"Function".padEnd(nameWidth)} ${"Base".padStart(10)} ${"Branch".padStart(10)} Delta`);
|
|
122
|
+
lines.push(` ${"─".repeat(nameWidth)} ${"─".repeat(10)} ${"─".repeat(10)} ${"─".repeat(20)}`);
|
|
123
|
+
for (const fn of filtered) {
|
|
124
|
+
let label = fn.entryPoint;
|
|
125
|
+
if (fn.isNew)
|
|
126
|
+
label = `${label} ${cyan("[NEW]")}`;
|
|
127
|
+
if (fn.isRemoved)
|
|
128
|
+
label = `${label} ${dim("[REMOVED]")}`;
|
|
129
|
+
const baseStr = fn.isNew ? dim("—") : formatBytes(fn.baseBytes).padStart(10);
|
|
130
|
+
const currentStr = fn.isRemoved
|
|
131
|
+
? dim("—")
|
|
132
|
+
: formatBytes(fn.currentBytes).padStart(10);
|
|
133
|
+
const deltaStr = fn.isNew
|
|
134
|
+
? cyan(formatBytes(fn.currentBytes))
|
|
135
|
+
: formatDelta(fn.deltaBytes, fn.deltaPercent);
|
|
136
|
+
lines.push(` ${label.padEnd(nameWidth)} ${baseStr} ${currentStr} ${deltaStr}`);
|
|
137
|
+
}
|
|
138
|
+
// Top growing modules
|
|
139
|
+
if (data.topGrowingModules.length > 0) {
|
|
140
|
+
lines.push("");
|
|
141
|
+
lines.push(bold("Top changing modules:"));
|
|
142
|
+
for (const mod of data.topGrowingModules.slice(0, 5)) {
|
|
143
|
+
const sign = mod.deltaBytes > 0 ? "+" : "";
|
|
144
|
+
const sizeStr = `${sign}${formatBytes(mod.deltaBytes)}`;
|
|
145
|
+
const colouredSize = mod.deltaBytes > 0 ? red(sizeStr) : green(sizeStr);
|
|
146
|
+
lines.push(` ${mod.module.padEnd(50)} ${colouredSize} (in ${mod.affectedFunctions} functions)`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return lines.join("\n");
|
|
150
|
+
}
|
|
151
|
+
function formatJsonReport(data) {
|
|
152
|
+
return JSON.stringify(data, null, 2);
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BundleAnalyserConfig } from "./config.js";
|
|
2
|
+
import type { ParseResult } from "./parse-serverless.js";
|
|
3
|
+
export interface SharedModule {
|
|
4
|
+
package: string;
|
|
5
|
+
bundleCount: number;
|
|
6
|
+
totalBytes: number;
|
|
7
|
+
avgBytesPerBundle: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SharedModulesResult {
|
|
10
|
+
modules: SharedModule[];
|
|
11
|
+
totalEntryPoints: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function extractPackageName(inputPath: string): string | null;
|
|
14
|
+
export declare function analyzeSharedModules(parseResult: ParseResult, config: BundleAnalyserConfig, cwd: string): Promise<SharedModulesResult>;
|
|
15
|
+
export declare function formatSharedModulesText(result: SharedModulesResult, top: number): string;
|
|
16
|
+
export declare function formatSharedModulesJson(result: SharedModulesResult, top: number): string;
|
|
17
|
+
//# sourceMappingURL=shared-modules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-modules.d.ts","sourceRoot":"","sources":["../src/shared-modules.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;CACxB;AAID,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBnE;AAED,wBAAsB,oBAAoB,CACzC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,oBAAoB,EAC5B,GAAG,EAAE,MAAM,GACT,OAAO,CAAC,mBAAmB,CAAC,CAsE9B;AAYD,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,MAAM,GACT,MAAM,CA+BR;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,GAAG,EAAE,MAAM,GACT,MAAM,CAMR"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractPackageName = extractPackageName;
|
|
4
|
+
exports.analyzeSharedModules = analyzeSharedModules;
|
|
5
|
+
exports.formatSharedModulesText = formatSharedModulesText;
|
|
6
|
+
exports.formatSharedModulesJson = formatSharedModulesJson;
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const esbuild_1 = require("esbuild");
|
|
9
|
+
const esbuild_config_js_1 = require("./esbuild-config.js");
|
|
10
|
+
const BATCH_SIZE = 10;
|
|
11
|
+
function extractPackageName(inputPath) {
|
|
12
|
+
const idx = inputPath.lastIndexOf("node_modules/");
|
|
13
|
+
if (idx === -1)
|
|
14
|
+
return null;
|
|
15
|
+
const rest = inputPath.slice(idx + "node_modules/".length);
|
|
16
|
+
if (rest.startsWith("@")) {
|
|
17
|
+
// Scoped package: @scope/pkg/...
|
|
18
|
+
const parts = rest.split("/");
|
|
19
|
+
if (parts.length >= 2)
|
|
20
|
+
return `${parts[0]}/${parts[1]}`;
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
// Regular package: pkg/...
|
|
24
|
+
const slashIdx = rest.indexOf("/");
|
|
25
|
+
return slashIdx === -1 ? rest : rest.slice(0, slashIdx);
|
|
26
|
+
}
|
|
27
|
+
async function analyzeSharedModules(parseResult, config, cwd) {
|
|
28
|
+
const entries = Array.from(parseResult.entries.keys());
|
|
29
|
+
// Per-package aggregation: package -> { perBundle: Map<entryIndex, bytes> }
|
|
30
|
+
const packageData = new Map();
|
|
31
|
+
for (let i = 0; i < entries.length; i += BATCH_SIZE) {
|
|
32
|
+
const batchEntries = entries.slice(i, i + BATCH_SIZE);
|
|
33
|
+
const batchMap = {};
|
|
34
|
+
for (const ep of batchEntries) {
|
|
35
|
+
const key = (0, node_path_1.relative)(cwd, ep);
|
|
36
|
+
batchMap[key] = ep;
|
|
37
|
+
}
|
|
38
|
+
const options = (0, esbuild_config_js_1.buildEsbuildOptions)(batchMap, config);
|
|
39
|
+
const result = await (0, esbuild_1.build)({ ...options, absWorkingDir: cwd });
|
|
40
|
+
if (!result.metafile) {
|
|
41
|
+
throw new Error("esbuild did not produce a metafile");
|
|
42
|
+
}
|
|
43
|
+
for (const output of Object.values(result.metafile.outputs)) {
|
|
44
|
+
if (output.entryPoint) {
|
|
45
|
+
const bundleIdx = entries.indexOf((0, node_path_1.join)(cwd, output.entryPoint));
|
|
46
|
+
for (const [inputPath, { bytesInOutput }] of Object.entries(output.inputs)) {
|
|
47
|
+
const pkg = extractPackageName(inputPath);
|
|
48
|
+
if (pkg) {
|
|
49
|
+
let perBundle = packageData.get(pkg);
|
|
50
|
+
if (!perBundle) {
|
|
51
|
+
perBundle = new Map();
|
|
52
|
+
packageData.set(pkg, perBundle);
|
|
53
|
+
}
|
|
54
|
+
perBundle.set(bundleIdx, (perBundle.get(bundleIdx) ?? 0) + bytesInOutput);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
process.stderr.write(`Bundled ${Math.min(i + BATCH_SIZE, entries.length)}/${entries.length} entry points...\n`);
|
|
60
|
+
}
|
|
61
|
+
const modules = Array.from(packageData.entries()).map(([pkg, perBundle]) => {
|
|
62
|
+
const totalBytes = Array.from(perBundle.values()).reduce((sum, b) => sum + b, 0);
|
|
63
|
+
return {
|
|
64
|
+
package: pkg,
|
|
65
|
+
bundleCount: perBundle.size,
|
|
66
|
+
totalBytes,
|
|
67
|
+
avgBytesPerBundle: Math.round(totalBytes / perBundle.size),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
// Sort by bundleCount desc, secondary by totalBytes desc
|
|
71
|
+
modules.sort((a, b) => b.bundleCount - a.bundleCount || b.totalBytes - a.totalBytes);
|
|
72
|
+
return { modules, totalEntryPoints: entries.length };
|
|
73
|
+
}
|
|
74
|
+
const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
75
|
+
const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
76
|
+
function formatBytes(bytes) {
|
|
77
|
+
const abs = Math.abs(bytes);
|
|
78
|
+
if (abs < 1024)
|
|
79
|
+
return `${bytes} B`;
|
|
80
|
+
if (abs < 1024 * 1024)
|
|
81
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
82
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
83
|
+
}
|
|
84
|
+
function formatSharedModulesText(result, top) {
|
|
85
|
+
const lines = [];
|
|
86
|
+
const modules = result.modules.slice(0, top);
|
|
87
|
+
lines.push(bold(`Shared node_modules packages (${result.totalEntryPoints} entry points)`));
|
|
88
|
+
lines.push("=".repeat(60));
|
|
89
|
+
if (modules.length === 0) {
|
|
90
|
+
lines.push(dim("No shared node_modules packages found."));
|
|
91
|
+
return lines.join("\n");
|
|
92
|
+
}
|
|
93
|
+
const nameWidth = Math.max(30, ...modules.map((m) => m.package.length));
|
|
94
|
+
lines.push(` ${"Module".padEnd(nameWidth)} ${"Bundles".padStart(8)} ${"Avg Size".padStart(10)} ${"Total".padStart(10)}`);
|
|
95
|
+
lines.push(` ${"─".repeat(nameWidth)} ${"─".repeat(8)} ${"─".repeat(10)} ${"─".repeat(10)}`);
|
|
96
|
+
for (const mod of modules) {
|
|
97
|
+
lines.push(` ${mod.package.padEnd(nameWidth)} ${String(mod.bundleCount).padStart(8)} ${formatBytes(mod.avgBytesPerBundle).padStart(10)} ${formatBytes(mod.totalBytes).padStart(10)}`);
|
|
98
|
+
}
|
|
99
|
+
return lines.join("\n");
|
|
100
|
+
}
|
|
101
|
+
function formatSharedModulesJson(result, top) {
|
|
102
|
+
return JSON.stringify({ ...result, modules: result.modules.slice(0, top) }, null, 2);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=shared-modules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-modules.js","sourceRoot":"","sources":["../src/shared-modules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Metafile } from "esbuild";
|
|
2
|
+
import type { BundleAnalyserConfig } from "./config.js";
|
|
3
|
+
type Template = "treemap" | "sunburst" | "network";
|
|
4
|
+
export interface VisualizeOptions {
|
|
5
|
+
template: Template;
|
|
6
|
+
excludeThirdParty: boolean;
|
|
7
|
+
top?: number;
|
|
8
|
+
outputPath?: string;
|
|
9
|
+
open?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function filterThirdParty(metafile: Metafile): Metafile;
|
|
12
|
+
export declare function filterTopModules(metafile: Metafile, n: number): Metafile;
|
|
13
|
+
export declare function sanitizeForFilename(entryPoint: string): string;
|
|
14
|
+
export declare function visualizeEntryPoint(entryPoint: string, config: BundleAnalyserConfig, cwd: string, options: VisualizeOptions): Promise<string>;
|
|
15
|
+
export declare function visualizeDiff(entryPoint: string, config: BundleAnalyserConfig, cwd: string, base: string, options: VisualizeOptions): Promise<{
|
|
16
|
+
currentPath: string;
|
|
17
|
+
basePath: string;
|
|
18
|
+
}>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=visualize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualize.d.ts","sourceRoot":"","sources":["../src/visualize.ts"],"names":[],"mappings":"AAGA,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAE9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGvD,KAAK,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;AAElD,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,QAAQ,CAAA;IAClB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,OAAO,CAAA;CACd;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAoB7D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,CAqCxE;AAkBD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AA2CD,wBAAsB,mBAAmB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,wBAAsB,aAAa,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,EAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BpD"}
|