Files
tibi-svelte-starter/api/hooks/ssr/AGENTS.md
T
apairon 958b45272d feat: enhance admin UI configuration and SSR handling
- Add support for number chip arrays and JSON editor in admin UI config.
- Introduce pagebuilder block registry for Svelte components in admin previews.
- Implement custom role names and a 3-layer cascade model for field-level permissions.
- Add CORS configuration hierarchy for better API security.
- Update project setup instructions for admin token and config management.
- Improve SSR 404 signaling with proper context handling in NotFound component.
- Refactor routing structure to separate NotFound page into its own route.
2026-05-12 23:20:31 +00:00

2.1 KiB

SSR and Caching

Server-side rendering via goja (Go JS runtime) with HTML caching.

Request flow

  1. get_read.js receives the request and calls lib/ssr-server.js.
  2. get_read.js loads lib/app.server.js and calls app.default.render({ url }).
  3. frontend/src/ssr.ts stays thin and only initializes locale state before rendering App.svelte.
  4. frontend/src/App.svelte is responsible for actual page data loading for both browser and SSR.
  5. During SSR, App.svelte calls the same loadContent(...) path directly inside typeof window === "undefined".
  6. Rendered HTML is stored in the ssr collection together with dependency tracking strings.

Build

  • SSR bundle is built via yarn build:server and outputs to lib/app.server.js.
  • The project no longer uses Babel for SSR.
  • goja-compatible transforms are configured in esbuild.config.server.js via supported.
  • The server build must remove frontend-only splitting/outdir options inherited from the shared esbuild config.

Cache invalidation

  • clear_cache.js hook invalidates SSR cache entries based on collection dependencies.
  • Dependencies are stored as strings like content:<id> or content:*.
  • DELETE invalidation must be robust even when context.data.id is missing.

Route validation

  • SSR route validation is active in config.js.
  • Public page URLs are language-prefixed (/de/..., /en/...), while content.path in the DB is stored without that prefix.
  • ssrValidatePath() must strip the language prefix before querying content and return a canonical language-prefixed URL when needed.

404 signaling

The SSR hook (get_read.js) checks context.is404 after rendering to determine the HTTP status code. If true, it returns HTTP 404 with the rendered 404 page HTML (and does not cache the result).

NotFound.svelte sets context.is404 = true during SSR. When the component renders (only when the page is not found), its top-level script sets the flag. The goja runtime provides context as a global during SSR, so it's available from the compiled frontend code.

When adding a 404 page or changing the not-found logic, ensure context.is404 is still set during SSR.