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
133
134
135
136
137
138
139
|
import { deleteAsync } from 'del';
import esbuild from 'esbuild';
import { copy } from 'esbuild-plugin-copy';
import { promises as fs } from 'fs';
import { dim, green, red, yellow } from 'kleur/colors';
import glob from 'tiny-glob';
import svelte from '../utils/svelte-plugin.js';
import prebuild from './prebuild.js';
/** @type {import('esbuild').BuildOptions} */
const defaultConfig = {
minify: false,
format: 'esm',
platform: 'node',
target: 'node16',
sourcemap: false,
sourcesContent: false,
};
const dt = new Intl.DateTimeFormat('en-us', {
hour: '2-digit',
minute: '2-digit',
});
function getPrebuilds(isDev, args) {
let prebuilds = [];
while (args.includes('--prebuild')) {
let idx = args.indexOf('--prebuild');
prebuilds.push(args[idx + 1]);
args.splice(idx, 2);
}
if (prebuilds.length && isDev) {
prebuilds.unshift('--no-minify');
}
return prebuilds;
}
export default async function build(...args) {
const config = Object.assign({}, defaultConfig);
const isDev = args.slice(-1)[0] === 'IS_DEV';
const prebuilds = getPrebuilds(isDev, args);
const patterns = args
.filter((f) => !!f) // remove empty args
.map((f) => f.replace(/^'/, '').replace(/'$/, '')); // Needed for Windows: glob strings contain surrounding string chars??? remove these
let entryPoints = [].concat(
...(await Promise.all(
patterns.map((pattern) => glob(pattern, { filesOnly: true, absolute: true }))
))
);
const noClean = args.includes('--no-clean-dist');
const bundle = args.includes('--bundle');
const forceCJS = args.includes('--force-cjs');
const copyWASM = args.includes('--copy-wasm');
const {
type = 'module',
version,
dependencies = {},
} = await fs.readFile('./package.json').then((res) => JSON.parse(res.toString()));
// expose PACKAGE_VERSION on process.env for CLI utils
config.define = { 'process.env.PACKAGE_VERSION': JSON.stringify(version) };
const format = type === 'module' && !forceCJS ? 'esm' : 'cjs';
const outdir = 'dist';
if (!noClean) {
await clean(outdir);
}
if (!isDev) {
await esbuild.build({
...config,
bundle,
external: bundle ? Object.keys(dependencies) : undefined,
entryPoints,
outdir,
outExtension: forceCJS ? { '.js': '.cjs' } : {},
format,
});
return;
}
const rebuildPlugin = {
name: 'astro:rebuild',
setup(build) {
build.onEnd(async (result) => {
if (prebuilds.length) {
await prebuild(...prebuilds);
}
const date = dt.format(new Date());
if (result && result.errors.length) {
console.error(dim(`[${date}] `) + red(error || result.errors.join('\n')));
} else {
if (result.warnings.length) {
console.log(
dim(`[${date}] `) + yellow('⚠ updated with warnings:\n' + result.warnings.join('\n'))
);
}
console.log(dim(`[${date}] `) + green('✔ updated'));
}
});
},
};
const builder = await esbuild.context({
...config,
entryPoints,
outdir,
format,
plugins: [
rebuildPlugin,
svelte({ isDev }),
...(copyWASM
? [
copy({
resolveFrom: 'cwd',
assets: {
from: ['./src/assets/services/vendor/squoosh/**/*.wasm'],
to: ['./dist/assets/services/vendor/squoosh'],
},
}),
]
: []),
],
});
await builder.watch();
process.on('beforeExit', () => {
builder.stop && builder.stop();
});
}
async function clean(outdir) {
await deleteAsync([`${outdir}/**`, `!${outdir}/**/*.d.ts`], {
onlyFiles: true,
});
}
|