Skip to content

Commit f599321

Browse files
committed
chore: refactor scripts to js, remove need for tsx
1 parent 91212fa commit f599321

File tree

5 files changed

+91
-62
lines changed

5 files changed

+91
-62
lines changed

.github/workflows/size-report.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666
if_no_artifact_found: warn
6767

6868
- name: Prepare report
69-
run: pnpm tsx scripts/size-report.ts > size-report.md
69+
run: node scripts/size-report.js > size-report.md
7070

7171
- name: Read Size Report
7272
id: size-report

package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"build": "node scripts/build.js",
99
"build-dts": "tsc -p tsconfig.build.json --noCheck && rollup -c rollup.dts.config.js",
1010
"clean": "rimraf --glob packages/*/dist temp .eslintcache",
11-
"size": "run-s \"size-*\" && tsx scripts/usage-size.ts",
11+
"size": "run-s \"size-*\" && node scripts/usage-size.js",
1212
"size-global": "node scripts/build.js vue runtime-dom -f global -p --size",
1313
"size-esm-runtime": "node scripts/build.js vue -f esm-bundler-runtime",
1414
"size-esm": "node scripts/build.js runtime-dom runtime-core reactivity shared -f esm-bundler",
@@ -104,7 +104,6 @@
104104
"simple-git-hooks": "^2.11.1",
105105
"todomvc-app-css": "^2.4.3",
106106
"tslib": "^2.7.0",
107-
"tsx": "^4.19.0",
108107
"typescript": "~5.6.2",
109108
"typescript-eslint": "^8.4.0",
110109
"vite": "catalog:",

pnpm-lock.yaml

-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/size-report.ts renamed to scripts/size-report.js

+50-25
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1+
// @ts-check
12
import path from 'node:path'
23
import { markdownTable } from 'markdown-table'
34
import prettyBytes from 'pretty-bytes'
45
import { readdir } from 'node:fs/promises'
56
import { existsSync } from 'node:fs'
67

7-
interface SizeResult {
8-
size: number
9-
gzip: number
10-
brotli: number
11-
}
8+
/**
9+
* @typedef {Object} SizeResult
10+
* @property {number} size
11+
* @property {number} gzip
12+
* @property {number} brotli
13+
*/
1214

13-
interface BundleResult extends SizeResult {
14-
file: string
15-
}
15+
/**
16+
* @typedef {SizeResult & { file: string }} BundleResult
17+
*/
1618

17-
type UsageResult = Record<string, SizeResult & { name: string }>
19+
/**
20+
* @typedef {Record<string, SizeResult & { name: string }>} UsageResult
21+
*/
1822

1923
const currDir = path.resolve('temp/size')
2024
const prevDir = path.resolve('temp/size-prev')
@@ -23,53 +27,60 @@ const sizeHeaders = ['Size', 'Gzip', 'Brotli']
2327

2428
run()
2529

30+
/**
31+
* Runs the main process of rendering file and usage data
32+
*/
2633
async function run() {
2734
await renderFiles()
2835
await renderUsages()
2936

3037
process.stdout.write(output)
3138
}
3239

40+
/**
41+
* Renders file sizes and diffs between current and previous versions
42+
*/
3343
async function renderFiles() {
34-
const filterFiles = (files: string[]) =>
44+
const filterFiles = files =>
3545
files.filter(file => file[0] !== '_' && !file.endsWith('.txt'))
3646

3747
const curr = filterFiles(await readdir(currDir))
3848
const prev = existsSync(prevDir) ? filterFiles(await readdir(prevDir)) : []
3949
const fileList = new Set([...curr, ...prev])
4050

41-
const rows: string[][] = []
51+
const rows = []
4252
for (const file of fileList) {
4353
const currPath = path.resolve(currDir, file)
4454
const prevPath = path.resolve(prevDir, file)
4555

46-
const curr = await importJSON<BundleResult>(currPath)
47-
const prev = await importJSON<BundleResult>(prevPath)
56+
const curr = await importJSON(currPath)
57+
const prev = await importJSON(prevPath)
4858
const fileName = curr?.file || prev?.file || ''
4959

5060
if (!curr) {
5161
rows.push([`~~${fileName}~~`])
52-
} else
62+
} else {
5363
rows.push([
5464
fileName,
5565
`${prettyBytes(curr.size)}${getDiff(curr.size, prev?.size)}`,
5666
`${prettyBytes(curr.gzip)}${getDiff(curr.gzip, prev?.gzip)}`,
5767
`${prettyBytes(curr.brotli)}${getDiff(curr.brotli, prev?.brotli)}`,
5868
])
69+
}
5970
}
6071

6172
output += '### Bundles\n\n'
6273
output += markdownTable([['File', ...sizeHeaders], ...rows])
6374
output += '\n\n'
6475
}
6576

77+
/**
78+
* Renders usage data comparing current and previous usage results
79+
*/
6680
async function renderUsages() {
67-
const curr = (await importJSON<UsageResult>(
68-
path.resolve(currDir, '_usages.json'),
69-
))!
70-
const prev = await importJSON<UsageResult>(
71-
path.resolve(prevDir, '_usages.json'),
72-
)
81+
const curr = await importJSON(path.resolve(currDir, '_usages.json'))
82+
const prev = await importJSON(path.resolve(prevDir, '_usages.json'))
83+
7384
output += '\n### Usages\n\n'
7485

7586
const data = Object.values(curr)
@@ -86,17 +97,31 @@ async function renderUsages() {
8697
`${prettyBytes(usage.brotli)}${diffBrotli}`,
8798
]
8899
})
89-
.filter((usage): usage is string[] => !!usage)
100+
.filter(usage => !!usage)
90101

91102
output += `${markdownTable([['Name', ...sizeHeaders], ...data])}\n\n`
92103
}
93104

94-
async function importJSON<T>(path: string): Promise<T | undefined> {
95-
if (!existsSync(path)) return undefined
96-
return (await import(path, { assert: { type: 'json' } })).default
105+
/**
106+
* Imports JSON data from a specified path
107+
*
108+
* @template T
109+
* @param {string} filePath - Path to the JSON file
110+
* @returns {Promise<T | undefined>} The JSON content or undefined if the file does not exist
111+
*/
112+
async function importJSON(filePath) {
113+
if (!existsSync(filePath)) return undefined
114+
return (await import(filePath, { assert: { type: 'json' } })).default
97115
}
98116

99-
function getDiff(curr: number, prev?: number) {
117+
/**
118+
* Calculates the difference between the current and previous sizes
119+
*
120+
* @param {number} curr - The current size
121+
* @param {number} [prev] - The previous size
122+
* @returns {string} The difference in pretty format
123+
*/
124+
function getDiff(curr, prev) {
100125
if (prev === undefined) return ''
101126
const diff = curr - prev
102127
if (diff === 0) return ''

scripts/usage-size.ts renamed to scripts/usage-size.js

+39-19
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// @ts-check
12
import { mkdir, writeFile } from 'node:fs/promises'
23
import path from 'node:path'
34
import { rollup } from 'rollup'
@@ -23,12 +24,20 @@ const {
2324
const sizeDir = path.resolve('temp/size')
2425
const entry = path.resolve('./packages/vue/dist/vue.runtime.esm-bundler.js')
2526

26-
interface Preset {
27-
name: string
28-
imports: string[]
29-
}
27+
/**
28+
* @typedef {Object} Preset
29+
* @property {string} name - The name of the preset
30+
* @property {string[]} imports - The imports that are part of this preset
31+
* @property {Record<string, string>} [replace]
32+
*/
3033

31-
const presets: Preset[] = [
34+
/** @type {Preset[]} */
35+
const presets = [
36+
{
37+
name: 'createApp (CAPI only)',
38+
imports: ['createApp'],
39+
replace: { __VUE_OPTIONS_API__: 'false' },
40+
},
3241
{ name: 'createApp', imports: ['createApp'] },
3342
{ name: 'createSSRApp', imports: ['createSSRApp'] },
3443
{ name: 'defineCustomElement', imports: ['defineCustomElement'] },
@@ -47,28 +56,45 @@ const presets: Preset[] = [
4756

4857
main()
4958

59+
/**
60+
* Main function that initiates the bundling process for the presets
61+
*/
5062
async function main() {
5163
console.log()
52-
const tasks: ReturnType<typeof generateBundle>[] = []
64+
/** @type {Promise<{name: string, size: number, gzip: number, brotli: number}>[]} */
65+
const tasks = []
5366
for (const preset of presets) {
5467
tasks.push(generateBundle(preset))
5568
}
69+
const results = await Promise.all(tasks)
5670

57-
const results = Object.fromEntries(
58-
(await Promise.all(tasks)).map(r => [r.name, r]),
59-
)
71+
for (const r of results) {
72+
console.log(
73+
`${pico.green(pico.bold(r.name))} - ` +
74+
`min:${prettyBytes(r.size, { minimumFractionDigits: 3 })} / ` +
75+
`gzip:${prettyBytes(r.gzip, { minimumFractionDigits: 3 })} / ` +
76+
`brotli:${prettyBytes(r.brotli, { minimumFractionDigits: 3 })}`,
77+
)
78+
}
6079

6180
await mkdir(sizeDir, { recursive: true })
6281
await writeFile(
6382
path.resolve(sizeDir, '_usages.json'),
64-
JSON.stringify(results, null, 2),
83+
JSON.stringify(Object.fromEntries(results.map(r => [r.name, r])), null, 2),
6584
'utf-8',
6685
)
6786
}
6887

69-
async function generateBundle(preset: Preset) {
88+
/**
89+
* Generates a bundle for a given preset
90+
*
91+
* @param {Preset} preset - The preset to generate the bundle for
92+
* @returns {Promise<{name: string, size: number, gzip: number, brotli: number}>} - The result of the bundling process
93+
*/
94+
async function generateBundle(preset) {
7095
const id = 'virtual:entry'
7196
const content = `export { ${preset.imports.join(', ')} } from '${entry}'`
97+
7298
const result = await rollup({
7399
input: id,
74100
plugins: [
@@ -89,6 +115,7 @@ async function generateBundle(preset: Preset) {
89115
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
90116
__VUE_OPTIONS_API__: 'true',
91117
preventAssignment: true,
118+
...preset.replace,
92119
}),
93120
],
94121
})
@@ -100,7 +127,7 @@ async function generateBundle(preset: Preset) {
100127
module: true,
101128
toplevel: true,
102129
})
103-
).code!
130+
).code
104131

105132
const size = minified.length
106133
const gzip = gzipSync(minified).length
@@ -110,13 +137,6 @@ async function generateBundle(preset: Preset) {
110137
await writeFile(path.resolve(sizeDir, preset.name + '.js'), bundled)
111138
}
112139

113-
console.log(
114-
`${pico.green(pico.bold(preset.name))} - ` +
115-
`min:${prettyBytes(size, { minimumFractionDigits: 3 })} / ` +
116-
`gzip:${prettyBytes(gzip, { minimumFractionDigits: 3 })} / ` +
117-
`brotli:${prettyBytes(brotli, { minimumFractionDigits: 3 })}`,
118-
)
119-
120140
return {
121141
name: preset.name,
122142
size,

0 commit comments

Comments
 (0)