Repository navigation
Expand file tree
/
Copy pathbuild-static.js
More file actions
78 lines (64 loc) · 2.56 KB
/
Copy pathbuild-static.js
File metadata and controls
78 lines (64 loc) · 2.56 KB
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
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { extract } from "tar";
const REGISTRY = "https://registry.npmjs.org";
const DIST = path.resolve("build");
const TMP = await fs.mkdtemp(path.join(os.tmpdir(), "scramjet-"));
async function getPkg(name, version = "latest") {
const res = await fetch(`${REGISTRY}/${name}`);
const data = await res.json();
if (version !== "latest" && !version.includes(".")) {
version = Object.keys(data.versions)
.filter((v) => v.startsWith(`${version}.`))
.sort((a, b) => b.localeCompare(a, undefined, { numeric: true }))[0];
} else if (version === "latest") {
version = data["dist-tags"].latest;
}
return data.versions[version];
}
async function download(url, name) {
const res = await fetch(url);
const tgz = path.join(TMP, `${name}.tgz`);
const dest = path.join(TMP, name);
await fs.writeFile(tgz, Buffer.from(await res.arrayBuffer()));
await fs.mkdir(dest, { recursive: true });
await extract({ f: tgz, cwd: dest });
return path.join(dest, "package/dist");
}
try {
const controller = await getPkg("@mercuryworkshop/scramjet-controller", "0");
const scramjetVer = controller.devDependencies["@mercuryworkshop/scramjet"];
const [scramjet, utils] = await Promise.all([
getPkg("@mercuryworkshop/scramjet", scramjetVer),
getPkg("@mercuryworkshop/scramjet-utils", "0"),
]);
const [scramjetDir, controllerDir, utilsDir] = await Promise.all([
download(scramjet.dist.tarball, "scramjet"),
download(controller.dist.tarball, "controller"),
download(utils.dist.tarball, "utils"),
]);
const files = {
"scramjet/scramjet.js": `${scramjetDir}/scramjet.js`,
"scramjet/scramjet.wasm": `${scramjetDir}/scramjet.wasm`,
"scramjet/scramjet-utils.js": `${utilsDir}/scramjet-utils.js`,
"controller/controller.api.js": `${controllerDir}/controller.api.js`,
"controller/controller.sw.js": `${controllerDir}/controller.sw.js`,
"controller/controller.inject.js": `${controllerDir}/controller.inject.js`,
};
for (const [out, src] of Object.entries(files)) {
const target = path.join(DIST, out);
await fs.mkdir(path.dirname(target), { recursive: true });
await fs.copyFile(src, target);
}
const swCode = `importScripts("./controller/controller.sw.js");
addEventListener("fetch", (e) => {
if ($scramjetController.shouldRoute(e)) {
e.respondWith($scramjetController.route(e));
}
});
`;
await fs.writeFile(path.join(DIST, "sw.js"), swCode, "utf-8");
} finally {
await fs.rm(TMP, { recursive: true, force: true });
}