104 lines
2.7 KiB
TypeScript
104 lines
2.7 KiB
TypeScript
import { spawn } from "bun";
|
|
import { dir } from "dir";
|
|
import { Plugin, context } from "esbuild";
|
|
import { $ } from "execa";
|
|
import { removeAsync, writeAsync } from "fs-jetpack";
|
|
|
|
// await removeAsync(dir.path("app/static"));
|
|
// await removeAsync(dir.path("app/web/.parcel-cache"));
|
|
// await removeAsync(dir.path("app/static"));
|
|
|
|
// const args = [
|
|
// "node",
|
|
// dir.path("node_modules/.bin/parcel"),
|
|
// "build",
|
|
// "./src/index.tsx",
|
|
// // "--no-optimize",
|
|
// "--no-scope-hoist",
|
|
// "--dist-dir",
|
|
// dir.path(`app/static`),
|
|
// ];
|
|
|
|
// const parcel = spawn({
|
|
// cmd: args,
|
|
// cwd: dir.path("app/web"),
|
|
// stdio: ["ignore", "inherit", "inherit"],
|
|
// });
|
|
// await parcel.exited;
|
|
|
|
// listAsync(dir.path("app/static")).then(async (files) => {
|
|
// if (files) {
|
|
// await removeAsync(dir.path("app/static-br"));
|
|
// await Promise.all(
|
|
// files
|
|
// .filter((e) => statSync(dir.path(`app/static/${e}`)).isFile())
|
|
// .map(async (file) => {
|
|
// const br = brotli.compress(
|
|
// new Uint8Array(
|
|
// await Bun.file(dir.path(`app/static/${file}`)).arrayBuffer()
|
|
// )
|
|
// );
|
|
// if (br) {
|
|
// console.log(`Compressing ${file}`);
|
|
// await writeAsync(
|
|
// dir.path(`app/static-br/${file}`),
|
|
// Buffer.from(br)
|
|
// );
|
|
// }
|
|
// })
|
|
// );
|
|
// }
|
|
// });
|
|
|
|
const buildSite = async () => {
|
|
await removeAsync(dir.path("app/srv/site"));
|
|
const onEndPlugin: Plugin = {
|
|
name: "on-end",
|
|
setup(build) {
|
|
build.onEnd(async (result) => {
|
|
console.log("Compressing deploy");
|
|
await removeAsync(dir.path("app/srv/site.zip"));
|
|
await $({ cwd: dir.path("app/srv") })`zip -r site.zip site`;
|
|
process.exit(0);
|
|
});
|
|
},
|
|
};
|
|
|
|
console.log("Building deploy");
|
|
const ctx = await context({
|
|
bundle: true,
|
|
absWorkingDir: dir.path(""),
|
|
entryPoints: [dir.path("app/web/src/render/site/site.tsx")],
|
|
outdir: dir.path("app/srv/site"),
|
|
splitting: true,
|
|
format: "esm",
|
|
jsx: "transform",
|
|
minify: true,
|
|
sourcemap: true,
|
|
logLevel: "error",
|
|
plugins: [onEndPlugin],
|
|
define: {
|
|
"process.env.NODE_ENV": `"production"`,
|
|
},
|
|
});
|
|
await ctx.rebuild();
|
|
await writeAsync(
|
|
dir.path("app/srv/site/index.html"),
|
|
`
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title></title>
|
|
<link rel="stylesheet" href="https://prasi.app/index.css">
|
|
</head>
|
|
<body class="flex-col flex-1 w-full min-h-screen flex opacity-0">
|
|
<div id="root"></div>
|
|
<script src="/site.js" type="module"></script>
|
|
</body>
|
|
</html>`
|
|
);
|
|
};
|
|
await buildSite();
|