forked from jtarrio/radioreceiver
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.mjs
115 lines (104 loc) · 3.05 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
import * as fs from "fs/promises";
import * as path from "path";
import * as esbuild from "esbuild";
import { glob } from "glob";
import esbuildPluginTsc from "esbuild-plugin-tsc";
import { program } from "commander";
import buildCommands from "./build_settings.mjs";
program.option("--clean", "Clean output directory");
program.option("--dist", "Enable distribution mode");
program.option("--no-source-maps", "Disable source maps");
program.option("--no-minify", "Disable minification");
program.parse();
const CLEAN_MODE = program.opts().clean;
const DIST_MODE = program.opts().dist;
const SOURCE_MAPS = program.opts().sourceMaps && !DIST_MODE;
const MINIFY = program.opts().minify;
function asArray(src) {
if (Array.isArray(src)) return src;
return [src];
}
async function compile(src) {
console.log(`Build ${src}`);
let assetPrefix = src.substring(0, src.indexOf("/"));
return esbuild.build({
entryPoints: [src],
outdir: "dist",
outbase: ".",
assetNames: `${assetPrefix}/assets/[name]-[hash]`,
bundle: true,
minify: MINIFY,
treeShaking: true,
sourcemap: SOURCE_MAPS,
loader: {
".html": "copy",
".png": "copy",
".ttf": "file",
".woff": "file",
".woff2": "file",
},
plugins: [esbuildPluginTsc({ force: true })],
});
}
async function copyDir(src, dest) {
console.log(`Copy ${src} to ${dest}`);
return fs.cp(src, dest, { recursive: true });
}
async function copy(src, base, dest) {
let srcFiles = await glob(src, { nodir: true });
if (srcFiles.length == 0) {
console.log(`Warning: no files matched for ${src.join(", ")}`);
return;
}
for (let src of srcFiles) {
let relative = path.relative(base, src);
let target = path.resolve(dest, relative);
console.log(`Copying ${src} to ${target}`);
await fs.mkdir(path.dirname(target), { recursive: true });
await fs.copyFile(src, target);
}
}
async function run(cmd) {
if (Array.isArray(cmd)) {
for (let c of cmd) {
await run(c);
}
} else if (cmd.compile !== undefined) {
let src = asArray(cmd.compile);
let allNames = await Promise.allSettled(
src.map((p) => glob(p, { nodir: true }))
);
let allBuilds = allNames
.filter((p) => p.status == "fulfilled")
.flatMap((p) => p.value)
.map(compile);
await Promise.allSettled(allBuilds);
} else if (cmd.copyDir !== undefined) {
let srcs = asArray(cmd.copyDir);
let dests = asArray(cmd.to);
await Promise.allSettled(
srcs.flatMap((src) => dests.map((dest) => copyDir(src, dest)))
);
} else if (cmd.copy !== undefined) {
let srcs = asArray(cmd.copy);
let base = cmd.base;
let dests = asArray(cmd.to);
await Promise.allSettled(dests.map((dest) => copy(srcs, base, dest)));
} else {
throw `Unknown command: ${JSON.stringify(cmd)}`;
}
}
async function main() {
let actions = {
clean: DIST_MODE || CLEAN_MODE,
build: !CLEAN_MODE,
};
if (actions.clean) {
await fs.rm("dist", {
force: true,
recursive: true,
});
}
if (actions.build) run(buildCommands);
}
main();