diff --git a/package-lock.json b/package-lock.json index 4d3ba95..110bb1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@uschuster/webapp-scaffold", - "version": "0.3.1", + "version": "0.3.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@uschuster/webapp-scaffold", - "version": "0.3.1", + "version": "0.3.6", "license": "UNLICENSED", "bin": { "webapp-scaffold-fetch-openapi": "bin/fetch-openapi.sh", diff --git a/package.json b/package.json index 501265a..e2c77be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@uschuster/webapp-scaffold", - "version": "0.3.5", + "version": "0.3.6", "description": "Shared build scripts + Vite config factories for webapp-template-derived projects.", "type": "module", "bin": { diff --git a/src/vite-config.ts b/src/vite-config.ts index f7a3a38..edf39c2 100644 --- a/src/vite-config.ts +++ b/src/vite-config.ts @@ -6,8 +6,15 @@ // Both honour the same Apache-proxy-prefix baseUrl convention and keep // their outputs under a conventional path so the `StaticController` and // Apache vhost can serve them without per-project tweaks. +// +// VITE_BASE resolution: Vite does NOT populate `process.env.VITE_BASE` from +// .env files at config-evaluation time (those go into `import.meta.env` for +// the client bundle only). To pick up the value `new-project.sh` writes to +// `frontend/.env.production`, we use Vite's own `loadEnv()` helper. A +// `process.env.VITE_BASE` override still wins so CI invocations that +// `export VITE_BASE=…` keep working. -import type { UserConfig } from 'vite'; +import { defineConfig, loadEnv, type UserConfig } from 'vite'; import react from '@vitejs/plugin-react'; import path from 'path'; @@ -20,10 +27,15 @@ export interface AdminConfigOptions { outDir?: string; } -export function defineAdminConfig(opts: AdminConfigOptions): UserConfig { - const base = process.env.VITE_BASE || '/'; - return { - base, +function resolveBase(mode: string, root: string): string { + if (process.env.VITE_BASE) return process.env.VITE_BASE; + const env = loadEnv(mode, root, ''); + return env.VITE_BASE || '/'; +} + +export function defineAdminConfig(opts: AdminConfigOptions) { + return defineConfig(({ mode }): UserConfig => ({ + base: resolveBase(mode, opts.root), plugins: [react()], build: { outDir: opts.outDir ?? path.resolve(opts.root, '../static/dist'), @@ -33,7 +45,7 @@ export function defineAdminConfig(opts: AdminConfigOptions): UserConfig { ? { output: { manualChunks: opts.vendorChunks } } : undefined, }, - }; + })); } export interface GuestConfigOptions extends AdminConfigOptions { @@ -41,10 +53,9 @@ export interface GuestConfigOptions extends AdminConfigOptions { entry?: string; } -export function defineGuestConfig(opts: GuestConfigOptions): UserConfig { - const base = process.env.VITE_BASE || '/'; - return { - base, +export function defineGuestConfig(opts: GuestConfigOptions) { + return defineConfig(({ mode }): UserConfig => ({ + base: resolveBase(mode, opts.root), plugins: [react()], build: { outDir: opts.outDir ?? path.resolve(opts.root, '../static/guest/dist'), @@ -60,5 +71,5 @@ export function defineGuestConfig(opts: GuestConfigOptions): UserConfig { }, }, }, - }; + })); }