import { defineConfig } from "vite";
import solidPlugin from "vite-plugin-solid";
import devtools from "solid-devtools/vite";
import tsconfigPaths from "vite-tsconfig-paths";
import oauthMetadata from "./src/lib/oauthMetadata.json";
export const makeOauthMetadata = (
client_id: string,
client_uri: string,
redirect_uri: string,
scope: string,
) => ({
...oauthMetadata,
client_id,
client_uri,
logo_uri: `${client_uri}/favicon.png`,
redirect_uris: [redirect_uri],
scope,
});
export default defineConfig({
plugins: [
{
name: "oauth-metadata",
config(_conf, { command }) {
if (command !== "build") {
process.env.VITE_CLIENT_URI = "http://localhost:3000";
const redirectUri = "http://127.0.0.1:3000";
process.env.VITE_OAUTH_REDIRECT_URL = redirectUri;
const scope = oauthMetadata.scope;
process.env.VITE_OAUTH_SCOPE = scope;
process.env.VITE_OAUTH_CLIENT_ID =
`http://localhost` +
`?redirect_uri=${encodeURIComponent(redirectUri)}` +
`&scope=${encodeURIComponent(scope)}`;
}
},
configureServer(server) {
server.middlewares.use((req, res, next) => {
if (req.headers.host?.startsWith("127.0.0.1")) {
const newUrl = `http://localhost:${req.headers.host.split(":")[1] || "3000"}${req.url}`;
res.writeHead(301, { Location: newUrl });
res.end();
return;
}
next();
});
server.middlewares.use((req, res, next) => {
if (req.url === "/oauth-client-metadata.json") {
res.setHeader("Content-Type", "application/json");
res.end(
JSON.stringify(
makeOauthMetadata(
process.env.VITE_OAUTH_CLIENT_ID!,
process.env.VITE_CLIENT_URI!,
process.env.VITE_OAUTH_REDIRECT_URL!,
process.env.VITE_OAUTH_SCOPE!,
),
null,
2,
),
);
return;
}
next();
});
},
generateBundle() {
this.emitFile({
type: "asset",
fileName: "oauth-client-metadata.json",
source: JSON.stringify(
makeOauthMetadata(
process.env.VITE_OAUTH_CLIENT_ID!,
process.env.VITE_CLIENT_URI!,
process.env.VITE_OAUTH_REDIRECT_URL!,
process.env.VITE_OAUTH_SCOPE!,
),
null,
2,
),
});
},
},
devtools(),
solidPlugin(),
tsconfigPaths({ root: "./" }),
],
server: {
host: "0.0.0.0",
port: 3000,
},
build: {
target: "esnext",
},
});