@rivetjs/router 0.0.0-stage → 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/adapters/assemble.d.ts +32 -0
  4. package/adapters/assemble.js +32 -0
  5. package/adapters/build.d.ts +24 -0
  6. package/adapters/build.js +43 -0
  7. package/adapters/bun.d.ts +18 -0
  8. package/adapters/bun.js +44 -0
  9. package/adapters/cloudflare.d.ts +5 -0
  10. package/adapters/cloudflare.js +8 -0
  11. package/adapters/cluster.d.ts +7 -0
  12. package/adapters/cluster.js +130 -0
  13. package/adapters/csr.d.ts +12 -0
  14. package/adapters/csr.js +11 -0
  15. package/adapters/deno.d.ts +13 -0
  16. package/adapters/deno.js +35 -0
  17. package/adapters/fetch.d.ts +55 -0
  18. package/adapters/fetch.js +72 -0
  19. package/adapters/files.d.ts +7 -0
  20. package/adapters/files.js +103 -0
  21. package/adapters/idle-memory.d.ts +23 -0
  22. package/adapters/idle-memory.js +91 -0
  23. package/adapters/netlify.d.ts +13 -0
  24. package/adapters/netlify.js +15 -0
  25. package/adapters/node.d.ts +163 -0
  26. package/adapters/node.js +940 -0
  27. package/adapters/pack.d.ts +39 -0
  28. package/adapters/pack.js +360 -0
  29. package/adapters/server-target.d.ts +17 -0
  30. package/adapters/server-target.js +8 -0
  31. package/adapters/static.d.ts +84 -0
  32. package/adapters/static.js +231 -0
  33. package/adapters/target-build.d.ts +92 -0
  34. package/adapters/target-build.js +118 -0
  35. package/adapters/vercel-edge.d.ts +7 -0
  36. package/adapters/vercel-edge.js +9 -0
  37. package/adapters/vercel.d.ts +33 -0
  38. package/adapters/vercel.js +45 -0
  39. package/build/codegen.d.ts +84 -0
  40. package/build/codegen.js +920 -0
  41. package/build/dev-errors.d.ts +19 -0
  42. package/build/dev-errors.js +236 -0
  43. package/build/migrate.d.ts +15 -0
  44. package/build/migrate.js +146 -0
  45. package/build/route-css.d.ts +54 -0
  46. package/build/route-css.js +216 -0
  47. package/build/routes.d.ts +50 -0
  48. package/build/routes.js +202 -0
  49. package/build/sync.d.ts +20 -0
  50. package/build/sync.js +16 -0
  51. package/build/vite.d.ts +195 -0
  52. package/build/vite.js +703 -0
  53. package/cli/rivet.d.ts +2 -0
  54. package/cli/rivet.js +100 -0
  55. package/client/active.d.ts +6 -0
  56. package/client/active.js +22 -0
  57. package/client/announce.d.ts +2 -0
  58. package/client/announce.js +21 -0
  59. package/client/dev.d.ts +41 -0
  60. package/client/dev.js +74 -0
  61. package/client/index.d.ts +152 -0
  62. package/client/index.js +680 -0
  63. package/client/layouts.d.ts +110 -0
  64. package/client/layouts.js +310 -0
  65. package/client/leave.d.ts +40 -0
  66. package/client/leave.js +75 -0
  67. package/client/link.d.ts +48 -0
  68. package/client/link.jsx +65 -0
  69. package/client/live.d.ts +57 -0
  70. package/client/live.js +170 -0
  71. package/client/navigate.d.ts +71 -0
  72. package/client/navigate.js +120 -0
  73. package/client/navigation.d.ts +28 -0
  74. package/client/navigation.js +14 -0
  75. package/client/params.d.ts +16 -0
  76. package/client/params.js +28 -0
  77. package/client/route-context.d.ts +32 -0
  78. package/client/route-context.js +21 -0
  79. package/client/scroll.d.ts +16 -0
  80. package/client/scroll.js +80 -0
  81. package/client/search.d.ts +8 -0
  82. package/client/search.js +17 -0
  83. package/client/tailwind.css +8 -0
  84. package/client/transition-helpers.d.ts +28 -0
  85. package/client/transition-helpers.js +63 -0
  86. package/client/transitions.css +90 -0
  87. package/client/transitions.d.ts +21 -0
  88. package/client/transitions.js +156 -0
  89. package/index.d.ts +138 -0
  90. package/index.js +7 -0
  91. package/package.json +156 -4
  92. package/server/app.d.ts +169 -0
  93. package/server/app.js +302 -0
  94. package/server/body.d.ts +20 -0
  95. package/server/body.js +8 -0
  96. package/server/early-hints.d.ts +34 -0
  97. package/server/early-hints.js +63 -0
  98. package/server/handler.d.ts +196 -0
  99. package/server/handler.js +623 -0
  100. package/server/index.d.ts +9 -0
  101. package/server/index.js +6 -0
  102. package/server/inline-styles.d.ts +21 -0
  103. package/server/inline-styles.js +28 -0
  104. package/server/module.d.ts +14 -0
  105. package/server/module.js +78 -0
  106. package/server/render.d.ts +94 -0
  107. package/server/render.js +489 -0
  108. package/server/route-cache.d.ts +175 -0
  109. package/server/route-cache.js +742 -0
  110. package/server/security.d.ts +18 -0
  111. package/server/security.js +47 -0
  112. package/server/strict-csp.d.ts +7 -0
  113. package/server/strict-csp.js +18 -0
  114. package/server-only.d.ts +1 -0
  115. package/server-only.js +3 -0
  116. package/shared/actions.d.ts +10 -0
  117. package/shared/actions.js +18 -0
  118. package/shared/base.d.ts +8 -0
  119. package/shared/base.js +20 -0
  120. package/shared/cookie.d.ts +7 -0
  121. package/shared/cookie.js +32 -0
  122. package/shared/csp-directives.d.ts +9 -0
  123. package/shared/csp-directives.js +85 -0
  124. package/shared/csp-hash.d.ts +39 -0
  125. package/shared/csp-hash.js +121 -0
  126. package/shared/csp.d.ts +26 -0
  127. package/shared/csp.js +13 -0
  128. package/shared/data.d.ts +175 -0
  129. package/shared/data.js +22 -0
  130. package/shared/errors.d.ts +31 -0
  131. package/shared/errors.js +51 -0
  132. package/shared/head.d.ts +57 -0
  133. package/shared/head.js +242 -0
  134. package/shared/nonce.d.ts +2 -0
  135. package/shared/nonce.js +23 -0
  136. package/shared/prefetch-fallback.min.d.ts +1 -0
  137. package/shared/prefetch-fallback.min.js +2 -0
  138. package/shared/prefetch.d.ts +54 -0
  139. package/shared/prefetch.js +74 -0
  140. package/shared/redirect.d.ts +6 -0
  141. package/shared/redirect.js +25 -0
  142. package/shared/slash.d.ts +8 -0
  143. package/shared/slash.js +24 -0
@@ -0,0 +1,195 @@
1
+ import type { Plugin } from "vite";
2
+ import { type ImagesConfig, type RivetCSSOptions, type RivetOptions, type RivetResumeOptions } from "@rivetjs/compiler/vite";
3
+ import { type RouteTable } from "./routes.js";
4
+ import { type CodegenOptions } from "./codegen.js";
5
+ import { type TrailingSlash } from "../shared/slash.js";
6
+ import { type RouteRules } from "../server/route-cache.js";
7
+ import type { DocumentPrefetch, PrefetchEagerness } from "../shared/prefetch.js";
8
+ export type { InlineStylesheets } from "./route-css.js";
9
+ /** Build-time helper for other Vite plugins (docs-kit example frames): one merged sheet per stylesheet list. */
10
+ export { mergeRouteCSS } from "./route-css.js";
11
+ import { type InlineStylesheets } from "./route-css.js";
12
+ import { type AdapterName, type AdapterOptions } from "../adapters/target-build.js";
13
+ /** Options of the `rivetRouter()` Vite plugin. */
14
+ export interface RivetRouterOptions {
15
+ /** Routes directory, root-relative (default `src/routes`). */
16
+ routes?: string;
17
+ /**
18
+ * URL base path the app is served under (`/app`); sets Vite's `base`. Default: Vite's `base`.
19
+ * Route patterns, `<Link to>`, `navigate()`, data requests, prefetch and the adapters follow it.
20
+ */
21
+ base?: string;
22
+ /**
23
+ * Trailing-slash policy. `"ignore"` (default): `/a` and `/a/` serve the same page as requested.
24
+ * `"never"` / `"always"`: one canonical form — page GET/HEAD requests for the other answer 308,
25
+ * `<Link>` / `navigate()` write hrefs in it, the static adapter writes `a.html` (`never`) or
26
+ * `a/index.html`. `/` itself never changes; endpoints and other methods are never redirected.
27
+ */
28
+ trailingSlash?: TrailingSlash;
29
+ /**
30
+ * Preload planner default for this app's pages (`createApp` / adapter `preload` options override it per server):
31
+ * `background` = byte budget (minified closures) of below-the-fold `visible` chunks also prefetched at idle; `0` off.
32
+ * Default 1 MiB. Dev pages keep `visible` chunks viewport-only (dev manifests have no bundle sizes).
33
+ */
34
+ preload?: {
35
+ background?: number;
36
+ };
37
+ /**
38
+ * Route rules by path pattern (`/about`, `/blog/*`, `/docs/**`): `headers`, and `cache` / `swr` / `isr` — rendered pages
39
+ * stored in process (fresh for `maxAge` s, then served stale while one render refreshes them; `isr: true` until
40
+ * `revalidate()`), with ETag / Last-Modified → 304 and `s-maxage` / `stale-while-revalidate` for CDNs. JSON data:
41
+ * the server entry exports it, every adapter applies it (`createApp` / adapter `routeRules` replace it). Dev applies
42
+ * `headers` only. See `@rivetjs/router/route-cache`.
43
+ */
44
+ routeRules?: RouteRules;
45
+ /** Codegen output directory, root-relative (default `.rivet`). */
46
+ outDir?: string;
47
+ /** Root-relative module whose default export is the `DocumentShell` (default `src/document.ts`). */
48
+ document?: string;
49
+ /** Root-relative stylesheets: client build inputs, linked by the document (`styles`). */
50
+ styles?: string[];
51
+ /**
52
+ * Stylesheets written into the page as `<style>` instead of linked (Astro's `build.inlineStylesheets`), production
53
+ * server / static pages, decided per page. `"auto"` (default): all of the page's sheets (global + route) when their
54
+ * brotli sizes add up to at most 6 KB (the page then has no render-blocking stylesheet request), else each sheet of
55
+ * at most Vite's `build.assetsInlineLimit` (4096 raw bytes; a function limit counts as 4096). `{ maxTotalBrotli }`:
56
+ * `auto` with another total (bytes). `"always"`: every sheet; `"never"`: all linked. Sheets with relative `url()` /
57
+ * `@import` references stay linked. Inline styles carry the page's CSP nonce (static pages: hashed into a
58
+ * `style-src` you set).
59
+ */
60
+ inlineStylesheets?: InlineStylesheets;
61
+ /** `server` (default) and `static` resume server-rendered pages; `csr` mounts a single-page app. */
62
+ mode?: NonNullable<CodegenOptions["mode"]>;
63
+ /** Resume options; generated route modules are added to `modules`. */
64
+ resume?: Partial<RivetResumeOptions>;
65
+ /** `?image` / `?jsx` imports (`rivet({ images })`); build with the app builder so server-only images reach the client output. */
66
+ images?: ImagesConfig | true;
67
+ /** DevTools on the dev server when `@rivetjs/devtools` is installed (default true; see `rivet()`). */
68
+ devtools?: boolean;
69
+ /**
70
+ * Framework bridges (`rivet({ bridges })`: `react()` from `@rivetjs/bridge-react/vite`, `preact()` from
71
+ * `@rivetjs/bridge-preact/vite`, …): those frameworks' components render as islands inside the routed pages.
72
+ * Server / static modes only.
73
+ */
74
+ bridges?: RivetOptions["bridges"];
75
+ /**
76
+ * Component head (`@rivetjs/kit` `<Title>`, `<Meta>`, …): `components` holds each page's document
77
+ * start until its shell rendered; on by default when the kit Vite plugin (`kit()`) is installed.
78
+ * `early` keeps route `head` exports only (document start written first).
79
+ */
80
+ head?: "components" | "early";
81
+ /** Scoped styles options passed to `rivet({ css })`. */
82
+ css?: RivetCSSOptions;
83
+ /** Compile-time `<Icon>` from `@rivetjs/kit/icon` (`rivet({ staticIcons })`, default true); `false` keeps every component call. */
84
+ staticIcons?: boolean;
85
+ /**
86
+ * Route transitions (View Transitions) + pending UI. Off by default; `true` = defaults. The
87
+ * transitions module loads on the first navigation intent; the generated resume entry provides
88
+ * the navigation context (a custom `resume.entry` must add `[Navigation, navigation]` itself).
89
+ */
90
+ transitions?: CodegenOptions["transitions"];
91
+ /** Route announcer for screen readers after client navigation (default true; `false` opts out). */
92
+ announce?: boolean;
93
+ /**
94
+ * The app reads search params (`useSearchParams()` / `SearchParams`): the server provides the
95
+ * request's, the resume entry the browser's. Default: detected from the project's sources
96
+ * (`routerUsage`); set `true` when only a published dependency reads them.
97
+ */
98
+ searchParams?: boolean;
99
+ /** The app calls `navigate()` / `invalidate()` / `revalidate()` / `setSearchParams()`. Default: detected (`routerUsage`). */
100
+ navigate?: boolean;
101
+ /**
102
+ * The app uses `@rivetjs/forms` (directly or through `@rivetjs/ui` `Form`): enhanced submits reach the router
103
+ * through `Symbol.for("rivet.router")` (implies `navigate`). Default: detected (`routerUsage`).
104
+ */
105
+ forms?: boolean;
106
+ /** The app reads `useParams()`. Default: detected (`routerUsage`). */
107
+ params?: boolean;
108
+ /** The app renders `<Link active>`: active links are re-marked after client navigation. Default: detected (`routerUsage`). */
109
+ activeLinks?: boolean;
110
+ /**
111
+ * Document prefetch for navigations that load a document (`@rivetjs/router/prefetch`): every page's
112
+ * head gets Speculation Rules (Chromium) + a ~1 kB inline intent fallback. `"document"` / `"prerender"`:
113
+ * also the default for every same-origin link without its own `prefetch` / `data-rivet-prefetch`
114
+ * (plain `<a>` included; `"none"` opts one out). `true`: only links marked `prefetch="document"` /
115
+ * `"prerender"`. Default: detected (`routerUsage`: such a mark in the sources); `false`: off.
116
+ * Server / static modes (ignored in `csr`).
117
+ */
118
+ prefetch?: boolean | DocumentPrefetch;
119
+ /**
120
+ * When Chromium starts a document prefetch / prerender (Speculation Rules `eagerness`):
121
+ * `"conservative"` (pointer / touch down), `"moderate"` (default: also a ~200 ms hover), `"eager"`
122
+ * (sooner). Applies only while `prefetch` is on; the fallback keeps its 65 ms / focus / down timing.
123
+ */
124
+ prefetchEagerness?: PrefetchEagerness;
125
+ /**
126
+ * Which links of a client-routed app take part in document prefetch. Default `true`: `data-rivet-reload` /
127
+ * `rel=external` links and links whose path no route matches (every page carries the route-path RegExp, in the
128
+ * Speculation Rules and in the fallback call). `false`: only `data-rivet-reload` / `rel=external` links — for apps
129
+ * whose document links all carry `reload` (the docs sites: −7.7 KB of route patterns per page).
130
+ */
131
+ prefetchPaths?: boolean;
132
+ /**
133
+ * Client-side navigation on pages with nothing else to resume (Astro's `<ClientRouter />` model).
134
+ * `true`: every resumed page ships the router (link clicks / intent prefetch / back-forward served in
135
+ * place). `false`: the router's listeners alone do not make a page resumable — a page without resumable
136
+ * symbols, client effects or forms ships zero JS (no loader, state script or modulepreloads) and its
137
+ * links load documents; interactive pages still route in place. Default: `false` in `static` mode,
138
+ * `true` in `server` mode (ignored in `csr`).
139
+ */
140
+ clientRouter?: boolean;
141
+ /**
142
+ * Deploy target besides node (name or options object): `vite build --ssr` also emits the target's
143
+ * entry (client manifests inlined, dependencies bundled). `"fetch"`: `dist/server/fetch.js`
144
+ * (`export default { fetch }`, any web-standard runtime). Platforms, packaged after the server build:
145
+ * `"vercel"` (`.vercel/output`, Build Output API v3), `"netlify"` (`.netlify/v1` + `dist/netlify`),
146
+ * `"cloudflare"` (`dist/cloudflare`, Workers + static assets), `"bun"` (`dist/server/bun.js`),
147
+ * `"deno"` (`dist/server/deno.js`).
148
+ */
149
+ adapter?: AdapterName | AdapterOptions;
150
+ /**
151
+ * Dev server. `resume` (default true): pages resume like production (recorder state, inline loader,
152
+ * symbol chunks served by Vite); the first hot update switches the page to client rendering, after
153
+ * which components hot-replace in place. `false`: pages client-render over the server HTML (the
154
+ * recorder still runs, so serialization errors still reach the overlay).
155
+ */
156
+ dev?: {
157
+ resume?: boolean;
158
+ };
159
+ }
160
+ /** Router features generated code provides only when the app uses them (`routerUsage`). */
161
+ export interface RouterUsage {
162
+ /** `useSearchParams` / `SearchParams`. */
163
+ searchParams: boolean;
164
+ /** `navigate` / `invalidate` / `revalidate` / `setSearchParams`, or forms (below). */
165
+ navigate: boolean;
166
+ /** `@rivetjs/forms`, or `Form` in a file importing `@rivetjs/ui` (its `Form` is built on forms). */
167
+ forms: boolean;
168
+ /** `useParams`. */
169
+ params: boolean;
170
+ /** `<Link active>` (an `active` attribute on a `<Link>`). */
171
+ activeLinks: boolean;
172
+ /** `prefetch="document"` / `"prerender"` (`<Link>` prop or `data-rivet-prefetch` attribute). */
173
+ prefetch: boolean;
174
+ }
175
+ /**
176
+ * Which router features the project's sources use: every source under `root` (skipping
177
+ * `node_modules`, `dist` and dot directories) plus the sources of linked (workspace / `npm link`)
178
+ * dependencies of `root/package.json`, except `@rivetjs/*` packages. Text based: a name that appears
179
+ * in a file importing `@rivetjs/router` counts (false positives only cost bytes); published
180
+ * dependencies are not scanned (set `rivetRouter({ navigate, params, searchParams })`).
181
+ */
182
+ export declare function routerUsage(root: string, options?: {
183
+ exclude?: readonly string[];
184
+ }): Promise<RouterUsage>;
185
+ /** Regenerate `.rivet/` for a project root; returns the resume modules and whether files changed. */
186
+ export declare function generateRoutes(root: string, options?: Pick<RivetRouterOptions, "routes" | "outDir" | "document" | "mode" | "transitions" | "announce" | "base" | "searchParams" | "navigate" | "forms" | "params" | "activeLinks" | "trailingSlash" | "prefetch" | "prefetchEagerness" | "prefetchPaths" | "preload" | "routeRules" | "clientRouter"> & {
187
+ head?: "components" | undefined;
188
+ }): Promise<{
189
+ table: RouteTable;
190
+ resumeModules: readonly string[];
191
+ changed: boolean;
192
+ resumeEntry: boolean;
193
+ }>;
194
+ /** The router's Vite plugins: file routes, typed routes, server code split, data requests and build adapters. */
195
+ export declare function rivetRouter(options?: RivetRouterOptions): Plugin[];