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

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 (155) 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 +20 -0
  20. package/adapters/files.js +155 -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 +180 -0
  26. package/adapters/node.js +986 -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 +95 -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 +35 -0
  38. package/adapters/vercel.js +45 -0
  39. package/build/codegen.d.ts +97 -0
  40. package/build/codegen.js +1037 -0
  41. package/build/dev-errors.d.ts +23 -0
  42. package/build/dev-errors.js +247 -0
  43. package/build/lazy-rows.d.ts +19 -0
  44. package/build/lazy-rows.js +59 -0
  45. package/build/migrate.d.ts +31 -0
  46. package/build/migrate.js +385 -0
  47. package/build/reach.d.ts +60 -0
  48. package/build/reach.js +302 -0
  49. package/build/route-css.d.ts +54 -0
  50. package/build/route-css.js +216 -0
  51. package/build/routes.d.ts +55 -0
  52. package/build/routes.js +219 -0
  53. package/build/sync.d.ts +20 -0
  54. package/build/sync.js +16 -0
  55. package/build/vite.d.ts +208 -0
  56. package/build/vite.js +861 -0
  57. package/cli/rivet.d.ts +2 -0
  58. package/cli/rivet.js +101 -0
  59. package/client/active.d.ts +6 -0
  60. package/client/active.js +22 -0
  61. package/client/announce.d.ts +2 -0
  62. package/client/announce.js +21 -0
  63. package/client/dev.d.ts +41 -0
  64. package/client/dev.js +91 -0
  65. package/client/index.d.ts +156 -0
  66. package/client/index.js +714 -0
  67. package/client/layouts.d.ts +110 -0
  68. package/client/layouts.js +310 -0
  69. package/client/leave.d.ts +40 -0
  70. package/client/leave.js +75 -0
  71. package/client/link.d.ts +48 -0
  72. package/client/link.jsx +65 -0
  73. package/client/live.d.ts +57 -0
  74. package/client/live.js +170 -0
  75. package/client/navigate.d.ts +71 -0
  76. package/client/navigate.js +120 -0
  77. package/client/navigation.d.ts +28 -0
  78. package/client/navigation.js +14 -0
  79. package/client/params.d.ts +16 -0
  80. package/client/params.js +28 -0
  81. package/client/route-context.d.ts +32 -0
  82. package/client/route-context.js +21 -0
  83. package/client/scroll.d.ts +16 -0
  84. package/client/scroll.js +80 -0
  85. package/client/search.d.ts +8 -0
  86. package/client/search.js +17 -0
  87. package/client/tailwind.css +8 -0
  88. package/client/transition-helpers.d.ts +28 -0
  89. package/client/transition-helpers.js +63 -0
  90. package/client/transitions.css +90 -0
  91. package/client/transitions.d.ts +21 -0
  92. package/client/transitions.js +156 -0
  93. package/index.d.ts +135 -0
  94. package/index.js +8 -0
  95. package/package.json +156 -4
  96. package/server/app.d.ts +175 -0
  97. package/server/app.js +335 -0
  98. package/server/body.d.ts +20 -0
  99. package/server/body.js +8 -0
  100. package/server/deferred.d.ts +12 -0
  101. package/server/deferred.js +60 -0
  102. package/server/early-hints.d.ts +34 -0
  103. package/server/early-hints.js +63 -0
  104. package/server/handler.d.ts +240 -0
  105. package/server/handler.js +661 -0
  106. package/server/index.d.ts +9 -0
  107. package/server/index.js +6 -0
  108. package/server/inline-styles.d.ts +21 -0
  109. package/server/inline-styles.js +28 -0
  110. package/server/module.d.ts +14 -0
  111. package/server/module.js +96 -0
  112. package/server/render.d.ts +96 -0
  113. package/server/render.js +492 -0
  114. package/server/route-cache.d.ts +245 -0
  115. package/server/route-cache.js +813 -0
  116. package/server/security.d.ts +18 -0
  117. package/server/security.js +47 -0
  118. package/server/shell-build.d.ts +3 -0
  119. package/server/shell-build.js +2 -0
  120. package/server/shell-cache.d.ts +8 -0
  121. package/server/shell-cache.js +836 -0
  122. package/server/strict-csp.d.ts +7 -0
  123. package/server/strict-csp.js +18 -0
  124. package/server-only.d.ts +1 -0
  125. package/server-only.js +3 -0
  126. package/shared/actions.d.ts +10 -0
  127. package/shared/actions.js +18 -0
  128. package/shared/base.d.ts +8 -0
  129. package/shared/base.js +20 -0
  130. package/shared/cookie.d.ts +7 -0
  131. package/shared/cookie.js +32 -0
  132. package/shared/csp-directives.d.ts +9 -0
  133. package/shared/csp-directives.js +85 -0
  134. package/shared/csp-hash.d.ts +39 -0
  135. package/shared/csp-hash.js +121 -0
  136. package/shared/csp.d.ts +26 -0
  137. package/shared/csp.js +13 -0
  138. package/shared/data.d.ts +175 -0
  139. package/shared/data.js +22 -0
  140. package/shared/errors.d.ts +31 -0
  141. package/shared/errors.js +51 -0
  142. package/shared/head.d.ts +57 -0
  143. package/shared/head.js +242 -0
  144. package/shared/nonce.d.ts +2 -0
  145. package/shared/nonce.js +23 -0
  146. package/shared/prefetch-fallback.min.d.ts +1 -0
  147. package/shared/prefetch-fallback.min.js +2 -0
  148. package/shared/prefetch.d.ts +54 -0
  149. package/shared/prefetch.js +74 -0
  150. package/shared/redirect.d.ts +6 -0
  151. package/shared/redirect.js +25 -0
  152. package/shared/server-exports.d.ts +78 -0
  153. package/shared/server-exports.js +77 -0
  154. package/shared/slash.d.ts +8 -0
  155. package/shared/slash.js +24 -0
package/package.json CHANGED
@@ -1,6 +1,158 @@
1
1
  {
2
2
  "name": "@rivetjs/router",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-alpha.1",
4
+ "description": "File routing for Rivet: loaders, actions, guards, a web-standard request handler, Node / static / edge adapters.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "bin": {
9
+ "rivet": "./cli/rivet.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./index.d.ts",
14
+ "default": "./index.js"
15
+ },
16
+ "./server": {
17
+ "types": "./server/index.d.ts",
18
+ "default": "./server/index.js"
19
+ },
20
+ "./route-cache": {
21
+ "types": "./server/route-cache.d.ts",
22
+ "default": "./server/route-cache.js"
23
+ },
24
+ "./server-only": {
25
+ "types": "./server-only.d.ts",
26
+ "default": "./server-only.js"
27
+ },
28
+ "./client": {
29
+ "types": "./client/index.d.ts",
30
+ "development": "./client/dev.js",
31
+ "default": "./client/index.js"
32
+ },
33
+ "./route-context": {
34
+ "types": "./client/route-context.d.ts",
35
+ "default": "./client/route-context.js"
36
+ },
37
+ "./leave": {
38
+ "types": "./client/leave.d.ts",
39
+ "default": "./client/leave.js"
40
+ },
41
+ "./navigation": {
42
+ "types": "./client/navigation.d.ts",
43
+ "default": "./client/navigation.js"
44
+ },
45
+ "./search": {
46
+ "types": "./client/search.d.ts",
47
+ "default": "./client/search.js"
48
+ },
49
+ "./transitions": {
50
+ "types": "./client/transitions.d.ts",
51
+ "default": "./client/transitions.js"
52
+ },
53
+ "./prefetch": {
54
+ "types": "./shared/prefetch.d.ts",
55
+ "default": "./shared/prefetch.js"
56
+ },
57
+ "./link": {
58
+ "types": "./client/link.d.ts",
59
+ "default": "./client/link.jsx"
60
+ },
61
+ "./transitions.css": "./client/transitions.css",
62
+ "./tailwind.css": "./client/tailwind.css",
63
+ "./routes": {
64
+ "types": "./build/routes.d.ts",
65
+ "default": "./build/routes.js"
66
+ },
67
+ "./node": {
68
+ "types": "./adapters/node.d.ts",
69
+ "default": "./adapters/node.js"
70
+ },
71
+ "./fetch": {
72
+ "types": "./adapters/fetch.d.ts",
73
+ "default": "./adapters/fetch.js"
74
+ },
75
+ "./static": {
76
+ "types": "./adapters/static.d.ts",
77
+ "default": "./adapters/static.js"
78
+ },
79
+ "./csr": {
80
+ "types": "./adapters/csr.d.ts",
81
+ "default": "./adapters/csr.js"
82
+ },
83
+ "./vercel": {
84
+ "types": "./adapters/vercel.d.ts",
85
+ "default": "./adapters/vercel.js"
86
+ },
87
+ "./vercel-edge": {
88
+ "types": "./adapters/vercel-edge.d.ts",
89
+ "default": "./adapters/vercel-edge.js"
90
+ },
91
+ "./netlify": {
92
+ "types": "./adapters/netlify.d.ts",
93
+ "default": "./adapters/netlify.js"
94
+ },
95
+ "./cloudflare": {
96
+ "types": "./adapters/cloudflare.d.ts",
97
+ "default": "./adapters/cloudflare.js"
98
+ },
99
+ "./bun": {
100
+ "types": "./adapters/bun.d.ts",
101
+ "default": "./adapters/bun.js"
102
+ },
103
+ "./deno": {
104
+ "types": "./adapters/deno.d.ts",
105
+ "default": "./adapters/deno.js"
106
+ },
107
+ "./head": {
108
+ "types": "./shared/head.d.ts",
109
+ "default": "./shared/head.js"
110
+ },
111
+ "./vite": {
112
+ "types": "./build/vite.d.ts",
113
+ "default": "./build/vite.js"
114
+ }
115
+ },
116
+ "dependencies": {
117
+ "@rivetjs/runtime": "0.1.0-alpha.1",
118
+ "@rivetjs/reactivity": "0.1.0-alpha.1",
119
+ "@rivetjs/compiler": "0.1.0-alpha.1"
120
+ },
121
+ "engines": {
122
+ "node": ">=24"
123
+ },
124
+ "peerDependencies": {
125
+ "vite": "^8.3.2"
126
+ },
127
+ "peerDependenciesMeta": {
128
+ "vite": {
129
+ "optional": true
130
+ }
131
+ },
132
+ "repository": {
133
+ "type": "git",
134
+ "url": "git+https://github.com/N1XUS/rivetjs.git",
135
+ "directory": "libs/router"
136
+ },
137
+ "homepage": "https://github.com/N1XUS/rivetjs/tree/main/libs/router#readme",
138
+ "bugs": {
139
+ "url": "https://github.com/N1XUS/rivetjs/issues"
140
+ },
141
+ "publishConfig": {
142
+ "access": "public"
143
+ },
144
+ "files": [
145
+ "LICENSE",
146
+ "README.md",
147
+ "adapters",
148
+ "build",
149
+ "cli",
150
+ "client",
151
+ "index.d.ts",
152
+ "index.js",
153
+ "server",
154
+ "server-only.d.ts",
155
+ "server-only.js",
156
+ "shared"
157
+ ]
158
+ }
@@ -0,0 +1,175 @@
1
+ import type { ServerValue } from "@rivetjs/runtime/server";
2
+ import type { ResumeManifest } from "@rivetjs/runtime/server-resume";
3
+ import type { RenderCache } from "@rivetjs/runtime/server-cache";
4
+ import type { ActionResult, Head, HeadSink, LoaderDeps } from "../shared/data.js";
5
+ import { type CSPOptions } from "../shared/csp.js";
6
+ import { type InlineStyleManifest } from "./inline-styles.js";
7
+ import type { TrailingSlash } from "../shared/slash.js";
8
+ import { type AppHandler, type AppRoute, type BodyLimit, type ErrorInfo, type ShellPhase } from "./handler.js";
9
+ import { type DocumentShell } from "./render.js";
10
+ import type { EarlyHintsOptions } from "./early-hints.js";
11
+ import type { RouteCacheOptions, RouteRules } from "./route-cache.js";
12
+ /** How a dev page renders (`AppConfig.devResume`). */
13
+ export type DevResumeMode = "check" | "resume";
14
+ /** What the generated page factory receives. */
15
+ export interface PageInput {
16
+ readonly data: readonly unknown[];
17
+ readonly url: URL;
18
+ readonly head: Head | undefined;
19
+ readonly error?: {
20
+ readonly status: number;
21
+ readonly message: string;
22
+ };
23
+ /** Component head collector (entries generated with `@rivetjs/kit`); the app provides it through `ServerData`. */
24
+ readonly headSink?: HeadSink;
25
+ /** The form action this request performed (no-JS POST): pages read it with `actionResult()`. */
26
+ readonly action?: ActionResult;
27
+ /** Layouts whose loader read the request URL (client navigation reloads them on any URL change). */
28
+ readonly byURL?: readonly number[];
29
+ /** Loaders' `event.depends()` keys (absent when none called it): resumed with the layout state for `invalidate(key)`. */
30
+ readonly deps?: LoaderDeps;
31
+ /** A `data` slot is a deferred loader's handle (`load(fn, { defer: true })`): the page streams (out of order) even without `stream`. */
32
+ readonly deferred?: true;
33
+ /** A deferred loader's redirect target, read at the document's end (client redirect). */
34
+ readonly moved?: () => string | undefined;
35
+ /** @internal Route rule `shell`: a shell fill / replay (always streams). */
36
+ readonly shell?: ShellPhase;
37
+ }
38
+ /** Shape of the generated `.rivet/entry.server.tsx` module. */
39
+ export interface GeneratedEntry {
40
+ readonly routes: readonly AppRoute[];
41
+ readonly universal: Readonly<Record<string, () => Promise<[number, {
42
+ head?: unknown;
43
+ }][]>>>;
44
+ page(input: PageInput): () => ServerValue;
45
+ /** The app's document shell, when codegen was given one. */
46
+ readonly document?: DocumentShell;
47
+ /** `createApp` from the same bundle as the app (one runtime instance). */
48
+ readonly createApp?: typeof createApp;
49
+ /** Generated with component head (`@rivetjs/kit`): pages hold the document start until the shell rendered. */
50
+ readonly headComponents?: boolean;
51
+ /** URL base path the route patterns carry (`""` or e.g. `/app`; `rivetRouter({ base })` / Vite `base`). */
52
+ readonly base?: string;
53
+ /** `rivetRouter({ trailingSlash })` when `"never"` / `"always"` (the handler's 308s use the bundle's build-time constant; the static adapter reads this). */
54
+ readonly trailingSlash?: Exclude<TrailingSlash, "ignore">;
55
+ /** `rivetRouter({ preload: { background } })`: the default `preload.background` of this app's pages. */
56
+ readonly preloadBackground?: number;
57
+ /** Document prefetch on (`rivetRouter({ prefetch })`): the default `preload.ahead` of this app's pages. */
58
+ readonly fetchAhead?: boolean;
59
+ /** `rivetRouter({ routeRules })`: the app's route rules (JSON data; `createApp({ routeRules })` replaces them). */
60
+ readonly routeRules?: RouteRules;
61
+ }
62
+ /** Config of the server app built from the generated routes entry. */
63
+ export interface AppConfig {
64
+ readonly entry: GeneratedEntry;
65
+ /** Document shell; defaults to the entry's `document`. */
66
+ readonly document?: DocumentShell;
67
+ /** Stylesheet URLs passed to the document. */
68
+ readonly styles?: readonly string[];
69
+ /**
70
+ * Per-route stylesheets (route modules' CSS), linked after `styles`: the client build's
71
+ * `.vite/rivet-route-css.json` (see `loadBuild`) or, in dev, a lookup of the route's module graph.
72
+ */
73
+ readonly routeStyles?: Readonly<Record<string, readonly string[]>> | ((routeId: string) => readonly string[] | Promise<readonly string[]>);
74
+ /**
75
+ * Stylesheets pages may write inline instead of linking: the client build's `.vite/rivet-inline-css.json`
76
+ * (`rivetRouter({ inlineStylesheets })`, see `loadBuild`), decided per page from its `styles` + `routeStyles` list
77
+ * (`inlineStylesFor`). Dev links every sheet.
78
+ */
79
+ readonly inlineStyles?: InlineStyleManifest;
80
+ /** Document defaults below every route (level −1): e.g. `{ titleTemplate: "%s · Shop", meta: [...] }`. */
81
+ readonly head?: Head;
82
+ /** Production resume manifest; omit in dev (see `devResume`). */
83
+ readonly manifest?: ResumeManifest;
84
+ readonly dev?: boolean;
85
+ /**
86
+ * Dev (no manifest): module scripts that client-render the page (e.g. the Vite client and the
87
+ * generated `entry.dev.tsx`). The app renders inside `[data-rivet-dev]` with its route data embedded.
88
+ * A function gets the page's locale (i18n), e.g. to load that locale's dev module graph.
89
+ */
90
+ readonly devScripts?: readonly string[] | ((locale: string | undefined) => readonly string[]);
91
+ /**
92
+ * Dev server (`rivetRouter` sets it; no production `manifest`): pages render through the resume
93
+ * recorder with this dev manifest, so serialization and chunk errors surface as in production.
94
+ * `mode` (per page locale when a function): `"check"` leaves the recorded state and loader out of
95
+ * the page and the browser client-renders (`devScripts`, embedded data); `"resume"` serves the
96
+ * page resumable like production, inside `[data-rivet-dev="resume"]` followed by `devScripts`.
97
+ */
98
+ readonly devResume?: {
99
+ readonly manifest: ResumeManifest;
100
+ readonly mode: DevResumeMode | ((locale: string | undefined) => DevResumeMode);
101
+ };
102
+ readonly stream?: {
103
+ deadline?: number;
104
+ };
105
+ /**
106
+ * Preload planner. `background`: byte budget (minified) of `visible` chunks' static closures also prefetched at idle,
107
+ * in plan order (default 1 MiB, `0` off; Save-Data / 2G never). A function decides per page URL (`undefined`: default),
108
+ * e.g. `0` for embedded frames that a page shows many of. `lean` (per page URL when a function): nothing loads before
109
+ * the first interaction — no scheduled prefetch (eager / idle / visible / background) and no router fetch-ahead;
110
+ * handlers load on intent (pointer dwell, focus, touch) and interaction, as under Save-Data.
111
+ */
112
+ readonly preload?: {
113
+ readonly background?: number | ((url: URL) => number | undefined);
114
+ readonly lean?: boolean | ((url: URL) => boolean | undefined);
115
+ /**
116
+ * Islands-only lean pages of a file-router app (bridge D-lean: the router's region + link listeners deferred until
117
+ * the first link intent / click) still fetch the runtime + router chunks ahead (low priority after `load`, fetched,
118
+ * never evaluated). On `resume.chunks: "route"` builds every page also fetches its own handler chunks ahead the
119
+ * same way. Default: the app's document prefetch (`rivetRouter({ prefetch })` on → true). Ignored with `lean`.
120
+ */
121
+ readonly ahead?: boolean;
122
+ };
123
+ /**
124
+ * Content-Security-Policy for HTML pages, given the response's nonce (inline scripts carry it).
125
+ * Default: strict nonce policy (`strictCSP`); `CSPOptions` (`{ trustedTypes, directives }`): `strictCSP` with them (directives checked at startup);
126
+ * `false` sends none. A `headers()` CSP wins.
127
+ */
128
+ readonly csp?: false | CSPOptions | ((nonce: string) => string);
129
+ /** Server failures (`digest` set for 5xx responses, matching the message the client sees; `phase`/`route` where it failed). */
130
+ onError?(error: unknown, request: Request, info?: ErrorInfo): void;
131
+ /**
132
+ * i18n: locales in compiler variant order and per-locale resume manifests. A page renders the
133
+ * variant and manifest of `locals.locale` (set by a guard, e.g. `i18nGuard`); `locals.dir` reaches
134
+ * the document as `dir`. Error pages use the request's `locals` too; without a locale there
135
+ * (unmatched URLs, guards that failed first) `resolve(request)` decides, else a first path segment
136
+ * naming a locale, else the first locale.
137
+ */
138
+ readonly i18n?: {
139
+ readonly locales: readonly string[];
140
+ readonly manifests?: Readonly<Record<string, ResumeManifest>>;
141
+ resolve?(request: Request): string | undefined | Promise<string | undefined>;
142
+ };
143
+ /** Request body limit for unsafe methods (413 past it); default 1 MiB, multipart 10 MiB. */
144
+ readonly maxBody?: BodyLimit;
145
+ /**
146
+ * Route rules by path pattern (`{ "/blog/**": { swr: 60 }, "/about": { isr: true, headers: { … } } }`): response headers,
147
+ * and an in-process cache of rendered pages (fresh, stale-while-revalidate, ISR; ETag / Last-Modified → 304).
148
+ * Defaults to the entry's (`rivetRouter({ routeRules })`). The rules module loads only when there are rules.
149
+ * See `server/route-cache.ts` / docs "Caching".
150
+ */
151
+ readonly routeRules?: RouteRules;
152
+ /** The route rules' page store: `maxBytes` (default 32 MiB), `maxEntries` (default 5000), `origin` (the public origin pages are stored for; `isr` needs it). */
153
+ readonly routeCache?: RouteCacheOptions;
154
+ /**
155
+ * Cross-request fragment cache (`createRenderCache()` from `@rivetjs/runtime/server-cache`): every page renders inside
156
+ * its scope (`withRenderCache`: locale variant, nonce, abort signal, resumable), so `cached()` / `shell()` / compiler
157
+ * `_cached` components hit across requests. Node-only (AsyncLocalStorage; Workers: `nodejs_als`); loaded only when set.
158
+ */
159
+ readonly renderCache?: RenderCache;
160
+ /**
161
+ * Early hints for HTML pages (production only): linked stylesheets, the head's build-asset font preloads (learned
162
+ * per route from its last render), `links` (e.g. preconnects), and with `runtime: true` the resume runtime entry. Sent as `103 Early
163
+ * Hints` by the node adapter before guards and loaders run (`start({ earlyHints })`), and as a `Link` header on every
164
+ * page response (proxies such as Cloudflare turn it into 103s). Browsers act on 103s over HTTP/2+ only. Pages served
165
+ * from the route cache get the stored `Link` header but no 103 (no render runs): it helps uncached pages. Default off.
166
+ */
167
+ readonly earlyHints?: boolean | EarlyHintsOptions;
168
+ }
169
+ /**
170
+ * Merge heads outer → inner: inner wins per key (title; meta by name/property/http-equiv/itemprop
171
+ * + media; one canonical; alternates by hreflang; other links by rel + href; scripts by id/src).
172
+ */
173
+ export declare function mergeHeads(heads: readonly (Head | undefined)[]): Head | undefined;
174
+ /** Create the app's request handler. */
175
+ export declare function createApp(config: AppConfig): AppHandler;