-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
build.js
116 lines (100 loc) · 3.87 KB
/
build.js
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
let fs = require('fs');
let DotJson = require('dot-json');
let brotliSize = require('brotli-size');
([
// Packages:
'alpinejs',
'csp',
'history',
'intersect',
'persist',
'collapse',
'morph',
'focus',
]).forEach(package => {
if (! fs.existsSync(`./packages/${package}/dist`)) {
fs.mkdirSync(`./packages/${package}/dist`, 0744);
}
// Go through each file in the package's "build" directory
// and use the appropriate bundling strategy based on its name.
fs.readdirSync(`./packages/${package}/builds`).forEach(file => {
bundleFile(package, file)
});
})
function bundleFile(package, file) {
// Based on the filename, give esbuild a specific configuration to build.
({
// This output file is meant to be loaded in a browser's <script> tag.
'cdn.js': () => {
build({
entryPoints: [`packages/${package}/builds/${file}`],
outfile: `packages/${package}/dist/${file}`,
bundle: true,
platform: 'browser',
define: { CDN: true },
})
// Build a minified version.
build({
entryPoints: [`packages/${package}/builds/${file}`],
outfile: `packages/${package}/dist/${file.replace('.js', '.min.js')}`,
bundle: true,
minify: true,
platform: 'browser',
define: { CDN: true },
}).then(() => {
outputSize(package, `packages/${package}/dist/${file.replace('.js', '.min.js')}`)
})
},
// This file outputs two files: an esm module and a cjs module.
// The ESM one is meant for "import" statements (bundlers and new browsers)
// and the cjs one is meant for "require" statements (node).
'module.js': () => {
build({
entryPoints: [`packages/${package}/builds/${file}`],
outfile: `packages/${package}/dist/${file.replace('.js', '.esm.js')}`,
bundle: true,
platform: 'neutral',
mainFields: ['module', 'main'],
})
build({
entryPoints: [`packages/${package}/builds/${file}`],
outfile: `packages/${package}/dist/${file.replace('.js', '.cjs.js')}`,
bundle: true,
target: ['node10.4'],
platform: 'node',
}).then(() => {
writeToPackageDotJson(package, 'main', `dist/${file.replace('.js', '.cjs.js')}`)
writeToPackageDotJson(package, 'module', `dist/${file.replace('.js', '.esm.js')}`)
})
},
})[file]()
}
function build(options) {
options.define || (options.define = {})
options.define['ALPINE_VERSION'] = `'${getFromPackageDotJson('alpinejs', 'version')}'`
options.define['process.env.NODE_ENV'] = process.argv.includes('--watch') ? `'production'` : `'development'`
return require('esbuild').build({
watch: process.argv.includes('--watch'),
// external: ['alpinejs'],
...options,
}).catch(() => process.exit(1))
}
function writeToPackageDotJson(package, key, value) {
let dotJson = new DotJson(`./packages/${package}/package.json`)
dotJson.set(key, value).save()
}
function getFromPackageDotJson(package, key) {
let dotJson = new DotJson(`./packages/${package}/package.json`)
return dotJson.get(key)
}
function outputSize(package, file) {
let size = bytesToSize(brotliSize.sync(fs.readFileSync(file)))
console.log("\x1b[32m", `${package}: ${size}`)
}
function bytesToSize(bytes) {
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']
if (bytes === 0) return 'n/a'
const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10)
if (i === 0) return `${bytes} ${sizes[i]}`
return `${(bytes / (1024 ** i)).toFixed(1)} ${sizes[i]}`
}