@bundle-stats/utils 4.2.3 → 4.2.4

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.
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.extractModules = void 0;
7
7
  const round_1 = __importDefault(require("lodash/round"));
8
+ const union_1 = __importDefault(require("lodash/union"));
8
9
  const utils_1 = require("../utils");
9
10
  const extractModules = (webpackStats) => {
10
11
  const modulesSource = webpackStats?.modules;
@@ -18,40 +19,64 @@ const extractModules = (webpackStats) => {
18
19
  },
19
20
  };
20
21
  }
21
- const allModules = modulesSource.reduce((agg, moduleEntry) => {
22
- if (!moduleEntry.modules) {
23
- agg.push(moduleEntry);
24
- return agg;
22
+ const modulesByName = new Map();
23
+ modulesSource.forEach((rootModule) => {
24
+ if (!rootModule.chunks || rootModule.chunks.length === 0) {
25
+ return;
25
26
  }
26
- agg = agg.concat(moduleEntry.modules.map((concatenatedModule) => ({
27
- ...concatenatedModule,
28
- chunks: moduleEntry.chunks,
29
- })));
30
- return agg;
31
- }, []);
27
+ if (rootModule.modules) {
28
+ rootModule.modules.forEach((concatenatedModule) => {
29
+ const concatenatedModuleName = (0, utils_1.getModuleName)(concatenatedModule.name);
30
+ const existingModule = modulesByName.get(concatenatedModuleName);
31
+ if (existingModule) {
32
+ modulesByName.set(concatenatedModuleName, {
33
+ ...existingModule,
34
+ chunks: (0, union_1.default)(existingModule.chunks, rootModule.chunks),
35
+ });
36
+ }
37
+ else {
38
+ modulesByName.set(concatenatedModuleName, {
39
+ ...concatenatedModule,
40
+ chunks: rootModule.chunks,
41
+ });
42
+ }
43
+ });
44
+ return;
45
+ }
46
+ const normalizedName = (0, utils_1.getModuleName)(rootModule.name);
47
+ const savedRootModule = modulesByName.get(normalizedName);
48
+ if (savedRootModule) {
49
+ modulesByName.set(normalizedName, {
50
+ ...savedRootModule,
51
+ chunks: (0, union_1.default)(savedRootModule.chunks, rootModule.chunks),
52
+ size: rootModule.size,
53
+ });
54
+ return;
55
+ }
56
+ modulesByName.set(normalizedName, rootModule);
57
+ });
58
+ const modules = {};
32
59
  let moduleCount = 0;
33
60
  let totalCodeSize = 0;
34
61
  let duplicateCodeSize = 0;
35
62
  let duplicateModulesCount = 0;
36
- const modules = allModules.reduce((agg, moduleEntry) => {
63
+ modulesByName.forEach((moduleEntry, normalizedName) => {
37
64
  const { name, size = 0, chunks } = moduleEntry;
38
- const normalizedName = (0, utils_1.getModuleName)(name);
39
- if (!chunks || chunks?.length === 0) {
40
- return agg;
41
- }
42
65
  const instances = chunks.length;
43
66
  const duplicateInstances = instances - 1;
67
+ const duplicated = duplicateInstances > 0;
44
68
  moduleCount += instances;
45
- duplicateModulesCount += duplicateInstances;
46
- duplicateCodeSize += duplicateInstances * size;
47
69
  totalCodeSize += instances * size;
48
- agg[normalizedName] = {
70
+ if (duplicated) {
71
+ duplicateModulesCount += duplicateInstances;
72
+ duplicateCodeSize += duplicateInstances * size;
73
+ }
74
+ modules[normalizedName] = {
49
75
  name,
50
76
  value: size,
51
77
  chunkIds: chunks.map(utils_1.normalizeChunkId),
52
- duplicated: Boolean(duplicateInstances),
78
+ ...(duplicated && { duplicated }),
53
79
  };
54
- return agg;
55
80
  }, {});
56
81
  const duplicateCode = totalCodeSize ? (0, round_1.default)((duplicateCodeSize / totalCodeSize) * 100, 2) : 0;
57
82
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAiC;AAIjC,oCAA2D;AAKpD,MAAM,cAAc,GAAG,CAAC,YAAmC,EAAkB,EAAE;IACpF,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,CAAC;IAE5C,IAAI,CAAC,aAAa,EAAE;QAClB,OAAO;YACL,OAAO,EAAE;gBACP,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC3B,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBACnC,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aAC1B;SACF,CAAC;KACH;IAGD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QAC3D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YACxB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEtB,OAAO,GAAG,CAAC;SACZ;QAGD,GAAG,GAAG,GAAG,CAAC,MAAM,CACd,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,kBAAkB;YAErB,MAAM,EAAE,WAAW,CAAC,MAAM;SAC3B,CAAC,CAAC,CACJ,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA2C,CAAC,CAAC;IAEhD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAG9B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QACrD,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAA,qBAAa,EAAC,IAAI,CAAC,CAAC;QAG3C,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,MAAM,KAAK,CAAC,EAAE;YACnC,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,MAAM,kBAAkB,GAAG,SAAS,GAAG,CAAC,CAAC;QAEzC,WAAW,IAAI,SAAS,CAAC;QACzB,qBAAqB,IAAI,kBAAkB,CAAC;QAC5C,iBAAiB,IAAI,kBAAkB,GAAG,IAAI,CAAC;QAC/C,aAAa,IAAI,SAAS,GAAG,IAAI,CAAC;QAGlC,GAAG,CAAC,cAAc,CAAC,GAAG;YACpB,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,kBAAkB,CAAC;SACxC,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA4B,CAAC,CAAC;IAEjC,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,IAAA,eAAK,EAAC,CAAC,iBAAiB,GAAG,aAAa,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,OAAO;QACL,OAAO,EAAE;YACP,OAAO;YACP,aAAa,EAAE;gBACb,KAAK,EAAE,aAAa;aACrB;YACD,qBAAqB,EAAE;gBACrB,KAAK,EAAE,qBAAqB;aAC7B;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,WAAW;aACnB;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AApFW,QAAA,cAAc,kBAoFzB"}
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ const types_1 = require("./types");
7
7
  exports.metrics = {
8
8
  [types_1.Metric.BUNDLE_SIZE]: {
9
9
  label: 'Bundle Size',
10
- description: 'The total size of the assets produced by webpack',
10
+ description: 'The total size of the assets processed by the bundler',
11
11
  url: 'https://relative-ci.com/documentation/metrics-and-data#assets',
12
12
  type: metrics_1.METRIC_TYPE_FILE_SIZE,
13
13
  },
@@ -46,14 +46,14 @@ exports.metrics = {
46
46
  },
47
47
  [types_1.Metric.MODULE_COUNT]: {
48
48
  label: 'Modules',
49
- description: 'The total number of modules bundled by webpack',
49
+ description: 'The total number of bundled modules',
50
50
  url: 'https://relative-ci.com/documentation/metrics-and-data#modules-1',
51
51
  type: metrics_1.METRIC_TYPE_NUMERIC,
52
52
  biggerIsBetter: false,
53
53
  },
54
54
  [types_1.Metric.DUPLICATE_MODULES_COUNT]: {
55
55
  label: 'Duplicate Modules',
56
- description: 'The total number of modules that belong to more than one chunk',
56
+ description: 'The total number of module instances bundled into multiple chunks',
57
57
  url: 'https://relative-ci.com/documentation/metrics-and-data#modules-1',
58
58
  type: metrics_1.METRIC_TYPE_NUMERIC,
59
59
  biggerIsBetter: false,
@@ -67,14 +67,14 @@ exports.metrics = {
67
67
  },
68
68
  [types_1.Metric.PACKAGE_COUNT]: {
69
69
  label: 'Packages',
70
- description: 'The total number of packages bundled by webpack',
70
+ description: 'The total number of bundled packages',
71
71
  url: 'https://relative-ci.com/documentation/metrics-and-data#packages',
72
72
  type: metrics_1.METRIC_TYPE_NUMERIC,
73
73
  biggerIsBetter: false,
74
74
  },
75
75
  [types_1.Metric.DUPLICATE_PACKAGES_COUNT]: {
76
76
  label: 'Duplicate Packages',
77
- description: 'The total number of duplicate packages',
77
+ description: 'The total number of bundled duplicate package instances',
78
78
  url: 'https://relative-ci.com/documentation/metrics-and-data#packages',
79
79
  type: metrics_1.METRIC_TYPE_NUMERIC,
80
80
  biggerIsBetter: false,
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/webpack/metrics.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/webpack/metrics.js"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import round from 'lodash/round';
2
+ import union from 'lodash/union';
2
3
  import { getModuleName, normalizeChunkId } from '../utils';
3
4
  export const extractModules = (webpackStats) => {
4
5
  const modulesSource = webpackStats === null || webpackStats === void 0 ? void 0 : webpackStats.modules;
@@ -12,40 +13,64 @@ export const extractModules = (webpackStats) => {
12
13
  },
13
14
  };
14
15
  }
15
- const allModules = modulesSource.reduce((agg, moduleEntry) => {
16
- if (!moduleEntry.modules) {
17
- agg.push(moduleEntry);
18
- return agg;
16
+ const modulesByName = new Map();
17
+ modulesSource.forEach((rootModule) => {
18
+ if (!rootModule.chunks || rootModule.chunks.length === 0) {
19
+ return;
19
20
  }
20
- agg = agg.concat(moduleEntry.modules.map((concatenatedModule) => ({
21
- ...concatenatedModule,
22
- chunks: moduleEntry.chunks,
23
- })));
24
- return agg;
25
- }, []);
21
+ if (rootModule.modules) {
22
+ rootModule.modules.forEach((concatenatedModule) => {
23
+ const concatenatedModuleName = getModuleName(concatenatedModule.name);
24
+ const existingModule = modulesByName.get(concatenatedModuleName);
25
+ if (existingModule) {
26
+ modulesByName.set(concatenatedModuleName, {
27
+ ...existingModule,
28
+ chunks: union(existingModule.chunks, rootModule.chunks),
29
+ });
30
+ }
31
+ else {
32
+ modulesByName.set(concatenatedModuleName, {
33
+ ...concatenatedModule,
34
+ chunks: rootModule.chunks,
35
+ });
36
+ }
37
+ });
38
+ return;
39
+ }
40
+ const normalizedName = getModuleName(rootModule.name);
41
+ const savedRootModule = modulesByName.get(normalizedName);
42
+ if (savedRootModule) {
43
+ modulesByName.set(normalizedName, {
44
+ ...savedRootModule,
45
+ chunks: union(savedRootModule.chunks, rootModule.chunks),
46
+ size: rootModule.size,
47
+ });
48
+ return;
49
+ }
50
+ modulesByName.set(normalizedName, rootModule);
51
+ });
52
+ const modules = {};
26
53
  let moduleCount = 0;
27
54
  let totalCodeSize = 0;
28
55
  let duplicateCodeSize = 0;
29
56
  let duplicateModulesCount = 0;
30
- const modules = allModules.reduce((agg, moduleEntry) => {
57
+ modulesByName.forEach((moduleEntry, normalizedName) => {
31
58
  const { name, size = 0, chunks } = moduleEntry;
32
- const normalizedName = getModuleName(name);
33
- if (!chunks || (chunks === null || chunks === void 0 ? void 0 : chunks.length) === 0) {
34
- return agg;
35
- }
36
59
  const instances = chunks.length;
37
60
  const duplicateInstances = instances - 1;
61
+ const duplicated = duplicateInstances > 0;
38
62
  moduleCount += instances;
39
- duplicateModulesCount += duplicateInstances;
40
- duplicateCodeSize += duplicateInstances * size;
41
63
  totalCodeSize += instances * size;
42
- agg[normalizedName] = {
64
+ if (duplicated) {
65
+ duplicateModulesCount += duplicateInstances;
66
+ duplicateCodeSize += duplicateInstances * size;
67
+ }
68
+ modules[normalizedName] = {
43
69
  name,
44
70
  value: size,
45
71
  chunkIds: chunks.map(normalizeChunkId),
46
- duplicated: Boolean(duplicateInstances),
72
+ ...(duplicated && { duplicated }),
47
73
  };
48
- return agg;
49
74
  }, {});
50
75
  const duplicateCode = totalCodeSize ? round((duplicateCodeSize / totalCodeSize) * 100, 2) : 0;
51
76
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAC;AAIjC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAK3D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,YAAmC,EAAkB,EAAE;IACpF,MAAM,aAAa,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,OAAO,CAAC;IAE5C,IAAI,CAAC,aAAa,EAAE;QAClB,OAAO;YACL,OAAO,EAAE;gBACP,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBAC3B,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;gBACnC,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aAC1B;SACF,CAAC;KACH;IAGD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QAC3D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YACxB,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEtB,OAAO,GAAG,CAAC;SACZ;QAGD,GAAG,GAAG,GAAG,CAAC,MAAM,CACd,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,kBAAkB;YAErB,MAAM,EAAE,WAAW,CAAC,MAAM;SAC3B,CAAC,CAAC,CACJ,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA2C,CAAC,CAAC;IAEhD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,qBAAqB,GAAG,CAAC,CAAC;IAG9B,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;QACrD,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;QAC/C,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAG3C,IAAI,CAAC,MAAM,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,MAAK,CAAC,EAAE;YACnC,OAAO,GAAG,CAAC;SACZ;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,MAAM,kBAAkB,GAAG,SAAS,GAAG,CAAC,CAAC;QAEzC,WAAW,IAAI,SAAS,CAAC;QACzB,qBAAqB,IAAI,kBAAkB,CAAC;QAC5C,iBAAiB,IAAI,kBAAkB,GAAG,IAAI,CAAC;QAC/C,aAAa,IAAI,SAAS,GAAG,IAAI,CAAC;QAGlC,GAAG,CAAC,cAAc,CAAC,GAAG;YACpB,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACtC,UAAU,EAAE,OAAO,CAAC,kBAAkB,CAAC;SACxC,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA4B,CAAC,CAAC;IAEjC,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,GAAG,aAAa,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,OAAO;QACL,OAAO,EAAE;YACP,OAAO;YACP,aAAa,EAAE;gBACb,KAAK,EAAE,aAAa;aACrB;YACD,qBAAqB,EAAE;gBACrB,KAAK,EAAE,qBAAqB;aAC7B;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,WAAW;aACnB;SACF;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { Metric } from './types';
4
4
  export const metrics = {
5
5
  [Metric.BUNDLE_SIZE]: {
6
6
  label: 'Bundle Size',
7
- description: 'The total size of the assets produced by webpack',
7
+ description: 'The total size of the assets processed by the bundler',
8
8
  url: 'https://relative-ci.com/documentation/metrics-and-data#assets',
9
9
  type: METRIC_TYPE_FILE_SIZE,
10
10
  },
@@ -43,14 +43,14 @@ export const metrics = {
43
43
  },
44
44
  [Metric.MODULE_COUNT]: {
45
45
  label: 'Modules',
46
- description: 'The total number of modules bundled by webpack',
46
+ description: 'The total number of bundled modules',
47
47
  url: 'https://relative-ci.com/documentation/metrics-and-data#modules-1',
48
48
  type: METRIC_TYPE_NUMERIC,
49
49
  biggerIsBetter: false,
50
50
  },
51
51
  [Metric.DUPLICATE_MODULES_COUNT]: {
52
52
  label: 'Duplicate Modules',
53
- description: 'The total number of modules that belong to more than one chunk',
53
+ description: 'The total number of module instances bundled into multiple chunks',
54
54
  url: 'https://relative-ci.com/documentation/metrics-and-data#modules-1',
55
55
  type: METRIC_TYPE_NUMERIC,
56
56
  biggerIsBetter: false,
@@ -64,14 +64,14 @@ export const metrics = {
64
64
  },
65
65
  [Metric.PACKAGE_COUNT]: {
66
66
  label: 'Packages',
67
- description: 'The total number of packages bundled by webpack',
67
+ description: 'The total number of bundled packages',
68
68
  url: 'https://relative-ci.com/documentation/metrics-and-data#packages',
69
69
  type: METRIC_TYPE_NUMERIC,
70
70
  biggerIsBetter: false,
71
71
  },
72
72
  [Metric.DUPLICATE_PACKAGES_COUNT]: {
73
73
  label: 'Duplicate Packages',
74
- description: 'The total number of duplicate packages',
74
+ description: 'The total number of bundled duplicate package instances',
75
75
  url: 'https://relative-ci.com/documentation/metrics-and-data#packages',
76
76
  type: METRIC_TYPE_NUMERIC,
77
77
  biggerIsBetter: false,
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/webpack/metrics.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/webpack/metrics.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bundle-stats/utils",
3
- "version": "4.2.3",
3
+ "version": "4.2.4",
4
4
  "description": "BundleStats utils",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -35,8 +35,8 @@
35
35
  },
36
36
  "homepage": "https://github.com/relative-ci/bundle-stats/blob/master/packages/utils#readme",
37
37
  "dependencies": {
38
- "@bundle-stats/plugin-webpack-filter": "^4.2.3",
39
- "@bundle-stats/plugin-webpack-validate": "^4.2.3",
38
+ "@bundle-stats/plugin-webpack-filter": "^4.2.4",
39
+ "@bundle-stats/plugin-webpack-validate": "^4.2.4",
40
40
  "query-string": "7.1.3",
41
41
  "serialize-query-params": "2.0.2",
42
42
  "use-query-params": "2.2.0"
@@ -44,13 +44,13 @@
44
44
  "devDependencies": {
45
45
  "@types/jest": "29.4.0",
46
46
  "@types/lodash": "4.14.191",
47
- "core-js": "3.28.0",
47
+ "core-js": "3.29.0",
48
48
  "jest": "29.4.3",
49
49
  "jest-cli": "29.4.3",
50
50
  "jest-date-mock": "1.0.8",
51
51
  "lodash": "4.17.21",
52
52
  "regenerator-runtime": "0.13.11",
53
- "rimraf": "4.1.2",
53
+ "rimraf": "4.2.0",
54
54
  "ts-jest": "29.0.5",
55
55
  "typescript": "4.9.5"
56
56
  },
@@ -58,5 +58,5 @@
58
58
  "core-js": "^3.0.0",
59
59
  "lodash": "^4.0.0"
60
60
  },
61
- "gitHead": "169eb699e82fdc6e165c0c76eda3b898d31152e6"
61
+ "gitHead": "98824e4d058484dd86c259c8df3c7560aa3a413b"
62
62
  }
@@ -1,11 +1,12 @@
1
1
  import round from 'lodash/round';
2
- import { WebpackStatsFiltered, WebpackStatsFilteredRootModule } from '@bundle-stats/plugin-webpack-filter';
2
+ import union from 'lodash/union';
3
+ import { WebpackStatsFiltered, WebpackStatsFilteredModule } from '@bundle-stats/plugin-webpack-filter';
3
4
 
4
5
  import { Module, MetricsModules } from '../types';
5
6
  import { getModuleName, normalizeChunkId } from '../utils';
6
7
 
7
8
  /*
8
- * Extract webpack modules array to an object with metrics
9
+ * Extract webpack modules metrics and stats
9
10
  */
10
11
  export const extractModules = (webpackStats?: WebpackStatsFiltered): MetricsModules => {
11
12
  const modulesSource = webpackStats?.modules;
@@ -22,57 +23,86 @@ export const extractModules = (webpackStats?: WebpackStatsFiltered): MetricsModu
22
23
  }
23
24
 
24
25
  // Flatten concatenated modules
25
- const allModules = modulesSource.reduce((agg, moduleEntry) => {
26
- if (!moduleEntry.modules) {
27
- agg.push(moduleEntry);
26
+ const modulesByName: Map<string, WebpackStatsFilteredModule> = new Map();
28
27
 
29
- return agg;
28
+ modulesSource.forEach((rootModule) => {
29
+ // skip modules that do not belong to any chunk
30
+ if (!rootModule.chunks || rootModule.chunks.length === 0) {
31
+ return;
32
+ }
33
+
34
+ // flatten concatenated modules
35
+ if (rootModule.modules) {
36
+ rootModule.modules.forEach((concatenatedModule) => {
37
+ const concatenatedModuleName = getModuleName(concatenatedModule.name);
38
+ const existingModule = modulesByName.get(concatenatedModuleName);
39
+
40
+ // Merge if the module is already available
41
+ // webpack adds a module entry for every concatenated module
42
+ if (existingModule) {
43
+ modulesByName.set(concatenatedModuleName, {
44
+ ...existingModule,
45
+ chunks: union(existingModule.chunks, rootModule.chunks),
46
+ });
47
+ } else {
48
+ modulesByName.set(concatenatedModuleName, {
49
+ ...concatenatedModule,
50
+ chunks: rootModule.chunks,
51
+ });
52
+ }
53
+ });
54
+
55
+ return;
56
+ }
57
+
58
+ const normalizedName = getModuleName(rootModule.name);
59
+ const savedRootModule = modulesByName.get(normalizedName);
60
+
61
+ // Merge module data
62
+ // @NOTE some webpack plugins (mini-css-extract-plugin) might add a root module entry
63
+ // even if thee module was already concantenated in another module
64
+ if (savedRootModule) {
65
+ modulesByName.set(normalizedName, {
66
+ ...savedRootModule,
67
+ chunks: union(savedRootModule.chunks, rootModule.chunks),
68
+ size: rootModule.size,
69
+ });
70
+
71
+ return;
30
72
  }
31
73
 
32
- // eslint-disable-next-line no-param-reassign
33
- agg = agg.concat(
34
- moduleEntry.modules.map((concatenatedModule) => ({
35
- ...concatenatedModule,
36
- // Add parent chunks
37
- chunks: moduleEntry.chunks,
38
- })),
39
- );
74
+ modulesByName.set(normalizedName, rootModule);
75
+ });
40
76
 
41
- return agg;
42
- }, [] as Array<WebpackStatsFilteredRootModule>);
77
+ // Normalize module entries and extract metrics
78
+ const modules: Record<string, Module> = {};
43
79
 
44
80
  let moduleCount = 0;
45
81
  let totalCodeSize = 0;
46
82
  let duplicateCodeSize = 0;
47
83
  let duplicateModulesCount = 0;
48
84
 
49
- // Normalize module entries
50
- const modules = allModules.reduce((agg, moduleEntry) => {
85
+ modulesByName.forEach((moduleEntry, normalizedName) => {
51
86
  const { name, size = 0, chunks } = moduleEntry;
52
- const normalizedName = getModuleName(name);
53
-
54
- // skip modules that do not belong to any chunk
55
- if (!chunks || chunks?.length === 0) {
56
- return agg;
57
- }
58
87
 
59
88
  const instances = chunks.length;
60
89
  const duplicateInstances = instances - 1;
90
+ const duplicated = duplicateInstances > 0;
61
91
 
62
92
  moduleCount += instances;
63
- duplicateModulesCount += duplicateInstances;
64
- duplicateCodeSize += duplicateInstances * size;
65
93
  totalCodeSize += instances * size;
66
94
 
67
- // eslint-disable-next-line no-param-reassign
68
- agg[normalizedName] = {
95
+ if (duplicated) {
96
+ duplicateModulesCount += duplicateInstances;
97
+ duplicateCodeSize += duplicateInstances * size;
98
+ }
99
+
100
+ modules[normalizedName] = {
69
101
  name,
70
102
  value: size,
71
103
  chunkIds: chunks.map(normalizeChunkId),
72
- duplicated: Boolean(duplicateInstances),
104
+ ...(duplicated && { duplicated }),
73
105
  };
74
-
75
- return agg;
76
106
  }, {} as Record<string, Module>);
77
107
 
78
108
  const duplicateCode = totalCodeSize ? round((duplicateCodeSize / totalCodeSize) * 100, 2) : 0;
@@ -9,7 +9,7 @@ import { Metric } from './types';
9
9
  export const metrics = {
10
10
  [Metric.BUNDLE_SIZE]: {
11
11
  label: 'Bundle Size',
12
- description: 'The total size of the assets produced by webpack',
12
+ description: 'The total size of the assets processed by the bundler',
13
13
  url: 'https://relative-ci.com/documentation/metrics-and-data#assets',
14
14
  type: METRIC_TYPE_FILE_SIZE,
15
15
  },
@@ -48,14 +48,14 @@ export const metrics = {
48
48
  },
49
49
  [Metric.MODULE_COUNT]: {
50
50
  label: 'Modules',
51
- description: 'The total number of modules bundled by webpack',
51
+ description: 'The total number of bundled modules',
52
52
  url: 'https://relative-ci.com/documentation/metrics-and-data#modules-1',
53
53
  type: METRIC_TYPE_NUMERIC,
54
54
  biggerIsBetter: false,
55
55
  },
56
56
  [Metric.DUPLICATE_MODULES_COUNT]: {
57
57
  label: 'Duplicate Modules',
58
- description: 'The total number of modules that belong to more than one chunk',
58
+ description: 'The total number of module instances bundled into multiple chunks',
59
59
  url: 'https://relative-ci.com/documentation/metrics-and-data#modules-1',
60
60
  type: METRIC_TYPE_NUMERIC,
61
61
  biggerIsBetter: false,
@@ -69,14 +69,14 @@ export const metrics = {
69
69
  },
70
70
  [Metric.PACKAGE_COUNT]: {
71
71
  label: 'Packages',
72
- description: 'The total number of packages bundled by webpack',
72
+ description: 'The total number of bundled packages',
73
73
  url: 'https://relative-ci.com/documentation/metrics-and-data#packages',
74
74
  type: METRIC_TYPE_NUMERIC,
75
75
  biggerIsBetter: false,
76
76
  },
77
77
  [Metric.DUPLICATE_PACKAGES_COUNT]: {
78
78
  label: 'Duplicate Packages',
79
- description: 'The total number of duplicate packages',
79
+ description: 'The total number of bundled duplicate package instances',
80
80
  url: 'https://relative-ci.com/documentation/metrics-and-data#packages',
81
81
  type: METRIC_TYPE_NUMERIC,
82
82
  biggerIsBetter: false,
@@ -51,7 +51,7 @@ export interface MetricsAssets {
51
51
  export interface Module extends MetricRun {
52
52
  name: string;
53
53
  chunkIds: Array<String>;
54
- duplicated: boolean;
54
+ duplicated?: boolean;
55
55
  }
56
56
 
57
57
  export type Modules = Record<string, Module>;
@@ -44,7 +44,7 @@ export interface MetricsAssets {
44
44
  export interface Module extends MetricRun {
45
45
  name: string;
46
46
  chunkIds: Array<String>;
47
- duplicated: boolean;
47
+ duplicated?: boolean;
48
48
  }
49
49
  export type Modules = Record<string, Module>;
50
50
  export interface MetricsModules {