@bundle-stats/utils 4.3.0-beta.2 → 4.3.0-rc.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 (88) hide show
  1. package/lib/config/index.js +0 -1
  2. package/lib/config/index.js.map +1 -1
  3. package/lib/config/metrics.js.map +1 -1
  4. package/lib/constants.js +7 -1
  5. package/lib/constants.js.map +1 -1
  6. package/lib/i18n.js +3 -0
  7. package/lib/i18n.js.map +1 -1
  8. package/lib/utils/component-links.js +40 -1
  9. package/lib/utils/component-links.js.map +1 -1
  10. package/lib/utils/index.js +1 -0
  11. package/lib/utils/index.js.map +1 -1
  12. package/lib/utils/insights.js +54 -0
  13. package/lib/utils/insights.js.map +1 -0
  14. package/lib/webpack/extract/assets-size-total-insight.js +2 -2
  15. package/lib/webpack/extract/assets-size-total-insight.js.map +1 -1
  16. package/lib/webpack/extract/index.js +2 -0
  17. package/lib/webpack/extract/index.js.map +1 -1
  18. package/lib/webpack/extract/modules-packages-duplicate.js +28 -16
  19. package/lib/webpack/extract/modules-packages-duplicate.js.map +1 -1
  20. package/lib/webpack/extract/modules-packages-new-insight.js +57 -0
  21. package/lib/webpack/extract/modules-packages-new-insight.js.map +1 -0
  22. package/lib/webpack/extract/modules.js +45 -20
  23. package/lib/webpack/extract/modules.js.map +1 -1
  24. package/lib/webpack/metrics.js +5 -5
  25. package/lib/webpack/metrics.js.map +1 -1
  26. package/lib-esm/config/index.js +0 -1
  27. package/lib-esm/config/index.js.map +1 -1
  28. package/lib-esm/config/metrics.js +1 -1
  29. package/lib-esm/config/metrics.js.map +1 -1
  30. package/lib-esm/constants.js +6 -0
  31. package/lib-esm/constants.js.map +1 -1
  32. package/lib-esm/i18n.js +3 -0
  33. package/lib-esm/i18n.js.map +1 -1
  34. package/lib-esm/utils/component-links.js +38 -0
  35. package/lib-esm/utils/component-links.js.map +1 -1
  36. package/lib-esm/utils/index.js +1 -0
  37. package/lib-esm/utils/index.js.map +1 -1
  38. package/lib-esm/utils/insights.js +47 -0
  39. package/lib-esm/utils/insights.js.map +1 -0
  40. package/lib-esm/webpack/extract/assets-size-total-insight.js +1 -1
  41. package/lib-esm/webpack/extract/assets-size-total-insight.js.map +1 -1
  42. package/lib-esm/webpack/extract/index.js +2 -0
  43. package/lib-esm/webpack/extract/index.js.map +1 -1
  44. package/lib-esm/webpack/extract/modules-packages-duplicate.js +22 -10
  45. package/lib-esm/webpack/extract/modules-packages-duplicate.js.map +1 -1
  46. package/lib-esm/webpack/extract/modules-packages-new-insight.js +54 -0
  47. package/lib-esm/webpack/extract/modules-packages-new-insight.js.map +1 -0
  48. package/lib-esm/webpack/extract/modules.js +45 -20
  49. package/lib-esm/webpack/extract/modules.js.map +1 -1
  50. package/lib-esm/webpack/metrics.js +5 -5
  51. package/lib-esm/webpack/metrics.js.map +1 -1
  52. package/package.json +13 -13
  53. package/src/config/index.js +0 -1
  54. package/src/config/metrics.js +2 -6
  55. package/src/constants.ts +22 -10
  56. package/src/i18n.js +3 -0
  57. package/src/utils/component-links.ts +44 -0
  58. package/src/utils/index.js +1 -0
  59. package/src/utils/insights.ts +82 -0
  60. package/src/webpack/extract/assets-size-total-insight.js +1 -1
  61. package/src/webpack/extract/index.js +2 -0
  62. package/src/webpack/extract/modules-packages-duplicate.ts +32 -17
  63. package/src/webpack/extract/modules-packages-new-insight.ts +80 -0
  64. package/src/webpack/extract/modules.ts +61 -31
  65. package/src/webpack/metrics.js +5 -5
  66. package/src/webpack/types.ts +2 -2
  67. package/types/browsertime/metrics.d.ts +1 -1
  68. package/types/config/index.d.ts +0 -1
  69. package/types/config/metrics.d.ts +1 -30
  70. package/types/constants.d.ts +21 -9
  71. package/types/i18n.d.ts +3 -0
  72. package/types/lighthouse/metrics.d.ts +4 -4
  73. package/types/utils/component-links.d.ts +3 -0
  74. package/types/utils/index.d.ts +1 -0
  75. package/types/utils/insights.d.ts +9 -0
  76. package/types/webpack/constants.d.ts +1 -1
  77. package/types/webpack/extract/assets-size-total-insight.d.ts +2 -2
  78. package/types/webpack/extract/modules-packages-duplicate.d.ts +3 -3
  79. package/types/webpack/extract/modules-packages-new-insight.d.ts +8 -0
  80. package/types/webpack/metrics.d.ts +3 -3
  81. package/types/webpack/types.d.ts +2 -2
  82. package/lib/config/insights.js +0 -10
  83. package/lib/config/insights.js.map +0 -1
  84. package/lib-esm/config/insights.js +0 -7
  85. package/lib-esm/config/insights.js.map +0 -1
  86. package/src/config/insights.ts +0 -5
  87. package/tsconfig.lib.json +0 -7
  88. package/types/config/insights.d.ts +0 -5
@@ -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.3.0-beta.2",
3
+ "version": "4.3.0-rc.0",
4
4
  "description": "BundleStats utils",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -35,28 +35,28 @@
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.3.0-beta.2",
39
- "@bundle-stats/plugin-webpack-validate": "^4.3.0-beta.2",
38
+ "@bundle-stats/plugin-webpack-filter": "^4.3.0-rc.0",
39
+ "@bundle-stats/plugin-webpack-validate": "^4.3.0-rc.0",
40
40
  "query-string": "7.1.3",
41
41
  "serialize-query-params": "2.0.2",
42
- "use-query-params": "2.1.2"
42
+ "use-query-params": "2.2.1"
43
43
  },
44
44
  "devDependencies": {
45
- "@types/jest": "29.4.0",
46
- "@types/lodash": "4.14.191",
47
- "core-js": "3.27.2",
48
- "jest": "29.4.0",
49
- "jest-cli": "29.4.0",
45
+ "@types/jest": "29.5.0",
46
+ "@types/lodash": "4.14.192",
47
+ "core-js": "3.30.0",
48
+ "jest": "29.5.0",
49
+ "jest-cli": "29.5.0",
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",
54
- "ts-jest": "29.0.5",
55
- "typescript": "4.9.4"
53
+ "rimraf": "4.4.1",
54
+ "ts-jest": "29.1.0",
55
+ "typescript": "5.0.3"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "core-js": "^3.0.0",
59
59
  "lodash": "^4.0.0"
60
60
  },
61
- "gitHead": "a4732cf9ed55fb8d8c31bee857ba3ac16c04de1d"
61
+ "gitHead": "c46d2890ca972917edea0c6db51cab92303e8e27"
62
62
  }
@@ -1,6 +1,5 @@
1
1
  export * from './component-links';
2
2
  export * from './file-types';
3
- export * from './insights';
4
3
  export * from './metrics';
5
4
  export * from './delta';
6
5
 
@@ -1,9 +1,4 @@
1
- import {
2
- formatNumber,
3
- formatDuration,
4
- formatFileSize,
5
- formatPercentage,
6
- } from '../utils/format';
1
+ import { formatNumber, formatDuration, formatFileSize, formatPercentage } from '../utils/format';
7
2
 
8
3
  export const METRIC_TYPE_FILE_SIZE = 'METRIC_TYPE_FILE_SIZE';
9
4
  export const METRIC_TYPE_DURATION = 'METRIC_TYPE_DURATION';
@@ -11,6 +6,7 @@ export const METRIC_TYPE_NUMERIC = 'METRIC_TYPE_NUMERIC';
11
6
  export const METRIC_TYPE_SCORE = 'METRIC_TYPE_SCORE';
12
7
  export const METRIC_TYPE_PERCENTAGE = 'METRIC_TYPE_PERCENTAGE';
13
8
 
9
+ /** @type {Record<string, import('../constants').MetricType>} */
14
10
  export const METRIC_TYPES = {
15
11
  [METRIC_TYPE_NUMERIC]: {
16
12
  biggerIsBetter: false,
package/src/constants.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { InsightType } from './config/insights';
2
-
3
1
  export enum Source {
4
2
  webpack = 'webpack',
5
3
  lighthouse = 'lighthouse',
@@ -8,12 +6,18 @@ export enum Source {
8
6
 
9
7
  export type SourceData = Record<string, unknown>;
10
8
 
9
+ export enum InsightType {
10
+ ERROR = 'error',
11
+ INFO = 'info',
12
+ WARNING = 'warning',
13
+ }
14
+
11
15
  export enum MetricTypeType {
12
- 'METRIC_TYPE_NUMERIC' = 'METRIC_TYPE_NUMERIC',
13
- 'METRIC_TYPE_SCORE' = 'METRIC_TYPE_SCORE',
14
- 'METRIC_TYPE_FILE_SIZE' = 'METRIC_TYPE_FILE_SIZE',
15
- 'METRIC_TYPE_DURATION' = 'METRIC_TYPE_DURATION',
16
- 'METRIC_TYPE_PERCENTAGE' = 'METRIC_TYPE_PERCENTAGE',
16
+ METRIC_TYPE_NUMERIC = 'METRIC_TYPE_NUMERIC',
17
+ METRIC_TYPE_SCORE = 'METRIC_TYPE_SCORE',
18
+ METRIC_TYPE_FILE_SIZE = 'METRIC_TYPE_FILE_SIZE',
19
+ METRIC_TYPE_DURATION = 'METRIC_TYPE_DURATION',
20
+ METRIC_TYPE_PERCENTAGE = 'METRIC_TYPE_PERCENTAGE',
17
21
  }
18
22
 
19
23
  export interface MetricTypeConfig {
@@ -68,21 +72,23 @@ export interface JobSummaryItem {
68
72
 
69
73
  export interface JobInsight<T = object> {
70
74
  type: InsightType;
71
- data: T;
75
+ data: T & { text?: string };
72
76
  }
73
77
 
74
78
  export interface JobInsightAssetsSizeTotalData {
75
- text: string;
76
79
  md: string;
77
80
  info: MetricRunInfo;
78
81
  }
79
82
  export type JobInsightDuplicatePackagesData = Record<string, Array<string>>;
80
83
 
81
84
  export interface JobInsightDuplicatePackagesV3Data {
82
- text: string;
83
85
  packages: Record<string, Array<string>>;
84
86
  }
85
87
 
88
+ export interface JobInsightNewPackagesData {
89
+ packages: Array<string>;
90
+ }
91
+
86
92
  export type JobSummarySource = Record<string, JobSummaryItem>;
87
93
  export type JobSummary = JobSection<JobSummarySource>;
88
94
 
@@ -91,9 +97,15 @@ export interface JobInsights {
91
97
  assetsSizeTotal: JobInsight<JobInsightAssetsSizeTotalData>;
92
98
  duplicatePackages?: JobInsight<JobInsightDuplicatePackagesData>;
93
99
  duplicatePackagesV3?: JobInsight<JobInsightDuplicatePackagesV3Data>;
100
+ newPackages?: JobInsight<JobInsightNewPackagesData>;
94
101
  };
95
102
  }
96
103
 
104
+ export interface JobInsightsInfo {
105
+ duplicatePackages?: JobInsights['webpack']['duplicatePackagesV3'];
106
+ newPackages?: JobInsights['webpack']['newPackages'];
107
+ }
108
+
97
109
  export type JobMetricsSource = Record<string, MetricRun | Record<string, MetricRun>>;
98
110
  export type JobMetrics = JobSection<JobMetricsSource>;
99
111
 
package/src/i18n.js CHANGED
@@ -9,7 +9,10 @@ export default {
9
9
  COMPONENT_LINK_MODULES_DUPLICATE: 'View duplicate modules',
10
10
  COMPONENT_LINK_CHUNK_MODULES: 'View chunk modules',
11
11
  COMPONENT_LINK_PACKAGES_COUNT: 'View all packages',
12
+ COMPONENT_LINK_PACKAGES_CHANGED: 'View all changed packages',
12
13
  COMPONENT_LINK_PACKAGES_DUPLICATE: 'View all duplicate packages',
14
+ COMPONENT_LINK_PACKAGES_DUPLICATE_CHANGED: 'View all changed duplicate packages',
13
15
  COMPONENT_LINK_VIEW_PACKAGE: 'View package',
14
16
  COMPONENT_LINK_BUNDLE_ASSETS_BY_FILE_TYPE: ({ label }) => `View all ${label} assets`,
17
+ COMPONENT_LINK_BUNDLE_ASSETS_BY_ENTRY_TYPE: (assetType) => `View all ${assetType} assets`,
15
18
  };
@@ -185,6 +185,24 @@ export const BUNDLE_MODULES_DUPLICATE: ComponentLink = {
185
185
  },
186
186
  };
187
187
 
188
+ export const getBundleAssetsByEntryType = (
189
+ assetType: 'entry' | 'initial' | 'chunk',
190
+ ): ComponentLink => ({
191
+ section: SECTIONS.ASSETS,
192
+ title: I18N.COMPONENT_LINK_BUNDLE_ASSETS_BY_ENTRY_TYPE(assetType),
193
+ params: {
194
+ [COMPONENT.BUNDLE_ASSETS]: {
195
+ filters: {
196
+ [ASSET_FILTERS.CHANGED]: false,
197
+ ...getAssetEntryTypeFilters(false),
198
+ [`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.ENTRY}`]: assetType === 'entry',
199
+ [`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.INITIAL}`]: assetType === 'initial',
200
+ [`${ASSET_ENTRY_TYPE}.${ASSET_FILTERS.CHUNK}`]: assetType === 'chunk',
201
+ },
202
+ },
203
+ },
204
+ });
205
+
188
206
  export const getBundleModulesBySearch = (search: string): ComponentLink => ({
189
207
  section: SECTIONS.MODULES,
190
208
  title: I18N.COMPONENT_LINK_MODULES,
@@ -234,6 +252,19 @@ export const BUNDLE_PACKAGES_COUNT: ComponentLink = {
234
252
  },
235
253
  };
236
254
 
255
+ export const BUNDLE_PACKAGES_CHANGED: ComponentLink = {
256
+ section: SECTIONS.PACKAGES,
257
+ title: I18N.COMPONENT_LINK_PACKAGES_CHANGED,
258
+ params: {
259
+ [COMPONENT.BUNDLE_PACKAGES]: {
260
+ filters: {
261
+ // Keep a filter to allow the merge and skip default
262
+ [PACKAGE_FILTERS.CHANGED]: true,
263
+ },
264
+ },
265
+ },
266
+ };
267
+
237
268
  export const BUNDLE_PACKAGES_DUPLICATE: ComponentLink = {
238
269
  section: SECTIONS.PACKAGES,
239
270
  title: I18N.COMPONENT_LINK_PACKAGES_DUPLICATE,
@@ -246,6 +277,19 @@ export const BUNDLE_PACKAGES_DUPLICATE: ComponentLink = {
246
277
  },
247
278
  };
248
279
 
280
+ export const BUNDLE_PACKAGES_DUPLICATE_CHANGED: ComponentLink = {
281
+ section: SECTIONS.PACKAGES,
282
+ title: I18N.COMPONENT_LINK_PACKAGES_DUPLICATE_CHANGED,
283
+ params: {
284
+ [COMPONENT.BUNDLE_PACKAGES]: {
285
+ filters: {
286
+ [PACKAGE_FILTERS.CHANGED]: true,
287
+ [PACKAGE_FILTERS.DUPLICATE]: true,
288
+ },
289
+ },
290
+ },
291
+ };
292
+
249
293
  export const getBundleAssetsFileTypeComponentLink = (
250
294
  fileType: string,
251
295
  label: string,
@@ -1,6 +1,7 @@
1
1
  export * from './component-links';
2
2
  export * from './delta';
3
3
  export * from './date';
4
+ export * from './insights';
4
5
  export * from './file-types';
5
6
  export * from './format';
6
7
  export * from './metrics';
@@ -0,0 +1,82 @@
1
+ import isEmpty from 'lodash/isEmpty';
2
+
3
+ import { InsightType, JobInsight, JobInsightsInfo } from '../constants';
4
+ import {
5
+ BUNDLE_PACKAGES_DUPLICATE,
6
+ BUNDLE_PACKAGES_CHANGED,
7
+ BUNDLE_PACKAGES_DUPLICATE_CHANGED,
8
+ } from './component-links';
9
+
10
+ interface InsightListItem {
11
+ /**
12
+ * Inight name
13
+ */
14
+ name: string;
15
+ /**
16
+ * Insight data
17
+ */
18
+ insight: JobInsight;
19
+ /**
20
+ * Custom link props
21
+ */
22
+ link: any;
23
+ }
24
+
25
+ /**
26
+ * Get the insigh list ordered by level type
27
+ */
28
+ export const getInsightList = (insights: JobInsightsInfo): Array<InsightListItem> => {
29
+ const { duplicatePackages, newPackages } = insights;
30
+
31
+ const insightsByLevel: Record<InsightType, Array<InsightListItem>> = {
32
+ [InsightType.ERROR]: [],
33
+ [InsightType.WARNING]: [],
34
+ [InsightType.INFO]: [],
35
+ };
36
+
37
+ if (duplicatePackages) {
38
+ insightsByLevel[duplicatePackages.type].push({
39
+ name: 'duplicatePackages',
40
+ insight: duplicatePackages,
41
+ link:
42
+ duplicatePackages.type === InsightType.WARNING
43
+ ? BUNDLE_PACKAGES_DUPLICATE
44
+ : BUNDLE_PACKAGES_DUPLICATE_CHANGED,
45
+ });
46
+ }
47
+
48
+ if (newPackages) {
49
+ insightsByLevel[newPackages.type].push({
50
+ name: 'newPackages',
51
+ insight: newPackages,
52
+ link: BUNDLE_PACKAGES_CHANGED,
53
+ });
54
+ }
55
+
56
+ return [
57
+ ...(insightsByLevel[InsightType.ERROR] || []),
58
+ ...(insightsByLevel[InsightType.WARNING] || []),
59
+ ...(insightsByLevel[InsightType.INFO] || []),
60
+ ];
61
+ };
62
+
63
+ /**
64
+ * Show only the insights that are introduced by a change
65
+ */
66
+ export const getChangedInsights = (normalizedInsights: JobInsightsInfo): JobInsightsInfo | null => {
67
+ const res: JobInsightsInfo = {};
68
+
69
+ if (normalizedInsights.duplicatePackages?.type === InsightType.ERROR) {
70
+ res.duplicatePackages = normalizedInsights.duplicatePackages;
71
+ }
72
+
73
+ if (normalizedInsights.newPackages) {
74
+ res.newPackages = normalizedInsights.newPackages;
75
+ }
76
+
77
+ if (isEmpty(res)) {
78
+ return null;
79
+ }
80
+
81
+ return res;
82
+ };
@@ -1,4 +1,4 @@
1
- import { InsightType } from '../../config/insights';
1
+ import { InsightType } from '../../constants';
2
2
  import { getMetricRunInfo } from '../../utils/metrics';
3
3
  import { getMetricType } from '../utils';
4
4
  import { Metric } from '../types';
@@ -11,6 +11,7 @@ import { extractModules } from './modules';
11
11
  import { extractModulesPackages } from './modules-packages';
12
12
  import { extractModulesPackagesCount } from './modules-packages-count';
13
13
  import { extractModulesPackagesDuplicate } from './modules-packages-duplicate';
14
+ import { extractModulesPackagesNewInsight } from './modules-packages-new-insight';
14
15
 
15
16
  const extractFns = [
16
17
  extractAssets,
@@ -24,6 +25,7 @@ const extractFns = [
24
25
  extractModulesPackages,
25
26
  extractModulesPackagesCount,
26
27
  extractModulesPackagesDuplicate,
28
+ extractModulesPackagesNewInsight,
27
29
  ];
28
30
 
29
31
  export const extract = (webpackStats, baseline) =>
@@ -1,9 +1,10 @@
1
+ import isEmpty from 'lodash/isEmpty';
1
2
  import map from 'lodash/map';
2
3
  import orderBy from 'lodash/orderBy';
3
4
  import sum from 'lodash/sum';
4
5
 
5
- import { InsightType } from '../../config';
6
6
  import {
7
+ InsightType,
7
8
  Job,
8
9
  JobInsight,
9
10
  JobInsightDuplicatePackagesData,
@@ -25,9 +26,9 @@ interface DuplicatePackageGroup {
25
26
  }
26
27
 
27
28
  interface ModulesPackagesDuplicateData {
28
- insights: {
29
+ insights?: {
29
30
  duplicatePackages?: JobInsights['webpack']['duplicatePackages'];
30
- duplicatePackagesV3: JobInsights['webpack']['duplicatePackagesV3'];
31
+ duplicatePackagesV3?: JobInsights['webpack']['duplicatePackagesV3'];
31
32
  };
32
33
  metrics: {
33
34
  duplicatePackagesCount: MetricRun;
@@ -37,7 +38,7 @@ interface ModulesPackagesDuplicateData {
37
38
  export const getDuplicatePackagesInsight = (
38
39
  duplicatePackagesMap: Record<string, Array<string>>,
39
40
  baselineDuplicatePackagesMap?: Record<string, Array<string>>,
40
- ): JobInsight<JobInsightDuplicatePackagesV3Data> => {
41
+ ): JobInsight<JobInsightDuplicatePackagesV3Data> | null => {
41
42
  const duplicateInstances: Array<string> = [];
42
43
  const baselineDuplicateInstances: Array<string> = [];
43
44
  const newDuplicateInstances: Array<string> = [];
@@ -81,8 +82,8 @@ export const getDuplicatePackagesInsight = (
81
82
  const newDuplicateInstancesCount = newDuplicateInstances.length;
82
83
  const removedDuplicateInstancesCount = removedDuplicateInstances.length;
83
84
 
84
- let text: string;
85
- let insightType: InsightType;
85
+ let text = '';
86
+ let insightType: InsightType | null = null;
86
87
 
87
88
  if (newDuplicateInstancesCount > 0 && removedDuplicateInstancesCount > 0) {
88
89
  // New duplicate packages and removed duplicates
@@ -90,7 +91,7 @@ export const getDuplicatePackagesInsight = (
90
91
  newDuplicateInstancesCount > 1 || removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
91
92
  text = `Bundle introduced ${newDuplicateInstancesCount} and removed ${removedDuplicateInstancesCount} duplicate ${item}`;
92
93
  insightType = InsightType.ERROR;
93
- } else if (newDuplicateInstancesCount > 0 && baselineDuplicatePackagesMap) {
94
+ } else if (newDuplicateInstancesCount > 0 && !isEmpty(baselineDuplicatePackagesMap)) {
94
95
  // New duplicate packages and baseline comparison
95
96
  const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
96
97
  text = `Bundle introduced ${newDuplicateInstancesCount} duplicate ${item}`;
@@ -100,6 +101,12 @@ export const getDuplicatePackagesInsight = (
100
101
  const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
101
102
  text = `Bundle contains ${newDuplicateInstancesCount} duplicate ${item}`;
102
103
  insightType = InsightType.WARNING;
104
+ } else if (removedDuplicateInstancesCount > 0 && duplicateInstancesCount > 0) {
105
+ // Removed duplicate packages, but there are duplicate packages remaining
106
+ const itemRemoved = removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
107
+ const itemRemaining = duplicateInstancesCount > 1 ? 'packages' : 'package';
108
+ text = `Bundle removed ${removedDuplicateInstancesCount} duplicate ${itemRemoved}, ${duplicateInstancesCount} duplicate ${itemRemaining} remaining`;
109
+ insightType = InsightType.WARNING;
103
110
  } else if (removedDuplicateInstancesCount > 0) {
104
111
  // Removed duplicate packages
105
112
  const item = removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
@@ -115,9 +122,11 @@ export const getDuplicatePackagesInsight = (
115
122
  text = `Bundle contains ${duplicateInstancesCount} duplicate ${item}`;
116
123
  insightType = InsightType.WARNING;
117
124
  } else {
118
- // No change
119
- text = 'Bundle does not contain duplicate packages';
120
- insightType = InsightType.INFO;
125
+ // No change - noop
126
+ }
127
+
128
+ if (!text || !insightType) {
129
+ return null;
121
130
  }
122
131
 
123
132
  return {
@@ -180,11 +189,15 @@ export const extractModulesPackagesDuplicate = (
180
189
  baselineJob?.insights?.webpack?.duplicatePackages?.data ||
181
190
  {};
182
191
 
192
+ const noDuplicatesDuplicatePackagesV3 = getDuplicatePackagesInsight({}, baselineDuplicatePackages);
193
+
183
194
  if (!count) {
184
195
  return {
185
- insights: {
186
- duplicatePackagesV3: getDuplicatePackagesInsight({}, baselineDuplicatePackages),
187
- },
196
+ ...(noDuplicatesDuplicatePackagesV3 && {
197
+ insights: {
198
+ duplicatePackagesV3: noDuplicatesDuplicatePackagesV3,
199
+ },
200
+ }),
188
201
  metrics: {
189
202
  duplicatePackagesCount: {
190
203
  value: count,
@@ -221,16 +234,18 @@ export const extractModulesPackagesDuplicate = (
221
234
  duplicatePackagesData[packageName] = packageData.children.map(({ id }) => id);
222
235
  });
223
236
 
237
+ const duplicatePackagesV3 = getDuplicatePackagesInsight(
238
+ duplicatePackagesData,
239
+ baselineDuplicatePackages,
240
+ );
241
+
224
242
  return {
225
243
  insights: {
226
244
  duplicatePackages: {
227
245
  type: InsightType.WARNING,
228
246
  data: duplicatePackagesData,
229
247
  },
230
- duplicatePackagesV3: getDuplicatePackagesInsight(
231
- duplicatePackagesData,
232
- baselineDuplicatePackages,
233
- ),
248
+ ...(duplicatePackagesV3 && { duplicatePackagesV3 }),
234
249
  },
235
250
  metrics: {
236
251
  duplicatePackagesCount: {
@@ -0,0 +1,80 @@
1
+ import { InsightType, Job, JobInsights } from '../../constants';
2
+ import { Packages } from '../types';
3
+
4
+ interface ModulesPackagesNewData {
5
+ insights?: {
6
+ newPackages: JobInsights['webpack']['newPackages'];
7
+ };
8
+ }
9
+
10
+ const getPackageNames = (packages: Packages): Set<string> => {
11
+ const result: Set<string> = new Set();
12
+
13
+ Object.values(packages).forEach((metricPackage) => {
14
+ result.add(metricPackage.name);
15
+ });
16
+
17
+ return result;
18
+ };
19
+
20
+ const getText = (newPackages: Array<string>) => {
21
+ if (newPackages.length === 1) {
22
+ return `Bundle introduced one new package: ${newPackages[0]}`;
23
+ }
24
+
25
+ const firstNewPackages = newPackages.slice(0, 3);
26
+ const otherPackages = newPackages.slice(3);
27
+
28
+ const text = `Bundle introduced ${newPackages.length} new packages: ${firstNewPackages.join(', ')}`;
29
+
30
+ if (otherPackages.length === 0) {
31
+ return text;
32
+ }
33
+
34
+ if (otherPackages.length === 1) {
35
+ return `${text} and one more`;
36
+ }
37
+
38
+ return `${text} and ${otherPackages.length} more`;
39
+ };
40
+
41
+ export const extractModulesPackagesNewInsight = (
42
+ _: any,
43
+ currentExtractedData: any,
44
+ baselineJob?: Job,
45
+ ): ModulesPackagesNewData | null => {
46
+ const currentMetricPackages = currentExtractedData?.metrics?.packages as Packages;
47
+ const baselineMetricPackages = baselineJob?.metrics?.webpack?.packages as Packages;
48
+
49
+ // Skip insight when the baseline data is missing
50
+ if (!baselineMetricPackages) {
51
+ return null;
52
+ }
53
+
54
+ const currentPackages = getPackageNames(currentMetricPackages);
55
+ const baselinePackages = getPackageNames(baselineMetricPackages);
56
+
57
+ const newPackages: Array<string> = [];
58
+
59
+ currentPackages.forEach((packageName) => {
60
+ if (!baselinePackages.has(packageName)) {
61
+ newPackages.push(packageName);
62
+ }
63
+ });
64
+
65
+ if (newPackages.length === 0) {
66
+ return null;
67
+ }
68
+
69
+ return {
70
+ insights: {
71
+ newPackages: {
72
+ type: InsightType.WARNING,
73
+ data: {
74
+ text: getText(newPackages),
75
+ packages: newPackages,
76
+ },
77
+ },
78
+ },
79
+ };
80
+ };