96 lines
2.6 KiB
JavaScript
96 lines
2.6 KiB
JavaScript
const fs = require('fs')
|
|
const path = require('path')
|
|
|
|
const ROOT = path.resolve(__dirname, '..')
|
|
const ENV_PATH = path.join(ROOT, '.env')
|
|
const OUT_PATH =
|
|
process.env.CONFIG_OUT || path.join(ROOT, 'public', 'config.js')
|
|
|
|
const DEFAULTS = {
|
|
VUE_APP_NAME: 'irandom',
|
|
VUE_APP_TITLE: 'irandom',
|
|
VUE_APP_BRAND_URL: 'https://git.imiheev.online/admin/irandom',
|
|
VUE_APP_LOGO_URL: '/logo.png',
|
|
VUE_APP_DEFAULT_LOCALE: 'ru',
|
|
VUE_APP_COLOR_PRIMARY: '#c9a66b',
|
|
VUE_APP_COLOR_ACCENT: '#e6c566',
|
|
VUE_APP_COLOR_BG: '#1a1815',
|
|
VUE_APP_COLOR_SURFACE: '#2e2820',
|
|
VUE_APP_COLOR_SURFACE_RAISED: '#3a3228',
|
|
VUE_APP_COLOR_TEXT: '#ffffff',
|
|
VUE_APP_COLOR_TEXT_MUTED: '#c8c0b4',
|
|
VUE_APP_COLOR_DANGER: '#ee5c5c',
|
|
VUE_APP_COLOR_LINK: '#4a6a8a',
|
|
VUE_APP_COLOR_BORDER: '#4a4034'
|
|
}
|
|
|
|
function parseEnvFile(filePath) {
|
|
if (!fs.existsSync(filePath)) {
|
|
return {}
|
|
}
|
|
|
|
const result = {}
|
|
const lines = fs.readFileSync(filePath, 'utf8').split(/\r?\n/)
|
|
|
|
for (const line of lines) {
|
|
const trimmed = line.trim()
|
|
if (!trimmed || trimmed.startsWith('#')) {
|
|
continue
|
|
}
|
|
|
|
const eq = trimmed.indexOf('=')
|
|
if (eq === -1) {
|
|
continue
|
|
}
|
|
|
|
const key = trimmed.slice(0, eq).trim()
|
|
let value = trimmed.slice(eq + 1).trim()
|
|
if (
|
|
(value.startsWith('"') && value.endsWith('"')) ||
|
|
(value.startsWith("'") && value.endsWith("'"))
|
|
) {
|
|
value = value.slice(1, -1)
|
|
}
|
|
result[key] = value
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
function buildConfig(fileEnv) {
|
|
// Container / shell env overrides .env file
|
|
const pick = (key) => process.env[key] || fileEnv[key] || DEFAULTS[key]
|
|
|
|
return {
|
|
name: pick('VUE_APP_NAME'),
|
|
title: pick('VUE_APP_TITLE'),
|
|
brandUrl: pick('VUE_APP_BRAND_URL'),
|
|
logoUrl: pick('VUE_APP_LOGO_URL'),
|
|
defaultLocale: pick('VUE_APP_DEFAULT_LOCALE'),
|
|
colors: {
|
|
primary: pick('VUE_APP_COLOR_PRIMARY'),
|
|
accent: pick('VUE_APP_COLOR_ACCENT'),
|
|
bg: pick('VUE_APP_COLOR_BG'),
|
|
surface: pick('VUE_APP_COLOR_SURFACE'),
|
|
surfaceRaised: pick('VUE_APP_COLOR_SURFACE_RAISED'),
|
|
text: pick('VUE_APP_COLOR_TEXT'),
|
|
textMuted: pick('VUE_APP_COLOR_TEXT_MUTED'),
|
|
danger: pick('VUE_APP_COLOR_DANGER'),
|
|
link: pick('VUE_APP_COLOR_LINK'),
|
|
border: pick('VUE_APP_COLOR_BORDER')
|
|
}
|
|
}
|
|
}
|
|
|
|
const fileEnv = parseEnvFile(ENV_PATH)
|
|
const config = buildConfig(fileEnv)
|
|
const payload = JSON.stringify(config, null, 2)
|
|
|
|
const output = `/* Generated by scripts/generate-config.js — do not edit by hand */
|
|
window.__APP_CONFIG__ = ${payload};
|
|
`
|
|
|
|
fs.mkdirSync(path.dirname(OUT_PATH), { recursive: true })
|
|
fs.writeFileSync(OUT_PATH, output, 'utf8')
|
|
console.log(`Wrote ${OUT_PATH}`)
|