@jsenv/file-size-impact 12.1.13 → 13.0.1
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 -19
- package/readme.md +17 -15
- package/src/generateFileSizeReport.js +6 -6
- package/src/internal/applyTrackingConfig.js +7 -12
- package/src/internal/compareTwoFileSizeReports.js +31 -11
- package/src/internal/formatFileSizeReportForLog.js +2 -1
- package/src/internal/formatSize.js +2 -2
- package/src/internal/format_percentage.js +6 -29
- package/src/internal/helper.js +2 -1
- package/src/internal/manifest.js +11 -4
- package/src/internal/orderBySizeImpact.js +4 -2
- package/src/internal/renderImpactTable.js +11 -6
- package/src/internal/size_map.js +9 -3
- package/src/main.js +8 -0
- package/src/reportFileSizeImpact.js +14 -17
- package/main.js +0 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/file-size-impact",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.1",
|
|
4
4
|
"description": "Add files size impact into pull requests",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -12,34 +12,29 @@
|
|
|
12
12
|
"node": ">=16.13.0"
|
|
13
13
|
},
|
|
14
14
|
"publishConfig": {
|
|
15
|
-
"access": "public"
|
|
16
|
-
"registry": "https://registry.npmjs.org"
|
|
15
|
+
"access": "public"
|
|
17
16
|
},
|
|
18
17
|
"type": "module",
|
|
19
18
|
"exports": {
|
|
20
19
|
".": {
|
|
21
|
-
"import": "./main.js"
|
|
20
|
+
"import": "./src/main.js"
|
|
22
21
|
},
|
|
23
22
|
"./*": "./*"
|
|
24
23
|
},
|
|
25
|
-
"main": "./main.js",
|
|
24
|
+
"main": "./src/main.js",
|
|
26
25
|
"files": [
|
|
27
|
-
"/src/"
|
|
28
|
-
"/main.js"
|
|
26
|
+
"/src/"
|
|
29
27
|
],
|
|
30
28
|
"scripts": {
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"test-with-coverage": "npm run test -- --coverage",
|
|
35
|
-
"file-size": "node ./script/file_size/file_size.mjs --log",
|
|
36
|
-
"prettier": "prettier --write ."
|
|
29
|
+
"snapshot": "node ./tests/comment/generate_comment_snapshot_file.mjs",
|
|
30
|
+
"test": "node ./scripts/test.mjs",
|
|
31
|
+
"file-size": "node ./scripts/file_size.mjs --log"
|
|
37
32
|
},
|
|
38
33
|
"dependencies": {
|
|
39
|
-
"@jsenv/dynamic-import-worker": "1.0
|
|
40
|
-
"@jsenv/filesystem": "
|
|
41
|
-
"@jsenv/github-pull-request-impact": "1.
|
|
42
|
-
"@jsenv/
|
|
43
|
-
"
|
|
34
|
+
"@jsenv/dynamic-import-worker": "1.1.0",
|
|
35
|
+
"@jsenv/filesystem": "4.1.0",
|
|
36
|
+
"@jsenv/github-pull-request-impact": "1.7.0",
|
|
37
|
+
"@jsenv/log": "3.0.0",
|
|
38
|
+
"@jsenv/urls": "1.2.6"
|
|
44
39
|
}
|
|
45
|
-
}
|
|
40
|
+
}
|
package/readme.md
CHANGED
|
@@ -28,7 +28,7 @@ The first thing you need is a script capable to generate a file size report.
|
|
|
28
28
|
npm install --save-dev @jsenv/file-size-impact
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
_file_size.mjs_
|
|
32
32
|
|
|
33
33
|
```js
|
|
34
34
|
import { generateFileSizeReport } from "@jsenv/file-size-impact"
|
|
@@ -48,7 +48,7 @@ export const fileSizeReport = await generateFileSizeReport({
|
|
|
48
48
|
At this stage, you could generate a file size report on your machine with the following command.
|
|
49
49
|
|
|
50
50
|
```console
|
|
51
|
-
node ./
|
|
51
|
+
node ./file_size.mjs --log
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
Now it's time to configure a workflow to compare file size reports before and after merging a pull request.
|
|
@@ -85,7 +85,7 @@ jobs:
|
|
|
85
85
|
- name: Setup npm
|
|
86
86
|
run: npm install
|
|
87
87
|
- name: Report file size impact
|
|
88
|
-
run: node ./
|
|
88
|
+
run: node ./file_size.mjs
|
|
89
89
|
env:
|
|
90
90
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
91
91
|
```
|
|
@@ -108,11 +108,13 @@ import {
|
|
|
108
108
|
await reportFileSizeImpact({
|
|
109
109
|
...readGitHubWorkflowEnv(),
|
|
110
110
|
buildCommand: "npm run dist",
|
|
111
|
-
|
|
111
|
+
fileSizeReportUrl: new URL("./file_size.mjs#fileSizeReport", import.meta.url),
|
|
112
112
|
})
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
**Notes**:
|
|
116
|
+
|
|
117
|
+
- "#fileSizeReport" is the name of the export from _file_size.mjs_.
|
|
116
118
|
|
|
117
119
|
## Other tools
|
|
118
120
|
|
|
@@ -164,12 +166,13 @@ In order to analyse the impact of a pull request on file size the following step
|
|
|
164
166
|
|
|
165
167
|
1. Checkout pull request base branch
|
|
166
168
|
2. Execute an install command (_npm install_ by default)
|
|
167
|
-
3.
|
|
168
|
-
4.
|
|
169
|
-
5.
|
|
170
|
-
6.
|
|
171
|
-
7.
|
|
172
|
-
8.
|
|
169
|
+
3. Run a build command (nom build by default)
|
|
170
|
+
4. Get a file size report (dynamic import of a js module exporting `generateFileSizeReport`)
|
|
171
|
+
5. Merge pull request into its base
|
|
172
|
+
6. Execute command to generate files again
|
|
173
|
+
7. Get a second file size report
|
|
174
|
+
8. Analyse differences between the two file size reports
|
|
175
|
+
9. Post or update comment in the pull request
|
|
173
176
|
|
|
174
177
|
# generateFileSizeReport
|
|
175
178
|
|
|
@@ -322,8 +325,7 @@ await reportFileSizeImpact({
|
|
|
322
325
|
|
|
323
326
|
installCommand: "npm install",
|
|
324
327
|
buildCommand: "npm run build",
|
|
325
|
-
|
|
326
|
-
|
|
328
|
+
fileSizeReportUrl: new URL("./file_size.mjs#fileSizeReport", import.meta.url),
|
|
327
329
|
filesOrdering: "size_impact",
|
|
328
330
|
})
|
|
329
331
|
```
|
|
@@ -346,9 +348,9 @@ _installCommand_ parameter is a string representing the command to run in order
|
|
|
346
348
|
|
|
347
349
|
_buildCommand_ parameter is a string representing the command to run in order to generate files. This parameter is optional with a default value of `"npm run-script build"`. You can pass `null` if you don't need to run a build command before computing file sizes.
|
|
348
350
|
|
|
349
|
-
##
|
|
351
|
+
## fileSizeReportUrl
|
|
350
352
|
|
|
351
|
-
|
|
353
|
+
_fileSizeReportUrl_ is a string or an url parameter representing an url leading a module file. This file must export a fileSizeReport produced by _generateFileSizeReport_.
|
|
352
354
|
|
|
353
355
|
## filesOrdering
|
|
354
356
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url"
|
|
1
2
|
import {
|
|
2
3
|
assertAndNormalizeDirectoryUrl,
|
|
3
4
|
bufferToEtag,
|
|
4
|
-
resolveUrl,
|
|
5
5
|
readFile,
|
|
6
|
-
urlToFileSystemPath,
|
|
7
6
|
} from "@jsenv/filesystem"
|
|
8
|
-
import { createDetailedMessage, createLogger } from "@jsenv/
|
|
7
|
+
import { createDetailedMessage, createLogger } from "@jsenv/log"
|
|
9
8
|
|
|
10
9
|
import { transform as rawTransform } from "./rawTransformation.js"
|
|
11
10
|
import { jsenvTrackingConfig } from "./jsenvTrackingConfig.js"
|
|
@@ -81,7 +80,8 @@ const groupTrackingResultToGroupReport = async (
|
|
|
81
80
|
const manifestRelativeUrls = Object.keys(manifestMetaMap)
|
|
82
81
|
await Promise.all(
|
|
83
82
|
manifestRelativeUrls.map(async (manifestRelativeUrl) => {
|
|
84
|
-
const manifestFileUrl =
|
|
83
|
+
const manifestFileUrl = new URL(manifestRelativeUrl, rootDirectoryUrl)
|
|
84
|
+
.href
|
|
85
85
|
const manifestFileContent = await readFile(manifestFileUrl, {
|
|
86
86
|
as: "string",
|
|
87
87
|
})
|
|
@@ -95,7 +95,7 @@ const groupTrackingResultToGroupReport = async (
|
|
|
95
95
|
`JSON.parse error while trying to parse a manifest file`,
|
|
96
96
|
{
|
|
97
97
|
"error stack": e.stack,
|
|
98
|
-
"manifest file":
|
|
98
|
+
"manifest file": fileURLToPath(manifestFileUrl),
|
|
99
99
|
},
|
|
100
100
|
),
|
|
101
101
|
)
|
|
@@ -114,7 +114,7 @@ const groupTrackingResultToGroupReport = async (
|
|
|
114
114
|
// so we won't benefit from concurrency (it might even make things worse)
|
|
115
115
|
await trackedRelativeUrls.reduce(async (previous, fileRelativeUrl) => {
|
|
116
116
|
await previous
|
|
117
|
-
const fileUrl =
|
|
117
|
+
const fileUrl = new URL(fileRelativeUrl, rootDirectoryUrl).href
|
|
118
118
|
const fileBuffer = await readFile(fileUrl, { as: "buffer" })
|
|
119
119
|
const sizeMap = await getFileSizeMap(fileBuffer, {
|
|
120
120
|
transformations,
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
collectDirectoryMatchReport,
|
|
4
|
-
} from "@jsenv/filesystem"
|
|
1
|
+
import { fileURLToPath } from "node:url"
|
|
2
|
+
import { collectDirectoryMatchReport } from "@jsenv/filesystem"
|
|
5
3
|
|
|
6
4
|
export const applyTrackingConfig = async (
|
|
7
5
|
trackingConfig,
|
|
@@ -30,21 +28,18 @@ const applyTracking = async (
|
|
|
30
28
|
tracking,
|
|
31
29
|
{ rootDirectoryUrl, manifestConfig },
|
|
32
30
|
) => {
|
|
33
|
-
const structuredMetaMap = {
|
|
34
|
-
track: tracking,
|
|
35
|
-
...(manifestConfig ? { manifest: manifestConfig } : {}),
|
|
36
|
-
}
|
|
37
|
-
|
|
38
31
|
let directoryMatchReport
|
|
39
|
-
|
|
40
32
|
try {
|
|
41
33
|
directoryMatchReport = await collectDirectoryMatchReport({
|
|
42
34
|
directoryUrl: rootDirectoryUrl,
|
|
43
|
-
|
|
35
|
+
associations: {
|
|
36
|
+
track: tracking,
|
|
37
|
+
...(manifestConfig ? { manifest: manifestConfig } : {}),
|
|
38
|
+
},
|
|
44
39
|
predicate: (meta) => Boolean(meta.track) || Boolean(meta.manifest),
|
|
45
40
|
})
|
|
46
41
|
} catch (e) {
|
|
47
|
-
const directoryPath =
|
|
42
|
+
const directoryPath = fileURLToPath(rootDirectoryUrl)
|
|
48
43
|
if (e.code === "ENOENT" && e.path === directoryPath) {
|
|
49
44
|
console.warn(`${directoryPath} does not exists`)
|
|
50
45
|
return []
|
|
@@ -40,7 +40,11 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
40
40
|
beforeMerge: null,
|
|
41
41
|
afterMerge: {
|
|
42
42
|
relativeUrl: afterMergeRelativeUrl,
|
|
43
|
-
manifestKey:
|
|
43
|
+
manifestKey:
|
|
44
|
+
manifestKeyFromRelativeUrl(
|
|
45
|
+
afterMergeRelativeUrl,
|
|
46
|
+
afterMergeMappings,
|
|
47
|
+
) || null,
|
|
44
48
|
...afterMergeFileMap[afterMergeRelativeUrl],
|
|
45
49
|
},
|
|
46
50
|
}
|
|
@@ -50,12 +54,19 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
50
54
|
beforeMerge: {
|
|
51
55
|
relativeUrl: beforeMergeRelativeUrl,
|
|
52
56
|
manifestKey:
|
|
53
|
-
manifestKeyFromRelativeUrl(
|
|
57
|
+
manifestKeyFromRelativeUrl(
|
|
58
|
+
beforeMergeRelativeUrl,
|
|
59
|
+
beforeMergeMappings,
|
|
60
|
+
) || null,
|
|
54
61
|
...beforeMergeFileMap[beforeMergeRelativeUrl],
|
|
55
62
|
},
|
|
56
63
|
afterMerge: {
|
|
57
64
|
relativeUrl: afterMergeRelativeUrl,
|
|
58
|
-
manifestKey:
|
|
65
|
+
manifestKey:
|
|
66
|
+
manifestKeyFromRelativeUrl(
|
|
67
|
+
afterMergeRelativeUrl,
|
|
68
|
+
afterMergeMappings,
|
|
69
|
+
) || null,
|
|
59
70
|
...afterMergeFileMap[afterMergeRelativeUrl],
|
|
60
71
|
},
|
|
61
72
|
}
|
|
@@ -64,7 +75,10 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
64
75
|
return {
|
|
65
76
|
beforeMerge: {
|
|
66
77
|
relativeUrl: beforeMergeRelativeUrl,
|
|
67
|
-
manifestKey: manifestKeyFromRelativeUrl(
|
|
78
|
+
manifestKey: manifestKeyFromRelativeUrl(
|
|
79
|
+
beforeMergeRelativeUrl,
|
|
80
|
+
beforeMergeMappings,
|
|
81
|
+
),
|
|
68
82
|
...beforeMergeFileMap[beforeMergeRelativeUrl],
|
|
69
83
|
},
|
|
70
84
|
afterMerge: null,
|
|
@@ -78,14 +92,16 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
78
92
|
)
|
|
79
93
|
|
|
80
94
|
if (afterMergeManifestKey) {
|
|
81
|
-
const existsInBeforeMergeManifest =
|
|
82
|
-
|
|
95
|
+
const existsInBeforeMergeManifest = Object.keys(
|
|
96
|
+
beforeMergeMappings,
|
|
97
|
+
).includes(afterMergeManifestKey)
|
|
83
98
|
if (existsInBeforeMergeManifest) {
|
|
84
99
|
// the manifest key also appears in the manifest before merge.
|
|
85
100
|
// It means that even if both file have different relative urls,
|
|
86
101
|
// they are considered the same.
|
|
87
102
|
// This is to support file generated with a dynamic name
|
|
88
|
-
const beforeMergeRelativeUrl =
|
|
103
|
+
const beforeMergeRelativeUrl =
|
|
104
|
+
beforeMergeMappings[afterMergeManifestKey]
|
|
89
105
|
const beforeMerge = beforeMergeFileMap[beforeMergeRelativeUrl]
|
|
90
106
|
if (beforeMerge) {
|
|
91
107
|
groupComparison[afterMergeRelativeUrl] = getUpdateInfo({
|
|
@@ -113,8 +129,9 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
113
129
|
beforeMergeMappings,
|
|
114
130
|
)
|
|
115
131
|
if (beforeMergeManifestKey) {
|
|
116
|
-
const existsInAfterMergeManifest =
|
|
117
|
-
|
|
132
|
+
const existsInAfterMergeManifest = Object.keys(
|
|
133
|
+
afterMergeMappings,
|
|
134
|
+
).includes(beforeMergeManifestKey)
|
|
118
135
|
if (existsInAfterMergeManifest) {
|
|
119
136
|
// file also referenced in after merge manifest
|
|
120
137
|
// let's first see if the file still exists
|
|
@@ -137,7 +154,9 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
137
154
|
// at this point there is no file for an eventual file mapping from manifest
|
|
138
155
|
// AND no file for the real relative url after merge
|
|
139
156
|
// -> the file is gone
|
|
140
|
-
groupComparison[beforeMergeRelativeUrl] = getRemoveInfo({
|
|
157
|
+
groupComparison[beforeMergeRelativeUrl] = getRemoveInfo({
|
|
158
|
+
beforeMergeRelativeUrl,
|
|
159
|
+
})
|
|
141
160
|
})
|
|
142
161
|
|
|
143
162
|
const fileImpactMap = sortFileStructure(groupComparison)
|
|
@@ -149,7 +168,8 @@ const compareTwoGroups = (beforeMergeGroup, afterMergeGroup) => {
|
|
|
149
168
|
}
|
|
150
169
|
|
|
151
170
|
const sortFileStructure = (fileStructure) => {
|
|
152
|
-
const relativeUrlSortedArray =
|
|
171
|
+
const relativeUrlSortedArray =
|
|
172
|
+
Object.keys(fileStructure).sort(comparePathnames)
|
|
153
173
|
const fileStructureSorted = {}
|
|
154
174
|
relativeUrlSortedArray.forEach((relativeUrl) => {
|
|
155
175
|
fileStructureSorted[relativeUrl] = fileStructure[relativeUrl]
|
|
@@ -9,7 +9,8 @@ export const formatFileSizeReportForLog = (fileSizeReport) => {
|
|
|
9
9
|
|
|
10
10
|
const mappings = manifestToMappings(manifestMap)
|
|
11
11
|
const fileMessages = Object.keys(fileMap).map((fileRelativeUrl) => {
|
|
12
|
-
const fileDisplayed =
|
|
12
|
+
const fileDisplayed =
|
|
13
|
+
manifestKeyFromRelativeUrl(fileRelativeUrl, mappings) || fileRelativeUrl
|
|
13
14
|
const file = fileMap[fileRelativeUrl]
|
|
14
15
|
const { sizeMap } = file
|
|
15
16
|
const sizeNames = Object.keys(sizeMap)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { byteAsFileSize } from "@jsenv/log"
|
|
2
2
|
|
|
3
3
|
export const formatSize = (sizeNumber, { diff = false } = {}) => {
|
|
4
4
|
const sizeNumberAbsolute = Math.abs(sizeNumber)
|
|
5
|
-
let sizeString =
|
|
5
|
+
let sizeString = byteAsFileSize(sizeNumberAbsolute)
|
|
6
6
|
if (diff) {
|
|
7
7
|
if (sizeNumber < 0) {
|
|
8
8
|
sizeString = `-${sizeString}`
|
|
@@ -1,31 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
const absoluteValue = Math.abs(number)
|
|
3
|
-
const valueRounded = roundNumber(
|
|
4
|
-
absoluteValue,
|
|
5
|
-
determineDecimals(absoluteValue),
|
|
6
|
-
)
|
|
7
|
-
return `${number < 0 ? `-` : "+"}${valueRounded}%`
|
|
8
|
-
}
|
|
1
|
+
import { setRoundedPrecision } from "@jsenv/log"
|
|
9
2
|
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return 3
|
|
16
|
-
}
|
|
17
|
-
if (number < 0.1) {
|
|
18
|
-
return 2
|
|
19
|
-
}
|
|
20
|
-
if (number < 1) {
|
|
21
|
-
return 1
|
|
22
|
-
}
|
|
23
|
-
return 0
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const roundNumber = (value, maxDecimals) => {
|
|
27
|
-
const expValue = Math.pow(10, maxDecimals)
|
|
28
|
-
const roundedValue = Math.round(expValue * value) / expValue
|
|
29
|
-
const valueAsString = roundedValue.toFixed(maxDecimals)
|
|
30
|
-
return parseFloat(valueAsString)
|
|
3
|
+
export const formatPercentage = (number) => {
|
|
4
|
+
return `${number < 0 ? `-` : "+"}${setRoundedPrecision(Math.abs(number), {
|
|
5
|
+
decimals: 0,
|
|
6
|
+
decimalsWhenSmall: 1,
|
|
7
|
+
})}%`
|
|
31
8
|
}
|
package/src/internal/helper.js
CHANGED
|
@@ -5,7 +5,8 @@ export const anchor = (text, id) => {
|
|
|
5
5
|
|
|
6
6
|
export const isAdded = ({ beforeMerge }) => !beforeMerge
|
|
7
7
|
|
|
8
|
-
export const isDeleted = ({ beforeMerge, afterMerge }) =>
|
|
8
|
+
export const isDeleted = ({ beforeMerge, afterMerge }) =>
|
|
9
|
+
beforeMerge && !afterMerge
|
|
9
10
|
|
|
10
11
|
export const isModified = ({ beforeMerge, afterMerge }) =>
|
|
11
12
|
beforeMerge && afterMerge && beforeMerge.hash !== afterMerge.hash
|
package/src/internal/manifest.js
CHANGED
|
@@ -1,14 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { urlToRelativeUrl } from "@jsenv/urls"
|
|
2
2
|
|
|
3
3
|
export const manifestToMappings = (manifestMap) => {
|
|
4
4
|
const mappings = {}
|
|
5
5
|
Object.keys(manifestMap).forEach((manifestRelativeUrl) => {
|
|
6
6
|
const manifest = manifestMap[manifestRelativeUrl]
|
|
7
|
-
const manifestAbstractUrl =
|
|
7
|
+
const manifestAbstractUrl = new URL(
|
|
8
|
+
manifestRelativeUrl,
|
|
9
|
+
ABSTRACT_DIRECTORY_URL,
|
|
10
|
+
).href
|
|
8
11
|
Object.keys(manifest).forEach((manifestKey) => {
|
|
9
12
|
const manifestValue = manifest[manifestKey]
|
|
10
|
-
const manifestKeyAsAbstractUrl =
|
|
11
|
-
|
|
13
|
+
const manifestKeyAsAbstractUrl = new URL(manifestKey, manifestAbstractUrl)
|
|
14
|
+
.href
|
|
15
|
+
const manifestValueAsAbstractUrl = new URL(
|
|
16
|
+
manifestValue,
|
|
17
|
+
manifestAbstractUrl,
|
|
18
|
+
).href
|
|
12
19
|
const manifestKeyAsRelativeUrl = urlToRelativeUrl(
|
|
13
20
|
manifestKeyAsAbstractUrl,
|
|
14
21
|
ABSTRACT_DIRECTORY_URL,
|
|
@@ -3,8 +3,10 @@ export const orderBySizeImpact = (fileByFileImpact, sizeNames) => {
|
|
|
3
3
|
const files = Object.keys(fileByFileImpact)
|
|
4
4
|
const firstSizeName = sizeNames[0]
|
|
5
5
|
files.sort((leftFile, rightFile) => {
|
|
6
|
-
const leftFileSizeImpact =
|
|
7
|
-
|
|
6
|
+
const leftFileSizeImpact =
|
|
7
|
+
fileByFileImpact[leftFile].sizeImpactMap[firstSizeName]
|
|
8
|
+
const rightFileSizeImpact =
|
|
9
|
+
fileByFileImpact[rightFile].sizeImpactMap[firstSizeName]
|
|
8
10
|
if (leftFileSizeImpact === 0) {
|
|
9
11
|
return 1
|
|
10
12
|
}
|
|
@@ -48,7 +48,10 @@ const renderSizeImpactTableHeader = (transformationKeys) => {
|
|
|
48
48
|
const headerLine = [
|
|
49
49
|
`<th nowrap>Files</th>`,
|
|
50
50
|
...transformationKeys.map(
|
|
51
|
-
(sizeName) =>
|
|
51
|
+
(sizeName) =>
|
|
52
|
+
`<th nowrap>${
|
|
53
|
+
sizeName === "raw" ? `new size` : `new ${sizeName} size`
|
|
54
|
+
}</th>`,
|
|
52
55
|
),
|
|
53
56
|
`<th></th>`,
|
|
54
57
|
]
|
|
@@ -88,15 +91,17 @@ const renderSizeImpactTableBody = ({
|
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
remainingFilesToDisplay--
|
|
91
|
-
const fileAbstractRelativeUrl =
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
94
|
+
const fileAbstractRelativeUrl =
|
|
95
|
+
fileAbstractRelativeUrlFromFileImpact(fileImpact)
|
|
96
|
+
const fileRelativeUrlFormatted = (
|
|
97
|
+
fileImpact.formatFileRelativeUrl || formatFileRelativeUrl
|
|
98
|
+
)(fileAbstractRelativeUrl)
|
|
95
99
|
const fileRelativeUrlDisplayed = truncateFileRelativeUrl(
|
|
96
100
|
fileRelativeUrlFormatted,
|
|
97
101
|
fileRelativeUrlMaxLength,
|
|
98
102
|
)
|
|
99
|
-
const { sizeMapBeforeMerge, sizeMapAfterMerge } =
|
|
103
|
+
const { sizeMapBeforeMerge, sizeMapAfterMerge } =
|
|
104
|
+
fileByFileImpact[fileRelativeUrl]
|
|
100
105
|
const fileCellFormatted = formatFileCell({
|
|
101
106
|
fileRelativeUrl,
|
|
102
107
|
fileRelativeUrlDisplayed,
|
package/src/internal/size_map.js
CHANGED
|
@@ -15,7 +15,8 @@ export const getSizeMapsOneFile = ({ sizeNames, beforeMerge, afterMerge }) => {
|
|
|
15
15
|
} else {
|
|
16
16
|
sizeMapBeforeMerge[sizeName] = beforeMerge.sizeMap[sizeName]
|
|
17
17
|
sizeMapAfterMerge[sizeName] = afterMerge.sizeMap[sizeName]
|
|
18
|
-
sizeImpactMap[sizeName] =
|
|
18
|
+
sizeImpactMap[sizeName] =
|
|
19
|
+
afterMerge.sizeMap[sizeName] - beforeMerge.sizeMap[sizeName]
|
|
19
20
|
}
|
|
20
21
|
})
|
|
21
22
|
|
|
@@ -26,7 +27,11 @@ export const getSizeMapsOneFile = ({ sizeNames, beforeMerge, afterMerge }) => {
|
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
export const getSizeMapsForManyFiles = ({
|
|
30
|
+
export const getSizeMapsForManyFiles = ({
|
|
31
|
+
sizeNames,
|
|
32
|
+
fileByFileImpact,
|
|
33
|
+
files,
|
|
34
|
+
}) => {
|
|
30
35
|
const sizeMapBeforeMerge = {}
|
|
31
36
|
const sizeMapAfterMerge = {}
|
|
32
37
|
|
|
@@ -34,7 +39,8 @@ export const getSizeMapsForManyFiles = ({ sizeNames, fileByFileImpact, files })
|
|
|
34
39
|
let sizeBeforeMerge = 0
|
|
35
40
|
let sizeAfterMerge = 0
|
|
36
41
|
files.forEach((fileRelativeUrl) => {
|
|
37
|
-
const { sizeMapBeforeMerge, sizeMapAfterMerge } =
|
|
42
|
+
const { sizeMapBeforeMerge, sizeMapAfterMerge } =
|
|
43
|
+
fileByFileImpact[fileRelativeUrl]
|
|
38
44
|
sizeBeforeMerge += sizeMapBeforeMerge[sizeName] || 0
|
|
39
45
|
sizeAfterMerge += sizeMapAfterMerge[sizeName] || 0
|
|
40
46
|
})
|
package/src/main.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { readGitHubWorkflowEnv } from "@jsenv/github-pull-request-impact"
|
|
2
|
+
|
|
3
|
+
export { jsenvTrackingConfig } from "./jsenvTrackingConfig.js"
|
|
4
|
+
export { transform as raw } from "./rawTransformation.js"
|
|
5
|
+
export { transform as gzip } from "./gzipTransformation.js"
|
|
6
|
+
export { transform as brotli } from "./brotliTransformation.js"
|
|
7
|
+
export { generateFileSizeReport } from "./generateFileSizeReport.js"
|
|
8
|
+
export { reportFileSizeImpact } from "./reportFileSizeImpact.js"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { assertAndNormalizeDirectoryUrl } from "@jsenv/filesystem"
|
|
1
2
|
import { commentGitHubPullRequestImpact } from "@jsenv/github-pull-request-impact"
|
|
2
|
-
import { assertAndNormalizeDirectoryUrl, resolveUrl } from "@jsenv/filesystem"
|
|
3
|
-
|
|
4
3
|
import { importOneExportFromFile } from "@jsenv/dynamic-import-worker"
|
|
4
|
+
|
|
5
5
|
import { formatComment } from "./internal/formatComment.js"
|
|
6
6
|
import { jsenvCommentParameters } from "./internal/jsenvCommentParameters.js"
|
|
7
7
|
|
|
@@ -18,7 +18,7 @@ export const reportFileSizeImpact = async ({
|
|
|
18
18
|
pullRequestNumber,
|
|
19
19
|
installCommand = "npm install",
|
|
20
20
|
buildCommand = "npm run-script build",
|
|
21
|
-
|
|
21
|
+
fileSizeReportUrl,
|
|
22
22
|
|
|
23
23
|
// We could just to ...jsenvCommentParameters but explicitely passing params
|
|
24
24
|
// helps autocompletion in vscode for dev using the function.
|
|
@@ -36,6 +36,16 @@ export const reportFileSizeImpact = async ({
|
|
|
36
36
|
runLink,
|
|
37
37
|
commitInGeneratedByInfo,
|
|
38
38
|
}) => {
|
|
39
|
+
rootDirectoryUrl = assertAndNormalizeDirectoryUrl(rootDirectoryUrl)
|
|
40
|
+
if (fileSizeReportUrl === "string") {
|
|
41
|
+
fileSizeReportUrl = new URL(fileSizeReportUrl, rootDirectoryUrl).href
|
|
42
|
+
} else if (fileSizeReportUrl instanceof URL) {
|
|
43
|
+
} else {
|
|
44
|
+
throw new TypeError(
|
|
45
|
+
`fileSizeReportUrl must be a string or an url but received ${fileSizeReportUrl}`,
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
39
49
|
if (installCommand === null) {
|
|
40
50
|
// a null installCommand means there is no need to install anything
|
|
41
51
|
} else if (typeof installCommand !== "string") {
|
|
@@ -52,17 +62,6 @@ export const reportFileSizeImpact = async ({
|
|
|
52
62
|
)
|
|
53
63
|
}
|
|
54
64
|
|
|
55
|
-
if (typeof fileSizeReportModulePath !== "string") {
|
|
56
|
-
throw new TypeError(
|
|
57
|
-
`fileSizeReportModulePath must be a string but received ${fileSizeReportModulePath}`,
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
rootDirectoryUrl = assertAndNormalizeDirectoryUrl(rootDirectoryUrl)
|
|
61
|
-
const fileSizeReportModuleUrl = resolveUrl(
|
|
62
|
-
fileSizeReportModulePath,
|
|
63
|
-
rootDirectoryUrl,
|
|
64
|
-
)
|
|
65
|
-
|
|
66
65
|
return commentGitHubPullRequestImpact({
|
|
67
66
|
logLevel,
|
|
68
67
|
commandLogs,
|
|
@@ -78,9 +77,7 @@ export const reportFileSizeImpact = async ({
|
|
|
78
77
|
collectInfo: async ({ execCommandInRootDirectory }) => {
|
|
79
78
|
if (installCommand) await execCommandInRootDirectory(installCommand)
|
|
80
79
|
if (buildCommand) await execCommandInRootDirectory(buildCommand)
|
|
81
|
-
const fileSizeReport = await importOneExportFromFile(
|
|
82
|
-
fileSizeReportModuleUrl,
|
|
83
|
-
)
|
|
80
|
+
const fileSizeReport = await importOneExportFromFile(fileSizeReportUrl)
|
|
84
81
|
return { version: 1, data: fileSizeReport }
|
|
85
82
|
},
|
|
86
83
|
commentIdentifier: `<!-- Generated by @jsenv/file-size-impact -->`,
|
package/main.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { jsenvTrackingConfig } from "./src/jsenvTrackingConfig.js"
|
|
2
|
-
export { transform as raw } from "./src/rawTransformation.js"
|
|
3
|
-
export { transform as gzip } from "./src/gzipTransformation.js"
|
|
4
|
-
export { transform as brotli } from "./src/brotliTransformation.js"
|
|
5
|
-
export { generateFileSizeReport } from "./src/generateFileSizeReport.js"
|
|
6
|
-
|
|
7
|
-
export { readGitHubWorkflowEnv } from "@jsenv/github-pull-request-impact"
|
|
8
|
-
export { reportFileSizeImpact } from "./src/reportFileSizeImpact.js"
|