Skip to content

Commit d64390e

Browse files
committedAug 28, 2018
Initial implementation
1 parent 291596e commit d64390e

File tree

9 files changed

+243
-39
lines changed

9 files changed

+243
-39
lines changed
 

‎config/bundlesize.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
javascript: {
3+
pattern: 'assets/*.js',
4+
limit: '1KB'
5+
},
6+
css: {
7+
pattern: 'assets/*.css',
8+
limit: '1MB'
9+
}
10+
};

‎index.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
'use strict';
22

33
module.exports = {
4-
name: require('./package').name
4+
name: require('./package').name,
5+
6+
includedCommands() {
7+
return {
8+
'bundlesize:test': require('./lib/commands/test')
9+
};
10+
},
511
};

‎lib/commands/test.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
'use strict';
2+
3+
const path = require('path');
4+
5+
module.exports = {
6+
name: 'bundlesize:test',
7+
description: 'Assert that your app\'s bundle size is within its defined limits',
8+
9+
availableOptions: [],
10+
works: 'insideProject',
11+
12+
run() {
13+
let BundlesizeTestTask = require('../tasks/test');
14+
15+
let testTask = new BundlesizeTestTask({
16+
ui: this.ui,
17+
rootDir: this.project.root,
18+
buildDir: path.join(this.project.root, 'dist')
19+
});
20+
21+
return testTask.run();
22+
}
23+
};

‎lib/helpers/assert-bundlesize.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict';
2+
3+
const bytes = require('bytes');
4+
const getBundlesize = require('./get-bundlesize');
5+
6+
module.exports = function assertBundlesize(config, buildDir) {
7+
let {
8+
pattern,
9+
limit
10+
} = config;
11+
12+
let maxSize = bytes.parse(limit);
13+
14+
// @todo validate config
15+
16+
return getBundlesize(pattern, buildDir)
17+
.then(size => {
18+
if (size > maxSize) {
19+
throw new Error(`${bytes(size)} > ${bytes(maxSize)}`);
20+
} else {
21+
return `${bytes(size)} <= ${bytes(maxSize)}`;
22+
}
23+
});
24+
};

‎lib/helpers/ember-build.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
const execa = require('execa');
4+
5+
module.exports = function emberBuild() {
6+
return execa('ember', ['build', '--prod'])
7+
}

‎lib/helpers/get-bundlesize.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use strict';
2+
3+
const fg = require('fast-glob');
4+
const fs = require('fs');
5+
const zlib = require('zlib');
6+
const RSVP = require('rsvp');
7+
const gzip = RSVP.denodeify(zlib.gzip);
8+
9+
// function getFileSize(file) {
10+
// let contentsBuffer = fs.readFileSync(file);
11+
// return gzip(contentsBuffer).then(buffer => ({
12+
// size: contentsBuffer.length,
13+
// compressedSize: buffer.length
14+
// }));
15+
// }
16+
17+
function getFileSize(file) {
18+
let contentsBuffer = fs.readFileSync(file);
19+
return contentsBuffer.length;
20+
}
21+
22+
function combineSizes(fileSizes) {
23+
return fileSizes.reduce((result, fileSize) => result + fileSize, 0);
24+
}
25+
26+
module.exports = function getBundlesize(pattern, buildDir) {
27+
return fg(pattern, {
28+
cwd: buildDir,
29+
onlyFiles: true,
30+
absolute: true
31+
})
32+
.then(files => Promise.all(files.map(getFileSize)))
33+
.then(fileSizes => combineSizes(fileSizes))
34+
};

‎lib/tasks/test.js

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
'use strict';
2+
3+
const path = require('path');
4+
const fs = require('fs');
5+
const SilentError = require('silent-error');
6+
const chalk = require('chalk');
7+
const emberBuild = require('../helpers/ember-build');
8+
const assertBundlesize = require('../helpers/assert-bundlesize');
9+
10+
const CONFIG_PATH = 'config/bundlesize.js';
11+
12+
function hasBuild() {
13+
return true;
14+
}
15+
16+
module.exports = class BundlesizeTestTask {
17+
18+
constructor(options) {
19+
Object.assign(this, options);
20+
}
21+
22+
run() {
23+
let errors = 0;
24+
return Promise.resolve()
25+
.then(() => {
26+
if (this.skipBuildIfAvailable && hasBuild()) {
27+
return;
28+
}
29+
this.ui.startProgress('Building for production...');
30+
return emberBuild()
31+
.then(() => this.ui.stopProgress());
32+
})
33+
.then(() => {
34+
let config = this.getConfig();
35+
36+
return Promise.all(
37+
Object.keys(config)
38+
.map((key, index) => {
39+
return assertBundlesize(config[key], this.buildDir)
40+
.then((msg) => {
41+
this.ui.writeLine(`ok ${index+1} - ${key}: ${msg}`);
42+
})
43+
.catch((err) => {
44+
this.ui.writeLine(`not ok ${index+1} - ${key}: ${err.message}`);
45+
errors++;
46+
});
47+
})
48+
)
49+
})
50+
.then(() => {
51+
if (errors > 0) {
52+
throw new SilentError(`Bundlesize check failed with ${errors} error${errors > 1 ? 's' : ''}.`);
53+
} else {
54+
this.ui.writeLine(chalk.green('Bundlesize check was successful. Good job!'));
55+
}
56+
})
57+
}
58+
59+
getConfig() {
60+
let configPath = path.join(this.rootDir, CONFIG_PATH);
61+
if (!fs.existsSync(configPath)) {
62+
throw new SilentError('Config file `config/bundlesize.js` not found. Please run `ember generate ember-cli-bundlesize` to generate a default config');
63+
}
64+
return require(configPath);
65+
}
66+
};

‎package.json

+8-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,14 @@
2121
"test:all": "ember try:each"
2222
},
2323
"dependencies": {
24-
"ember-cli-babel": "^6.6.0"
24+
"bytes": "^3.0.0",
25+
"chalk": "^2.4.1",
26+
"ember-cli-babel": "^6.6.0",
27+
"execa": "^1.0.0",
28+
"fast-glob": "^2.2.2",
29+
"rsvp": "^4.8.3",
30+
"silent-error": "^1.1.0",
31+
"zlib": "^1.0.5"
2532
},
2633
"devDependencies": {
2734
"@ember/optional-features": "^0.6.1",

‎yarn.lock

+64-37
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,7 @@ broccoli-asset-rewrite@^1.1.0:
952952
dependencies:
953953
broccoli-filter "^1.2.3"
954954

955-
broccoli-babel-transpiler@^6.4.5, broccoli-babel-transpiler@^6.5.0:
955+
broccoli-babel-transpiler@^6.5.0:
956956
version "6.5.0"
957957
resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.0.tgz#aa501a227b298a99742fdd0309b1eaad7124bba0"
958958
dependencies:
@@ -1011,8 +1011,8 @@ broccoli-clean-css@^1.1.0:
10111011
json-stable-stringify "^1.0.0"
10121012

10131013
broccoli-concat@^3.2.2, broccoli-concat@^3.4.0, broccoli-concat@^3.5.1:
1014-
version "3.7.0"
1015-
resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.0.tgz#6407fd411bc0bdf70a1aa607e382a7fa214e55bb"
1014+
version "3.7.1"
1015+
resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.1.tgz#22ba97420b33f5254549adc5bc41163f97bd1793"
10161016
dependencies:
10171017
broccoli-debug "^0.6.4"
10181018
broccoli-kitchen-sink-helpers "^0.3.1"
@@ -1324,7 +1324,7 @@ bytes@1:
13241324
version "1.0.0"
13251325
resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
13261326

1327-
bytes@3.0.0:
1327+
bytes@3.0.0, bytes@^3.0.0:
13281328
version "3.0.0"
13291329
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
13301330

@@ -1400,8 +1400,8 @@ can-symlink@^1.0.0:
14001400
tmp "0.0.28"
14011401

14021402
caniuse-lite@^1.0.30000844:
1403-
version "1.0.30000878"
1404-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123"
1403+
version "1.0.30000880"
1404+
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000880.tgz#b7b6ceaf739e17d0dda0d89426cba4be16d07bb0"
14051405

14061406
capture-exit@^1.2.0:
14071407
version "1.2.0"
@@ -1572,14 +1572,14 @@ collection-visit@^1.0.0:
15721572
object-visit "^1.0.0"
15731573

15741574
color-convert@^1.9.0:
1575-
version "1.9.2"
1576-
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
1575+
version "1.9.3"
1576+
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
15771577
dependencies:
1578-
color-name "1.1.1"
1578+
color-name "1.1.3"
15791579

1580-
color-name@1.1.1:
1581-
version "1.1.1"
1582-
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
1580+
color-name@1.1.3:
1581+
version "1.1.3"
1582+
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
15831583

15841584
colors@1.0.3:
15851585
version "1.0.3"
@@ -1599,14 +1599,10 @@ commander@2.8.x:
15991599
dependencies:
16001600
graceful-readlink ">= 1.0.0"
16011601

1602-
commander@^2.6.0:
1602+
commander@^2.6.0, commander@~2.17.1:
16031603
version "2.17.1"
16041604
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
16051605

1606-
commander@~2.16.0:
1607-
version "2.16.0"
1608-
resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50"
1609-
16101606
common-tags@^1.4.0:
16111607
version "1.8.0"
16121608
resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
@@ -1931,16 +1927,16 @@ ember-ajax@^3.0.0:
19311927
ember-cli-babel "^6.6.0"
19321928

19331929
ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2:
1934-
version "6.16.0"
1935-
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.16.0.tgz#623b4a2764ece72b65f1572fc8aeb5714a450228"
1930+
version "6.17.0"
1931+
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd"
19361932
dependencies:
19371933
amd-name-resolver "1.2.0"
19381934
babel-plugin-debug-macros "^0.2.0-beta.6"
19391935
babel-plugin-ember-modules-api-polyfill "^2.3.2"
19401936
babel-plugin-transform-es2015-modules-amd "^6.24.0"
19411937
babel-polyfill "^6.26.0"
19421938
babel-preset-env "^1.7.0"
1943-
broccoli-babel-transpiler "^6.4.5"
1939+
broccoli-babel-transpiler "^6.5.0"
19441940
broccoli-debug "^0.6.4"
19451941
broccoli-funnel "^2.0.0"
19461942
broccoli-source "^1.1.0"
@@ -2257,8 +2253,8 @@ ember-source-channel-url@^1.0.1:
22572253
got "^8.0.1"
22582254

22592255
ember-source@~3.4.0-beta.1:
2260-
version "3.4.0-beta.3"
2261-
resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.4.0-beta.3.tgz#82b39cd94581876f952c222ee2504cf253144561"
2256+
version "3.4.0"
2257+
resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.4.0.tgz#12de2461de6ce5e02de824ac45c81cb17bf5523b"
22622258
dependencies:
22632259
broccoli-funnel "^2.0.1"
22642260
broccoli-merge-trees "^2.0.0"
@@ -2322,6 +2318,12 @@ encodeurl@~1.0.2:
23222318
version "1.0.2"
23232319
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
23242320

2321+
end-of-stream@^1.1.0:
2322+
version "1.4.1"
2323+
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
2324+
dependencies:
2325+
once "^1.4.0"
2326+
23252327
engine.io-client@~3.2.0:
23262328
version "3.2.1"
23272329
resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36"
@@ -2553,6 +2555,18 @@ execa@^0.10.0:
25532555
signal-exit "^3.0.0"
25542556
strip-eof "^1.0.0"
25552557

2558+
execa@^1.0.0:
2559+
version "1.0.0"
2560+
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
2561+
dependencies:
2562+
cross-spawn "^6.0.0"
2563+
get-stream "^4.0.0"
2564+
is-stream "^1.1.0"
2565+
npm-run-path "^2.0.0"
2566+
p-finally "^1.0.0"
2567+
signal-exit "^3.0.0"
2568+
strip-eof "^1.0.0"
2569+
25562570
exists-stat@1.0.0:
25572571
version "1.0.0"
25582572
resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529"
@@ -2672,7 +2686,7 @@ fast-deep-equal@^1.0.0:
26722686
version "1.1.0"
26732687
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
26742688

2675-
fast-glob@^2.0.2:
2689+
fast-glob@^2.0.2, fast-glob@^2.2.2:
26762690
version "2.2.2"
26772691
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf"
26782692
dependencies:
@@ -2977,6 +2991,12 @@ get-stream@3.0.0, get-stream@^3.0.0:
29772991
version "3.0.0"
29782992
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
29792993

2994+
get-stream@^4.0.0:
2995+
version "4.0.0"
2996+
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.0.0.tgz#9e074cb898bd2b9ebabb445a1766d7f43576d977"
2997+
dependencies:
2998+
pump "^3.0.0"
2999+
29803000
get-value@^2.0.3, get-value@^2.0.6:
29813001
version "2.0.6"
29823002
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -3047,8 +3067,8 @@ glob@^5.0.10:
30473067
path-is-absolute "^1.0.0"
30483068

30493069
glob@^7.0.3, glob@^7.0.4, glob@^7.0.5, glob@^7.1.2:
3050-
version "7.1.2"
3051-
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
3070+
version "7.1.3"
3071+
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
30523072
dependencies:
30533073
fs.realpath "^1.0.0"
30543074
inflight "^1.0.4"
@@ -4351,19 +4371,15 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
43514371
snapdragon "^0.8.1"
43524372
to-regex "^3.0.2"
43534373

4354-
"mime-db@>= 1.34.0 < 2":
4374+
"mime-db@>= 1.34.0 < 2", mime-db@~1.36.0:
43554375
version "1.36.0"
43564376
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397"
43574377

4358-
mime-db@~1.35.0:
4359-
version "1.35.0"
4360-
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47"
4361-
43624378
mime-types@^2.1.18, mime-types@~2.1.18:
4363-
version "2.1.19"
4364-
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0"
4379+
version "2.1.20"
4380+
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19"
43654381
dependencies:
4366-
mime-db "~1.35.0"
4382+
mime-db "~1.36.0"
43674383

43684384
mime@1.4.1:
43694385
version "1.4.1"
@@ -4657,7 +4673,7 @@ on-headers@~1.0.1:
46574673
version "1.0.1"
46584674
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
46594675

4660-
once@^1.3.0:
4676+
once@^1.3.0, once@^1.3.1, once@^1.4.0:
46614677
version "1.4.0"
46624678
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
46634679
dependencies:
@@ -4937,6 +4953,13 @@ pseudomap@^1.0.2:
49374953
version "1.0.2"
49384954
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
49394955

4956+
pump@^3.0.0:
4957+
version "3.0.0"
4958+
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
4959+
dependencies:
4960+
end-of-stream "^1.1.0"
4961+
once "^1.3.1"
4962+
49404963
qs@6.5.1:
49414964
version "6.5.1"
49424965
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
@@ -5773,10 +5796,10 @@ temp@0.8.3:
57735796
rimraf "~2.2.6"
57745797

57755798
terser@^3.7.5:
5776-
version "3.8.1"
5777-
resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.1.tgz#cb70070ac9e0a71add169dfb63c0a64fca2738ac"
5799+
version "3.8.2"
5800+
resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.2.tgz#48b880f949f8d038aca4dfd00a37c53d96ecf9fb"
57785801
dependencies:
5779-
commander "~2.16.0"
5802+
commander "~2.17.1"
57805803
source-map "~0.6.1"
57815804
source-map-support "~0.5.6"
57825805

@@ -6248,3 +6271,7 @@ yargs@~3.10.0:
62486271
yeast@0.1.2:
62496272
version "0.1.2"
62506273
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
6274+
6275+
zlib@^1.0.5:
6276+
version "1.0.5"
6277+
resolved "https://registry.yarnpkg.com/zlib/-/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0"

0 commit comments

Comments
 (0)
Please sign in to comment.