80 lines
3.0 KiB
JavaScript
80 lines
3.0 KiB
JavaScript
// Must come first: it populates process.env from the workspace .env, and everything
|
|
// below reads process.env.
|
|
import './scripts/load-env.mjs';
|
|
|
|
import { defineConfig } from 'astro/config';
|
|
import { checkCatalogs } from './scripts/i18n-build-check.mjs';
|
|
import { DEFAULT_LOCALE, LOCALE_CODES } from './src/i18n/locales.mjs';
|
|
|
|
const site = process.env.SITE_URL ?? 'https://cashumints.space';
|
|
|
|
/*
|
|
* Catalog check, before anything renders.
|
|
*
|
|
* A missing key is a warning listing every key by locale, because English is a working
|
|
* fallback and half a language beats none. A key used in the source that no catalog
|
|
* defines, or an island reaching for a string the page never inlines, is an error and
|
|
* stops the build: both of those put a humanised key on a real page.
|
|
*/
|
|
await checkCatalogs();
|
|
|
|
// Where the build (and the dev server proxy) reaches the API. This is a private,
|
|
// build-machine address by default and must never end up in the browser's markup.
|
|
const apiUrl = process.env.API_URL ?? 'http://127.0.0.1:8787';
|
|
|
|
// Browser-facing API origin. Empty means same origin: islands fetch /api/... and icons
|
|
// resolve to /icons/..., which the dev proxy below and nginx in production forward to
|
|
// the API. Set PUBLIC_API_URL only when the API is served from its own origin, e.g.
|
|
// https://api.cashumints.space.
|
|
const publicApiUrl = process.env.PUBLIC_API_URL ?? '';
|
|
|
|
// Dev server and preview port. Set WEB_PORT in .env; a --port flag still overrides it.
|
|
const port = Number.parseInt(process.env.WEB_PORT ?? '', 10) || 4321;
|
|
|
|
// Same-origin mode only works if something forwards those two prefixes; in dev that is
|
|
// this proxy. With PUBLIC_API_URL set, requests skip the dev server entirely.
|
|
const proxy = publicApiUrl
|
|
? undefined
|
|
: {
|
|
'/api': { target: apiUrl, changeOrigin: true },
|
|
'/icons': { target: apiUrl, changeOrigin: true },
|
|
};
|
|
|
|
export default defineConfig({
|
|
site,
|
|
output: 'static',
|
|
trailingSlash: 'ignore',
|
|
|
|
/*
|
|
* Path-prefix locales, English at the root: /mints, /es/mints, /nl/mints.
|
|
*
|
|
* `prefixDefaultLocale: false` is what keeps every existing English URL exactly where
|
|
* it was, which matters more here than tidiness: those URLs are indexed, linked and
|
|
* pasted into wallets. Astro uses this to resolve `Astro.currentLocale` and to route
|
|
* in dev; the pages themselves are emitted per locale by `getStaticPaths` in
|
|
* `src/pages/[...locale]/`, so the whole set is prerendered rather than negotiated.
|
|
*
|
|
* `redirectToDefaultLocale: false`: a visitor asking for /es/thing that does not
|
|
* exist gets a 404, not a silent bounce to English. Redirecting by language is
|
|
* exactly what this site does not do.
|
|
*/
|
|
i18n: {
|
|
defaultLocale: DEFAULT_LOCALE,
|
|
locales: LOCALE_CODES,
|
|
routing: {
|
|
prefixDefaultLocale: false,
|
|
redirectToDefaultLocale: false,
|
|
},
|
|
},
|
|
|
|
build: { inlineStylesheets: 'auto' },
|
|
devToolbar: { enabled: false },
|
|
server: { port },
|
|
vite: {
|
|
define: {
|
|
'import.meta.env.PUBLIC_API_URL': JSON.stringify(publicApiUrl),
|
|
},
|
|
server: { proxy },
|
|
},
|
|
});
|