-
Notifications
You must be signed in to change notification settings - Fork 169
Expand file tree
/
Copy pathbuild.config.mjs
More file actions
132 lines (121 loc) · 3.6 KB
/
build.config.mjs
File metadata and controls
132 lines (121 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import * as esbuild from 'esbuild'
import { cpSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'
import { join } from 'path'
import { execSync } from 'child_process'
const dev = process.argv.includes('--watch')
const OUT = process.env.HS_OUT_DIR || 'dist'
const coreEntry = ['src/_hyperscript.js']
const extEntries = [
'src/ext/hdb.js',
'src/ext/component.js',
'src/ext/socket.js',
'src/ext/worker.js',
'src/ext/eventsource.js',
'src/ext/tailwind.js',
]
const shared = {
bundle: true,
sourcemap: true,
platform: 'browser',
target: 'es2022',
}
function builds(entryPoints, outOptions) {
return [
// IIFE (default - plain <script> tag)
{
...shared,
format: 'iife',
entryPoints,
...outOptions.iife,
},
// ESM (import)
{
...shared,
format: 'esm',
entryPoints,
...outOptions.esm,
},
// IIFE minified
{
...shared,
format: 'iife',
minify: true,
sourcemap: false,
entryPoints,
...outOptions.iifeMin,
},
// ESM minified
{
...shared,
format: 'esm',
minify: true,
sourcemap: false,
entryPoints,
...outOptions.esmMin,
},
]
}
const maxEntry = ['src/_hyperscript-max.js']
const coreBuildConfigs = builds(coreEntry, {
iife: { outfile: `${OUT}/_hyperscript.js` },
esm: { outfile: `${OUT}/_hyperscript.esm.js` },
iifeMin: { outfile: `${OUT}/_hyperscript.min.js` },
esmMin: { outfile: `${OUT}/_hyperscript.esm.min.js` },
})
const maxBuildConfigs = [
{ ...shared, format: 'iife', entryPoints: maxEntry, outfile: `${OUT}/_hyperscript-max.js` },
{ ...shared, format: 'iife', minify: true, sourcemap: false, entryPoints: maxEntry, outfile: `${OUT}/_hyperscript-max.min.js` },
]
const extBuildConfigs = builds(extEntries, {
iife: { outdir: `${OUT}/ext` },
esm: { outdir: `${OUT}/ext`, outExtension: { '.js': '.esm.js' } },
iifeMin: { outdir: `${OUT}/ext`, outExtension: { '.js': '.min.js' } },
esmMin: { outdir: `${OUT}/ext`, outExtension: { '.js': '.esm.min.js' } },
})
function brotliCompress() {
const minFiles = [
`${OUT}/_hyperscript.min.js`,
`${OUT}/_hyperscript.esm.min.js`,
`${OUT}/_hyperscript-max.min.js`,
]
// Add extension min files
for (const f of readdirSync(`${OUT}/ext`)) {
if (f.endsWith('.min.js')) {
minFiles.push(`${OUT}/ext/` + f)
}
}
for (const f of minFiles) {
execSync(`brotli -f ${f}`)
}
}
function copyPlatformScripts() {
mkdirSync(`${OUT}/platform`, { recursive: true })
cpSync('src/platform', `${OUT}/platform`, { recursive: true })
// In src/, `../_hyperscript.js` resolves to the ESM source entry.
// In dist/, the equivalent ESM bundle is `_hyperscript.esm.js` — `_hyperscript.js`
// is the IIFE build and has no exports. Rewrite the import path on copy.
for (const name of readdirSync(`${OUT}/platform`)) {
if (!name.endsWith('.js')) continue
const p = join(OUT, 'platform', name)
const src = readFileSync(p, 'utf8')
const fixed = src.replaceAll("'../_hyperscript.js'", "'../_hyperscript.esm.js'")
if (fixed !== src) writeFileSync(p, fixed)
}
}
if (dev) {
// Watch mode - just build IIFE for speed
const ctx = await esbuild.context({
...shared,
format: 'iife',
entryPoints: coreEntry,
outfile: `${OUT}/_hyperscript.js`,
})
await ctx.watch()
console.log(`Watching src/ for changes...`)
} else {
const allConfigs = [...coreBuildConfigs, ...maxBuildConfigs, ...extBuildConfigs]
await Promise.all(allConfigs.map(c => esbuild.build(c)))
copyPlatformScripts()
brotliCompress()
console.log(`Built ${OUT}/`)
}