Files
Nitro-V3/vite.config.mjs
T
medievalshell 2fded7bc79 feat: interactive JSON / JSON5 mode selector at build time
Lets the operator pick between strict JSON (legacy) and JSON5 for every
configuration file consumed by Nitro and the renderer.

- scripts/configure-json.mjs: interactive prompt (JSON5 recommended),
  with --if-missing and --non-interactive flags for CI use
- package.json: yarn configure / prestart / prebuild hooks
- vite.config.mjs: reads .nitro-build.json (or NITRO_JSON_MODE env) and
  injects the compile-time constant __NITRO_JSON_MODE__ via define
- src/bootstrap.ts: routes client-mode.json parsing through the
  selected mode
- .gitignore: ignore the per-deployment .nitro-build.json
- README: full usage and override section
- public/configuration assets regenerated by the updated prebuild flow

The renderer side (@nitrots/utils JsonParser) is updated in the
companion Nitro_Render_V3 commit on the dev branch.
2026-05-18 20:38:26 +02:00

96 lines
3.7 KiB
JavaScript

import react from '@vitejs/plugin-react';
import { existsSync, readFileSync } from 'fs';
import { resolve } from 'path';
import { defineConfig } from 'vite';
const legacyRendererRoot = resolve(__dirname, '..', 'renderer');
const currentRendererRoot = resolve(__dirname, '..', 'Nitro_Render_V3');
const rendererRoot = existsSync(currentRendererRoot) ? currentRendererRoot : legacyRendererRoot;
const resolveJsonMode = () =>
{
const envOverride = process.env.NITRO_JSON_MODE;
if(envOverride === 'legacy' || envOverride === 'json5' || envOverride === 'auto') return envOverride;
const configFile = resolve(__dirname, '.nitro-build.json');
if(existsSync(configFile))
{
try
{
const parsed = JSON.parse(readFileSync(configFile, 'utf8'));
if(parsed?.jsonMode === 'legacy' || parsed?.jsonMode === 'json5' || parsed?.jsonMode === 'auto') return parsed.jsonMode;
}
catch {}
}
return 'auto';
};
const nitroJsonMode = resolveJsonMode();
process.stdout.write(`[vite] __NITRO_JSON_MODE__ = ${ nitroJsonMode }\n`);
export default defineConfig({
base: process.env.VITE_BASE || './',
plugins: [ react() ],
define: {
__NITRO_JSON_MODE__: JSON.stringify(nitroJsonMode)
},
server: {
fs: {
allow: [
resolve(__dirname),
rendererRoot,
]
},
proxy: {
'/api': {
target: process.env.AUTH_PROXY_TARGET || 'http://192.168.0.181:2096',
changeOrigin: true,
}
}
},
resolve: {
tsconfigPaths: true,
alias: {
'@': resolve(__dirname, 'src'),
'~': resolve(__dirname, 'node_modules'),
'@nitrots/nitro-renderer': resolve(rendererRoot, 'index.ts'),
'@nitrots/api': resolve(rendererRoot, 'packages/api/src/index.ts'),
'@nitrots/assets': resolve(rendererRoot, 'packages/assets/src/index.ts'),
'@nitrots/avatar': resolve(rendererRoot, 'packages/avatar/src/index.ts'),
'@nitrots/camera': resolve(rendererRoot, 'packages/camera/src/index.ts'),
'@nitrots/communication': resolve(rendererRoot, 'packages/communication/src/index.ts'),
'@nitrots/configuration': resolve(rendererRoot, 'packages/configuration/src/index.ts'),
'@nitrots/events': resolve(rendererRoot, 'packages/events/src/index.ts'),
'@nitrots/localization': resolve(rendererRoot, 'packages/localization/src/index.ts'),
'@nitrots/room': resolve(rendererRoot, 'packages/room/src/index.ts'),
'@nitrots/session': resolve(rendererRoot, 'packages/session/src/index.ts'),
'@nitrots/sound': resolve(rendererRoot, 'packages/sound/src/index.ts'),
'@nitrots/utils/src': resolve(rendererRoot, 'packages/utils/src'),
'@nitrots/utils': resolve(rendererRoot, 'packages/utils/src/index.ts'),
'pixi.js': resolve(rendererRoot, 'node_modules/pixi.js'),
'pixi-filters': resolve(rendererRoot, 'node_modules/pixi-filters'),
'howler': resolve(rendererRoot, 'node_modules/howler'),
}
},
build: {
assetsInlineLimit: 102400,
chunkSizeWarningLimit: 200000,
manifest: true,
rollupOptions: {
output: {
assetFileNames: 'src/assets/[name]-[hash].[ext]',
manualChunks: id =>
{
if(id.includes('node_modules'))
{
if(id.includes('@nitrots/nitro-renderer') || id.includes('renderer3') || id.includes('Nitro_Render_V3')) return 'nitro-renderer';
return 'vendor';
}
}
}
}
}
});