diff --git a/package.json b/package.json index 6f38c48d02..e1f13fd6dc 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,9 @@ "name": "stoat-for-web", "version": "0.9.1", "description": "Stoat for Web: frontend software for Stoat", + "dependencies": { + "dotenv": "^17.4.2" + }, "devDependencies": { "@eslint/js": "^9.39.1", "eslint": "^9.26.0", diff --git a/packages/client/app-config.plugin.ts b/packages/client/app-config.plugin.ts new file mode 100644 index 0000000000..b389b6cd4b --- /dev/null +++ b/packages/client/app-config.plugin.ts @@ -0,0 +1,39 @@ +import { PluginOption } from "vite"; + +//Load .env file +import dotenv from "dotenv"; +dotenv.config({ quiet: true }); + +import CONFIGURATION, { AppConfig } from "./components/common/lib/env"; + +//Data for public config endpoint +const appCfg = JSON.stringify({ + api: CONFIGURATION.DEFAULT_API_URL, + gifbox: CONFIGURATION.DEFAULT_GIFBOX_URL, +} as AppConfig); + +export default function appConfigPlugin(): PluginOption { + return { + name: "app-config", + //For dev / serve mode + configureServer(server) { + server.middlewares.use("/stoat-config.json", (_, res) => { + res.writeHead(200, { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }); + res.end(appCfg); + }); + }, + //For static build + buildStart() { + //TODO: This throws warning "context method emitFile() is not supported in serve mode. This plugin is likely not vite-compatible." + //Need to add a conditional and detect serve mode somehow + this.emitFile({ + fileName: "stoat-config.json", + source: appCfg, + type: "asset", + }); + }, + }; +} diff --git a/packages/client/components/common/lib/env.ts b/packages/client/components/common/lib/env.ts index 73d85d54ca..73c51c0d99 100644 --- a/packages/client/components/common/lib/env.ts +++ b/packages/client/components/common/lib/env.ts @@ -1,7 +1,19 @@ +export const STOAT_API = "https://api.stoat.chat"; + +//Run in NodeJS mode +if (!("env" in import.meta)) + (import.meta as { env: NodeJS.ProcessEnv }).env = process.env; + +/** App `/.stoat-config` endpoint response */ +export interface AppConfig { + api: string; + gifbox: string; +} + const DEFAULT_API_URL = (import.meta.env.DEV ? import.meta.env.VITE_DEV_API_URL : undefined) ?? (import.meta.env.VITE_API_URL as string) ?? - "https://stoat.chat/api"; + STOAT_API; export default { /** @@ -22,6 +34,7 @@ export default { "https://revolt.chat/api", // ... and now: "https://stoat.chat/api", + STOAT_API, ].includes(DEFAULT_API_URL), /** * What WS server to connect to by default. diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts index d868fd8b69..79343efdac 100644 --- a/packages/client/vite.config.ts +++ b/packages/client/vite.config.ts @@ -9,6 +9,7 @@ import { VitePWA } from "vite-plugin-pwa"; import solidPlugin from "vite-plugin-solid"; import solidSvg from "vite-plugin-solid-svg"; +import appConfigPlugin from "./app-config.plugin"; import codegenPlugin from "./codegen.plugin"; const base = process.env.BASE_PATH ?? "/"; @@ -19,6 +20,7 @@ export default defineConfig({ Inspect(), devtools(), codegenPlugin(), + appConfigPlugin(), babelMacrosPlugin(), linguiSolidPlugin(), solidPlugin(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5386a76df4..a1c17ba6d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,10 @@ overrides: importers: .: + dependencies: + dotenv: + specifier: ^17.4.2 + version: 17.4.2 devDependencies: '@eslint/js': specifier: ^9.39.1 @@ -4416,6 +4420,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -11773,6 +11781,8 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dotenv@17.4.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2