@jsenv/file-size-impact 10.0.4 → 11.0.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/package.json +14 -12
- package/readme.md +13 -23
- package/src/getFileSizeReport.js +1 -1
- package/src/internal/applyTrackingConfig.js +1 -1
- package/src/internal/compareTwoFileSizeReports.js +1 -1
- package/src/internal/formatComment.js +105 -224
- package/src/internal/jsenvCommentParameters.js +73 -69
- package/src/internal/orderBySizeImpact.js +3 -14
- package/src/internal/renderImpactTable.js +158 -155
- package/src/internal/size_map.js +49 -0
- package/src/internal/worker_generating_file_size_report.js +17 -0
- package/src/logFileSizeReport.js +1 -1
- package/src/reportFileSizeImpact.js +30 -25
- package/src/internal/getSizeMaps.js +0 -43
|
@@ -1,19 +1,31 @@
|
|
|
1
1
|
import { formatSize } from "./formatSize.js"
|
|
2
2
|
|
|
3
|
-
const jsenvFormatGroupSummary = ({
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const jsenvFormatGroupSummary = ({
|
|
4
|
+
groupName,
|
|
5
|
+
groupSizeMapBeforeMerge,
|
|
6
|
+
groupSizeMapAfterMerge,
|
|
7
|
+
sizeNames,
|
|
8
|
+
}) => {
|
|
9
|
+
const firstSizeName = sizeNames[0]
|
|
10
|
+
const groupSizeBeforeMerge = groupSizeMapBeforeMerge[firstSizeName]
|
|
11
|
+
const groupSizeAfterMerge = groupSizeMapAfterMerge[firstSizeName]
|
|
12
|
+
|
|
13
|
+
if (groupSizeBeforeMerge === groupSizeAfterMerge) {
|
|
14
|
+
return `${groupName} (no impact)`
|
|
15
|
+
}
|
|
6
16
|
|
|
7
|
-
|
|
8
|
-
|
|
17
|
+
return `${groupName} (${formatSizeImpactAsPercentage({
|
|
18
|
+
sizeBeforeMerge: groupSizeBeforeMerge,
|
|
19
|
+
sizeAfterMerge: groupSizeAfterMerge,
|
|
20
|
+
})})`
|
|
9
21
|
}
|
|
10
22
|
|
|
11
23
|
const jsenvFormatFileRelativeUrl = (fileRelativeUrl) => {
|
|
12
24
|
return fileRelativeUrl
|
|
13
25
|
}
|
|
14
26
|
|
|
15
|
-
const jsenvFormatFileCell = ({ fileRelativeUrlDisplayed,
|
|
16
|
-
if (
|
|
27
|
+
const jsenvFormatFileCell = ({ fileRelativeUrlDisplayed, sizeAfterMerge }) => {
|
|
28
|
+
if (sizeAfterMerge === undefined) {
|
|
17
29
|
return `<del>${fileRelativeUrlDisplayed}</del>`
|
|
18
30
|
}
|
|
19
31
|
return fileRelativeUrlDisplayed
|
|
@@ -27,92 +39,84 @@ const jsenvFormatFileCell = ({ fileRelativeUrlDisplayed, event }) => {
|
|
|
27
39
|
* - deleted
|
|
28
40
|
* 0 (-100b)
|
|
29
41
|
*/
|
|
30
|
-
const jsenvFormatFileSizeImpactCell = (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
sizeAfterMerge,
|
|
40
|
-
// +100 % of something that was not here
|
|
41
|
-
// makes no sense
|
|
42
|
-
showDiff: false,
|
|
43
|
-
})
|
|
42
|
+
const jsenvFormatFileSizeImpactCell = ({ sizeBeforeMerge, sizeAfterMerge }) => {
|
|
43
|
+
// The file is new
|
|
44
|
+
// it makes sense to display
|
|
45
|
+
// "100B"
|
|
46
|
+
// but it would make no sense to compare with something that does not exists like
|
|
47
|
+
// "100 B (+100B / +100%)
|
|
48
|
+
if (sizeBeforeMerge === undefined) {
|
|
49
|
+
const sizeAfterMergeFormatted = formatSize(sizeAfterMerge)
|
|
50
|
+
return sizeAfterMergeFormatted
|
|
44
51
|
}
|
|
45
52
|
|
|
46
|
-
// deleted
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
})
|
|
53
|
+
// The file is deleted, it makes sense to display
|
|
54
|
+
// "deleted (-100 B)"
|
|
55
|
+
// to indicate the new file size is 0 and was 100 bytes
|
|
56
|
+
// but it would be redundant to add the percentage
|
|
57
|
+
// "deleted (-100 B / -100%)"
|
|
58
|
+
if (sizeAfterMerge === undefined) {
|
|
59
|
+
const sizeDiff = -sizeBeforeMerge
|
|
60
|
+
const sizeDiffFormatted = formatSize(sizeDiff, { diff: true })
|
|
61
|
+
return `deleted (${sizeDiffFormatted})`
|
|
56
62
|
}
|
|
57
63
|
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
|
|
64
|
+
const sizeAfterMergeFormatted = formatSize(sizeAfterMerge)
|
|
65
|
+
const sizeDiff = sizeAfterMerge - sizeBeforeMerge
|
|
66
|
+
const sizeDiffFormatted = formatSize(sizeDiff, { diff: true })
|
|
67
|
+
const sizeDiffAsPercentageFormatted = formatSizeImpactAsPercentage({
|
|
61
68
|
sizeBeforeMerge,
|
|
62
69
|
sizeAfterMerge,
|
|
63
70
|
})
|
|
71
|
+
return `${sizeAfterMergeFormatted} (${sizeDiffFormatted} / ${sizeDiffAsPercentageFormatted})`
|
|
64
72
|
}
|
|
65
73
|
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
sizeAfterMerge: groupSizeAfterMerge,
|
|
70
|
-
})
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const formatSizeImpact = ({
|
|
74
|
-
sizeBeforeMerge,
|
|
75
|
-
sizeAfterMerge,
|
|
76
|
-
showDiff = true,
|
|
77
|
-
showDiffPercentage = true,
|
|
78
|
-
}) => {
|
|
79
|
-
const sizeAfterMergeFormatted = formatSize(sizeAfterMerge)
|
|
80
|
-
if (!showDiff) {
|
|
81
|
-
return sizeAfterMergeFormatted
|
|
74
|
+
export const jsenvFormatEmojiCell = ({ sizeBeforeMerge, sizeAfterMerge }) => {
|
|
75
|
+
if (sizeBeforeMerge === undefined) {
|
|
76
|
+
return ":baby:"
|
|
82
77
|
}
|
|
83
78
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (!showDiffPercentage) {
|
|
88
|
-
return `${sizeAfterMergeFormatted} (${sizeDiffFormatted})`
|
|
79
|
+
if (sizeAfterMerge === undefined) {
|
|
80
|
+
return ""
|
|
89
81
|
}
|
|
90
82
|
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
limitDecimals(sizeDiffAsPercentage, 2),
|
|
96
|
-
)}%`
|
|
83
|
+
const delta = sizeAfterMerge - sizeBeforeMerge
|
|
84
|
+
if (delta === 0) {
|
|
85
|
+
return ":ghost:"
|
|
86
|
+
}
|
|
97
87
|
|
|
98
|
-
|
|
99
|
-
|
|
88
|
+
if (delta > 0) {
|
|
89
|
+
return ":arrow_upper_right:"
|
|
90
|
+
}
|
|
100
91
|
|
|
101
|
-
|
|
102
|
-
const multiplier = Math.pow(10, decimalCount)
|
|
103
|
-
return Math.round(number * multiplier) / multiplier
|
|
92
|
+
return ":arrow_lower_right:"
|
|
104
93
|
}
|
|
105
94
|
|
|
106
95
|
export const jsenvCommentParameters = {
|
|
107
96
|
filesOrdering: "size_impact",
|
|
108
|
-
|
|
97
|
+
maxFilesPerGroup: 600,
|
|
109
98
|
fileRelativeUrlMaxLength: 100,
|
|
110
99
|
formatGroupSummary: jsenvFormatGroupSummary,
|
|
111
|
-
formatHiddenImpactSummary: jsenvFormatHiddenImpactSummary,
|
|
112
100
|
formatFileRelativeUrl: jsenvFormatFileRelativeUrl,
|
|
113
101
|
|
|
114
102
|
formatFileCell: jsenvFormatFileCell,
|
|
115
103
|
formatFileSizeImpactCell: jsenvFormatFileSizeImpactCell,
|
|
116
|
-
|
|
104
|
+
formatEmojiCell: jsenvFormatEmojiCell,
|
|
117
105
|
shouldOpenGroupByDefault: () => false,
|
|
118
106
|
}
|
|
107
|
+
|
|
108
|
+
const formatSizeImpactAsPercentage = ({ sizeBeforeMerge, sizeAfterMerge }) => {
|
|
109
|
+
const sizeDiff = sizeAfterMerge - sizeBeforeMerge
|
|
110
|
+
const sizeDiffRatio =
|
|
111
|
+
sizeBeforeMerge === 0 ? 1 : sizeAfterMerge === 0 ? -1 : sizeDiff / sizeBeforeMerge
|
|
112
|
+
const sizeDiffAsPercentage = sizeDiffRatio * 100
|
|
113
|
+
const sizeDiffAsPercentageFormatted = `${sizeDiffAsPercentage < 0 ? `-` : "+"}${Math.abs(
|
|
114
|
+
limitDecimals(sizeDiffAsPercentage, 2),
|
|
115
|
+
)}%`
|
|
116
|
+
return sizeDiffAsPercentageFormatted
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const limitDecimals = (number, decimalCount = 2) => {
|
|
120
|
+
const multiplier = Math.pow(10, decimalCount)
|
|
121
|
+
return Math.round(number * multiplier) / multiplier
|
|
122
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export const orderBySizeImpact = (fileByFileImpact, sizeNames) => {
|
|
2
2
|
const impactOrderedBySizeImpact = {}
|
|
3
3
|
const files = Object.keys(fileByFileImpact)
|
|
4
|
-
const
|
|
4
|
+
const firstSizeName = sizeNames[0]
|
|
5
5
|
files.sort((leftFile, rightFile) => {
|
|
6
|
-
const leftFileSizeImpact =
|
|
7
|
-
const rightFileSizeImpact =
|
|
6
|
+
const leftFileSizeImpact = fileByFileImpact[leftFile].sizeImpactMap[firstSizeName]
|
|
7
|
+
const rightFileSizeImpact = fileByFileImpact[rightFile].sizeImpactMap[firstSizeName]
|
|
8
8
|
if (leftFileSizeImpact === 0) {
|
|
9
9
|
return 1
|
|
10
10
|
}
|
|
@@ -24,14 +24,3 @@ export const orderBySizeImpact = (fileByFileImpact, sizeNames) => {
|
|
|
24
24
|
})
|
|
25
25
|
return impactOrderedBySizeImpact
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
const sizeImpactFromFileImpact = (fileImpact, sizeName) => {
|
|
29
|
-
const { event } = fileImpact
|
|
30
|
-
if (event === "added") {
|
|
31
|
-
return fileImpact.afterMerge.sizeMap[sizeName]
|
|
32
|
-
}
|
|
33
|
-
if (event === "modified") {
|
|
34
|
-
return fileImpact.afterMerge.sizeMap[sizeName] - fileImpact.beforeMerge.sizeMap[sizeName]
|
|
35
|
-
}
|
|
36
|
-
return -fileImpact.beforeMerge.sizeMap[sizeName]
|
|
37
|
-
}
|
|
@@ -1,35 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
import { getSizeMapsForManyFiles } from "./size_map.js"
|
|
2
|
+
|
|
3
|
+
export const renderImpactTable = ({
|
|
2
4
|
fileByFileImpact,
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
) => {
|
|
5
|
+
transformationKeys,
|
|
6
|
+
fileRelativeUrlMaxLength,
|
|
7
|
+
maxFilesPerGroup,
|
|
8
|
+
formatFileRelativeUrl,
|
|
9
|
+
formatFileCell,
|
|
10
|
+
formatFileSizeImpactCell,
|
|
11
|
+
formatEmojiCell,
|
|
12
|
+
groupSizeMapBeforeMerge,
|
|
13
|
+
groupSizeMapAfterMerge,
|
|
14
|
+
}) => {
|
|
14
15
|
const table = `<table>
|
|
15
16
|
<thead>
|
|
16
17
|
${renderSizeImpactTableHeader(transformationKeys)}
|
|
17
18
|
</thead>
|
|
18
19
|
<tbody>
|
|
19
|
-
${renderSizeImpactTableBody(
|
|
20
|
+
${renderSizeImpactTableBody({
|
|
21
|
+
fileByFileImpact,
|
|
20
22
|
transformationKeys,
|
|
21
|
-
|
|
23
|
+
maxFilesPerGroup,
|
|
22
24
|
fileRelativeUrlMaxLength,
|
|
23
25
|
formatFileRelativeUrl,
|
|
24
26
|
formatFileCell,
|
|
25
27
|
formatFileSizeImpactCell,
|
|
28
|
+
formatEmojiCell,
|
|
26
29
|
})}
|
|
27
30
|
</tbody>
|
|
28
31
|
<tfoot>
|
|
29
|
-
${renderSizeImpactTableFooter(
|
|
30
|
-
|
|
32
|
+
${renderSizeImpactTableFooter({
|
|
33
|
+
fileByFileImpact,
|
|
31
34
|
transformationKeys,
|
|
32
|
-
|
|
35
|
+
formatFileSizeImpactCell,
|
|
36
|
+
formatEmojiCell,
|
|
37
|
+
groupSizeMapBeforeMerge,
|
|
38
|
+
groupSizeMapAfterMerge,
|
|
33
39
|
})}
|
|
34
40
|
</tfoot>
|
|
35
41
|
</table>`
|
|
@@ -40,7 +46,7 @@ export const renderImpactTable = (
|
|
|
40
46
|
const renderSizeImpactTableHeader = (transformationKeys) => {
|
|
41
47
|
const lines = []
|
|
42
48
|
const headerLine = [
|
|
43
|
-
`<th nowrap>
|
|
49
|
+
`<th nowrap>Files</th>`,
|
|
44
50
|
...transformationKeys.map(
|
|
45
51
|
(sizeName) => `<th nowrap>${sizeName === "raw" ? `new size` : `new ${sizeName} size`}</th>`,
|
|
46
52
|
),
|
|
@@ -51,35 +57,37 @@ const renderSizeImpactTableHeader = (transformationKeys) => {
|
|
|
51
57
|
return renderTableLines(lines)
|
|
52
58
|
}
|
|
53
59
|
|
|
54
|
-
const renderSizeImpactTableBody = (
|
|
60
|
+
const renderSizeImpactTableBody = ({
|
|
55
61
|
fileByFileImpact,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
) => {
|
|
62
|
+
transformationKeys,
|
|
63
|
+
maxFilesPerGroup,
|
|
64
|
+
fileRelativeUrlMaxLength,
|
|
65
|
+
formatFileRelativeUrl,
|
|
66
|
+
formatFileCell,
|
|
67
|
+
formatFileSizeImpactCell,
|
|
68
|
+
formatEmojiCell,
|
|
69
|
+
}) => {
|
|
65
70
|
const lines = []
|
|
66
71
|
const sizeNames = transformationKeys
|
|
72
|
+
const firstSizeName = sizeNames[0]
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const files = Object.keys(fileByFileImpact)
|
|
74
|
-
const fileCount = files.length
|
|
75
|
-
let filesShown
|
|
76
|
-
if (fileCount > maxRowsPerTable) {
|
|
77
|
-
filesShown = files.slice(0, maxRowsPerTable)
|
|
78
|
-
} else {
|
|
79
|
-
filesShown = files
|
|
80
|
-
}
|
|
81
|
-
filesShown.forEach((fileRelativeUrl) => {
|
|
74
|
+
let remainingFilesToDisplay = maxFilesPerGroup
|
|
75
|
+
const truncateds = []
|
|
76
|
+
const unmodifieds = []
|
|
77
|
+
Object.keys(fileByFileImpact).forEach((fileRelativeUrl) => {
|
|
82
78
|
const fileImpact = fileByFileImpact[fileRelativeUrl]
|
|
79
|
+
|
|
80
|
+
if (fileImpact.event === "none") {
|
|
81
|
+
unmodifieds.push(fileRelativeUrl)
|
|
82
|
+
return
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (remainingFilesToDisplay === 0) {
|
|
86
|
+
truncateds.push(fileRelativeUrl)
|
|
87
|
+
return
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
remainingFilesToDisplay--
|
|
83
91
|
const fileAbstractRelativeUrl = fileAbstractRelativeUrlFromFileImpact(fileImpact)
|
|
84
92
|
const fileRelativeUrlFormatted = (fileImpact.formatFileRelativeUrl || formatFileRelativeUrl)(
|
|
85
93
|
fileAbstractRelativeUrl,
|
|
@@ -88,151 +96,146 @@ const renderSizeImpactTableBody = (
|
|
|
88
96
|
fileRelativeUrlFormatted,
|
|
89
97
|
fileRelativeUrlMaxLength,
|
|
90
98
|
)
|
|
99
|
+
const { sizeMapBeforeMerge, sizeMapAfterMerge } = fileByFileImpact[fileRelativeUrl]
|
|
91
100
|
const fileCellFormatted = formatFileCell({
|
|
92
101
|
fileRelativeUrl,
|
|
93
102
|
fileRelativeUrlDisplayed,
|
|
94
|
-
|
|
103
|
+
sizeBeforeMerge: sizeMapBeforeMerge[firstSizeName],
|
|
104
|
+
sizeAfterMerge: sizeMapAfterMerge[firstSizeName],
|
|
95
105
|
})
|
|
106
|
+
|
|
96
107
|
const line = [
|
|
97
108
|
`<td nowrap>${fileCellFormatted}</td>`,
|
|
98
|
-
...sizeNames.map((sizeName) =>
|
|
99
|
-
|
|
109
|
+
...sizeNames.map((sizeName) => {
|
|
110
|
+
return `<td nowrap>${formatFileSizeImpactCell({
|
|
111
|
+
sizeBeforeMerge: sizeMapBeforeMerge[sizeName],
|
|
112
|
+
sizeAfterMerge: sizeMapAfterMerge[sizeName],
|
|
113
|
+
sizeName,
|
|
114
|
+
})}</td>`
|
|
115
|
+
}),
|
|
116
|
+
...(formatEmojiCell
|
|
117
|
+
? [
|
|
118
|
+
`<td>${formatEmojiCell({
|
|
119
|
+
sizeBeforeMerge: sizeMapBeforeMerge[firstSizeName],
|
|
120
|
+
sizeAfterMerge: sizeMapAfterMerge[firstSizeName],
|
|
121
|
+
})}</td>`,
|
|
122
|
+
]
|
|
123
|
+
: []),
|
|
100
124
|
]
|
|
101
125
|
lines.push(line)
|
|
102
126
|
})
|
|
103
|
-
if (filesShown !== files) {
|
|
104
|
-
const columnCount =
|
|
105
|
-
// file name
|
|
106
|
-
1 +
|
|
107
|
-
// all sizes
|
|
108
|
-
sizeNames.length +
|
|
109
|
-
// emoji column
|
|
110
|
-
1
|
|
111
|
-
lines.push([
|
|
112
|
-
`<td colspan="${columnCount}" align="center">... ${
|
|
113
|
-
fileCount - maxRowsPerTable
|
|
114
|
-
} more ...</td>`,
|
|
115
|
-
])
|
|
116
|
-
}
|
|
117
127
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if (delta > 0) {
|
|
145
|
-
return ":arrow_upper_right:"
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return ":arrow_lower_right:"
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const renderGroupEmojiCellContent = ({ groupSizeAfterMerge, groupSizeBeforeMerge }) => {
|
|
152
|
-
const delta = groupSizeAfterMerge - groupSizeBeforeMerge
|
|
153
|
-
if (delta === 0) {
|
|
154
|
-
return ":ghost:"
|
|
128
|
+
const truncatedCount = truncateds.length
|
|
129
|
+
if (truncatedCount > 0) {
|
|
130
|
+
const { sizeMapBeforeMerge, sizeMapAfterMerge } = getSizeMapsForManyFiles({
|
|
131
|
+
sizeNames,
|
|
132
|
+
fileByFileImpact,
|
|
133
|
+
files: truncateds,
|
|
134
|
+
})
|
|
135
|
+
const lineForTruncatedFiles = [
|
|
136
|
+
`<td nowrap><i>Truncated (${truncatedCount})</i></td>`,
|
|
137
|
+
...sizeNames.map((sizeName) => {
|
|
138
|
+
return `<td nowrap>${formatFileSizeImpactCell({
|
|
139
|
+
sizeBeforeMerge: sizeMapBeforeMerge[sizeName],
|
|
140
|
+
sizeAfterMerge: sizeMapAfterMerge[sizeName],
|
|
141
|
+
sizeName,
|
|
142
|
+
})}</td>`
|
|
143
|
+
}),
|
|
144
|
+
...(formatEmojiCell
|
|
145
|
+
? [
|
|
146
|
+
`<td>${formatEmojiCell({
|
|
147
|
+
sizeBeforeMerge: sizeMapBeforeMerge[firstSizeName],
|
|
148
|
+
sizeAfterMerge: sizeMapAfterMerge[firstSizeName],
|
|
149
|
+
})}</td>`,
|
|
150
|
+
]
|
|
151
|
+
: []),
|
|
152
|
+
]
|
|
153
|
+
lines.push(lineForTruncatedFiles)
|
|
155
154
|
}
|
|
156
155
|
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
const unmodifiedCount = unmodifieds.length
|
|
157
|
+
if (unmodifiedCount > 0) {
|
|
158
|
+
const { sizeMapBeforeMerge, sizeMapAfterMerge } = getSizeMapsForManyFiles({
|
|
159
|
+
sizeNames,
|
|
160
|
+
fileByFileImpact,
|
|
161
|
+
files: unmodifieds,
|
|
162
|
+
})
|
|
163
|
+
const lineForUnmodifiedFiles = [
|
|
164
|
+
`<td nowrap><i>Unmodified (${unmodifiedCount})</i></td>`,
|
|
165
|
+
...sizeNames.map((sizeName) => {
|
|
166
|
+
return `<td nowrap>${formatFileSizeImpactCell({
|
|
167
|
+
sizeBeforeMerge: sizeMapBeforeMerge[sizeName],
|
|
168
|
+
sizeAfterMerge: sizeMapAfterMerge[sizeName],
|
|
169
|
+
sizeName,
|
|
170
|
+
})}</td>`
|
|
171
|
+
}),
|
|
172
|
+
...(formatEmojiCell
|
|
173
|
+
? [
|
|
174
|
+
`<td>${formatEmojiCell({
|
|
175
|
+
sizeBeforeMerge: sizeMapBeforeMerge[firstSizeName],
|
|
176
|
+
sizeAfterMerge: sizeMapAfterMerge[firstSizeName],
|
|
177
|
+
})}</td>`,
|
|
178
|
+
]
|
|
179
|
+
: []),
|
|
180
|
+
]
|
|
181
|
+
lines.push(lineForUnmodifiedFiles)
|
|
159
182
|
}
|
|
160
183
|
|
|
161
|
-
return
|
|
184
|
+
return renderTableLines(lines)
|
|
162
185
|
}
|
|
163
186
|
|
|
164
|
-
const fileAbstractRelativeUrlFromFileImpact = ({
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
187
|
+
const fileAbstractRelativeUrlFromFileImpact = ({
|
|
188
|
+
manifestKeyBeforeMerge,
|
|
189
|
+
relativeUrlBeforeMerge,
|
|
190
|
+
manifestKeyAfterMerge,
|
|
191
|
+
relativeUrlAfterMerge,
|
|
192
|
+
}) => {
|
|
193
|
+
return (
|
|
194
|
+
manifestKeyAfterMerge ||
|
|
195
|
+
relativeUrlAfterMerge ||
|
|
196
|
+
manifestKeyBeforeMerge ||
|
|
197
|
+
relativeUrlBeforeMerge
|
|
198
|
+
)
|
|
169
199
|
}
|
|
170
200
|
|
|
171
|
-
const renderSizeImpactTableFooter = (
|
|
201
|
+
const renderSizeImpactTableFooter = ({
|
|
172
202
|
fileByFileImpact,
|
|
173
|
-
|
|
174
|
-
|
|
203
|
+
transformationKeys,
|
|
204
|
+
formatFileSizeImpactCell,
|
|
205
|
+
formatEmojiCell,
|
|
206
|
+
groupSizeMapBeforeMerge,
|
|
207
|
+
groupSizeMapAfterMerge,
|
|
208
|
+
}) => {
|
|
175
209
|
const footerLines = []
|
|
176
210
|
|
|
211
|
+
const fileCount = Object.keys(fileByFileImpact).length
|
|
177
212
|
const sizeNames = transformationKeys
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
const groupImpacts = {}
|
|
181
|
-
sizeNames.forEach((sizeName) => {
|
|
182
|
-
groupImpacts[sizeName] = computeGroupImpact(groupFileImpactMap, sizeName)
|
|
183
|
-
})
|
|
213
|
+
const firstSizeName = sizeNames[0]
|
|
184
214
|
|
|
185
215
|
const groupSizeImpactLine = [
|
|
186
|
-
`<td nowrap><strong>
|
|
216
|
+
`<td nowrap><strong>Total (${fileCount})</strong></td>`,
|
|
187
217
|
...sizeNames.map(
|
|
188
|
-
(sizeName) =>
|
|
218
|
+
(sizeName) =>
|
|
219
|
+
`<td nowrap>${formatFileSizeImpactCell({
|
|
220
|
+
sizeBeforeMerge: groupSizeMapBeforeMerge[sizeName],
|
|
221
|
+
sizeAfterMerge: groupSizeMapAfterMerge[sizeName],
|
|
222
|
+
sizeName,
|
|
223
|
+
})}</td>`,
|
|
189
224
|
),
|
|
190
|
-
|
|
225
|
+
...(formatEmojiCell
|
|
226
|
+
? [
|
|
227
|
+
`<td>${formatEmojiCell({
|
|
228
|
+
sizeBeforeMerge: groupSizeMapBeforeMerge[firstSizeName],
|
|
229
|
+
sizeAfterMerge: groupSizeMapAfterMerge[firstSizeName],
|
|
230
|
+
})}</td>`,
|
|
231
|
+
]
|
|
232
|
+
: []),
|
|
191
233
|
]
|
|
192
234
|
footerLines.push(groupSizeImpactLine)
|
|
193
235
|
|
|
194
236
|
return renderTableLines(footerLines)
|
|
195
237
|
}
|
|
196
238
|
|
|
197
|
-
const computeGroupImpact = (groupFileImpactMap, sizeName) => {
|
|
198
|
-
const groupImpact = Object.keys(groupFileImpactMap).reduce(
|
|
199
|
-
(previous, fileRelativeUrl) => {
|
|
200
|
-
const fileImpact = groupFileImpactMap[fileRelativeUrl]
|
|
201
|
-
const { beforeMerge, afterMerge } = fileImpact
|
|
202
|
-
// added
|
|
203
|
-
if (!beforeMerge) {
|
|
204
|
-
const sizeAfterMerge = afterMerge.sizeMap[sizeName]
|
|
205
|
-
return {
|
|
206
|
-
groupSizeBeforeMerge: previous.groupSizeBeforeMerge,
|
|
207
|
-
groupSizeAfterMerge: previous.groupSizeAfterMerge + sizeAfterMerge,
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// removed
|
|
212
|
-
if (!afterMerge) {
|
|
213
|
-
const sizeBeforeMerge = beforeMerge.sizeMap[sizeName]
|
|
214
|
-
return {
|
|
215
|
-
groupSizeBeforeMerge: previous.groupSizeBeforeMerge + sizeBeforeMerge,
|
|
216
|
-
groupSizeAfterMerge: previous.groupSizeAfterMerge,
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// modified or not, does not matter
|
|
221
|
-
const sizeBeforeMerge = beforeMerge.sizeMap[sizeName]
|
|
222
|
-
const sizeAfterMerge = afterMerge.sizeMap[sizeName]
|
|
223
|
-
return {
|
|
224
|
-
groupSizeBeforeMerge: previous.groupSizeBeforeMerge + sizeBeforeMerge,
|
|
225
|
-
groupSizeAfterMerge: previous.groupSizeAfterMerge + sizeAfterMerge,
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
groupSizeBeforeMerge: 0,
|
|
230
|
-
groupSizeAfterMerge: 0,
|
|
231
|
-
},
|
|
232
|
-
)
|
|
233
|
-
return groupImpact
|
|
234
|
-
}
|
|
235
|
-
|
|
236
239
|
const truncateFileRelativeUrl = (fileRelativeUrl, fileRelativeUrlMaxLength) => {
|
|
237
240
|
const length = fileRelativeUrl.length
|
|
238
241
|
const extraLength = length - fileRelativeUrlMaxLength
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export const getSizeMapsOneFile = ({ sizeNames, beforeMerge, afterMerge }) => {
|
|
2
|
+
const sizeMapBeforeMerge = {}
|
|
3
|
+
const sizeMapAfterMerge = {}
|
|
4
|
+
const sizeImpactMap = {}
|
|
5
|
+
|
|
6
|
+
sizeNames.forEach((sizeName) => {
|
|
7
|
+
if (beforeMerge === null) {
|
|
8
|
+
sizeMapBeforeMerge[sizeName] = undefined
|
|
9
|
+
sizeMapAfterMerge[sizeName] = afterMerge.sizeMap[sizeName]
|
|
10
|
+
sizeImpactMap[sizeName] = afterMerge.sizeMap[sizeName]
|
|
11
|
+
} else if (afterMerge === null) {
|
|
12
|
+
sizeMapBeforeMerge[sizeName] = beforeMerge.sizeMap[sizeName]
|
|
13
|
+
sizeMapAfterMerge[sizeName] = undefined
|
|
14
|
+
sizeImpactMap[sizeName] = -beforeMerge.sizeMap[sizeName]
|
|
15
|
+
} else {
|
|
16
|
+
sizeMapBeforeMerge[sizeName] = beforeMerge.sizeMap[sizeName]
|
|
17
|
+
sizeMapAfterMerge[sizeName] = afterMerge.sizeMap[sizeName]
|
|
18
|
+
sizeImpactMap[sizeName] = afterMerge.sizeMap[sizeName] - beforeMerge.sizeMap[sizeName]
|
|
19
|
+
}
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
sizeMapBeforeMerge,
|
|
24
|
+
sizeMapAfterMerge,
|
|
25
|
+
sizeImpactMap,
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export const getSizeMapsForManyFiles = ({ sizeNames, fileByFileImpact, files }) => {
|
|
30
|
+
const sizeMapBeforeMerge = {}
|
|
31
|
+
const sizeMapAfterMerge = {}
|
|
32
|
+
|
|
33
|
+
sizeNames.forEach((sizeName) => {
|
|
34
|
+
let sizeBeforeMerge = 0
|
|
35
|
+
let sizeAfterMerge = 0
|
|
36
|
+
files.forEach((fileRelativeUrl) => {
|
|
37
|
+
const { sizeMapBeforeMerge, sizeMapAfterMerge } = fileByFileImpact[fileRelativeUrl]
|
|
38
|
+
sizeBeforeMerge += sizeMapBeforeMerge[sizeName] || 0
|
|
39
|
+
sizeAfterMerge += sizeMapAfterMerge[sizeName] || 0
|
|
40
|
+
})
|
|
41
|
+
sizeMapBeforeMerge[sizeName] = sizeBeforeMerge
|
|
42
|
+
sizeMapAfterMerge[sizeName] = sizeAfterMerge
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
sizeMapBeforeMerge,
|
|
47
|
+
sizeMapAfterMerge,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { parentPort } from "node:worker_threads"
|
|
2
|
+
|
|
3
|
+
parentPort.on("message", async ({ fileSizeModuleUrl }) => {
|
|
4
|
+
const { generateFileSizeReport } = await import(fileSizeModuleUrl)
|
|
5
|
+
|
|
6
|
+
if (typeof generateFileSizeReport !== "function") {
|
|
7
|
+
throw new TypeError(
|
|
8
|
+
`generateFileSizeReport export must be a function, got ${generateFileSizeReport}`,
|
|
9
|
+
)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const fileSizeReport = await generateFileSizeReport()
|
|
13
|
+
|
|
14
|
+
parentPort.postMessage({
|
|
15
|
+
fileSizeReport,
|
|
16
|
+
})
|
|
17
|
+
})
|
package/src/logFileSizeReport.js
CHANGED
|
@@ -17,7 +17,7 @@ export const logFileSizeReport = (fileSizeReport) => {
|
|
|
17
17
|
const sizesFormatted = sizeNames.map((sizeName) => {
|
|
18
18
|
return `${sizeName}: ${formatSize(sizeMap[sizeName])}`
|
|
19
19
|
})
|
|
20
|
-
return `${fileRelativeUrl}: { ${sizesFormatted.join(
|
|
20
|
+
return `${fileRelativeUrl}: { ${sizesFormatted.join(`, `)} }`
|
|
21
21
|
})
|
|
22
22
|
|
|
23
23
|
return `${groupName}
|