@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.
- package/lib/config/index.js +0 -1
- package/lib/config/index.js.map +1 -1
- package/lib/config/metrics.js.map +1 -1
- package/lib/constants.js +7 -1
- package/lib/constants.js.map +1 -1
- package/lib/i18n.js +3 -0
- package/lib/i18n.js.map +1 -1
- package/lib/utils/component-links.js +40 -1
- package/lib/utils/component-links.js.map +1 -1
- package/lib/utils/index.js +1 -0
- package/lib/utils/index.js.map +1 -1
- package/lib/utils/insights.js +54 -0
- package/lib/utils/insights.js.map +1 -0
- package/lib/webpack/extract/assets-size-total-insight.js +2 -2
- package/lib/webpack/extract/assets-size-total-insight.js.map +1 -1
- package/lib/webpack/extract/index.js +2 -0
- package/lib/webpack/extract/index.js.map +1 -1
- package/lib/webpack/extract/modules-packages-duplicate.js +28 -16
- package/lib/webpack/extract/modules-packages-duplicate.js.map +1 -1
- package/lib/webpack/extract/modules-packages-new-insight.js +57 -0
- package/lib/webpack/extract/modules-packages-new-insight.js.map +1 -0
- package/lib/webpack/extract/modules.js +45 -20
- package/lib/webpack/extract/modules.js.map +1 -1
- package/lib/webpack/metrics.js +5 -5
- package/lib/webpack/metrics.js.map +1 -1
- package/lib-esm/config/index.js +0 -1
- package/lib-esm/config/index.js.map +1 -1
- package/lib-esm/config/metrics.js +1 -1
- package/lib-esm/config/metrics.js.map +1 -1
- package/lib-esm/constants.js +6 -0
- package/lib-esm/constants.js.map +1 -1
- package/lib-esm/i18n.js +3 -0
- package/lib-esm/i18n.js.map +1 -1
- package/lib-esm/utils/component-links.js +38 -0
- package/lib-esm/utils/component-links.js.map +1 -1
- package/lib-esm/utils/index.js +1 -0
- package/lib-esm/utils/index.js.map +1 -1
- package/lib-esm/utils/insights.js +47 -0
- package/lib-esm/utils/insights.js.map +1 -0
- package/lib-esm/webpack/extract/assets-size-total-insight.js +1 -1
- package/lib-esm/webpack/extract/assets-size-total-insight.js.map +1 -1
- package/lib-esm/webpack/extract/index.js +2 -0
- package/lib-esm/webpack/extract/index.js.map +1 -1
- package/lib-esm/webpack/extract/modules-packages-duplicate.js +22 -10
- package/lib-esm/webpack/extract/modules-packages-duplicate.js.map +1 -1
- package/lib-esm/webpack/extract/modules-packages-new-insight.js +54 -0
- package/lib-esm/webpack/extract/modules-packages-new-insight.js.map +1 -0
- package/lib-esm/webpack/extract/modules.js +45 -20
- package/lib-esm/webpack/extract/modules.js.map +1 -1
- package/lib-esm/webpack/metrics.js +5 -5
- package/lib-esm/webpack/metrics.js.map +1 -1
- package/package.json +13 -13
- package/src/config/index.js +0 -1
- package/src/config/metrics.js +2 -6
- package/src/constants.ts +22 -10
- package/src/i18n.js +3 -0
- package/src/utils/component-links.ts +44 -0
- package/src/utils/index.js +1 -0
- package/src/utils/insights.ts +82 -0
- package/src/webpack/extract/assets-size-total-insight.js +1 -1
- package/src/webpack/extract/index.js +2 -0
- package/src/webpack/extract/modules-packages-duplicate.ts +32 -17
- package/src/webpack/extract/modules-packages-new-insight.ts +80 -0
- package/src/webpack/extract/modules.ts +61 -31
- package/src/webpack/metrics.js +5 -5
- package/src/webpack/types.ts +2 -2
- package/types/browsertime/metrics.d.ts +1 -1
- package/types/config/index.d.ts +0 -1
- package/types/config/metrics.d.ts +1 -30
- package/types/constants.d.ts +21 -9
- package/types/i18n.d.ts +3 -0
- package/types/lighthouse/metrics.d.ts +4 -4
- package/types/utils/component-links.d.ts +3 -0
- package/types/utils/index.d.ts +1 -0
- package/types/utils/insights.d.ts +9 -0
- package/types/webpack/constants.d.ts +1 -1
- package/types/webpack/extract/assets-size-total-insight.d.ts +2 -2
- package/types/webpack/extract/modules-packages-duplicate.d.ts +3 -3
- package/types/webpack/extract/modules-packages-new-insight.d.ts +8 -0
- package/types/webpack/metrics.d.ts +3 -3
- package/types/webpack/types.d.ts +2 -2
- package/lib/config/insights.js +0 -10
- package/lib/config/insights.js.map +0 -1
- package/lib-esm/config/insights.js +0 -7
- package/lib-esm/config/insights.js.map +0 -1
- package/src/config/insights.ts +0 -5
- package/tsconfig.lib.json +0 -7
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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":"AAAA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;QACpB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,
|
|
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-
|
|
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-
|
|
39
|
-
"@bundle-stats/plugin-webpack-validate": "^4.3.0-
|
|
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
|
|
42
|
+
"use-query-params": "2.2.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/jest": "29.
|
|
46
|
-
"@types/lodash": "4.14.
|
|
47
|
-
"core-js": "3.
|
|
48
|
-
"jest": "29.
|
|
49
|
-
"jest-cli": "29.
|
|
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
|
|
54
|
-
"ts-jest": "29.0
|
|
55
|
-
"typescript": "
|
|
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": "
|
|
61
|
+
"gitHead": "c46d2890ca972917edea0c6db51cab92303e8e27"
|
|
62
62
|
}
|
package/src/config/index.js
CHANGED
package/src/config/metrics.js
CHANGED
|
@@ -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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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,
|
package/src/utils/index.js
CHANGED
|
@@ -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
|
+
};
|
|
@@ -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
|
|
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
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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
|
|
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
|
+
};
|