"The whole book" now lays the book on the designed templates through autoDesignedBook, in the book's own page format and theme (a recoloured one of its own included), its title kept and every page holding a locked element kept; each press takes a new seed, so a second press gives another book, one undo away as before. "This spread" lays the page on another design than the one on screen and its neighbours, its id kept, and now works on the cover, the summary and the countries too, so the menu offers it wherever the auto layout knows the page. Loose gallery photos reach the layout with the day they were taken, which it shares them out by. The menu's two hints say what the button now does, in every language. Nothing here places the classic summary, countries or marks any more.
@trek/shared
Single source of truth for TREK's API contracts, expressed as Zod schemas and consumed by both the server (request validation + inferred DTO types) and the client (typed requests/responses).
This package is part of the incremental NestJS + React 19 migration (see the "Brownfield Rewrite" board). It is intentionally dormant until modules start importing it — adding it changes nothing for users.
Rules
- One folder per domain:
src/<domain>/<domain>.schema.ts(+.spec.ts). - Domain-agnostic building blocks live in
src/common/. - A route is only considered migrated once its contract lives here.
- Schemas are the source of truth; server DTOs and client types are inferred from them
(
z.infer<typeof schema>), never hand-duplicated.
Consumption (dev)
Both apps resolve @trek/shared to this package's TypeScript source:
- Server (
tsx): viapathsinserver/tsconfig.json. - Client (
vite): viaresolve.aliasinclient/vite.config.ts(+pathsfor the type-checker).
Production packaging (Docker / workspace wiring) is introduced in card F2, when the server first depends on this package at runtime. Until then prod builds are untouched.
Not yet here
The canonical error envelope is finalised in card F5 (it must match TREK's current Express error responses byte-for-byte), so it is deliberately not invented in F1.