-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathesbuild.mjs
104 lines (93 loc) · 2.4 KB
/
esbuild.mjs
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
import child_process from 'child_process'
import * as esbuild from 'esbuild'
import fs from 'fs/promises'
import path from 'path'
const production = process.argv.includes('--production')
const watch = process.argv.includes('--watch')
const minify = process.argv.includes('--minify')
const packages = process.argv.includes('--packages')
/**
* @type {import('esbuild').Plugin}
*/
const esbuildProblemMatcherPlugin = {
name: 'esbuild-problem-matcher',
setup(build) {
build.onStart(() => {
console.log('[watch] build started')
})
build.onEnd((result) => {
result.errors.forEach(({ text, location }) => {
console.error(`✘ [ERROR] ${text}`)
console.error(` ${location.file}:${location.line}:${location.column}:`)
})
console.log('[watch] build finished')
})
},
}
const ctx = await esbuild.context({
entryPoints: [
'src/extension.ts',
],
bundle: true,
format: 'cjs',
minify: minify || production,
sourcemap: !production,
sourcesContent: false,
platform: 'node',
target: 'es2022',
outfile: 'dist/extension.js',
external: [
'vscode',
'usb',
'serialport',
],
logLevel: 'silent',
plugins: [
esbuildProblemMatcherPlugin,
],
})
if (packages) {
await fs.mkdir('dist', { recursive: true })
await buildPackageJson('package.json', 'dist/package.json')
await fs.copyFile('package-lock.json', 'dist/package-lock.json')
await child_process.spawn('npm', ['install', '--ignore-scripts', '--omit', 'dev'], {
cwd: 'dist',
stdio: 'inherit',
})
}
if (watch) {
await ctx.watch()
} else {
await ctx.rebuild()
await ctx.dispose()
}
async function buildPackageJson(src, dst) {
function merge(o, i) {
for (const k in i) {
if (typeof o[k] === 'object' && typeof i[k] === 'object') {
merge(o[k], i[k])
} else if (!(k in o)) {
o[k] = i[k]
}
}
}
async function process(o, relativeTo) {
const inc = o.$$include
delete o.$$include
delete o.$schema
for (const k in o) {
if (typeof o[k] === 'object') {
await process(o[k], relativeTo)
}
}
if (inc) {
const p = path.join(path.dirname(relativeTo), inc)
const i = JSON.parse(await fs.readFile(p))
await process(i, p)
merge(o, i)
}
}
const pkg = JSON.parse(await fs.readFile(src))
await process(pkg, src)
await fs.writeFile(dst, JSON.stringify(pkg, undefined, 2))
}