@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.
@@ -1,19 +1,31 @@
1
1
  import { formatSize } from "./formatSize.js"
2
2
 
3
- const jsenvFormatGroupSummary = ({ groupName, groupImpactCount, groupFileCount }) => {
4
- return `${groupName} (${groupImpactCount}/${groupFileCount})`
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
- const jsenvFormatHiddenImpactSummary = ({ groupHiddenImpactCount }) => {
8
- return `Hidden (${groupHiddenImpactCount})`
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, event }) => {
16
- if (event === "deleted") {
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 = (fileImpact, sizeName) => {
31
- const { beforeMerge, afterMerge } = fileImpact
32
-
33
- // added
34
- if (!beforeMerge) {
35
- const sizeBeforeMerge = 0
36
- const sizeAfterMerge = afterMerge.sizeMap[sizeName]
37
- return formatSizeImpact({
38
- sizeBeforeMerge,
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
- if (!afterMerge) {
48
- const sizeBeforeMerge = beforeMerge.sizeMap[sizeName]
49
- const sizeAfterMerge = 0
50
- return formatSizeImpact({
51
- sizeBeforeMerge,
52
- sizeAfterMerge,
53
- // -100% of the file kinda makes sense
54
- showDiffPercentage: false,
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 sizeBeforeMerge = beforeMerge.sizeMap[sizeName]
59
- const sizeAfterMerge = afterMerge.sizeMap[sizeName]
60
- return formatSizeImpact({
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 jsenvFormatGroupSizeImpactCell = ({ groupSizeAfterMerge, groupSizeBeforeMerge }) => {
67
- return formatSizeImpact({
68
- sizeBeforeMerge: groupSizeBeforeMerge,
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
- const sizeDiff = sizeAfterMerge - sizeBeforeMerge
85
- const sizeDiffFormatted = formatSize(sizeDiff, { diff: true })
86
-
87
- if (!showDiffPercentage) {
88
- return `${sizeAfterMergeFormatted} (${sizeDiffFormatted})`
79
+ if (sizeAfterMerge === undefined) {
80
+ return ""
89
81
  }
90
82
 
91
- const sizeDiffRatio =
92
- sizeBeforeMerge === 0 ? 1 : sizeAfterMerge === 0 ? -1 : sizeDiff / sizeBeforeMerge
93
- const sizeDiffAsPercentage = sizeDiffRatio * 100
94
- const sizeDiffAsPercentageFormatted = `${sizeDiffAsPercentage < 0 ? `-` : "+"}${Math.abs(
95
- limitDecimals(sizeDiffAsPercentage, 2),
96
- )}%`
83
+ const delta = sizeAfterMerge - sizeBeforeMerge
84
+ if (delta === 0) {
85
+ return ":ghost:"
86
+ }
97
87
 
98
- return `${sizeAfterMergeFormatted} (${sizeDiffFormatted} / ${sizeDiffAsPercentageFormatted})`
99
- }
88
+ if (delta > 0) {
89
+ return ":arrow_upper_right:"
90
+ }
100
91
 
101
- const limitDecimals = (number, decimalCount = 2) => {
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
- maxRowsPerTable: 600,
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
- formatGroupSizeImpactCell: jsenvFormatGroupSizeImpactCell,
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 lastSizeName = sizeNames[sizeNames.length - 1]
4
+ const firstSizeName = sizeNames[0]
5
5
  files.sort((leftFile, rightFile) => {
6
- const leftFileSizeImpact = sizeImpactFromFileImpact(fileByFileImpact[leftFile], lastSizeName)
7
- const rightFileSizeImpact = sizeImpactFromFileImpact(fileByFileImpact[rightFile], lastSizeName)
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
- export const renderImpactTable = (
1
+ import { getSizeMapsForManyFiles } from "./size_map.js"
2
+
3
+ export const renderImpactTable = ({
2
4
  fileByFileImpact,
3
- {
4
- groupFileImpactMap,
5
- transformationKeys,
6
- fileRelativeUrlMaxLength,
7
- maxRowsPerTable,
8
- formatFileRelativeUrl,
9
- formatFileCell,
10
- formatFileSizeImpactCell,
11
- formatGroupSizeImpactCell,
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(fileByFileImpact, {
20
+ ${renderSizeImpactTableBody({
21
+ fileByFileImpact,
20
22
  transformationKeys,
21
- maxRowsPerTable,
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(fileByFileImpact, {
30
- groupFileImpactMap,
32
+ ${renderSizeImpactTableFooter({
33
+ fileByFileImpact,
31
34
  transformationKeys,
32
- formatGroupSizeImpactCell,
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>File</th>`,
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
- transformationKeys,
58
- maxRowsPerTable,
59
- fileRelativeUrlMaxLength,
60
- formatFileRelativeUrl,
61
- formatFileCell,
62
- formatFileSizeImpactCell,
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
- const renderDiffCell = (fileImpact, sizeName) => {
69
- const fileSizeImpactCellFormatted = formatFileSizeImpactCell(fileImpact, sizeName)
70
- return fileSizeImpactCellFormatted
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
- ...fileImpact,
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) => `<td nowrap>${renderDiffCell(fileImpact, sizeName)}</td>`),
99
- `<td>${renderEmojiCellContent(fileImpact)}</td>`,
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
- return renderTableLines(lines)
119
- }
120
-
121
- const renderEmojiCellContent = (fileImpact) => {
122
- const { event } = fileImpact
123
-
124
- if (event === "added") {
125
- return ":baby:"
126
- }
127
-
128
- if (event === "deleted") {
129
- return ""
130
- }
131
-
132
- const { afterMerge, beforeMerge } = fileImpact
133
- const afterMergeSizeMap = afterMerge.sizeMap
134
- const beforeMergeSizeMap = beforeMerge.sizeMap
135
- const sizeNames = Object.keys(afterMergeSizeMap)
136
- const sizeName = sizeNames[sizeNames.length - 1]
137
- const afterMergeSize = afterMergeSizeMap[sizeName]
138
- const beforeMergeSize = beforeMergeSizeMap[sizeName]
139
- const delta = afterMergeSize - beforeMergeSize
140
- if (delta === 0) {
141
- return ":ghost:"
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
- if (delta > 0) {
158
- return ":arrow_upper_right:"
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 ":arrow_lower_right:"
184
+ return renderTableLines(lines)
162
185
  }
163
186
 
164
- const fileAbstractRelativeUrlFromFileImpact = ({ beforeMerge, afterMerge }) => {
165
- if (afterMerge) {
166
- return afterMerge.manifestKey || afterMerge.relativeUrl
167
- }
168
- return beforeMerge.manifestKey || beforeMerge.relativeUrl
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
- { groupFileImpactMap, transformationKeys, formatGroupSizeImpactCell },
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 lastSizeName = sizeNames[sizeNames.length - 1]
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>Whole group</strong></td>`,
216
+ `<td nowrap><strong>Total (${fileCount})</strong></td>`,
187
217
  ...sizeNames.map(
188
- (sizeName) => `<td nowrap>${formatGroupSizeImpactCell(groupImpacts[sizeName])}</td>`,
218
+ (sizeName) =>
219
+ `<td nowrap>${formatFileSizeImpactCell({
220
+ sizeBeforeMerge: groupSizeMapBeforeMerge[sizeName],
221
+ sizeAfterMerge: groupSizeMapAfterMerge[sizeName],
222
+ sizeName,
223
+ })}</td>`,
189
224
  ),
190
- `<td>${renderGroupEmojiCellContent(groupImpacts[lastSizeName])}</td>`,
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
+ })
@@ -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}