48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { defineConfig, Plugin } from "vite";
|
|
import react from "@vitejs/plugin-react";
|
|
import { viteSingleFile } from "vite-plugin-singlefile";
|
|
import { existsSync, renameSync, rmSync } from "fs";
|
|
import { resolve } from "path";
|
|
|
|
const app = process.env.APP;
|
|
|
|
if (!app) {
|
|
throw new Error("APP environment variable must be set");
|
|
}
|
|
|
|
const outDir = resolve(__dirname, "../pkg/github/ui_dist");
|
|
|
|
// vite-plugin-singlefile inlines all JS/CSS into the HTML, but Vite preserves
|
|
// the input file's relative path in the output (src/apps/<app>/index.html).
|
|
// After the bundle is written, hoist that file to <outDir>/<app>.html and
|
|
// remove the now-empty nested directories. Done in closeBundle (post-write)
|
|
// because Rolldown disallows mutating the in-memory bundle in generateBundle.
|
|
function flattenOutput(): Plugin {
|
|
return {
|
|
name: "flatten-output",
|
|
enforce: "post",
|
|
closeBundle() {
|
|
const nested = resolve(outDir, `src/apps/${app}/index.html`);
|
|
const flat = resolve(outDir, `${app}.html`);
|
|
if (!existsSync(nested)) {
|
|
throw new Error(
|
|
`flatten-output: expected built HTML at ${nested} for app "${app}" but it was not emitted`,
|
|
);
|
|
}
|
|
renameSync(nested, flat);
|
|
rmSync(resolve(outDir, "src"), { recursive: true, force: true });
|
|
},
|
|
};
|
|
}
|
|
|
|
export default defineConfig({
|
|
plugins: [react(), viteSingleFile(), flattenOutput()],
|
|
build: {
|
|
outDir,
|
|
emptyOutDir: false,
|
|
rollupOptions: {
|
|
input: resolve(__dirname, `src/apps/${app}/index.html`),
|
|
},
|
|
},
|
|
});
|