teecup/frontend/next.config.mjs
Erol Haagenrud 5355aba75d Ekte i18n (next-intl) + hjelpeside/FAQ + Spillere-tabellen slått videre sammen (ADR-094)
Grunnmur for oversettelse (cookie-basert, ingen URL-endring), ny
/hjelp-side med oversikt+FAQ på norsk og engelsk, og Deltakere+
Rundedeltakelse slått sammen til én bred tabell i Spillere-steget.
Resten av appens ~2200 strenger og 479 backend-feilkoder er bevisst
utsatt til senere, avgrensede runder -- se FEATURE_BACKLOG.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 07:54:07 +02:00

73 lines
4.2 KiB
JavaScript

import createNextIntlPlugin from "next-intl/plugin"
// API-et proxyes server-side under samme opprinnelse (ingen CORS, cookien
// fungerer uendret) -- se ADR-009/015. TEECUP_API_ORIGIN peker mot en lokal
// backend i dev; i prod peker den mot teecup_api på det delte Docker-nettverket.
const API_ORIGIN = process.env.TEECUP_API_ORIGIN || "http://localhost:8000"
// i18n (ADR-094) -- leser i18n/request.ts, INGEN URL-routing (se den filens
// egen kommentar for hvorfor).
const withNextIntl = createNextIntlPlugin("./i18n/request.ts")
/** @type {import('next').NextConfig} */
const nextConfig = {
output: "standalone",
images: {
unoptimized: true,
},
// MERK (funnet 2026-07-19, se FEATURE_BACKLOG.md): en plain array her gir
// implisitt "afterFiles"-semantikk -- statiske filer/sider sjekkes FØR
// disse rewrites, men DYNAMISKE Next.js-sider (app/x/[id]/page.tsx)
// sjekkes ETTER. En frontend-SIDE må derfor ALDRI nestes direkte under
// et av prefiksene under (f.eks. /orgs/[id]/members) -- rewrite-regelen
// vinner presedens og siden blir uoppnåelig (rå API-404 i stedet).
// Legg nye frontend-sider et sted UTENFOR disse prefiksene (se
// app/organizations/[id]/members for eksempelet dette ble rettet på).
//
// SAMME FELLE, VERRE UTSLAG (funnet 2026-07-23, ADR-033): en EKSAKT
// kollisjon (ikke bare nøsting) mellom en frontend-side og et
// rewrite-prefiks slår begge veier. `/rounds` var opprinnelig BÅDE en
// frontend-liste-side OG rounds.py sitt API-prefiks -- statisk side vs.
// eksakt rewrite: SIDEN vant, så `fetch("/rounds")`/`POST /rounds` fra
// klienten traff aldri backend (fikk Next sin egen HTML tilbake, JSON-
// parsing feilet stille). `/rounds/[id]` (DYNAMISK side) vs.
// `/rounds/:path*`: REWRITEN vant, så selve rundedetalj-siden var
// fullstendig uoppnåelig (rå backend-JSON i stedet for UI-et). Løst ved
// å flytte frontend-sidene til et HELT ANNET toppnivå-prefiks
// (`/my-rounds/*`) som ikke overlapper `/rounds/*` i det hele tatt --
// API-et beholder `/rounds` uendret. Lærdom: et rewrite-prefiks og en
// frontend-sides toppnivå-segment må ALDRI være identisk streng, selv
// om det virker naturlig (f.eks. "runder" for begge).
async rewrites() {
return [
{ source: "/auth/:path*", destination: `${API_ORIGIN}/auth/:path*` },
{ source: "/orgs/:path*", destination: `${API_ORIGIN}/orgs/:path*` },
{ source: "/public/:path*", destination: `${API_ORIGIN}/public/:path*` },
{ source: "/superadmin/:path*", destination: `${API_ORIGIN}/superadmin/:path*` },
{ source: "/rounds/:path*", destination: `${API_ORIGIN}/rounds/:path*` },
{ source: "/rounds", destination: `${API_ORIGIN}/rounds` },
{ source: "/personal-courses/:path*", destination: `${API_ORIGIN}/personal-courses/:path*` },
{ source: "/personal-courses", destination: `${API_ORIGIN}/personal-courses` },
// Venner-kjernen (ADR-036, fase 1, 2026-07-25).
{ source: "/people/:path*", destination: `${API_ORIGIN}/people/:path*` },
{ source: "/friends/:path*", destination: `${API_ORIGIN}/friends/:path*` },
{ source: "/friends", destination: `${API_ORIGIN}/friends` },
// Merk (samme kollisjonsklasse som /rounds->/my-rounds og
// /friends->/my-friends): frontend-siden for dette heter derfor
// /my-notifications, ALDRI /notifications.
{ source: "/notifications/:path*", destination: `${API_ORIGIN}/notifications/:path*` },
{ source: "/notifications", destination: `${API_ORIGIN}/notifications` },
// Push-varsler til telefonens OS (Web Push/VAPID, 2026-07-28) -- ingen
// frontend-side bruker dette prefikset, kun fetch() fra /account.
{ source: "/push/:path*", destination: `${API_ORIGIN}/push/:path*` },
{ source: "/push", destination: `${API_ORIGIN}/push` },
// Kommentarer/bilder på runder + samlet feed (ADR-044, 2026-08-06).
// Samme kollisjonsklasse som over: frontend-siden heter /my-feed,
// ALDRI /feed -- API-endepunktet /feed er flatt (ingen understier).
{ source: "/feed", destination: `${API_ORIGIN}/feed` },
{ source: "/health", destination: `${API_ORIGIN}/health` },
]
},
}
export default withNextIntl(nextConfig)