From c1ee2d54f9813d95a4ada362b8a942262dd1cb99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl?= Date: Sat, 28 Feb 2026 00:16:16 -0300 Subject: [PATCH] Vite proxy: use VITE_API_URL from .env, forward Host/Proto for NIP-98 Made-with: Cursor --- frontend/package-lock.json | 18 +++++++++ frontend/package.json | 1 + frontend/tsconfig.node.json | 3 +- frontend/vite.config.ts | 81 +++++++++++++++++++++++-------------- 4 files changed, 72 insertions(+), 31 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1cbcb4b..17eccdc 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -18,6 +18,7 @@ }, "devDependencies": { "@types/canvas-confetti": "^1.9.0", + "@types/node": "^22.10.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/react-router-dom": "^5.3.3", @@ -1247,6 +1248,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "22.19.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.13.tgz", + "integrity": "sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", @@ -2134,6 +2145,13 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index cd0bbd9..a969712 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,6 +18,7 @@ "react-router-dom": "^7.13.1" }, "devDependencies": { + "@types/node": "^22.10.0", "@types/canvas-confetti": "^1.9.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json index e9387e3..9767e3d 100644 --- a/frontend/tsconfig.node.json +++ b/frontend/tsconfig.node.json @@ -3,7 +3,8 @@ "target": "ES2022", "lib": ["ES2023"], "module": "ESNext", - "skipLibCheck": true + "skipLibCheck": true, + "types": ["node"] }, "include": ["vite.config.ts"] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 29a07cb..bca25f3 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,37 +1,58 @@ -import { defineConfig } from "vite"; +import { defineConfig, loadEnv } from "vite"; import react from "@vitejs/plugin-react"; -export default defineConfig({ - plugins: [react()], - build: { - sourcemap: false, - rollupOptions: { - output: { - manualChunks: { - vendor: ["react", "react-dom", "react-router-dom"], - nostr: ["nostr-tools"], - ui: ["framer-motion", "qrcode", "canvas-confetti"], +/** Proxy config that forwards client Host/Proto so NIP-98 URL validation matches. */ +function proxyToBackendWithForwarded(backendTarget: string) { + return { + target: backendTarget, + changeOrigin: true, + configure: (proxy) => { + proxy.on("proxyReq", (proxyReq, req) => { + const host = (req.headers.host as string) || ""; + const proto = (req.headers["x-forwarded-proto"] as string) || "http"; + proxyReq.setHeader("X-Forwarded-Host", host); + proxyReq.setHeader("X-Forwarded-Proto", proto); + }); + }, + }; +} + +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), ""); + const backendTarget = env.VITE_API_URL || "http://localhost:3001"; + + return { + plugins: [react()], + build: { + sourcemap: false, + rollupOptions: { + output: { + manualChunks: { + vendor: ["react", "react-dom", "react-router-dom"], + nostr: ["nostr-tools"], + ui: ["framer-motion", "qrcode", "canvas-confetti"], + }, }, }, }, - }, - preview: { - allowedHosts: ["faucet.lnpulse.app"], - }, - server: { - port: 5173, - proxy: { - "/api": { - target: "http://localhost:3001", - changeOrigin: true, - rewrite: (path) => path.replace(/^\/api/, ""), - }, - "/claim": { target: "http://localhost:3001", changeOrigin: true }, - "/auth": { target: "http://localhost:3001", changeOrigin: true }, - "/user": { target: "http://localhost:3001", changeOrigin: true }, - "/config": { target: "http://localhost:3001", changeOrigin: true }, - "/stats": { target: "http://localhost:3001", changeOrigin: true }, - "/deposit": { target: "http://localhost:3001", changeOrigin: true }, + preview: { + allowedHosts: ["faucet.lnpulse.app"], }, - }, + server: { + port: 5173, + proxy: { + "/api": { + target: backendTarget, + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ""), + }, + "/claim": proxyToBackendWithForwarded(backendTarget), + "/auth": proxyToBackendWithForwarded(backendTarget), + "/user": proxyToBackendWithForwarded(backendTarget), + "/config": { target: backendTarget, changeOrigin: true }, + "/stats": { target: backendTarget, changeOrigin: true }, + "/deposit": { target: backendTarget, changeOrigin: true }, + }, + }, + }; });