#6: Use Vite's loadEnv() for VITE_BASE so .env.production actually wins
defineAdminConfig / defineGuestConfig were reading process.env.VITE_BASE, but Vite does NOT populate process.env from .env files at config-evaluation time — those go into import.meta.env for the client bundle only. So the VITE_BASE that new-project.sh writes to frontend/.env.production was silently ignored, base fell back to '/', and SPA assets 404'd behind the Apache /projects/<name>/ proxy prefix (blank page on every public route). Switch both factories to Vite's defineConfig + loadEnv pattern. A process.env.VITE_BASE override still wins so CI invocations that explicitly export the variable keep working. Bumps to 0.3.6. Closes #6 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5b0bec8850
commit
b1a13b83fd
3 changed files with 25 additions and 14 deletions
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "@uschuster/webapp-scaffold",
|
"name": "@uschuster/webapp-scaffold",
|
||||||
"version": "0.3.1",
|
"version": "0.3.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@uschuster/webapp-scaffold",
|
"name": "@uschuster/webapp-scaffold",
|
||||||
"version": "0.3.1",
|
"version": "0.3.6",
|
||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"bin": {
|
"bin": {
|
||||||
"webapp-scaffold-fetch-openapi": "bin/fetch-openapi.sh",
|
"webapp-scaffold-fetch-openapi": "bin/fetch-openapi.sh",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@uschuster/webapp-scaffold",
|
"name": "@uschuster/webapp-scaffold",
|
||||||
"version": "0.3.5",
|
"version": "0.3.6",
|
||||||
"description": "Shared build scripts + Vite config factories for webapp-template-derived projects.",
|
"description": "Shared build scripts + Vite config factories for webapp-template-derived projects.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,15 @@
|
||||||
// Both honour the same Apache-proxy-prefix baseUrl convention and keep
|
// Both honour the same Apache-proxy-prefix baseUrl convention and keep
|
||||||
// their outputs under a conventional path so the `StaticController` and
|
// their outputs under a conventional path so the `StaticController` and
|
||||||
// Apache vhost can serve them without per-project tweaks.
|
// 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 react from '@vitejs/plugin-react';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
|
|
@ -20,10 +27,15 @@ export interface AdminConfigOptions {
|
||||||
outDir?: string;
|
outDir?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function defineAdminConfig(opts: AdminConfigOptions): UserConfig {
|
function resolveBase(mode: string, root: string): string {
|
||||||
const base = process.env.VITE_BASE || '/';
|
if (process.env.VITE_BASE) return process.env.VITE_BASE;
|
||||||
return {
|
const env = loadEnv(mode, root, '');
|
||||||
base,
|
return env.VITE_BASE || '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
export function defineAdminConfig(opts: AdminConfigOptions) {
|
||||||
|
return defineConfig(({ mode }): UserConfig => ({
|
||||||
|
base: resolveBase(mode, opts.root),
|
||||||
plugins: [react()],
|
plugins: [react()],
|
||||||
build: {
|
build: {
|
||||||
outDir: opts.outDir ?? path.resolve(opts.root, '../static/dist'),
|
outDir: opts.outDir ?? path.resolve(opts.root, '../static/dist'),
|
||||||
|
|
@ -33,7 +45,7 @@ export function defineAdminConfig(opts: AdminConfigOptions): UserConfig {
|
||||||
? { output: { manualChunks: opts.vendorChunks } }
|
? { output: { manualChunks: opts.vendorChunks } }
|
||||||
: undefined,
|
: undefined,
|
||||||
},
|
},
|
||||||
};
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface GuestConfigOptions extends AdminConfigOptions {
|
export interface GuestConfigOptions extends AdminConfigOptions {
|
||||||
|
|
@ -41,10 +53,9 @@ export interface GuestConfigOptions extends AdminConfigOptions {
|
||||||
entry?: string;
|
entry?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function defineGuestConfig(opts: GuestConfigOptions): UserConfig {
|
export function defineGuestConfig(opts: GuestConfigOptions) {
|
||||||
const base = process.env.VITE_BASE || '/';
|
return defineConfig(({ mode }): UserConfig => ({
|
||||||
return {
|
base: resolveBase(mode, opts.root),
|
||||||
base,
|
|
||||||
plugins: [react()],
|
plugins: [react()],
|
||||||
build: {
|
build: {
|
||||||
outDir: opts.outDir ?? path.resolve(opts.root, '../static/guest/dist'),
|
outDir: opts.outDir ?? path.resolve(opts.root, '../static/guest/dist'),
|
||||||
|
|
@ -60,5 +71,5 @@ export function defineGuestConfig(opts: GuestConfigOptions): UserConfig {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue