@bundle-stats/utils 4.3.0-beta.1 → 4.4.0-beta.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 +1 -9
- package/lib/config/index.js.map +1 -1
- package/lib/constants.js +15 -1
- package/lib/constants.js.map +1 -1
- package/lib/jobs/create-job.js +2 -2
- package/lib/jobs/create-job.js.map +1 -1
- package/lib/report/create.js +2 -2
- package/lib/report/create.js.map +1 -1
- package/lib/utils/component-links.js +3 -3
- package/lib/webpack/extract/modules-packages-duplicate.js +93 -7
- package/lib/webpack/extract/modules-packages-duplicate.js.map +1 -1
- package/lib/webpack/extract/modules.js +2 -0
- package/lib/webpack/extract/modules.js.map +1 -1
- package/lib-esm/config/index.js +0 -8
- package/lib-esm/config/index.js.map +1 -1
- package/lib-esm/constants.js +14 -0
- package/lib-esm/constants.js.map +1 -1
- package/lib-esm/jobs/create-job.js +2 -2
- package/lib-esm/jobs/create-job.js.map +1 -1
- package/lib-esm/report/create.js +2 -2
- package/lib-esm/report/create.js.map +1 -1
- package/lib-esm/utils/component-links.js +2 -2
- package/lib-esm/webpack/extract/modules-packages-duplicate.js +94 -7
- package/lib-esm/webpack/extract/modules-packages-duplicate.js.map +1 -1
- package/lib-esm/webpack/extract/modules.js +3 -0
- package/lib-esm/webpack/extract/modules.js.map +1 -1
- package/package.json +8 -8
- package/src/config/index.js +0 -9
- package/src/constants.ts +51 -7
- package/src/jobs/create-job.ts +2 -3
- package/src/report/create.ts +2 -3
- package/src/utils/component-links.ts +2 -2
- package/src/webpack/extract/modules-packages-duplicate.ts +147 -11
- package/src/webpack/extract/modules.ts +4 -1
- package/src/webpack/types.ts +2 -1
- package/types/config/index.d.ts +0 -4
- package/types/constants.d.ts +42 -7
- package/types/utils/component-links.d.ts +1 -1
- package/types/webpack/extract/modules-packages-duplicate.d.ts +9 -17
- package/types/webpack/types.d.ts +2 -1
package/lib/config/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.
|
|
17
|
+
exports.PACKAGE_ID_SEPARATOR = exports.PACKAGES_SEPARATOR = void 0;
|
|
18
18
|
__exportStar(require("./component-links"), exports);
|
|
19
19
|
__exportStar(require("./file-types"), exports);
|
|
20
20
|
__exportStar(require("./insights"), exports);
|
|
@@ -22,12 +22,4 @@ __exportStar(require("./metrics"), exports);
|
|
|
22
22
|
__exportStar(require("./delta"), exports);
|
|
23
23
|
exports.PACKAGES_SEPARATOR = ':';
|
|
24
24
|
exports.PACKAGE_ID_SEPARATOR = '~';
|
|
25
|
-
exports.SOURCE_PATH_WEBPACK_STATS = 'webpack';
|
|
26
|
-
exports.SOURCE_PATH_LIGHTHOUSE = 'lighthouse';
|
|
27
|
-
exports.SOURCE_PATH_BROWSERTIME = 'browsertime';
|
|
28
|
-
exports.SOURCE_PATHS = [
|
|
29
|
-
exports.SOURCE_PATH_WEBPACK_STATS,
|
|
30
|
-
exports.SOURCE_PATH_LIGHTHOUSE,
|
|
31
|
-
exports.SOURCE_PATH_BROWSERTIME,
|
|
32
|
-
];
|
|
33
25
|
//# sourceMappingURL=index.js.map
|
package/lib/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,+CAA6B;AAC7B,6CAA2B;AAC3B,4CAA0B;AAC1B,0CAAwB;AAEX,QAAA,kBAAkB,GAAG,GAAG,CAAC;AACzB,QAAA,oBAAoB,GAAG,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,+CAA6B;AAC7B,6CAA2B;AAC3B,4CAA0B;AAC1B,0CAAwB;AAEX,QAAA,kBAAkB,GAAG,GAAG,CAAC;AACzB,QAAA,oBAAoB,GAAG,GAAG,CAAC"}
|
package/lib/constants.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MetricRunInfoDeltaType = exports.MetricTypeType = void 0;
|
|
3
|
+
exports.JobSectionId = exports.MetricRunInfoDeltaType = exports.MetricTypeType = exports.Source = void 0;
|
|
4
|
+
var Source;
|
|
5
|
+
(function (Source) {
|
|
6
|
+
Source["webpack"] = "webpack";
|
|
7
|
+
Source["lighthouse"] = "lighthouse";
|
|
8
|
+
Source["browsertime"] = "browsertime";
|
|
9
|
+
})(Source = exports.Source || (exports.Source = {}));
|
|
4
10
|
var MetricTypeType;
|
|
5
11
|
(function (MetricTypeType) {
|
|
6
12
|
MetricTypeType["METRIC_TYPE_NUMERIC"] = "METRIC_TYPE_NUMERIC";
|
|
@@ -19,4 +25,12 @@ var MetricRunInfoDeltaType;
|
|
|
19
25
|
MetricRunInfoDeltaType["POSITIVE"] = "POSITIVE";
|
|
20
26
|
MetricRunInfoDeltaType["HIGH_POSITIVE"] = "HIGH_POSITIVE";
|
|
21
27
|
})(MetricRunInfoDeltaType = exports.MetricRunInfoDeltaType || (exports.MetricRunInfoDeltaType = {}));
|
|
28
|
+
var JobSectionId;
|
|
29
|
+
(function (JobSectionId) {
|
|
30
|
+
JobSectionId["meta"] = "meta";
|
|
31
|
+
JobSectionId["insights"] = "insights";
|
|
32
|
+
JobSectionId["summary"] = "summary";
|
|
33
|
+
JobSectionId["metrics"] = "metrics";
|
|
34
|
+
JobSectionId["rawData"] = "rawData";
|
|
35
|
+
})(JobSectionId = exports.JobSectionId || (exports.JobSectionId = {}));
|
|
22
36
|
//# sourceMappingURL=constants.js.map
|
package/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAEA,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,6DAA6C,CAAA;IAC7C,yDAAyC,CAAA;IACzC,iEAAiD,CAAA;IACjD,+DAA+C,CAAA;IAC/C,mEAAmD,CAAA;AACrD,CAAC,EANW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAMzB;AAaD,IAAY,sBAQX;AARD,WAAY,sBAAsB;IAChC,yDAAiC,CAAA;IACjC,+CAAuB,CAAA;IACvB,uDAA+B,CAAA;IAC/B,iDAAyB,CAAA;IACzB,uDAA+B,CAAA;IAC/B,+CAAuB,CAAA;IACvB,yDAAiC,CAAA;AACnC,CAAC,EARW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAQjC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAEA,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,6BAAmB,CAAA;IACnB,mCAAyB,CAAA;IACzB,qCAA2B,CAAA;AAC7B,CAAC,EAJW,MAAM,GAAN,cAAM,KAAN,cAAM,QAIjB;AAID,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,6DAA6C,CAAA;IAC7C,yDAAyC,CAAA;IACzC,iEAAiD,CAAA;IACjD,+DAA+C,CAAA;IAC/C,mEAAmD,CAAA;AACrD,CAAC,EANW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAMzB;AAaD,IAAY,sBAQX;AARD,WAAY,sBAAsB;IAChC,yDAAiC,CAAA;IACjC,+CAAuB,CAAA;IACvB,uDAA+B,CAAA;IAC/B,iDAAyB,CAAA;IACzB,uDAA+B,CAAA;IAC/B,+CAAuB,CAAA;IACvB,yDAAiC,CAAA;AACnC,CAAC,EARW,sBAAsB,GAAtB,8BAAsB,KAAtB,8BAAsB,QAQjC;AAkBD,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,qCAAqB,CAAA;IACrB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;AACrB,CAAC,EANW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAMvB"}
|
package/lib/jobs/create-job.js
CHANGED
|
@@ -28,13 +28,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.createJob = void 0;
|
|
30
30
|
const merge_1 = __importDefault(require("lodash/merge"));
|
|
31
|
-
const config_1 = require("../config");
|
|
32
31
|
const create_summary_1 = require("./create-summary");
|
|
33
32
|
const webpack = __importStar(require("../webpack"));
|
|
34
33
|
const lighthouse = __importStar(require("../lighthouse"));
|
|
35
34
|
const browsertime = __importStar(require("../browsertime"));
|
|
35
|
+
const constants_1 = require("../constants");
|
|
36
36
|
const SOURCE_MODULES = { webpack, lighthouse, browsertime };
|
|
37
|
-
const createJob = (source, baseline) =>
|
|
37
|
+
const createJob = (source, baseline) => Object.values(constants_1.Source).reduce((agg, sourcePath) => {
|
|
38
38
|
const rawData = source[sourcePath];
|
|
39
39
|
if (!rawData) {
|
|
40
40
|
return agg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-job.js","sourceRoot":"","sources":["../../src/jobs/create-job.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAAiC;AAEjC,
|
|
1
|
+
{"version":3,"file":"create-job.js","sourceRoot":"","sources":["../../src/jobs/create-job.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yDAAiC;AAEjC,qDAAiD;AACjD,oDAAsC;AACtC,0DAA4C;AAC5C,4DAA8C;AAC9C,4CAA6E;AAa7E,MAAM,cAAc,GAAiC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAEnF,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,QAAkB,EAAW,EAAE,CAC3E,MAAM,CAAC,MAAM,CAAC,kBAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEnC,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,aAAa,GAAiB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,IAAA,8BAAa,EAC3B,cAAc,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAC/C,QAAQ,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAC/B,aAAa,EAAE,OAAO,CACvB,CAAC;IAEF,OAAO,IAAA,eAAK,EAAC,EAAE,EAAE,GAAG,EAAE;QACpB,IAAI,EAAE;YACJ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,IAAI;SACjC;QACD,QAAQ,EAAE;YACR,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,QAAQ;SACrC;QACD,OAAO,EAAE;YACP,CAAC,UAAU,CAAC,EAAE,OAAO;SACtB;QACD,OAAO,EAAE;YACP,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO;SACpC;QACD,OAAO,EAAE;YACP,CAAC,UAAU,CAAC,EAAE,OAAO;SACtB;KACF,CAAC,CAAC;AACL,CAAC,EAAE,EAAE,CAAC,CAAC;AAvCI,QAAA,SAAS,aAuCb"}
|
package/lib/report/create.js
CHANGED
|
@@ -28,14 +28,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.createReport = void 0;
|
|
30
30
|
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
|
|
31
|
-
const
|
|
31
|
+
const constants_1 = require("../constants");
|
|
32
32
|
const metrics_1 = require("../utils/metrics");
|
|
33
33
|
const webpack = __importStar(require("../webpack"));
|
|
34
34
|
const package_json_1 = require("../../package.json");
|
|
35
35
|
const createReport = (jobs) => {
|
|
36
36
|
const insights = jobs[0]?.insights;
|
|
37
37
|
const summary = {};
|
|
38
|
-
|
|
38
|
+
Object.values(constants_1.Source).forEach((sourceId) => {
|
|
39
39
|
const sourceSummary = jobs[0]?.summary?.[sourceId];
|
|
40
40
|
if (!sourceSummary) {
|
|
41
41
|
return;
|
package/lib/report/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/report/create.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAAqC;AAErC,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/report/create.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAAqC;AAErC,4CAA4E;AAC5E,8CAAyE;AACzE,oDAAsC;AAEtC,qDAA6C;AAmBtC,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAU,EAAE;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;IAGnC,MAAM,OAAO,GAA+C,EAAE,CAAC;IAE/D,MAAM,CAAC,MAAM,CAAC,kBAAM,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAqB,CAAC;QAEvE,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO;SACR;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE;YACnF,MAAM,MAAM,GAAG,IAAA,6BAAmB,EAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YAC9D,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC;YAClD,MAAM,IAAI,GAAG,IAAA,0BAAgB,EAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEzD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;QACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAP,sBAAO;QAEP,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,GAAG,IAAI;YACP,mBAAmB;SACpB,CAAC,CAAC;QAEH,OAAO;QAGP,GAAG,CAAC,CAAC,IAAA,iBAAO,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC,CAAC;AAxCW,QAAA,YAAY,gBAwCvB"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.METRIC_COMPONENT_LINKS = exports.getComponentStateQueryString = exports.getBundlePackagesByNameComponentLink = exports.getBundleAssetsFileTypeComponentLink = exports.BUNDLE_PACKAGES_DUPLICATE = exports.
|
|
6
|
+
exports.METRIC_COMPONENT_LINKS = exports.getComponentStateQueryString = exports.getBundlePackagesByNameComponentLink = exports.getBundleAssetsFileTypeComponentLink = exports.BUNDLE_PACKAGES_DUPLICATE = exports.BUNDLE_PACKAGES_COUNT = exports.getBundleModulesByChunk = exports.getBundleModulesBySearch = exports.BUNDLE_MODULES_DUPLICATE = exports.BUNDLE_MODULES = exports.BUNDLE_ASSETS_CHUNK_COUNT = exports.BUNDLE_ASSETS_COUNT = exports.BUNDLE_ASSETS_CACHE_INVALIDATION = exports.BUNDLE_ASSETS_INITIAL_CSS = exports.BUNDLE_ASSETS_INITIAL_JS = exports.TOTALS = exports.getModuleFileTypeFilters = exports.getModuleChunkFilters = exports.getModuleSourceTypeFilters = exports.getAssetEntryTypeFilters = exports.getAssetFileTypeFilters = void 0;
|
|
7
7
|
const query_string_1 = require("query-string");
|
|
8
8
|
const serialize_query_params_1 = require("serialize-query-params");
|
|
9
9
|
const file_types_1 = require("../config/file-types");
|
|
@@ -166,7 +166,7 @@ const getBundleModulesByChunk = (chunkIds, chunkId, fileType = '') => ({
|
|
|
166
166
|
},
|
|
167
167
|
});
|
|
168
168
|
exports.getBundleModulesByChunk = getBundleModulesByChunk;
|
|
169
|
-
exports.
|
|
169
|
+
exports.BUNDLE_PACKAGES_COUNT = {
|
|
170
170
|
section: component_links_1.SECTIONS.PACKAGES,
|
|
171
171
|
title: i18n_1.default.COMPONENT_LINK_PACKAGES_COUNT,
|
|
172
172
|
params: {
|
|
@@ -238,7 +238,7 @@ exports.METRIC_COMPONENT_LINKS = new Map([
|
|
|
238
238
|
['webpack.moduleCount', { link: exports.BUNDLE_MODULES }],
|
|
239
239
|
['webpack.duplicateModulesCount', { link: exports.BUNDLE_MODULES_DUPLICATE }],
|
|
240
240
|
['webpack.duplicateCode', { link: exports.BUNDLE_MODULES_DUPLICATE }],
|
|
241
|
-
['webpack.packageCount', { link: exports.
|
|
241
|
+
['webpack.packageCount', { link: exports.BUNDLE_PACKAGES_COUNT }],
|
|
242
242
|
['webpack.duplicatePackagesCount', { link: exports.BUNDLE_PACKAGES_DUPLICATE }],
|
|
243
243
|
]);
|
|
244
244
|
//# sourceMappingURL=component-links.js.map
|
|
@@ -3,12 +3,88 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.extractModulesPackagesDuplicate = void 0;
|
|
6
|
+
exports.extractModulesPackagesDuplicate = exports.getDuplicatePackagesInsight = void 0;
|
|
7
7
|
const map_1 = __importDefault(require("lodash/map"));
|
|
8
8
|
const orderBy_1 = __importDefault(require("lodash/orderBy"));
|
|
9
9
|
const sum_1 = __importDefault(require("lodash/sum"));
|
|
10
10
|
const config_1 = require("../../config");
|
|
11
|
-
const
|
|
11
|
+
const getDuplicatePackagesInsight = (duplicatePackagesMap, baselineDuplicatePackagesMap) => {
|
|
12
|
+
const duplicateInstances = [];
|
|
13
|
+
const baselineDuplicateInstances = [];
|
|
14
|
+
const newDuplicateInstances = [];
|
|
15
|
+
const removedDuplicateInstances = [];
|
|
16
|
+
Object.entries(duplicatePackagesMap).forEach(([id, instances]) => {
|
|
17
|
+
instances.forEach((duplicateInstance) => {
|
|
18
|
+
if (duplicateInstance === id) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
duplicateInstances.push(duplicateInstance);
|
|
22
|
+
if (baselineDuplicatePackagesMap?.[id]?.includes(duplicateInstance)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
newDuplicateInstances.push(duplicateInstance);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
if (baselineDuplicatePackagesMap) {
|
|
29
|
+
Object.entries(baselineDuplicatePackagesMap).forEach(([id, instances]) => {
|
|
30
|
+
instances.forEach((duplicateInstance) => {
|
|
31
|
+
if (duplicateInstance === id) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
baselineDuplicateInstances.push(duplicateInstance);
|
|
35
|
+
if (duplicatePackagesMap?.[id]?.includes(duplicateInstance)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
removedDuplicateInstances.push(duplicateInstance);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const duplicateInstancesCount = duplicateInstances.length;
|
|
43
|
+
const newDuplicateInstancesCount = newDuplicateInstances.length;
|
|
44
|
+
const removedDuplicateInstancesCount = removedDuplicateInstances.length;
|
|
45
|
+
let text;
|
|
46
|
+
let insightType;
|
|
47
|
+
if (newDuplicateInstancesCount > 0 && removedDuplicateInstancesCount > 0) {
|
|
48
|
+
const item = newDuplicateInstancesCount > 1 || removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
49
|
+
text = `Bundle introduced ${newDuplicateInstancesCount} and removed ${removedDuplicateInstancesCount} duplicate ${item}`;
|
|
50
|
+
insightType = config_1.InsightType.ERROR;
|
|
51
|
+
}
|
|
52
|
+
else if (newDuplicateInstancesCount > 0 && baselineDuplicatePackagesMap) {
|
|
53
|
+
const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
54
|
+
text = `Bundle introduced ${newDuplicateInstancesCount} duplicate ${item}`;
|
|
55
|
+
insightType = config_1.InsightType.ERROR;
|
|
56
|
+
}
|
|
57
|
+
else if (newDuplicateInstancesCount > 0) {
|
|
58
|
+
const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
59
|
+
text = `Bundle contains ${newDuplicateInstancesCount} duplicate ${item}`;
|
|
60
|
+
insightType = config_1.InsightType.WARNING;
|
|
61
|
+
}
|
|
62
|
+
else if (removedDuplicateInstancesCount > 0) {
|
|
63
|
+
const item = removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
64
|
+
text = `Bundle removed ${removedDuplicateInstancesCount} duplicate ${item}`;
|
|
65
|
+
insightType = config_1.InsightType.INFO;
|
|
66
|
+
}
|
|
67
|
+
else if (newDuplicateInstancesCount === 0 &&
|
|
68
|
+
removedDuplicateInstancesCount === 0 &&
|
|
69
|
+
duplicateInstancesCount > 0) {
|
|
70
|
+
const item = duplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
71
|
+
text = `Bundle contains ${duplicateInstancesCount} duplicate ${item}`;
|
|
72
|
+
insightType = config_1.InsightType.WARNING;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
text = 'Bundle does not contain duplicate packages';
|
|
76
|
+
insightType = config_1.InsightType.INFO;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
type: insightType,
|
|
80
|
+
data: {
|
|
81
|
+
text,
|
|
82
|
+
packages: duplicatePackagesMap,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
exports.getDuplicatePackagesInsight = getDuplicatePackagesInsight;
|
|
87
|
+
const extractModulesPackagesDuplicate = (_, currentExtractedData, baselineJob) => {
|
|
12
88
|
const source = currentExtractedData?.metrics?.packages || {};
|
|
13
89
|
const packagesByName = {};
|
|
14
90
|
Object.entries(source).forEach(([packageId, packageData]) => {
|
|
@@ -35,8 +111,14 @@ const extractModulesPackagesDuplicate = (_, currentExtractedData) => {
|
|
|
35
111
|
children: packageGroupData.children,
|
|
36
112
|
});
|
|
37
113
|
});
|
|
114
|
+
const baselineDuplicatePackages = baselineJob?.insights?.webpack?.duplicatePackagesV3?.data?.packages ||
|
|
115
|
+
baselineJob?.insights?.webpack?.duplicatePackages?.data ||
|
|
116
|
+
{};
|
|
38
117
|
if (!count) {
|
|
39
118
|
return {
|
|
119
|
+
insights: {
|
|
120
|
+
duplicatePackagesV3: (0, exports.getDuplicatePackagesInsight)({}, baselineDuplicatePackages),
|
|
121
|
+
},
|
|
40
122
|
metrics: {
|
|
41
123
|
duplicatePackagesCount: {
|
|
42
124
|
value: count,
|
|
@@ -51,16 +133,20 @@ const extractModulesPackagesDuplicate = (_, currentExtractedData) => {
|
|
|
51
133
|
children: (0, orderBy_1.default)(duplicatePackageData.children, 'value', 'desc'),
|
|
52
134
|
},
|
|
53
135
|
}), {});
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
[packageName]
|
|
57
|
-
|
|
136
|
+
const duplicatePackagesData = {};
|
|
137
|
+
Object.entries(duplicatePackagesByName).forEach(([packageName, packageData]) => {
|
|
138
|
+
if (!duplicatePackagesData[packageName]) {
|
|
139
|
+
duplicatePackagesData[packageName] = [];
|
|
140
|
+
}
|
|
141
|
+
duplicatePackagesData[packageName] = packageData.children.map(({ id }) => id);
|
|
142
|
+
});
|
|
58
143
|
return {
|
|
59
144
|
insights: {
|
|
60
145
|
duplicatePackages: {
|
|
61
146
|
type: config_1.InsightType.WARNING,
|
|
62
|
-
data,
|
|
147
|
+
data: duplicatePackagesData,
|
|
63
148
|
},
|
|
149
|
+
duplicatePackagesV3: (0, exports.getDuplicatePackagesInsight)(duplicatePackagesData, baselineDuplicatePackages),
|
|
64
150
|
},
|
|
65
151
|
metrics: {
|
|
66
152
|
duplicatePackagesCount: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules-packages-duplicate.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules-packages-duplicate.ts"],"names":[],"mappings":";;;;;;AAAA,qDAA6B;AAC7B,6DAAqC;AACrC,qDAA6B;AAE7B,yCAA2C;
|
|
1
|
+
{"version":3,"file":"modules-packages-duplicate.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules-packages-duplicate.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,11 +45,13 @@ const extractModules = (webpackStats) => {
|
|
|
45
45
|
duplicateModulesCount += duplicateInstances;
|
|
46
46
|
duplicateCodeSize += duplicateInstances * size;
|
|
47
47
|
totalCodeSize += instances * size;
|
|
48
|
+
const reasons = moduleEntry.reasons?.map((reason) => (0, utils_1.getModuleName)(reason.module));
|
|
48
49
|
agg[normalizedName] = {
|
|
49
50
|
name,
|
|
50
51
|
value: size,
|
|
51
52
|
chunkIds: chunks.map(utils_1.normalizeChunkId),
|
|
52
53
|
duplicated: Boolean(duplicateInstances),
|
|
54
|
+
...(reasons && { reasons }),
|
|
53
55
|
};
|
|
54
56
|
return agg;
|
|
55
57
|
}, {});
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules.ts"],"names":[],"mappings":"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"}
|
package/lib-esm/config/index.js
CHANGED
|
@@ -5,12 +5,4 @@ export * from './metrics';
|
|
|
5
5
|
export * from './delta';
|
|
6
6
|
export const PACKAGES_SEPARATOR = ':';
|
|
7
7
|
export const PACKAGE_ID_SEPARATOR = '~';
|
|
8
|
-
export const SOURCE_PATH_WEBPACK_STATS = 'webpack';
|
|
9
|
-
export const SOURCE_PATH_LIGHTHOUSE = 'lighthouse';
|
|
10
|
-
export const SOURCE_PATH_BROWSERTIME = 'browsertime';
|
|
11
|
-
export const SOURCE_PATHS = [
|
|
12
|
-
SOURCE_PATH_WEBPACK_STATS,
|
|
13
|
-
SOURCE_PATH_LIGHTHOUSE,
|
|
14
|
-
SOURCE_PATH_BROWSERTIME,
|
|
15
|
-
];
|
|
16
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.js"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.js"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC"}
|
package/lib-esm/constants.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
export var Source;
|
|
2
|
+
(function (Source) {
|
|
3
|
+
Source["webpack"] = "webpack";
|
|
4
|
+
Source["lighthouse"] = "lighthouse";
|
|
5
|
+
Source["browsertime"] = "browsertime";
|
|
6
|
+
})(Source || (Source = {}));
|
|
1
7
|
export var MetricTypeType;
|
|
2
8
|
(function (MetricTypeType) {
|
|
3
9
|
MetricTypeType["METRIC_TYPE_NUMERIC"] = "METRIC_TYPE_NUMERIC";
|
|
@@ -16,4 +22,12 @@ export var MetricRunInfoDeltaType;
|
|
|
16
22
|
MetricRunInfoDeltaType["POSITIVE"] = "POSITIVE";
|
|
17
23
|
MetricRunInfoDeltaType["HIGH_POSITIVE"] = "HIGH_POSITIVE";
|
|
18
24
|
})(MetricRunInfoDeltaType || (MetricRunInfoDeltaType = {}));
|
|
25
|
+
export var JobSectionId;
|
|
26
|
+
(function (JobSectionId) {
|
|
27
|
+
JobSectionId["meta"] = "meta";
|
|
28
|
+
JobSectionId["insights"] = "insights";
|
|
29
|
+
JobSectionId["summary"] = "summary";
|
|
30
|
+
JobSectionId["metrics"] = "metrics";
|
|
31
|
+
JobSectionId["rawData"] = "rawData";
|
|
32
|
+
})(JobSectionId || (JobSectionId = {}));
|
|
19
33
|
//# sourceMappingURL=constants.js.map
|
package/lib-esm/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,6DAA6C,CAAA;IAC7C,yDAAyC,CAAA;IACzC,iEAAiD,CAAA;IACjD,+DAA+C,CAAA;IAC/C,mEAAmD,CAAA;AACrD,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB;AAaD,MAAM,CAAN,IAAY,sBAQX;AARD,WAAY,sBAAsB;IAChC,yDAAiC,CAAA;IACjC,+CAAuB,CAAA;IACvB,uDAA+B,CAAA;IAC/B,iDAAyB,CAAA;IACzB,uDAA+B,CAAA;IAC/B,+CAAuB,CAAA;IACvB,yDAAiC,CAAA;AACnC,CAAC,EARW,sBAAsB,KAAtB,sBAAsB,QAQjC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,MAIX;AAJD,WAAY,MAAM;IAChB,6BAAmB,CAAA;IACnB,mCAAyB,CAAA;IACzB,qCAA2B,CAAA;AAC7B,CAAC,EAJW,MAAM,KAAN,MAAM,QAIjB;AAID,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,6DAA6C,CAAA;IAC7C,yDAAyC,CAAA;IACzC,iEAAiD,CAAA;IACjD,+DAA+C,CAAA;IAC/C,mEAAmD,CAAA;AACrD,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB;AAaD,MAAM,CAAN,IAAY,sBAQX;AARD,WAAY,sBAAsB;IAChC,yDAAiC,CAAA;IACjC,+CAAuB,CAAA;IACvB,uDAA+B,CAAA;IAC/B,iDAAyB,CAAA;IACzB,uDAA+B,CAAA;IAC/B,+CAAuB,CAAA;IACvB,yDAAiC,CAAA;AACnC,CAAC,EARW,sBAAsB,KAAtB,sBAAsB,QAQjC;AAkBD,MAAM,CAAN,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,6BAAa,CAAA;IACb,qCAAqB,CAAA;IACrB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;IACnB,mCAAmB,CAAA;AACrB,CAAC,EANW,YAAY,KAAZ,YAAY,QAMvB"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import merge from 'lodash/merge';
|
|
2
|
-
import { SOURCE_PATHS } from '../config';
|
|
3
2
|
import { createSummary } from './create-summary';
|
|
4
3
|
import * as webpack from '../webpack';
|
|
5
4
|
import * as lighthouse from '../lighthouse';
|
|
6
5
|
import * as browsertime from '../browsertime';
|
|
6
|
+
import { Source } from '../constants';
|
|
7
7
|
const SOURCE_MODULES = { webpack, lighthouse, browsertime };
|
|
8
|
-
export const createJob = (source, baseline) =>
|
|
8
|
+
export const createJob = (source, baseline) => Object.values(Source).reduce((agg, sourcePath) => {
|
|
9
9
|
var _a;
|
|
10
10
|
const rawData = source[sourcePath];
|
|
11
11
|
if (!rawData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-job.js","sourceRoot":"","sources":["../../src/jobs/create-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create-job.js","sourceRoot":"","sources":["../../src/jobs/create-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,cAAc,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAA6B,MAAM,EAAc,MAAM,cAAc,CAAC;AAa7E,MAAM,cAAc,GAAiC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AAE1F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAkB,EAAE,QAAkB,EAAW,EAAE,CAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEnC,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,GAAG,CAAC;KACZ;IAED,MAAM,aAAa,GAAiB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,aAAa,CAC3B,cAAc,CAAC,UAAU,CAAC,CAAC,oBAAoB,EAC/C,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,0CAAG,UAAU,CAAC,EAC/B,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,CACvB,CAAC;IAEF,OAAO,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE;QACpB,IAAI,EAAE;YACJ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,IAAI;SACjC;QACD,QAAQ,EAAE;YACR,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,QAAQ;SACrC;QACD,OAAO,EAAE;YACP,CAAC,UAAU,CAAC,EAAE,OAAO;SACtB;QACD,OAAO,EAAE;YACP,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,OAAO;SACpC;QACD,OAAO,EAAE;YACP,CAAC,UAAU,CAAC,EAAE,OAAO;SACtB;KACF,CAAC,CAAC;AACL,CAAC,EAAE,EAAE,CAAC,CAAC"}
|
package/lib-esm/report/create.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import isEmpty from 'lodash/isEmpty';
|
|
2
|
-
import {
|
|
2
|
+
import { Source } from '../constants';
|
|
3
3
|
import { getGlobalMetricType, getMetricRunInfo } from '../utils/metrics';
|
|
4
4
|
import * as webpack from '../webpack';
|
|
5
5
|
import { version } from '../../package.json';
|
|
@@ -7,7 +7,7 @@ export const createReport = (jobs) => {
|
|
|
7
7
|
var _a;
|
|
8
8
|
const insights = (_a = jobs[0]) === null || _a === void 0 ? void 0 : _a.insights;
|
|
9
9
|
const summary = {};
|
|
10
|
-
|
|
10
|
+
Object.values(Source).forEach((sourceId) => {
|
|
11
11
|
var _a, _b;
|
|
12
12
|
const sourceSummary = (_b = (_a = jobs[0]) === null || _a === void 0 ? void 0 : _a.summary) === null || _b === void 0 ? void 0 : _b[sourceId];
|
|
13
13
|
if (!sourceSummary) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/report/create.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,gBAAgB,CAAC;AAErC,OAAO,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/report/create.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAwC,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAmB7C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAU,EAAE;;IACvD,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,QAAQ,CAAC;IAGnC,MAAM,OAAO,GAA+C,EAAE,CAAC;IAE/D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;;QACzC,MAAM,aAAa,GAAG,MAAA,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,OAAO,0CAAG,QAAQ,CAAqB,CAAC;QAEvE,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO;SACR;QAED,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE;YACnF,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;YAC9D,MAAM,EAAE,OAAO,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,WAAW,CAAC;YAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEzD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE;QACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO;QAEP,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,GAAG,IAAI;YACP,mBAAmB;SACpB,CAAC,CAAC;QAEH,OAAO;QAGP,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -153,7 +153,7 @@ export const getBundleModulesByChunk = (chunkIds, chunkId, fileType = '') => ({
|
|
|
153
153
|
},
|
|
154
154
|
},
|
|
155
155
|
});
|
|
156
|
-
export const
|
|
156
|
+
export const BUNDLE_PACKAGES_COUNT = {
|
|
157
157
|
section: SECTIONS.PACKAGES,
|
|
158
158
|
title: I18N.COMPONENT_LINK_PACKAGES_COUNT,
|
|
159
159
|
params: {
|
|
@@ -222,7 +222,7 @@ export const METRIC_COMPONENT_LINKS = new Map([
|
|
|
222
222
|
['webpack.moduleCount', { link: BUNDLE_MODULES }],
|
|
223
223
|
['webpack.duplicateModulesCount', { link: BUNDLE_MODULES_DUPLICATE }],
|
|
224
224
|
['webpack.duplicateCode', { link: BUNDLE_MODULES_DUPLICATE }],
|
|
225
|
-
['webpack.packageCount', { link:
|
|
225
|
+
['webpack.packageCount', { link: BUNDLE_PACKAGES_COUNT }],
|
|
226
226
|
['webpack.duplicatePackagesCount', { link: BUNDLE_PACKAGES_DUPLICATE }],
|
|
227
227
|
]);
|
|
228
228
|
//# sourceMappingURL=component-links.js.map
|
|
@@ -2,8 +2,85 @@ import map from 'lodash/map';
|
|
|
2
2
|
import orderBy from 'lodash/orderBy';
|
|
3
3
|
import sum from 'lodash/sum';
|
|
4
4
|
import { InsightType } from '../../config';
|
|
5
|
-
export const
|
|
6
|
-
|
|
5
|
+
export const getDuplicatePackagesInsight = (duplicatePackagesMap, baselineDuplicatePackagesMap) => {
|
|
6
|
+
const duplicateInstances = [];
|
|
7
|
+
const baselineDuplicateInstances = [];
|
|
8
|
+
const newDuplicateInstances = [];
|
|
9
|
+
const removedDuplicateInstances = [];
|
|
10
|
+
Object.entries(duplicatePackagesMap).forEach(([id, instances]) => {
|
|
11
|
+
instances.forEach((duplicateInstance) => {
|
|
12
|
+
var _a;
|
|
13
|
+
if (duplicateInstance === id) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
duplicateInstances.push(duplicateInstance);
|
|
17
|
+
if ((_a = baselineDuplicatePackagesMap === null || baselineDuplicatePackagesMap === void 0 ? void 0 : baselineDuplicatePackagesMap[id]) === null || _a === void 0 ? void 0 : _a.includes(duplicateInstance)) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
newDuplicateInstances.push(duplicateInstance);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
if (baselineDuplicatePackagesMap) {
|
|
24
|
+
Object.entries(baselineDuplicatePackagesMap).forEach(([id, instances]) => {
|
|
25
|
+
instances.forEach((duplicateInstance) => {
|
|
26
|
+
var _a;
|
|
27
|
+
if (duplicateInstance === id) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
baselineDuplicateInstances.push(duplicateInstance);
|
|
31
|
+
if ((_a = duplicatePackagesMap === null || duplicatePackagesMap === void 0 ? void 0 : duplicatePackagesMap[id]) === null || _a === void 0 ? void 0 : _a.includes(duplicateInstance)) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
removedDuplicateInstances.push(duplicateInstance);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const duplicateInstancesCount = duplicateInstances.length;
|
|
39
|
+
const newDuplicateInstancesCount = newDuplicateInstances.length;
|
|
40
|
+
const removedDuplicateInstancesCount = removedDuplicateInstances.length;
|
|
41
|
+
let text;
|
|
42
|
+
let insightType;
|
|
43
|
+
if (newDuplicateInstancesCount > 0 && removedDuplicateInstancesCount > 0) {
|
|
44
|
+
const item = newDuplicateInstancesCount > 1 || removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
45
|
+
text = `Bundle introduced ${newDuplicateInstancesCount} and removed ${removedDuplicateInstancesCount} duplicate ${item}`;
|
|
46
|
+
insightType = InsightType.ERROR;
|
|
47
|
+
}
|
|
48
|
+
else if (newDuplicateInstancesCount > 0 && baselineDuplicatePackagesMap) {
|
|
49
|
+
const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
50
|
+
text = `Bundle introduced ${newDuplicateInstancesCount} duplicate ${item}`;
|
|
51
|
+
insightType = InsightType.ERROR;
|
|
52
|
+
}
|
|
53
|
+
else if (newDuplicateInstancesCount > 0) {
|
|
54
|
+
const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
55
|
+
text = `Bundle contains ${newDuplicateInstancesCount} duplicate ${item}`;
|
|
56
|
+
insightType = InsightType.WARNING;
|
|
57
|
+
}
|
|
58
|
+
else if (removedDuplicateInstancesCount > 0) {
|
|
59
|
+
const item = removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
60
|
+
text = `Bundle removed ${removedDuplicateInstancesCount} duplicate ${item}`;
|
|
61
|
+
insightType = InsightType.INFO;
|
|
62
|
+
}
|
|
63
|
+
else if (newDuplicateInstancesCount === 0 &&
|
|
64
|
+
removedDuplicateInstancesCount === 0 &&
|
|
65
|
+
duplicateInstancesCount > 0) {
|
|
66
|
+
const item = duplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
67
|
+
text = `Bundle contains ${duplicateInstancesCount} duplicate ${item}`;
|
|
68
|
+
insightType = InsightType.WARNING;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
text = 'Bundle does not contain duplicate packages';
|
|
72
|
+
insightType = InsightType.INFO;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
type: insightType,
|
|
76
|
+
data: {
|
|
77
|
+
text,
|
|
78
|
+
packages: duplicatePackagesMap,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
export const extractModulesPackagesDuplicate = (_, currentExtractedData, baselineJob) => {
|
|
83
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
7
84
|
const source = ((_a = currentExtractedData === null || currentExtractedData === void 0 ? void 0 : currentExtractedData.metrics) === null || _a === void 0 ? void 0 : _a.packages) || {};
|
|
8
85
|
const packagesByName = {};
|
|
9
86
|
Object.entries(source).forEach(([packageId, packageData]) => {
|
|
@@ -30,8 +107,14 @@ export const extractModulesPackagesDuplicate = (_, currentExtractedData) => {
|
|
|
30
107
|
children: packageGroupData.children,
|
|
31
108
|
});
|
|
32
109
|
});
|
|
110
|
+
const baselineDuplicatePackages = ((_e = (_d = (_c = (_b = baselineJob === null || baselineJob === void 0 ? void 0 : baselineJob.insights) === null || _b === void 0 ? void 0 : _b.webpack) === null || _c === void 0 ? void 0 : _c.duplicatePackagesV3) === null || _d === void 0 ? void 0 : _d.data) === null || _e === void 0 ? void 0 : _e.packages) ||
|
|
111
|
+
((_h = (_g = (_f = baselineJob === null || baselineJob === void 0 ? void 0 : baselineJob.insights) === null || _f === void 0 ? void 0 : _f.webpack) === null || _g === void 0 ? void 0 : _g.duplicatePackages) === null || _h === void 0 ? void 0 : _h.data) ||
|
|
112
|
+
{};
|
|
33
113
|
if (!count) {
|
|
34
114
|
return {
|
|
115
|
+
insights: {
|
|
116
|
+
duplicatePackagesV3: getDuplicatePackagesInsight({}, baselineDuplicatePackages),
|
|
117
|
+
},
|
|
35
118
|
metrics: {
|
|
36
119
|
duplicatePackagesCount: {
|
|
37
120
|
value: count,
|
|
@@ -46,16 +129,20 @@ export const extractModulesPackagesDuplicate = (_, currentExtractedData) => {
|
|
|
46
129
|
children: orderBy(duplicatePackageData.children, 'value', 'desc'),
|
|
47
130
|
},
|
|
48
131
|
}), {});
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
[packageName]
|
|
52
|
-
|
|
132
|
+
const duplicatePackagesData = {};
|
|
133
|
+
Object.entries(duplicatePackagesByName).forEach(([packageName, packageData]) => {
|
|
134
|
+
if (!duplicatePackagesData[packageName]) {
|
|
135
|
+
duplicatePackagesData[packageName] = [];
|
|
136
|
+
}
|
|
137
|
+
duplicatePackagesData[packageName] = packageData.children.map(({ id }) => id);
|
|
138
|
+
});
|
|
53
139
|
return {
|
|
54
140
|
insights: {
|
|
55
141
|
duplicatePackages: {
|
|
56
142
|
type: InsightType.WARNING,
|
|
57
|
-
data,
|
|
143
|
+
data: duplicatePackagesData,
|
|
58
144
|
},
|
|
145
|
+
duplicatePackagesV3: getDuplicatePackagesInsight(duplicatePackagesData, baselineDuplicatePackages),
|
|
59
146
|
},
|
|
60
147
|
metrics: {
|
|
61
148
|
duplicatePackagesCount: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules-packages-duplicate.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules-packages-duplicate.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,YAAY,CAAC;AAC7B,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,GAAG,MAAM,YAAY,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"modules-packages-duplicate.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules-packages-duplicate.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ export const extractModules = (webpackStats) => {
|
|
|
28
28
|
let duplicateCodeSize = 0;
|
|
29
29
|
let duplicateModulesCount = 0;
|
|
30
30
|
const modules = allModules.reduce((agg, moduleEntry) => {
|
|
31
|
+
var _a;
|
|
31
32
|
const { name, size = 0, chunks } = moduleEntry;
|
|
32
33
|
const normalizedName = getModuleName(name);
|
|
33
34
|
if (!chunks || (chunks === null || chunks === void 0 ? void 0 : chunks.length) === 0) {
|
|
@@ -39,11 +40,13 @@ export const extractModules = (webpackStats) => {
|
|
|
39
40
|
duplicateModulesCount += duplicateInstances;
|
|
40
41
|
duplicateCodeSize += duplicateInstances * size;
|
|
41
42
|
totalCodeSize += instances * size;
|
|
43
|
+
const reasons = (_a = moduleEntry.reasons) === null || _a === void 0 ? void 0 : _a.map((reason) => getModuleName(reason.module));
|
|
42
44
|
agg[normalizedName] = {
|
|
43
45
|
name,
|
|
44
46
|
value: size,
|
|
45
47
|
chunkIds: chunks.map(normalizeChunkId),
|
|
46
48
|
duplicated: Boolean(duplicateInstances),
|
|
49
|
+
...(reasons && { reasons }),
|
|
47
50
|
};
|
|
48
51
|
return agg;
|
|
49
52
|
}, {});
|
|
@@ -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
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../../../src/webpack/extract/modules.ts"],"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
|
+
"version": "4.4.0-beta.0",
|
|
4
4
|
"description": "BundleStats utils",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "lib-esm/index.js",
|
|
@@ -35,22 +35,22 @@
|
|
|
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.
|
|
39
|
-
"@bundle-stats/plugin-webpack-validate": "^4.
|
|
38
|
+
"@bundle-stats/plugin-webpack-filter": "^4.4.0-beta.0",
|
|
39
|
+
"@bundle-stats/plugin-webpack-validate": "^4.4.0-beta.0",
|
|
40
40
|
"query-string": "7.1.3",
|
|
41
41
|
"serialize-query-params": "2.0.2",
|
|
42
42
|
"use-query-params": "2.1.2"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/jest": "29.
|
|
45
|
+
"@types/jest": "29.4.0",
|
|
46
46
|
"@types/lodash": "4.14.191",
|
|
47
47
|
"core-js": "3.27.2",
|
|
48
|
-
"jest": "29.
|
|
49
|
-
"jest-cli": "29.
|
|
48
|
+
"jest": "29.4.0",
|
|
49
|
+
"jest-cli": "29.4.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.
|
|
53
|
+
"rimraf": "4.1.2",
|
|
54
54
|
"ts-jest": "29.0.5",
|
|
55
55
|
"typescript": "4.9.4"
|
|
56
56
|
},
|
|
@@ -58,5 +58,5 @@
|
|
|
58
58
|
"core-js": "^3.0.0",
|
|
59
59
|
"lodash": "^4.0.0"
|
|
60
60
|
},
|
|
61
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "e2c2b5a9b7bd31c07baad4f5fefa682d21470600"
|
|
62
62
|
}
|
package/src/config/index.js
CHANGED
|
@@ -6,12 +6,3 @@ export * from './delta';
|
|
|
6
6
|
|
|
7
7
|
export const PACKAGES_SEPARATOR = ':';
|
|
8
8
|
export const PACKAGE_ID_SEPARATOR = '~';
|
|
9
|
-
|
|
10
|
-
export const SOURCE_PATH_WEBPACK_STATS = 'webpack';
|
|
11
|
-
export const SOURCE_PATH_LIGHTHOUSE = 'lighthouse';
|
|
12
|
-
export const SOURCE_PATH_BROWSERTIME = 'browsertime';
|
|
13
|
-
export const SOURCE_PATHS = [
|
|
14
|
-
SOURCE_PATH_WEBPACK_STATS,
|
|
15
|
-
SOURCE_PATH_LIGHTHOUSE,
|
|
16
|
-
SOURCE_PATH_BROWSERTIME,
|
|
17
|
-
];
|
package/src/constants.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
import { InsightType } from './config/insights';
|
|
2
|
+
|
|
3
|
+
export enum Source {
|
|
4
|
+
webpack = 'webpack',
|
|
5
|
+
lighthouse = 'lighthouse',
|
|
6
|
+
browsertime = 'browsertime',
|
|
7
|
+
}
|
|
8
|
+
|
|
1
9
|
export type SourceData = Record<string, unknown>;
|
|
2
10
|
|
|
3
11
|
export enum MetricTypeType {
|
|
@@ -43,22 +51,58 @@ export interface MetricRunInfo {
|
|
|
43
51
|
displayDeltaPercentage?: string;
|
|
44
52
|
}
|
|
45
53
|
|
|
54
|
+
export type JobSection<T = object> = Record<Source, T>;
|
|
55
|
+
|
|
56
|
+
export enum JobSectionId {
|
|
57
|
+
meta = 'meta',
|
|
58
|
+
insights = 'insights',
|
|
59
|
+
summary = 'summary',
|
|
60
|
+
metrics = 'metrics',
|
|
61
|
+
rawData = 'rawData',
|
|
62
|
+
}
|
|
63
|
+
|
|
46
64
|
export interface JobSummaryItem {
|
|
47
65
|
baseline: number;
|
|
48
66
|
current: number;
|
|
49
67
|
}
|
|
68
|
+
|
|
69
|
+
export interface JobInsight<T = object> {
|
|
70
|
+
type: InsightType;
|
|
71
|
+
data: T;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface JobInsightAssetsSizeTotalData {
|
|
75
|
+
text: string;
|
|
76
|
+
md: string;
|
|
77
|
+
info: MetricRunInfo;
|
|
78
|
+
}
|
|
79
|
+
export type JobInsightDuplicatePackagesData = Record<string, Array<string>>;
|
|
80
|
+
|
|
81
|
+
export interface JobInsightDuplicatePackagesV3Data {
|
|
82
|
+
text: string;
|
|
83
|
+
packages: Record<string, Array<string>>;
|
|
84
|
+
}
|
|
85
|
+
|
|
50
86
|
export type JobSummarySource = Record<string, JobSummaryItem>;
|
|
51
|
-
export type JobSummary =
|
|
87
|
+
export type JobSummary = JobSection<JobSummarySource>;
|
|
88
|
+
|
|
89
|
+
export interface JobInsights {
|
|
90
|
+
[Source.webpack]: {
|
|
91
|
+
assetsSizeTotal: JobInsight<JobInsightAssetsSizeTotalData>;
|
|
92
|
+
duplicatePackages?: JobInsight<JobInsightDuplicatePackagesData>;
|
|
93
|
+
duplicatePackagesV3?: JobInsight<JobInsightDuplicatePackagesV3Data>;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
52
96
|
|
|
53
97
|
export type JobMetricsSource = Record<string, MetricRun | Record<string, MetricRun>>;
|
|
54
|
-
export type JobMetrics =
|
|
98
|
+
export type JobMetrics = JobSection<JobMetricsSource>;
|
|
55
99
|
|
|
56
100
|
export interface JobData {
|
|
57
|
-
meta?:
|
|
58
|
-
insights?:
|
|
59
|
-
summary?: JobSummary;
|
|
60
|
-
metrics?: JobMetrics;
|
|
61
|
-
rawData?:
|
|
101
|
+
[JobSectionId.meta]?: JobSection;
|
|
102
|
+
[JobSectionId.insights]?: JobInsights;
|
|
103
|
+
[JobSectionId.summary]?: JobSummary;
|
|
104
|
+
[JobSectionId.metrics]?: JobMetrics;
|
|
105
|
+
[JobSectionId.rawData]?: JobSection;
|
|
62
106
|
}
|
|
63
107
|
|
|
64
108
|
export interface Job extends JobData {
|
package/src/jobs/create-job.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import merge from 'lodash/merge';
|
|
2
2
|
|
|
3
|
-
import { SOURCE_PATHS } from '../config';
|
|
4
3
|
import { createSummary } from './create-summary';
|
|
5
4
|
import * as webpack from '../webpack';
|
|
6
5
|
import * as lighthouse from '../lighthouse';
|
|
7
6
|
import * as browsertime from '../browsertime';
|
|
8
|
-
import { JobData, JobMetricsSource, SourceData } from '../constants';
|
|
7
|
+
import { JobData, JobMetricsSource, Source, SourceData } from '../constants';
|
|
9
8
|
|
|
10
9
|
interface SourceResult {
|
|
11
10
|
meta: {};
|
|
@@ -21,7 +20,7 @@ interface SourceModule {
|
|
|
21
20
|
const SOURCE_MODULES: Record<string, SourceModule> = { webpack, lighthouse, browsertime };
|
|
22
21
|
|
|
23
22
|
export const createJob = (source: SourceData, baseline?: JobData): JobData =>
|
|
24
|
-
|
|
23
|
+
Object.values(Source).reduce((agg, sourcePath) => {
|
|
25
24
|
const rawData = source[sourcePath];
|
|
26
25
|
|
|
27
26
|
if (!rawData) {
|
package/src/report/create.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import isEmpty from 'lodash/isEmpty';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { MetricRunInfo, Job, JobSummarySource } from '../constants';
|
|
3
|
+
import { MetricRunInfo, Job, JobSummarySource, Source } from '../constants';
|
|
5
4
|
import { getGlobalMetricType, getMetricRunInfo } from '../utils/metrics';
|
|
6
5
|
import * as webpack from '../webpack';
|
|
7
6
|
/* @ts-ignore */
|
|
@@ -30,7 +29,7 @@ export const createReport = (jobs: Array<Job>): Report => {
|
|
|
30
29
|
// Add summary report data
|
|
31
30
|
const summary: Record<string, Array<ReportMetricRunInfo>> = {};
|
|
32
31
|
|
|
33
|
-
|
|
32
|
+
Object.values(Source).forEach((sourceId) => {
|
|
34
33
|
const sourceSummary = jobs[0]?.summary?.[sourceId] as JobSummarySource;
|
|
35
34
|
|
|
36
35
|
if (!sourceSummary) {
|
|
@@ -221,7 +221,7 @@ export const getBundleModulesByChunk = (
|
|
|
221
221
|
},
|
|
222
222
|
});
|
|
223
223
|
|
|
224
|
-
export const
|
|
224
|
+
export const BUNDLE_PACKAGES_COUNT: ComponentLink = {
|
|
225
225
|
section: SECTIONS.PACKAGES,
|
|
226
226
|
title: I18N.COMPONENT_LINK_PACKAGES_COUNT,
|
|
227
227
|
params: {
|
|
@@ -303,6 +303,6 @@ export const METRIC_COMPONENT_LINKS = new Map([
|
|
|
303
303
|
['webpack.moduleCount', { link: BUNDLE_MODULES }],
|
|
304
304
|
['webpack.duplicateModulesCount', { link: BUNDLE_MODULES_DUPLICATE }],
|
|
305
305
|
['webpack.duplicateCode', { link: BUNDLE_MODULES_DUPLICATE }],
|
|
306
|
-
['webpack.packageCount', { link:
|
|
306
|
+
['webpack.packageCount', { link: BUNDLE_PACKAGES_COUNT }],
|
|
307
307
|
['webpack.duplicatePackagesCount', { link: BUNDLE_PACKAGES_DUPLICATE }],
|
|
308
308
|
]);
|
|
@@ -3,6 +3,14 @@ import orderBy from 'lodash/orderBy';
|
|
|
3
3
|
import sum from 'lodash/sum';
|
|
4
4
|
|
|
5
5
|
import { InsightType } from '../../config';
|
|
6
|
+
import {
|
|
7
|
+
Job,
|
|
8
|
+
JobInsight,
|
|
9
|
+
JobInsightDuplicatePackagesData,
|
|
10
|
+
JobInsightDuplicatePackagesV3Data,
|
|
11
|
+
JobInsights,
|
|
12
|
+
MetricRun,
|
|
13
|
+
} from '../../constants';
|
|
6
14
|
import { Packages } from '../types';
|
|
7
15
|
|
|
8
16
|
interface DuplicatePackage {
|
|
@@ -16,7 +24,116 @@ interface DuplicatePackageGroup {
|
|
|
16
24
|
children: Array<DuplicatePackage>;
|
|
17
25
|
}
|
|
18
26
|
|
|
19
|
-
|
|
27
|
+
interface ModulesPackagesDuplicateData {
|
|
28
|
+
insights: {
|
|
29
|
+
duplicatePackages?: JobInsights['webpack']['duplicatePackages'];
|
|
30
|
+
duplicatePackagesV3: JobInsights['webpack']['duplicatePackagesV3'];
|
|
31
|
+
};
|
|
32
|
+
metrics: {
|
|
33
|
+
duplicatePackagesCount: MetricRun;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const getDuplicatePackagesInsight = (
|
|
38
|
+
duplicatePackagesMap: Record<string, Array<string>>,
|
|
39
|
+
baselineDuplicatePackagesMap?: Record<string, Array<string>>,
|
|
40
|
+
): JobInsight<JobInsightDuplicatePackagesV3Data> => {
|
|
41
|
+
const duplicateInstances: Array<string> = [];
|
|
42
|
+
const baselineDuplicateInstances: Array<string> = [];
|
|
43
|
+
const newDuplicateInstances: Array<string> = [];
|
|
44
|
+
const removedDuplicateInstances: Array<string> = [];
|
|
45
|
+
|
|
46
|
+
Object.entries(duplicatePackagesMap).forEach(([id, instances]) => {
|
|
47
|
+
instances.forEach((duplicateInstance) => {
|
|
48
|
+
if (duplicateInstance === id) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
duplicateInstances.push(duplicateInstance);
|
|
53
|
+
|
|
54
|
+
if (baselineDuplicatePackagesMap?.[id]?.includes(duplicateInstance)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
newDuplicateInstances.push(duplicateInstance);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (baselineDuplicatePackagesMap) {
|
|
63
|
+
Object.entries(baselineDuplicatePackagesMap).forEach(([id, instances]) => {
|
|
64
|
+
instances.forEach((duplicateInstance) => {
|
|
65
|
+
if (duplicateInstance === id) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
baselineDuplicateInstances.push(duplicateInstance);
|
|
70
|
+
|
|
71
|
+
if (duplicatePackagesMap?.[id]?.includes(duplicateInstance)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
removedDuplicateInstances.push(duplicateInstance);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const duplicateInstancesCount = duplicateInstances.length;
|
|
81
|
+
const newDuplicateInstancesCount = newDuplicateInstances.length;
|
|
82
|
+
const removedDuplicateInstancesCount = removedDuplicateInstances.length;
|
|
83
|
+
|
|
84
|
+
let text: string;
|
|
85
|
+
let insightType: InsightType;
|
|
86
|
+
|
|
87
|
+
if (newDuplicateInstancesCount > 0 && removedDuplicateInstancesCount > 0) {
|
|
88
|
+
// New duplicate packages and removed duplicates
|
|
89
|
+
const item =
|
|
90
|
+
newDuplicateInstancesCount > 1 || removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
91
|
+
text = `Bundle introduced ${newDuplicateInstancesCount} and removed ${removedDuplicateInstancesCount} duplicate ${item}`;
|
|
92
|
+
insightType = InsightType.ERROR;
|
|
93
|
+
} else if (newDuplicateInstancesCount > 0 && baselineDuplicatePackagesMap) {
|
|
94
|
+
// New duplicate packages and baseline comparison
|
|
95
|
+
const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
96
|
+
text = `Bundle introduced ${newDuplicateInstancesCount} duplicate ${item}`;
|
|
97
|
+
insightType = InsightType.ERROR;
|
|
98
|
+
} else if (newDuplicateInstancesCount > 0) {
|
|
99
|
+
// New duplicate packages and no baseline
|
|
100
|
+
const item = newDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
101
|
+
text = `Bundle contains ${newDuplicateInstancesCount} duplicate ${item}`;
|
|
102
|
+
insightType = InsightType.WARNING;
|
|
103
|
+
} else if (removedDuplicateInstancesCount > 0) {
|
|
104
|
+
// Removed duplicate packages
|
|
105
|
+
const item = removedDuplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
106
|
+
text = `Bundle removed ${removedDuplicateInstancesCount} duplicate ${item}`;
|
|
107
|
+
insightType = InsightType.INFO;
|
|
108
|
+
} else if (
|
|
109
|
+
newDuplicateInstancesCount === 0 &&
|
|
110
|
+
removedDuplicateInstancesCount === 0 &&
|
|
111
|
+
duplicateInstancesCount > 0
|
|
112
|
+
) {
|
|
113
|
+
// No change comparred with the baseline
|
|
114
|
+
const item = duplicateInstancesCount > 1 ? 'packages' : 'package';
|
|
115
|
+
text = `Bundle contains ${duplicateInstancesCount} duplicate ${item}`;
|
|
116
|
+
insightType = InsightType.WARNING;
|
|
117
|
+
} else {
|
|
118
|
+
// No change
|
|
119
|
+
text = 'Bundle does not contain duplicate packages';
|
|
120
|
+
insightType = InsightType.INFO;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
type: insightType,
|
|
125
|
+
data: {
|
|
126
|
+
text,
|
|
127
|
+
packages: duplicatePackagesMap,
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export const extractModulesPackagesDuplicate = (
|
|
133
|
+
_: any,
|
|
134
|
+
currentExtractedData: any,
|
|
135
|
+
baselineJob?: Job,
|
|
136
|
+
): ModulesPackagesDuplicateData => {
|
|
20
137
|
const source: Packages = currentExtractedData?.metrics?.packages || {};
|
|
21
138
|
|
|
22
139
|
// Group packages by name(uniq)
|
|
@@ -58,8 +175,16 @@ export const extractModulesPackagesDuplicate = (_: any, currentExtractedData: an
|
|
|
58
175
|
});
|
|
59
176
|
});
|
|
60
177
|
|
|
178
|
+
const baselineDuplicatePackages =
|
|
179
|
+
baselineJob?.insights?.webpack?.duplicatePackagesV3?.data?.packages ||
|
|
180
|
+
baselineJob?.insights?.webpack?.duplicatePackages?.data ||
|
|
181
|
+
{};
|
|
182
|
+
|
|
61
183
|
if (!count) {
|
|
62
184
|
return {
|
|
185
|
+
insights: {
|
|
186
|
+
duplicatePackagesV3: getDuplicatePackagesInsight({}, baselineDuplicatePackages),
|
|
187
|
+
},
|
|
63
188
|
metrics: {
|
|
64
189
|
duplicatePackagesCount: {
|
|
65
190
|
value: count,
|
|
@@ -68,7 +193,12 @@ export const extractModulesPackagesDuplicate = (_: any, currentExtractedData: an
|
|
|
68
193
|
};
|
|
69
194
|
}
|
|
70
195
|
|
|
71
|
-
|
|
196
|
+
// Group duplicate packages by name and order children by value
|
|
197
|
+
const duplicatePackagesByName: Record<string, DuplicatePackageGroup> = orderBy(
|
|
198
|
+
duplicatePackages,
|
|
199
|
+
'value',
|
|
200
|
+
'desc',
|
|
201
|
+
).reduce(
|
|
72
202
|
(agg, { name, ...duplicatePackageData }: DuplicatePackageGroup) => ({
|
|
73
203
|
...agg,
|
|
74
204
|
[name]: {
|
|
@@ -80,21 +210,27 @@ export const extractModulesPackagesDuplicate = (_: any, currentExtractedData: an
|
|
|
80
210
|
);
|
|
81
211
|
|
|
82
212
|
// Generate v2 data structure
|
|
83
|
-
// @TODO remove in
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
213
|
+
// @TODO remove in v5.0
|
|
214
|
+
const duplicatePackagesData: JobInsightDuplicatePackagesData = {};
|
|
215
|
+
|
|
216
|
+
Object.entries(duplicatePackagesByName).forEach(([packageName, packageData]) => {
|
|
217
|
+
if (!duplicatePackagesData[packageName]) {
|
|
218
|
+
duplicatePackagesData[packageName] = [];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
duplicatePackagesData[packageName] = packageData.children.map(({ id }) => id);
|
|
222
|
+
});
|
|
91
223
|
|
|
92
224
|
return {
|
|
93
225
|
insights: {
|
|
94
226
|
duplicatePackages: {
|
|
95
227
|
type: InsightType.WARNING,
|
|
96
|
-
data,
|
|
228
|
+
data: duplicatePackagesData,
|
|
97
229
|
},
|
|
230
|
+
duplicatePackagesV3: getDuplicatePackagesInsight(
|
|
231
|
+
duplicatePackagesData,
|
|
232
|
+
baselineDuplicatePackages,
|
|
233
|
+
),
|
|
98
234
|
},
|
|
99
235
|
metrics: {
|
|
100
236
|
duplicatePackagesCount: {
|
|
@@ -51,7 +51,7 @@ export const extractModules = (webpackStats?: WebpackStatsFiltered): MetricsModu
|
|
|
51
51
|
const { name, size = 0, chunks } = moduleEntry;
|
|
52
52
|
const normalizedName = getModuleName(name);
|
|
53
53
|
|
|
54
|
-
// skip modules that do not belong to any chunk
|
|
54
|
+
// skip modules that are orphane(do not belong to any chunk)
|
|
55
55
|
if (!chunks || chunks?.length === 0) {
|
|
56
56
|
return agg;
|
|
57
57
|
}
|
|
@@ -64,12 +64,15 @@ export const extractModules = (webpackStats?: WebpackStatsFiltered): MetricsModu
|
|
|
64
64
|
duplicateCodeSize += duplicateInstances * size;
|
|
65
65
|
totalCodeSize += instances * size;
|
|
66
66
|
|
|
67
|
+
const reasons = moduleEntry.reasons?.map((reason) => getModuleName(reason.module));
|
|
68
|
+
|
|
67
69
|
// eslint-disable-next-line no-param-reassign
|
|
68
70
|
agg[normalizedName] = {
|
|
69
71
|
name,
|
|
70
72
|
value: size,
|
|
71
73
|
chunkIds: chunks.map(normalizeChunkId),
|
|
72
74
|
duplicated: Boolean(duplicateInstances),
|
|
75
|
+
...(reasons && { reasons }),
|
|
73
76
|
};
|
|
74
77
|
|
|
75
78
|
return agg;
|
package/src/webpack/types.ts
CHANGED
|
@@ -50,8 +50,9 @@ export interface MetricsAssets {
|
|
|
50
50
|
|
|
51
51
|
export interface Module extends MetricRun {
|
|
52
52
|
name: string;
|
|
53
|
-
chunkIds: Array<
|
|
53
|
+
chunkIds: Array<string>;
|
|
54
54
|
duplicated: boolean;
|
|
55
|
+
reasons?: Array<string>;
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
export type Modules = Record<string, Module>;
|
package/types/config/index.d.ts
CHANGED
|
@@ -5,7 +5,3 @@ export * from "./metrics";
|
|
|
5
5
|
export * from "./delta";
|
|
6
6
|
export const PACKAGES_SEPARATOR: ":";
|
|
7
7
|
export const PACKAGE_ID_SEPARATOR: "~";
|
|
8
|
-
export const SOURCE_PATH_WEBPACK_STATS: "webpack";
|
|
9
|
-
export const SOURCE_PATH_LIGHTHOUSE: "lighthouse";
|
|
10
|
-
export const SOURCE_PATH_BROWSERTIME: "browsertime";
|
|
11
|
-
export const SOURCE_PATHS: string[];
|
package/types/constants.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import { InsightType } from './config/insights';
|
|
2
|
+
export declare enum Source {
|
|
3
|
+
webpack = "webpack",
|
|
4
|
+
lighthouse = "lighthouse",
|
|
5
|
+
browsertime = "browsertime"
|
|
6
|
+
}
|
|
1
7
|
export type SourceData = Record<string, unknown>;
|
|
2
8
|
export declare enum MetricTypeType {
|
|
3
9
|
'METRIC_TYPE_NUMERIC' = "METRIC_TYPE_NUMERIC",
|
|
@@ -36,20 +42,49 @@ export interface MetricRunInfo {
|
|
|
36
42
|
displayDelta?: string;
|
|
37
43
|
displayDeltaPercentage?: string;
|
|
38
44
|
}
|
|
45
|
+
export type JobSection<T = object> = Record<Source, T>;
|
|
46
|
+
export declare enum JobSectionId {
|
|
47
|
+
meta = "meta",
|
|
48
|
+
insights = "insights",
|
|
49
|
+
summary = "summary",
|
|
50
|
+
metrics = "metrics",
|
|
51
|
+
rawData = "rawData"
|
|
52
|
+
}
|
|
39
53
|
export interface JobSummaryItem {
|
|
40
54
|
baseline: number;
|
|
41
55
|
current: number;
|
|
42
56
|
}
|
|
57
|
+
export interface JobInsight<T = object> {
|
|
58
|
+
type: InsightType;
|
|
59
|
+
data: T;
|
|
60
|
+
}
|
|
61
|
+
export interface JobInsightAssetsSizeTotalData {
|
|
62
|
+
text: string;
|
|
63
|
+
md: string;
|
|
64
|
+
info: MetricRunInfo;
|
|
65
|
+
}
|
|
66
|
+
export type JobInsightDuplicatePackagesData = Record<string, Array<string>>;
|
|
67
|
+
export interface JobInsightDuplicatePackagesV3Data {
|
|
68
|
+
text: string;
|
|
69
|
+
packages: Record<string, Array<string>>;
|
|
70
|
+
}
|
|
43
71
|
export type JobSummarySource = Record<string, JobSummaryItem>;
|
|
44
|
-
export type JobSummary =
|
|
72
|
+
export type JobSummary = JobSection<JobSummarySource>;
|
|
73
|
+
export interface JobInsights {
|
|
74
|
+
[Source.webpack]: {
|
|
75
|
+
assetsSizeTotal: JobInsight<JobInsightAssetsSizeTotalData>;
|
|
76
|
+
duplicatePackages?: JobInsight<JobInsightDuplicatePackagesData>;
|
|
77
|
+
duplicatePackagesV3?: JobInsight<JobInsightDuplicatePackagesV3Data>;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
45
80
|
export type JobMetricsSource = Record<string, MetricRun | Record<string, MetricRun>>;
|
|
46
|
-
export type JobMetrics =
|
|
81
|
+
export type JobMetrics = JobSection<JobMetricsSource>;
|
|
47
82
|
export interface JobData {
|
|
48
|
-
meta?:
|
|
49
|
-
insights?:
|
|
50
|
-
summary?: JobSummary;
|
|
51
|
-
metrics?: JobMetrics;
|
|
52
|
-
rawData?:
|
|
83
|
+
[JobSectionId.meta]?: JobSection;
|
|
84
|
+
[JobSectionId.insights]?: JobInsights;
|
|
85
|
+
[JobSectionId.summary]?: JobSummary;
|
|
86
|
+
[JobSectionId.metrics]?: JobMetrics;
|
|
87
|
+
[JobSectionId.rawData]?: JobSection;
|
|
53
88
|
}
|
|
54
89
|
export interface Job extends JobData {
|
|
55
90
|
internalBuildNumber: number;
|
|
@@ -25,7 +25,7 @@ export declare const BUNDLE_MODULES: ComponentLink;
|
|
|
25
25
|
export declare const BUNDLE_MODULES_DUPLICATE: ComponentLink;
|
|
26
26
|
export declare const getBundleModulesBySearch: (search: string) => ComponentLink;
|
|
27
27
|
export declare const getBundleModulesByChunk: (chunkIds: Array<string>, chunkId: string, fileType?: string) => ComponentLink;
|
|
28
|
-
export declare const
|
|
28
|
+
export declare const BUNDLE_PACKAGES_COUNT: ComponentLink;
|
|
29
29
|
export declare const BUNDLE_PACKAGES_DUPLICATE: ComponentLink;
|
|
30
30
|
export declare const getBundleAssetsFileTypeComponentLink: (fileType: string, label: string) => ComponentLink;
|
|
31
31
|
export declare const getBundlePackagesByNameComponentLink: (search: string) => ComponentLink;
|
|
@@ -1,21 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
metrics: {
|
|
4
|
-
duplicatePackagesCount: {
|
|
5
|
-
value: number;
|
|
6
|
-
};
|
|
7
|
-
};
|
|
8
|
-
insights?: undefined;
|
|
9
|
-
} | {
|
|
1
|
+
import { Job, JobInsight, JobInsightDuplicatePackagesV3Data, JobInsights, MetricRun } from '../../constants';
|
|
2
|
+
interface ModulesPackagesDuplicateData {
|
|
10
3
|
insights: {
|
|
11
|
-
duplicatePackages
|
|
12
|
-
|
|
13
|
-
data: {};
|
|
14
|
-
};
|
|
4
|
+
duplicatePackages?: JobInsights['webpack']['duplicatePackages'];
|
|
5
|
+
duplicatePackagesV3: JobInsights['webpack']['duplicatePackagesV3'];
|
|
15
6
|
};
|
|
16
7
|
metrics: {
|
|
17
|
-
duplicatePackagesCount:
|
|
18
|
-
value: number;
|
|
19
|
-
};
|
|
8
|
+
duplicatePackagesCount: MetricRun;
|
|
20
9
|
};
|
|
21
|
-
}
|
|
10
|
+
}
|
|
11
|
+
export declare const getDuplicatePackagesInsight: (duplicatePackagesMap: Record<string, Array<string>>, baselineDuplicatePackagesMap?: Record<string, Array<string>>) => JobInsight<JobInsightDuplicatePackagesV3Data>;
|
|
12
|
+
export declare const extractModulesPackagesDuplicate: (_: any, currentExtractedData: any, baselineJob?: Job) => ModulesPackagesDuplicateData;
|
|
13
|
+
export {};
|
package/types/webpack/types.d.ts
CHANGED
|
@@ -43,8 +43,9 @@ export interface MetricsAssets {
|
|
|
43
43
|
}
|
|
44
44
|
export interface Module extends MetricRun {
|
|
45
45
|
name: string;
|
|
46
|
-
chunkIds: Array<
|
|
46
|
+
chunkIds: Array<string>;
|
|
47
47
|
duplicated: boolean;
|
|
48
|
+
reasons?: Array<string>;
|
|
48
49
|
}
|
|
49
50
|
export type Modules = Record<string, Module>;
|
|
50
51
|
export interface MetricsModules {
|