-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbuild.mjs
122 lines (108 loc) · 3.09 KB
/
build.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import archiver from 'archiver'
import autoprefixer from 'autoprefixer'
import * as dotenv from 'dotenv'
import esbuild from 'esbuild'
import copyStaticFiles from 'esbuild-copy-static-files'
import postcssPlugin from 'esbuild-style-plugin'
import fs from 'fs-extra'
import process from 'node:process'
import tailwindcss from 'tailwindcss'
dotenv.config()
const outdir = 'build'
async function deleteOldDir() {
await fs.remove(outdir)
}
async function runEsbuild() {
await esbuild.build({
entryPoints: [
'src/content-script/index.tsx',
'src/background/index.ts',
'src/options/index.tsx',
'src/popup/index.tsx',
],
bundle: true,
outdir: outdir,
treeShaking: true,
minify: true,
drop: ['console', 'debugger'],
legalComments: 'none',
define: {
'process.env.NODE_ENV': '"production"',
'process.env.AXIOM_TOKEN': JSON.stringify(process.env.AXIOM_TOKEN || 'UNDEFINED'),
},
jsxFactory: 'h',
jsxFragment: 'Fragment',
jsx: 'automatic',
loader: {
'.png': 'dataurl',
'.svg': 'dataurl',
'.ttf': 'dataurl',
'.woff': 'dataurl',
'.woff2': 'dataurl',
},
plugins: [
copyStaticFiles({
src: './public',
dest: 'build/.',
dereference: true,
errorOnExist: false,
preserveTimestamps: true,
recursive: true,
}),
postcssPlugin({
postcss: {
plugins: [tailwindcss, autoprefixer],
},
}),
],
})
}
async function zipFolder(dir) {
const output = fs.createWriteStream(`${dir}.zip`)
const archive = archiver('zip', {
zlib: { level: 9 },
})
archive.pipe(output)
archive.directory(dir, false)
await archive.finalize()
}
async function copyFiles(entryPoints, targetDir) {
await fs.ensureDir(targetDir)
await Promise.all(
entryPoints.map(async (entryPoint) => {
await fs.copy(entryPoint.src, `${targetDir}/${entryPoint.dst}`)
}),
)
}
async function build() {
await deleteOldDir()
await runEsbuild()
const commonFiles = [
{ src: 'build/content-script/index.js', dst: 'content-script.js' },
{ src: 'build/content-script/index.css', dst: 'content-script.css' },
{ src: 'build/background/index.js', dst: 'background.js' },
{ src: 'build/options/index.js', dst: 'options.js' },
{ src: 'build/options/index.css', dst: 'options.css' },
{ src: 'src/options/index.html', dst: 'options.html' },
{ src: 'build/popup/index.js', dst: 'popup.js' },
{ src: 'build/popup/index.css', dst: 'popup.css' },
{ src: 'src/popup/index.html', dst: 'popup.html' },
{ src: 'src/logo.png', dst: 'logo.png' },
{ src: 'src/_locales', dst: '_locales' },
{ src: 'build/js', dst: 'js' },
]
// chromium
await copyFiles(
[...commonFiles, { src: 'src/manifest.json', dst: 'manifest.json' }],
`./${outdir}/chromium`,
)
await zipFolder(`./${outdir}/chromium`)
// firefox
await copyFiles(
[...commonFiles, { src: 'src/manifest.v2.json', dst: 'manifest.json' }],
`./${outdir}/firefox`,
)
await zipFolder(`./${outdir}/firefox`)
console.log('Build success.')
}
build()