@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.
- package/LICENSE +21 -0
- package/README.md +10 -2
- package/adapters/assemble.d.ts +32 -0
- package/adapters/assemble.js +32 -0
- package/adapters/build.d.ts +24 -0
- package/adapters/build.js +43 -0
- package/adapters/bun.d.ts +18 -0
- package/adapters/bun.js +44 -0
- package/adapters/cloudflare.d.ts +5 -0
- package/adapters/cloudflare.js +8 -0
- package/adapters/cluster.d.ts +7 -0
- package/adapters/cluster.js +130 -0
- package/adapters/csr.d.ts +12 -0
- package/adapters/csr.js +11 -0
- package/adapters/deno.d.ts +13 -0
- package/adapters/deno.js +35 -0
- package/adapters/fetch.d.ts +55 -0
- package/adapters/fetch.js +72 -0
- package/adapters/files.d.ts +20 -0
- package/adapters/files.js +155 -0
- package/adapters/idle-memory.d.ts +23 -0
- package/adapters/idle-memory.js +91 -0
- package/adapters/netlify.d.ts +13 -0
- package/adapters/netlify.js +15 -0
- package/adapters/node.d.ts +180 -0
- package/adapters/node.js +986 -0
- package/adapters/pack.d.ts +39 -0
- package/adapters/pack.js +360 -0
- package/adapters/server-target.d.ts +17 -0
- package/adapters/server-target.js +8 -0
- package/adapters/static.d.ts +84 -0
- package/adapters/static.js +231 -0
- package/adapters/target-build.d.ts +95 -0
- package/adapters/target-build.js +118 -0
- package/adapters/vercel-edge.d.ts +7 -0
- package/adapters/vercel-edge.js +9 -0
- package/adapters/vercel.d.ts +35 -0
- package/adapters/vercel.js +45 -0
- package/build/codegen.d.ts +97 -0
- package/build/codegen.js +1037 -0
- package/build/dev-errors.d.ts +23 -0
- package/build/dev-errors.js +247 -0
- package/build/lazy-rows.d.ts +19 -0
- package/build/lazy-rows.js +59 -0
- package/build/migrate.d.ts +31 -0
- package/build/migrate.js +385 -0
- package/build/reach.d.ts +60 -0
- package/build/reach.js +302 -0
- package/build/route-css.d.ts +54 -0
- package/build/route-css.js +216 -0
- package/build/routes.d.ts +55 -0
- package/build/routes.js +219 -0
- package/build/sync.d.ts +20 -0
- package/build/sync.js +16 -0
- package/build/vite.d.ts +208 -0
- package/build/vite.js +861 -0
- package/cli/rivet.d.ts +2 -0
- package/cli/rivet.js +101 -0
- package/client/active.d.ts +6 -0
- package/client/active.js +22 -0
- package/client/announce.d.ts +2 -0
- package/client/announce.js +21 -0
- package/client/dev.d.ts +41 -0
- package/client/dev.js +91 -0
- package/client/index.d.ts +156 -0
- package/client/index.js +714 -0
- package/client/layouts.d.ts +110 -0
- package/client/layouts.js +310 -0
- package/client/leave.d.ts +40 -0
- package/client/leave.js +75 -0
- package/client/link.d.ts +48 -0
- package/client/link.jsx +65 -0
- package/client/live.d.ts +57 -0
- package/client/live.js +170 -0
- package/client/navigate.d.ts +71 -0
- package/client/navigate.js +120 -0
- package/client/navigation.d.ts +28 -0
- package/client/navigation.js +14 -0
- package/client/params.d.ts +16 -0
- package/client/params.js +28 -0
- package/client/route-context.d.ts +32 -0
- package/client/route-context.js +21 -0
- package/client/scroll.d.ts +16 -0
- package/client/scroll.js +80 -0
- package/client/search.d.ts +8 -0
- package/client/search.js +17 -0
- package/client/tailwind.css +8 -0
- package/client/transition-helpers.d.ts +28 -0
- package/client/transition-helpers.js +63 -0
- package/client/transitions.css +90 -0
- package/client/transitions.d.ts +21 -0
- package/client/transitions.js +156 -0
- package/index.d.ts +135 -0
- package/index.js +8 -0
- package/package.json +156 -4
- package/server/app.d.ts +175 -0
- package/server/app.js +335 -0
- package/server/body.d.ts +20 -0
- package/server/body.js +8 -0
- package/server/deferred.d.ts +12 -0
- package/server/deferred.js +60 -0
- package/server/early-hints.d.ts +34 -0
- package/server/early-hints.js +63 -0
- package/server/handler.d.ts +240 -0
- package/server/handler.js +661 -0
- package/server/index.d.ts +9 -0
- package/server/index.js +6 -0
- package/server/inline-styles.d.ts +21 -0
- package/server/inline-styles.js +28 -0
- package/server/module.d.ts +14 -0
- package/server/module.js +96 -0
- package/server/render.d.ts +96 -0
- package/server/render.js +492 -0
- package/server/route-cache.d.ts +245 -0
- package/server/route-cache.js +813 -0
- package/server/security.d.ts +18 -0
- package/server/security.js +47 -0
- package/server/shell-build.d.ts +3 -0
- package/server/shell-build.js +2 -0
- package/server/shell-cache.d.ts +8 -0
- package/server/shell-cache.js +836 -0
- package/server/strict-csp.d.ts +7 -0
- package/server/strict-csp.js +18 -0
- package/server-only.d.ts +1 -0
- package/server-only.js +3 -0
- package/shared/actions.d.ts +10 -0
- package/shared/actions.js +18 -0
- package/shared/base.d.ts +8 -0
- package/shared/base.js +20 -0
- package/shared/cookie.d.ts +7 -0
- package/shared/cookie.js +32 -0
- package/shared/csp-directives.d.ts +9 -0
- package/shared/csp-directives.js +85 -0
- package/shared/csp-hash.d.ts +39 -0
- package/shared/csp-hash.js +121 -0
- package/shared/csp.d.ts +26 -0
- package/shared/csp.js +13 -0
- package/shared/data.d.ts +175 -0
- package/shared/data.js +22 -0
- package/shared/errors.d.ts +31 -0
- package/shared/errors.js +51 -0
- package/shared/head.d.ts +57 -0
- package/shared/head.js +242 -0
- package/shared/nonce.d.ts +2 -0
- package/shared/nonce.js +23 -0
- package/shared/prefetch-fallback.min.d.ts +1 -0
- package/shared/prefetch-fallback.min.js +2 -0
- package/shared/prefetch.d.ts +54 -0
- package/shared/prefetch.js +74 -0
- package/shared/redirect.d.ts +6 -0
- package/shared/redirect.js +25 -0
- package/shared/server-exports.d.ts +78 -0
- package/shared/server-exports.js +77 -0
- package/shared/slash.d.ts +8 -0
- package/shared/slash.js +24 -0
package/server/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Server entry: request handler, page rendering and app assembly (web-standard APIs only).
|
|
2
|
+
export * from "./handler.js";
|
|
3
|
+
export { strictCSP } from "./strict-csp.js";
|
|
4
|
+
export { createApp, mergeHeads } from "./app.js";
|
|
5
|
+
export { renderPage, renderDocument, failureMarker, headTags, } from "./render.js";
|
|
6
|
+
export { serverExports, mergeServer, loadServer } from "./module.js";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** `.vite/rivet-inline-css.json`: the sheets that may be inlined and the rule the build was configured with. */
|
|
2
|
+
export interface InlineStyleManifest {
|
|
3
|
+
/** `"always"`: every listed sheet; `"auto"`: the per-page brotli total, else the per-sheet limit. */
|
|
4
|
+
readonly mode: "auto" | "always";
|
|
5
|
+
/** `auto`: all of a page's listed sheets go inline when their brotli sizes add up to at most this (bytes). */
|
|
6
|
+
readonly maxTotalBrotli: number;
|
|
7
|
+
/** `auto` fallback: a listed sheet of at most this many bytes (raw CSS) goes inline on its own. */
|
|
8
|
+
readonly limit: number;
|
|
9
|
+
/** Stylesheet URL → its CSS, its UTF-8 size and its brotli size (bytes). Sheets with relative references are never listed. */
|
|
10
|
+
readonly sheets: Readonly<Record<string, {
|
|
11
|
+
readonly css: string;
|
|
12
|
+
readonly bytes: number;
|
|
13
|
+
readonly br: number;
|
|
14
|
+
}>>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The subset of `styles` (URL → CSS) a page writes inline. `auto`: every listed sheet when their brotli total is at
|
|
18
|
+
* most `maxTotalBrotli` (one render-blocking round trip less: all of the page's sheets arrive with the HTML), else
|
|
19
|
+
* each listed sheet of at most `limit` raw bytes. Results are cached per stylesheet list (bounded by the routes).
|
|
20
|
+
*/
|
|
21
|
+
export declare function inlineStylesFor(manifest: InlineStyleManifest): (styles: readonly string[]) => Readonly<Record<string, string>> | undefined;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Per-page stylesheet inlining (`rivetRouter({ inlineStylesheets })`): which of a page's stylesheet URLs the shell
|
|
2
|
+
// writes as `<style>` (`DocumentInput.inlineStyles`), from the client build's `.vite/rivet-inline-css.json`.
|
|
3
|
+
/**
|
|
4
|
+
* The subset of `styles` (URL → CSS) a page writes inline. `auto`: every listed sheet when their brotli total is at
|
|
5
|
+
* most `maxTotalBrotli` (one render-blocking round trip less: all of the page's sheets arrive with the HTML), else
|
|
6
|
+
* each listed sheet of at most `limit` raw bytes. Results are cached per stylesheet list (bounded by the routes).
|
|
7
|
+
*/
|
|
8
|
+
export function inlineStylesFor(manifest) {
|
|
9
|
+
const cache = new Map();
|
|
10
|
+
const { sheets } = manifest;
|
|
11
|
+
return (styles) => {
|
|
12
|
+
const key = styles.join("\n");
|
|
13
|
+
if (cache.has(key))
|
|
14
|
+
return cache.get(key);
|
|
15
|
+
const listed = styles.filter((href) => Object.hasOwn(sheets, href));
|
|
16
|
+
let total = 0;
|
|
17
|
+
for (const href of listed)
|
|
18
|
+
total += sheets[href].br;
|
|
19
|
+
const all = manifest.mode === "always" || total <= manifest.maxTotalBrotli;
|
|
20
|
+
const out = {};
|
|
21
|
+
for (const href of listed)
|
|
22
|
+
if (all || sheets[href].bytes <= manifest.limit)
|
|
23
|
+
out[href] = sheets[href].css;
|
|
24
|
+
const result = Object.keys(out).length ? out : undefined;
|
|
25
|
+
cache.set(key, result);
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ServerModule } from "./handler.js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize one module's exports by tag. `server`: a raw-loaded server module (sibling `*.server.ts`,
|
|
4
|
+
* plain `.ts` endpoint) — its former sibling names (`load`, `GET`…) are checked too. Errors (thrown at the
|
|
5
|
+
* first request that loads the module): two exports of one kind; an untagged export with a former magic name.
|
|
6
|
+
*/
|
|
7
|
+
export declare function serverExports(module: Record<string, unknown> | undefined, file?: string, server?: boolean): ServerModule;
|
|
8
|
+
/** Merge a route module's in-file server exports with its sibling `*.server.ts`. */
|
|
9
|
+
export declare function mergeServer(inline: Record<string, unknown>, sibling: Record<string, unknown>, files?: readonly string[]): ServerModule;
|
|
10
|
+
/**
|
|
11
|
+
* Load a route table entry's server module. Generated loaders (`build/codegen.ts`) return it normalized
|
|
12
|
+
* (`serverExports` / `mergeServer`): `AppRoute.server` / `layouts` return `ServerModule`s.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadServer(load: (() => Promise<ServerModule>) | undefined): Promise<ServerModule> | undefined;
|
package/server/module.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { SERVER_EXPORT } from "../shared/server-exports.js";
|
|
2
|
+
/** Former magic export names → the wrapper that replaces them (an untagged export with one is an error). */
|
|
3
|
+
const MAGIC = {
|
|
4
|
+
serverLoad: "load",
|
|
5
|
+
serverGuard: "guard",
|
|
6
|
+
serverActions: "actions",
|
|
7
|
+
serverEntries: "entries",
|
|
8
|
+
serverHeaders: "headers",
|
|
9
|
+
onRequest: "onRequest",
|
|
10
|
+
onGet: "onGet",
|
|
11
|
+
onPost: "onPost",
|
|
12
|
+
onPut: "onPut",
|
|
13
|
+
onPatch: "onPatch",
|
|
14
|
+
onDelete: "onDelete",
|
|
15
|
+
onOptions: "onOptions",
|
|
16
|
+
};
|
|
17
|
+
/** Former sibling `*.server.ts` names (raw-loaded server modules only). */
|
|
18
|
+
const LEGACY = {
|
|
19
|
+
load: "load",
|
|
20
|
+
guard: "guard",
|
|
21
|
+
actions: "actions",
|
|
22
|
+
entries: "entries",
|
|
23
|
+
headers: "headers",
|
|
24
|
+
GET: "onGet",
|
|
25
|
+
POST: "onPost",
|
|
26
|
+
PUT: "onPut",
|
|
27
|
+
PATCH: "onPatch",
|
|
28
|
+
DELETE: "onDelete",
|
|
29
|
+
};
|
|
30
|
+
const cache = new WeakMap();
|
|
31
|
+
const kindOf = (value) => typeof value === "function" || (typeof value === "object" && value !== null) ? value[SERVER_EXPORT] : undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Normalize one module's exports by tag. `server`: a raw-loaded server module (sibling `*.server.ts`,
|
|
34
|
+
* plain `.ts` endpoint) — its former sibling names (`load`, `GET`…) are checked too. Errors (thrown at the
|
|
35
|
+
* first request that loads the module): two exports of one kind; an untagged export with a former magic name.
|
|
36
|
+
*/
|
|
37
|
+
export function serverExports(module, file = "route module", server = false) {
|
|
38
|
+
if (!module)
|
|
39
|
+
return {};
|
|
40
|
+
const cached = cache.get(module);
|
|
41
|
+
if (cached)
|
|
42
|
+
return cached;
|
|
43
|
+
const out = {};
|
|
44
|
+
const names = {};
|
|
45
|
+
for (const name of Object.keys(module)) {
|
|
46
|
+
const value = module[name];
|
|
47
|
+
const kind = kindOf(value);
|
|
48
|
+
if (kind === undefined) {
|
|
49
|
+
const wrapper = MAGIC[name] ?? (server ? LEGACY[name] : undefined);
|
|
50
|
+
if (wrapper !== undefined && value !== undefined)
|
|
51
|
+
throw new Error(`${file}: \`${name}\` is not a server export: wrap it — \`export const x = ${wrapper}(…)\` (\`${wrapper}\` is exported by @rivetjs/router)`);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (out[kind] !== undefined && out[kind] !== value)
|
|
55
|
+
throw new Error(`${file}: \`${names[kind]}\` and \`${name}\` are both \`${kind}(…)\`; keep one`);
|
|
56
|
+
out[kind] = value;
|
|
57
|
+
names[kind] = name;
|
|
58
|
+
}
|
|
59
|
+
if (module.prerender !== undefined)
|
|
60
|
+
out.prerender = module.prerender;
|
|
61
|
+
if (module.csrf !== undefined)
|
|
62
|
+
out.csrf = module.csrf;
|
|
63
|
+
const result = out;
|
|
64
|
+
cache.set(module, result);
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Merge a page/layout module's in-file server exports with its sibling `*.server.ts` (generated
|
|
69
|
+
* loaders call this for routes that have both). One kind defined in both is an error.
|
|
70
|
+
*/
|
|
71
|
+
const merges = new WeakMap();
|
|
72
|
+
/** Merge a route module's in-file server exports with its sibling `*.server.ts`. */
|
|
73
|
+
export function mergeServer(inline, sibling, files = ["page", "sibling"]) {
|
|
74
|
+
// Per (inline, sibling) module pair: a hot edit brings new module objects, hence a new merge.
|
|
75
|
+
const cached = merges.get(inline)?.get(sibling);
|
|
76
|
+
if (cached)
|
|
77
|
+
return cached;
|
|
78
|
+
const a = serverExports(inline, files[0]);
|
|
79
|
+
const b = serverExports(sibling, files[1], true);
|
|
80
|
+
for (const key of Object.keys(b))
|
|
81
|
+
if (key in a)
|
|
82
|
+
throw new Error(`${files[0]} and ${files[1]} both define the route's \`${key}\`; keep one`);
|
|
83
|
+
const merged = { ...b, ...a };
|
|
84
|
+
let bySibling = merges.get(inline);
|
|
85
|
+
if (!bySibling)
|
|
86
|
+
merges.set(inline, (bySibling = new WeakMap()));
|
|
87
|
+
bySibling.set(sibling, merged);
|
|
88
|
+
return merged;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Load a route table entry's server module. Generated loaders (`build/codegen.ts`) return it normalized
|
|
92
|
+
* (`serverExports` / `mergeServer`): `AppRoute.server` / `layouts` return `ServerModule`s.
|
|
93
|
+
*/
|
|
94
|
+
export function loadServer(load) {
|
|
95
|
+
return load?.();
|
|
96
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type ServerValue } from "@rivetjs/runtime/server";
|
|
2
|
+
import { type ResumeManifest } from "@rivetjs/runtime/server-resume";
|
|
3
|
+
import type { Head } from "../shared/data.js";
|
|
4
|
+
import type { HeadManaged } from "../shared/head.js";
|
|
5
|
+
export { headTags, htmlAttributes, bodyAttributes, type HeadTagOptions, type HeadManaged } from "../shared/head.js";
|
|
6
|
+
/** Document around the app. `start` ends inside the app container; `end` closes it. */
|
|
7
|
+
export interface DocumentParts {
|
|
8
|
+
start: string;
|
|
9
|
+
end: string;
|
|
10
|
+
}
|
|
11
|
+
/** What a document shell receives: head, nonce, URL, status and stylesheets. */
|
|
12
|
+
export interface DocumentInput {
|
|
13
|
+
readonly head: Head | undefined;
|
|
14
|
+
readonly nonce: string | undefined;
|
|
15
|
+
readonly url: URL;
|
|
16
|
+
readonly status: number;
|
|
17
|
+
/** Stylesheet URLs to link (Vite manifest CSS in production, source paths in dev): global, then the route's. */
|
|
18
|
+
readonly styles: readonly string[];
|
|
19
|
+
/** Stylesheets of `styles` written as `<style>` (URL → CSS; `rivetRouter({ inlineStylesheets })`): `headTags` reads it. */
|
|
20
|
+
readonly inlineStyles?: Readonly<Record<string, string>>;
|
|
21
|
+
/** Request locale (i18n `locals.locale`); shells write `<html lang dir>` from it. */
|
|
22
|
+
readonly locale?: string;
|
|
23
|
+
readonly dir?: "ltr" | "rtl";
|
|
24
|
+
/** Head tags are client-managed (`@rivetjs/kit`): shells pass the input to `headTags(head, input)`. */
|
|
25
|
+
readonly managed?: HeadManaged;
|
|
26
|
+
}
|
|
27
|
+
/** Renders the HTML document around a page. */
|
|
28
|
+
export type DocumentShell = (input: DocumentInput) => DocumentParts;
|
|
29
|
+
/** Options of `renderPage()`. */
|
|
30
|
+
export interface RenderPageOptions {
|
|
31
|
+
/** Resume manifest (production client build). Without it the page renders without resumability. */
|
|
32
|
+
manifest?: ResumeManifest;
|
|
33
|
+
document: DocumentShell;
|
|
34
|
+
/** Out-of-order streaming for pending `Async` boundaries; `deadline` ms hands the rest to the browser. */
|
|
35
|
+
stream?: {
|
|
36
|
+
deadline?: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Preload planner (`renderResumable` `preload`): `background` byte budget of idle-time visible prefetch; `lean`: nothing
|
|
40
|
+
* before an interaction; `ahead`: bridge D-lean pages keep the runtime fetch-ahead.
|
|
41
|
+
*/
|
|
42
|
+
preload?: {
|
|
43
|
+
background?: number;
|
|
44
|
+
lean?: boolean;
|
|
45
|
+
ahead?: boolean;
|
|
46
|
+
};
|
|
47
|
+
signal?: AbortSignal;
|
|
48
|
+
nonce?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Failures after the response started (status already sent): this reports; a returned digest goes
|
|
51
|
+
* into the failure marker. The document then ends cleanly: a nonce'd script dispatching
|
|
52
|
+
* `rivet:resume-error` (`detail: { phase: "render", digest, error }`) and the shell's `end`.
|
|
53
|
+
*/
|
|
54
|
+
onError?: (error: unknown) => string | void;
|
|
55
|
+
/** Markup written right before and after the app (dev: client mount container, data, scripts). */
|
|
56
|
+
around?: {
|
|
57
|
+
start: string;
|
|
58
|
+
end: string;
|
|
59
|
+
};
|
|
60
|
+
/** Locale variant index of translated templates (i18n; default 0). */
|
|
61
|
+
variant?: number;
|
|
62
|
+
/**
|
|
63
|
+
* Head hold (`@rivetjs/kit` components): app output is buffered until the shell has rendered, then
|
|
64
|
+
* the document starts with `head()` (route exports merged with what components pushed).
|
|
65
|
+
*/
|
|
66
|
+
hold?: {
|
|
67
|
+
head(): Head | undefined;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Dev check (`AppConfig.devResume` mode `"check"`): the recorder runs, so its errors surface, but the
|
|
71
|
+
* page's root state and loader are cut (the browser client-renders). Not with `stream`.
|
|
72
|
+
*/
|
|
73
|
+
discardState?: boolean;
|
|
74
|
+
/** Markup written after the app's output (and its streamed boundaries), before `around.end` (deferred loaders' client redirect). */
|
|
75
|
+
epilogue?: () => string;
|
|
76
|
+
}
|
|
77
|
+
/** Mid-stream failure marker: tells the page (and monitoring) the document is incomplete. */
|
|
78
|
+
export declare function failureMarker(nonce: string | undefined, digest: string | undefined): string;
|
|
79
|
+
/**
|
|
80
|
+
* Render `factory` between the document parts as a streamed UTF-8 body. Writes respect the
|
|
81
|
+
* consumer's pace: the renderer waits while the stream's queue is full. Always a `Response`: a
|
|
82
|
+
* failure before any byte left errors the body (`renderDocument` rejects instead).
|
|
83
|
+
*/
|
|
84
|
+
export declare function renderPage(factory: () => ServerValue, input: DocumentInput, options: RenderPageOptions, init: {
|
|
85
|
+
status: number;
|
|
86
|
+
headers: Headers;
|
|
87
|
+
}): Response;
|
|
88
|
+
/**
|
|
89
|
+
* `renderPage`, but the `Response` is created once the first body bytes are ready (or the render
|
|
90
|
+
* ended): a failure before that throws / rejects, so the caller can answer with an error page and
|
|
91
|
+
* status instead of a 200 with a broken body. A synchronous page answers synchronously.
|
|
92
|
+
*/
|
|
93
|
+
export declare function renderDocument(factory: () => ServerValue, input: DocumentInput, options: RenderPageOptions, init: {
|
|
94
|
+
status: number;
|
|
95
|
+
headers: Headers;
|
|
96
|
+
}): Response | Promise<Response>;
|