UNPKG

3.1 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4var path = require('path');
5
6var _ = require('lodash');
7
8var _require = require('../lib/tree'),
9 Folder = _require.Folder;
10
11var _require2 = require('../lib/parseUtils'),
12 getModuleSizesFromBundle = _require2.getModuleSizesFromBundle;
13
14module.exports = {
15 getChartData: getChartData,
16 readStatsFromFile: readStatsFromFile
17};
18
19function getChartData(bundleStats, bundleDir) {
20 // Picking only `*.js` assets from bundle that has non-empty `chunks` array
21 bundleStats.assets = _.filter(bundleStats.assets, function (asset) {
22 return _.endsWith(asset.name, '.js') && !_.isEmpty(asset.chunks);
23 });
24
25 // Real module sizes got by parsing assets
26 var parsedModuleSizes = null;
27
28 if (bundleDir) {
29 // Checking if all assets are exist
30 var bundleScriptsFound = _.every(bundleStats.assets, function (statAsset) {
31 var assetFile = path.resolve(bundleDir, statAsset.name);
32 var assetExists = fs.existsSync(assetFile);
33
34 if (!assetExists) {
35 console.log('\nUnable to find bundle asset "' + assetFile + '".\n' + 'Analyzer will use module sizes from stats file.\n');
36 }
37
38 return assetExists;
39 });
40
41 if (bundleScriptsFound) {
42 // Parsing assets and getting real module sizes
43 parsedModuleSizes = _.transform(bundleStats.assets, function (result, statAsset) {
44 _.assign(result, getModuleSizesFromBundle(path.resolve(bundleDir, statAsset.name)));
45 }, {});
46 }
47 }
48
49 var assets = _.transform(bundleStats.assets, function (result, statAsset) {
50 var bundleFilename = statAsset.name;
51 var asset = result[bundleFilename] = _.pick(statAsset, 'size');
52
53 // Picking modules from current bundle script
54 asset.modules = _(bundleStats.modules).filter(function (statModule) {
55 return assetHasModule(statAsset, statModule);
56 }).each(function (statModule) {
57 if (parsedModuleSizes) {
58 statModule.parsedSize = parsedModuleSizes[statModule.id];
59 }
60 });
61
62 asset.tree = createModulesTree(asset.modules);
63 }, {});
64
65 return _.transform(assets, function (result, asset, filename) {
66 var statSize = asset.tree.size;
67 var parsedSize = parsedModuleSizes ? asset.tree.parsedSize : undefined;
68
69 result.push({
70 label: filename,
71 weight: parsedSize === undefined ? statSize : parsedSize,
72 statSize: statSize,
73 parsedSize: parsedSize,
74 groups: _.invokeMap(asset.tree.children, 'toChartData')
75 });
76 }, []);
77}
78
79function readStatsFromFile(filename) {
80 return JSON.parse(fs.readFileSync(filename, 'utf8'));
81}
82
83function assetHasModule(statAsset, statModule) {
84 return _.some(statModule.chunks, function (moduleChunk) {
85 return _.includes(statAsset.chunks, moduleChunk);
86 });
87}
88
89function createModulesTree(modules) {
90 var root = new Folder('.');
91
92 _.each(modules, function (module) {
93 var path = getModulePath(module.name);
94 root.addFileByPath(path, module);
95 });
96
97 return root;
98}
99
100function getModulePath(path) {
101 return _(path).split('/').slice(1).map(function (part) {
102 return part === '~' ? 'node_modules' : part;
103 }).value();
104}
\No newline at end of file