@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.
Files changed (59) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +126 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +54 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/compare.d.ts +10 -0
  8. package/dist/commands/compare.d.ts.map +1 -0
  9. package/dist/commands/compare.js +82 -0
  10. package/dist/commands/compare.js.map +1 -0
  11. package/dist/commands/shared-modules.d.ts +6 -0
  12. package/dist/commands/shared-modules.d.ts.map +1 -0
  13. package/dist/commands/shared-modules.js +27 -0
  14. package/dist/commands/shared-modules.js.map +1 -0
  15. package/dist/commands/sizes.d.ts +6 -0
  16. package/dist/commands/sizes.d.ts.map +1 -0
  17. package/dist/commands/sizes.js +70 -0
  18. package/dist/commands/sizes.js.map +1 -0
  19. package/dist/commands/visualize.d.ts +11 -0
  20. package/dist/commands/visualize.d.ts.map +1 -0
  21. package/dist/commands/visualize.js +29 -0
  22. package/dist/commands/visualize.js.map +1 -0
  23. package/dist/compare.d.ts +47 -0
  24. package/dist/compare.d.ts.map +1 -0
  25. package/dist/compare.js +181 -0
  26. package/dist/compare.js.map +1 -0
  27. package/dist/config.d.ts +11 -0
  28. package/dist/config.d.ts.map +1 -0
  29. package/dist/config.js +35 -0
  30. package/dist/config.js.map +1 -0
  31. package/dist/dependency-graph.d.ts +29 -0
  32. package/dist/dependency-graph.d.ts.map +1 -0
  33. package/dist/dependency-graph.js +87 -0
  34. package/dist/dependency-graph.js.map +1 -0
  35. package/dist/esbuild-config.d.ts +4 -0
  36. package/dist/esbuild-config.d.ts.map +1 -0
  37. package/dist/esbuild-config.js +20 -0
  38. package/dist/esbuild-config.js.map +1 -0
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +28 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/parse-serverless.d.ts +53 -0
  44. package/dist/parse-serverless.d.ts.map +1 -0
  45. package/dist/parse-serverless.js +195 -0
  46. package/dist/parse-serverless.js.map +1 -0
  47. package/dist/report.d.ts +36 -0
  48. package/dist/report.d.ts.map +1 -0
  49. package/dist/report.js +154 -0
  50. package/dist/report.js.map +1 -0
  51. package/dist/shared-modules.d.ts +17 -0
  52. package/dist/shared-modules.d.ts.map +1 -0
  53. package/dist/shared-modules.js +104 -0
  54. package/dist/shared-modules.js.map +1 -0
  55. package/dist/visualize.d.ts +20 -0
  56. package/dist/visualize.d.ts.map +1 -0
  57. package/dist/visualize.js +139 -0
  58. package/dist/visualize.js.map +1 -0
  59. package/package.json +53 -0
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterThirdParty = filterThirdParty;
4
+ exports.filterTopModules = filterTopModules;
5
+ exports.sanitizeForFilename = sanitizeForFilename;
6
+ exports.visualizeEntryPoint = visualizeEntryPoint;
7
+ exports.visualizeDiff = visualizeDiff;
8
+ const node_child_process_1 = require("node:child_process");
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = require("node:path");
11
+ const esbuild_1 = require("esbuild");
12
+ const compare_js_1 = require("./compare.js");
13
+ const esbuild_config_js_1 = require("./esbuild-config.js");
14
+ function filterThirdParty(metafile) {
15
+ const inputs = {};
16
+ for (const [path, value] of Object.entries(metafile.inputs)) {
17
+ if (!path.includes("node_modules")) {
18
+ inputs[path] = value;
19
+ }
20
+ }
21
+ const outputs = {};
22
+ for (const [bundle, output] of Object.entries(metafile.outputs)) {
23
+ const filteredInputs = {};
24
+ for (const [path, value] of Object.entries(output.inputs)) {
25
+ if (!path.includes("node_modules")) {
26
+ filteredInputs[path] = value;
27
+ }
28
+ }
29
+ outputs[bundle] = { ...output, inputs: filteredInputs };
30
+ }
31
+ return { inputs, outputs };
32
+ }
33
+ function filterTopModules(metafile, n) {
34
+ // Collect all input paths with their total bytesInOutput across all outputs
35
+ const totalByPath = new Map();
36
+ for (const output of Object.values(metafile.outputs)) {
37
+ for (const [path, { bytesInOutput }] of Object.entries(output.inputs)) {
38
+ totalByPath.set(path, (totalByPath.get(path) ?? 0) + bytesInOutput);
39
+ }
40
+ }
41
+ // Sort descending and keep top N paths
42
+ const topPaths = new Set(Array.from(totalByPath.entries())
43
+ .sort((a, b) => b[1] - a[1])
44
+ .slice(0, n)
45
+ .map(([path]) => path));
46
+ // Rebuild metafile with only those paths
47
+ const inputs = {};
48
+ for (const [path, value] of Object.entries(metafile.inputs)) {
49
+ if (topPaths.has(path)) {
50
+ inputs[path] = value;
51
+ }
52
+ }
53
+ const outputs = {};
54
+ for (const [bundle, output] of Object.entries(metafile.outputs)) {
55
+ const filteredInputs = {};
56
+ for (const [path, value] of Object.entries(output.inputs)) {
57
+ if (topPaths.has(path)) {
58
+ filteredInputs[path] = value;
59
+ }
60
+ }
61
+ outputs[bundle] = { ...output, inputs: filteredInputs };
62
+ }
63
+ return { inputs, outputs };
64
+ }
65
+ function resolveEntryPoint(entryPoint, cwd) {
66
+ // If it already has an extension, try as-is first
67
+ const abs = (0, node_path_1.resolve)(cwd, entryPoint);
68
+ if ((0, node_fs_1.existsSync)(abs))
69
+ return abs;
70
+ // Try common extensions
71
+ if (!(0, node_path_1.extname)(entryPoint)) {
72
+ for (const ext of [".ts", ".js"]) {
73
+ const candidate = (0, node_path_1.resolve)(cwd, entryPoint + ext);
74
+ if ((0, node_fs_1.existsSync)(candidate))
75
+ return candidate;
76
+ }
77
+ }
78
+ throw new Error(`Entry point not found: ${entryPoint} (resolved from ${cwd})`);
79
+ }
80
+ function sanitizeForFilename(entryPoint) {
81
+ return entryPoint.replace(/[/\\]/g, "-").replace(/\.[^.]+$/, "");
82
+ }
83
+ async function buildAndVisualize(entryPoint, config, cwd, options) {
84
+ const resolvedPath = resolveEntryPoint(entryPoint, cwd);
85
+ const buildOpts = (0, esbuild_config_js_1.buildEsbuildOptions)({ entry: resolvedPath }, config);
86
+ buildOpts.absWorkingDir = cwd;
87
+ const result = await (0, esbuild_1.build)(buildOpts);
88
+ if (!result.metafile) {
89
+ throw new Error("esbuild did not produce a metafile");
90
+ }
91
+ // Dynamic import of esbuild-visualizer
92
+ const { visualizer } = (await import("esbuild-visualizer/dist/plugin/index.js"));
93
+ let metafile = options.excludeThirdParty
94
+ ? filterThirdParty(result.metafile)
95
+ : result.metafile;
96
+ if (options.top != null) {
97
+ metafile = filterTopModules(metafile, options.top);
98
+ }
99
+ return visualizer(metafile, {
100
+ template: options.template,
101
+ title: entryPoint,
102
+ });
103
+ }
104
+ async function visualizeEntryPoint(entryPoint, config, cwd, options) {
105
+ const html = await buildAndVisualize(entryPoint, config, cwd, options);
106
+ const sanitized = sanitizeForFilename(entryPoint);
107
+ const outPath = options.outputPath ?? `/tmp/sls-bundle-analyser-${sanitized}.html`;
108
+ (0, node_fs_1.writeFileSync)(outPath, html);
109
+ if (options.open !== false && !options.outputPath) {
110
+ (0, node_child_process_1.execSync)(`open ${outPath}`);
111
+ }
112
+ return outPath;
113
+ }
114
+ async function visualizeDiff(entryPoint, config, cwd, base, options) {
115
+ const currentHtml = await buildAndVisualize(entryPoint, config, cwd, options);
116
+ const baseHtml = await (0, compare_js_1.withWorktree)(base, cwd, (worktreeCwd) => buildAndVisualize(entryPoint, config, worktreeCwd, options));
117
+ const sanitized = sanitizeForFilename(entryPoint);
118
+ let currentPath;
119
+ let basePath;
120
+ if (options.outputPath) {
121
+ const dir = (0, node_path_1.dirname)(options.outputPath);
122
+ const ext = (0, node_path_1.extname)(options.outputPath);
123
+ const stem = (0, node_path_1.basename)(options.outputPath, ext);
124
+ currentPath = (0, node_path_1.join)(dir, `${stem}-current${ext}`);
125
+ basePath = (0, node_path_1.join)(dir, `${stem}-${base}${ext}`);
126
+ }
127
+ else {
128
+ currentPath = `/tmp/sls-bundle-analyser-${sanitized}-current.html`;
129
+ basePath = `/tmp/sls-bundle-analyser-${sanitized}-${base}.html`;
130
+ }
131
+ (0, node_fs_1.writeFileSync)(currentPath, currentHtml);
132
+ (0, node_fs_1.writeFileSync)(basePath, baseHtml);
133
+ if (options.open !== false && !options.outputPath) {
134
+ (0, node_child_process_1.execSync)(`open ${currentPath}`);
135
+ (0, node_child_process_1.execSync)(`open ${basePath}`);
136
+ }
137
+ return { currentPath, basePath };
138
+ }
139
+ //# sourceMappingURL=visualize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualize.js","sourceRoot":"","sources":["../src/visualize.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@tomnieuwland/sls-bundle-analyser",
3
+ "version": "1.1.0",
4
+ "description": "Analyze bundle size changes for Typescript/Javascript Serverless Framework Lambda functions using esbuild.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/tomnieuwland/sls-bundle-analyser.git"
8
+ },
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "bin": {
13
+ "sls-bundle-analyser": "./dist/cli.js"
14
+ },
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "files": [
18
+ "dist",
19
+ "!dist/__tests__"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "typecheck": "tsc --noEmit",
24
+ "biome": "npx @biomejs/biome check",
25
+ "biome:fix": "npx @biomejs/biome check --write",
26
+ "cspell": "cspell lint .",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "prepare": "husky"
30
+ },
31
+ "dependencies": {
32
+ "commander": "^14.0.3",
33
+ "cspell": "^9.7.0",
34
+ "esbuild": "0.27.1",
35
+ "esbuild-visualizer": "0.7.0"
36
+ },
37
+ "devDependencies": {
38
+ "@biomejs/biome": "2.4.8",
39
+ "@types/node": "20.19.23",
40
+ "husky": "^9.1.7",
41
+ "typescript": "5.9.3",
42
+ "vitest": "^4.1.0"
43
+ },
44
+ "license": "MIT",
45
+ "engines": {
46
+ "node": ">=20"
47
+ },
48
+ "release": {
49
+ "branches": [
50
+ "main"
51
+ ]
52
+ }
53
+ }