1 | #!/usr/bin/env node
|
2 |
|
3 | import fs from "fs";
|
4 | import zlib from "zlib";
|
5 | import prettyBytes from "pretty-bytes";
|
6 | const beforeSourcemap = JSON.parse(fs.readFileSync('./before.json').toString());
|
7 | const afterSourcemap = JSON.parse(fs.readFileSync('./after.json').toString());
|
8 |
|
9 | function fileSize(file) {
|
10 | const {size} = fs.statSync(file);
|
11 | const gzipped = zlib.gzipSync(fs.readFileSync(file)).length
|
12 | return {
|
13 | size,
|
14 | gzipped
|
15 | };
|
16 | }
|
17 |
|
18 | const beforejs = fileSize('./before/maplibre-gl.js');
|
19 | const beforecss = fileSize('./before/maplibre-gl.css');
|
20 | const afterjs = fileSize('./after/maplibre-gl.js');
|
21 | const aftercss = fileSize('./after/maplibre-gl.css');
|
22 |
|
23 | console.log('Bundle size report:\n');
|
24 | console.log(`**Size Change:** ${prettyBytes(afterjs.gzipped + aftercss.gzipped - (beforejs.gzipped + beforecss.gzipped), { signed: true })}`);
|
25 | console.log(`**Total Size Before:** ${prettyBytes(beforejs.gzipped + beforecss.gzipped)}`);
|
26 | console.log(`**Total Size After:** ${prettyBytes(afterjs.gzipped + aftercss.gzipped)}`);
|
27 | console.log(`
|
28 | | Output file | Before | After | Change |
|
29 | | :--- | :---: | :---: | :---: |
|
30 | | maplibre-gl.js | ${prettyBytes(beforejs.gzipped)} | ${prettyBytes(afterjs.gzipped)} | ${prettyBytes(afterjs.gzipped - beforejs.gzipped, { signed: true })} |
|
31 | | maplibre-gl.css | ${prettyBytes(beforecss.gzipped)} | ${prettyBytes(aftercss.gzipped)} | ${prettyBytes(aftercss.gzipped - beforecss.gzipped, { signed: true })} |`);
|
32 |
|
33 | const before = {};
|
34 | beforeSourcemap.results.forEach(result => {
|
35 | Object.keys(result.files).forEach(filename => {
|
36 | const {size} = result.files[filename];
|
37 | before[filename] = size;
|
38 | });
|
39 | });
|
40 |
|
41 | const after = {};
|
42 | afterSourcemap.results.forEach(result => {
|
43 | Object.keys(result.files).forEach(filename => {
|
44 | const {size} = result.files[filename];
|
45 | after[filename] = size;
|
46 | });
|
47 | });
|
48 |
|
49 | const diffs = [];
|
50 | Object.keys(Object.assign({}, before, after)).forEach(filename => {
|
51 | const beforeSize = before[filename] || 0;
|
52 | const afterSize = after[filename] || 0;
|
53 | if (Math.abs(afterSize - beforeSize) > 0) {
|
54 | diffs.push([
|
55 | afterSize - beforeSize,
|
56 | filename.replace(/^[\./]+/, ''),
|
57 | prettyBytes(beforeSize),
|
58 | prettyBytes(afterSize),
|
59 | prettyBytes(afterSize - beforeSize, { signed: true })
|
60 | ]);
|
61 | }
|
62 | });
|
63 |
|
64 | diffs.sort((a, b) => b[0] - a[0]);
|
65 |
|
66 | console.log(`
|
67 | <details><summary>ℹ️ <strong>View Details</strong></summary>`);
|
68 | if (diffs.length) {
|
69 | console.log(`
|
70 | | Source file | Before | After | Change |
|
71 | | :--- | :---: | :---: | :---: |
|
72 | ${diffs.map(diff => '| ' + diff.slice(1).join(' | ') + ' |').join('\n')}
|
73 | `);
|
74 | } else {
|
75 | console.log('No major changes');
|
76 | }
|
77 | console.log(`</details>`);
|