@jsenv/file-size-impact 10.0.1 → 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 +16 -14
- package/readme.md +40 -57
- package/src/getFileSizeReport.js +1 -1
- package/src/internal/applyTrackingConfig.js +1 -1
- package/src/internal/compareTwoFileSizeReports.js +2 -2
- 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,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}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Worker } from "node:worker_threads"
|
|
2
|
+
import {
|
|
3
|
+
assertAndNormalizeDirectoryUrl,
|
|
4
|
+
fileSystemPathToUrl,
|
|
5
|
+
isFileSystemPath,
|
|
6
|
+
resolveUrl,
|
|
7
|
+
urlToFileSystemPath,
|
|
8
|
+
} from "@jsenv/filesystem"
|
|
2
9
|
import { commentGitHubPullRequestImpact } from "@jsenv/github-pull-request-impact"
|
|
3
10
|
|
|
4
11
|
import { formatComment } from "./internal/formatComment.js"
|
|
5
12
|
import { jsenvCommentParameters } from "./internal/jsenvCommentParameters.js"
|
|
6
13
|
|
|
14
|
+
const workerFileUrl = resolveUrl(
|
|
15
|
+
"./internal/worker_generating_file_size_report.js",
|
|
16
|
+
import.meta.url,
|
|
17
|
+
)
|
|
18
|
+
|
|
7
19
|
export const reportFileSizeImpact = async ({
|
|
8
20
|
logLevel,
|
|
9
21
|
commandLogs,
|
|
@@ -17,19 +29,18 @@ export const reportFileSizeImpact = async ({
|
|
|
17
29
|
pullRequestNumber,
|
|
18
30
|
installCommand = "npm install",
|
|
19
31
|
buildCommand = "npm run-script build",
|
|
20
|
-
|
|
32
|
+
fileSizeModulePath,
|
|
21
33
|
|
|
22
34
|
// We could just to ...jsenvCommentParameters but explicitely passing params
|
|
23
35
|
// helps autocompletion in vscode for dev using the function.
|
|
24
36
|
filesOrdering = jsenvCommentParameters.filesOrdering,
|
|
25
|
-
|
|
37
|
+
maxFilesPerGroup = jsenvCommentParameters.maxFilesPerGroup,
|
|
26
38
|
fileRelativeUrlMaxLength = jsenvCommentParameters.fileRelativeUrlMaxLength,
|
|
27
39
|
formatGroupSummary = jsenvCommentParameters.formatGroupSummary,
|
|
28
|
-
formatHiddenImpactSummary = jsenvCommentParameters.formatHiddenImpactSummary,
|
|
29
40
|
formatFileRelativeUrl = jsenvCommentParameters.formatFileRelativeUrl,
|
|
30
41
|
formatFileCell = jsenvCommentParameters.formatFileCell,
|
|
31
42
|
formatFileSizeImpactCell = jsenvCommentParameters.formatFileSizeImpactCell,
|
|
32
|
-
|
|
43
|
+
formatEmojiCell = jsenvCommentParameters.formatEmojiCell,
|
|
33
44
|
shouldOpenGroupByDefault = jsenvCommentParameters.shouldOpenGroupByDefault,
|
|
34
45
|
|
|
35
46
|
catchError,
|
|
@@ -48,16 +59,14 @@ export const reportFileSizeImpact = async ({
|
|
|
48
59
|
throw new TypeError(`buildCommand must be a string but received ${buildCommand}`)
|
|
49
60
|
}
|
|
50
61
|
|
|
51
|
-
if (typeof
|
|
52
|
-
throw new TypeError(
|
|
53
|
-
`moduleGeneratingFileSizeReportRelativeUrl must be a string but received ${moduleGeneratingFileSizeReportRelativeUrl}`,
|
|
54
|
-
)
|
|
62
|
+
if (typeof fileSizeModulePath !== "string") {
|
|
63
|
+
throw new TypeError(`fileSizeModulePath must be a string but received ${fileSizeModulePath}`)
|
|
55
64
|
}
|
|
56
65
|
projectDirectoryUrl = assertAndNormalizeDirectoryUrl(projectDirectoryUrl)
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
projectDirectoryUrl
|
|
60
|
-
)
|
|
66
|
+
const fileSizeModuleUrl = isFileSystemPath(fileSizeModulePath)
|
|
67
|
+
? fileSystemPathToUrl(fileSizeModulePath)
|
|
68
|
+
: resolveUrl(fileSizeModulePath, projectDirectoryUrl)
|
|
69
|
+
const workerFilePath = urlToFileSystemPath(workerFileUrl)
|
|
61
70
|
|
|
62
71
|
return commentGitHubPullRequestImpact({
|
|
63
72
|
logLevel,
|
|
@@ -75,15 +84,12 @@ export const reportFileSizeImpact = async ({
|
|
|
75
84
|
if (installCommand) await execCommandInProjectDirectory(installCommand)
|
|
76
85
|
if (buildCommand) await execCommandInProjectDirectory(buildCommand)
|
|
77
86
|
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
)
|
|
85
|
-
}
|
|
86
|
-
const fileSizeReport = await generateFileSizeReport()
|
|
87
|
+
const worker = new Worker(workerFilePath)
|
|
88
|
+
const { fileSizeReport } = await new Promise((resolve, reject) => {
|
|
89
|
+
worker.postMessage({ fileSizeModuleUrl })
|
|
90
|
+
worker.on("message", resolve)
|
|
91
|
+
worker.on("error", reject)
|
|
92
|
+
})
|
|
87
93
|
|
|
88
94
|
return { version: 1, data: fileSizeReport }
|
|
89
95
|
},
|
|
@@ -102,14 +108,13 @@ export const reportFileSizeImpact = async ({
|
|
|
102
108
|
afterMergeFileSizeReport: afterMergeData,
|
|
103
109
|
|
|
104
110
|
filesOrdering,
|
|
105
|
-
|
|
111
|
+
maxFilesPerGroup,
|
|
106
112
|
fileRelativeUrlMaxLength,
|
|
107
113
|
formatGroupSummary,
|
|
108
|
-
formatHiddenImpactSummary,
|
|
109
114
|
formatFileRelativeUrl,
|
|
110
115
|
formatFileCell,
|
|
111
116
|
formatFileSizeImpactCell,
|
|
112
|
-
|
|
117
|
+
formatEmojiCell,
|
|
113
118
|
shouldOpenGroupByDefault,
|
|
114
119
|
})
|
|
115
120
|
},
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
export const getSizeMaps = ({ beforeMerge, afterMerge }) => {
|
|
2
|
-
// added
|
|
3
|
-
if (!beforeMerge) {
|
|
4
|
-
const sizeMapBeforeMerge = null
|
|
5
|
-
const sizeMapAfterMerge = afterMerge.sizeMap
|
|
6
|
-
const sizeImpactMap = {}
|
|
7
|
-
Object.keys(sizeMapAfterMerge).forEach((sizeName) => {
|
|
8
|
-
sizeImpactMap[sizeName] = sizeMapAfterMerge[sizeName]
|
|
9
|
-
})
|
|
10
|
-
return {
|
|
11
|
-
sizeMapBeforeMerge,
|
|
12
|
-
sizeMapAfterMerge,
|
|
13
|
-
sizeImpactMap,
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// deleted
|
|
18
|
-
if (!afterMerge) {
|
|
19
|
-
const sizeMapBeforeMerge = beforeMerge.sizeMap
|
|
20
|
-
const sizeMapAfterMerge = null
|
|
21
|
-
const sizeImpactMap = {}
|
|
22
|
-
Object.keys(sizeMapBeforeMerge).forEach((sizeName) => {
|
|
23
|
-
sizeImpactMap[sizeName] = -sizeMapBeforeMerge[sizeName]
|
|
24
|
-
})
|
|
25
|
-
return {
|
|
26
|
-
sizeMapBeforeMerge,
|
|
27
|
-
sizeMapAfterMerge,
|
|
28
|
-
sizeImpactMap,
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const sizeMapBeforeMerge = beforeMerge.sizeMap
|
|
33
|
-
const sizeMapAfterMerge = afterMerge.sizeMap
|
|
34
|
-
const sizeImpactMap = {}
|
|
35
|
-
Object.keys(sizeMapAfterMerge).forEach((sizeName) => {
|
|
36
|
-
sizeImpactMap[sizeName] = sizeMapAfterMerge[sizeName] - sizeMapBeforeMerge[sizeName]
|
|
37
|
-
})
|
|
38
|
-
return {
|
|
39
|
-
sizeMapBeforeMerge,
|
|
40
|
-
sizeMapAfterMerge,
|
|
41
|
-
sizeImpactMap,
|
|
42
|
-
}
|
|
43
|
-
}
|