@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
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import type { AppHandler } from "./handler.js";
|
|
2
|
+
import type { CSPOptions } from "../shared/csp.js";
|
|
3
|
+
/** How a matched route's rendered pages are cached (`RouteRule.cache`). */
|
|
4
|
+
export interface CacheRule {
|
|
5
|
+
/** Seconds a stored page is served without rendering (fresh). */
|
|
6
|
+
readonly maxAge: number;
|
|
7
|
+
/**
|
|
8
|
+
* Seconds after `maxAge` the stored page is still served while one background render refreshes it
|
|
9
|
+
* (stale-while-revalidate); `true`: without limit. Default 0 (an expired page renders on the request).
|
|
10
|
+
*/
|
|
11
|
+
readonly swr?: number | true;
|
|
12
|
+
/** Names `revalidate({ tag })` drops these pages by. */
|
|
13
|
+
readonly tags?: readonly string[];
|
|
14
|
+
/**
|
|
15
|
+
* Request headers whose values key separate copies (`accept-language`, …); case-insensitive; never `cookie` /
|
|
16
|
+
* `authorization`. Sent as `Vary` with every stored page. A response `Vary` naming other headers adds them to the key
|
|
17
|
+
* too; one naming `cookie` / `authorization` (the i18n guard's) is stored only when `varies` names a header.
|
|
18
|
+
*/
|
|
19
|
+
readonly varies?: readonly string[];
|
|
20
|
+
/**
|
|
21
|
+
* Query strings: `true` (default) keys a copy per query string (a new query string is stored on its second
|
|
22
|
+
* request), `false` ignores the query (one copy per path), a list keys only those parameters.
|
|
23
|
+
*/
|
|
24
|
+
readonly query?: boolean | readonly string[];
|
|
25
|
+
/**
|
|
26
|
+
* `true`: requests with a `Cookie` header are served from the cache too (cookies are not part of the key) — and every
|
|
27
|
+
* page of the rule renders without the request's `Cookie` / `Authorization` (anonymous: a loader never sees a session),
|
|
28
|
+
* so one visitor's page is never stored for everyone. Default: requests with cookies bypass the cache.
|
|
29
|
+
*/
|
|
30
|
+
readonly cookies?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** What shared caches / CDNs are told (`RouteRule.cdn`): `s-maxage` / `stale-while-revalidate` seconds. */
|
|
33
|
+
export interface CdnRule {
|
|
34
|
+
readonly maxAge: number;
|
|
35
|
+
readonly swr?: number | true;
|
|
36
|
+
}
|
|
37
|
+
/** What applies to the requests whose path matches a pattern. */
|
|
38
|
+
export interface RouteRule {
|
|
39
|
+
/** Response headers set on every response of the matched paths (pages, data requests, endpoints, 304s). */
|
|
40
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
41
|
+
/** Cache rendered pages; `false` turns off a less specific rule's cache. */
|
|
42
|
+
readonly cache?: CacheRule | false;
|
|
43
|
+
/** Shorthand: `swr: n` = `cache: { maxAge: n, swr: true }`. */
|
|
44
|
+
readonly swr?: number | true;
|
|
45
|
+
/**
|
|
46
|
+
* Shorthand: `isr: n` = `cache: { maxAge: n, swr: true }`; `isr: true` = stored until `revalidate()`. Needs a fixed
|
|
47
|
+
* `origin` (`routeCache.origin`, or the adapter's). CDNs get `s-maxage=0, must-revalidate` (`revalidate()` is
|
|
48
|
+
* process-local: it cannot purge a CDN) unless `cdn` says otherwise.
|
|
49
|
+
*/
|
|
50
|
+
readonly isr?: number | true;
|
|
51
|
+
/**
|
|
52
|
+
* `Cache-Control` for shared caches / CDNs of the stored pages (`s-maxage`, `stale-while-revalidate`). Default: the
|
|
53
|
+
* cache's own `maxAge` / `swr`, `isr` (and `maxAge: Infinity`) rules `s-maxage=0, must-revalidate`.
|
|
54
|
+
*/
|
|
55
|
+
readonly cdn?: CdnRule;
|
|
56
|
+
/**
|
|
57
|
+
* Shell cache (partial prerendering, `server/shell-cache.ts`): the document up to its first streamed boundary (the shell:
|
|
58
|
+
* everything outside `<Async fallback>` holes reading deferred loaders) is stored once and sent at once on later
|
|
59
|
+
* requests — signed-in ones too (cookies never bypass it, never key it) — while the holes render live per request in
|
|
60
|
+
* the same response. `true`: the rule's `cache` / `swr` / `isr` times, else stored until `revalidate()` (needs a fixed
|
|
61
|
+
* `origin`, like `isr`); an object sets them. Fills that read request input outside the key (cookies, headers, locals,
|
|
62
|
+
* unkeyed query parameters) are not stored (dev logs why). `false` turns off a less specific rule's shell. Not with `cdn`.
|
|
63
|
+
*/
|
|
64
|
+
readonly shell?: boolean | ShellRule;
|
|
65
|
+
}
|
|
66
|
+
/** `RouteRule.shell` times and keys (defaults: the rule's `cache` / `swr` / `isr`, else stored until `revalidate()`). */
|
|
67
|
+
export interface ShellRule {
|
|
68
|
+
readonly maxAge?: number;
|
|
69
|
+
readonly swr?: number | true;
|
|
70
|
+
readonly tags?: readonly string[];
|
|
71
|
+
/** Request headers whose values key separate shells (never `cookie` / `authorization`). */
|
|
72
|
+
readonly varies?: readonly string[];
|
|
73
|
+
/** `true` (default): one shell per query string; `false`: query-less URLs only; a list: those parameters (other URLs render without the shell). */
|
|
74
|
+
readonly query?: boolean | readonly string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Rules by path pattern (pathname below the app's base): `/about` exact, `*` one segment (`/blog/*`), a trailing
|
|
78
|
+
* `/**` the path and everything below it (`/docs/**`, `/**`). Every matching rule applies, the less specific first
|
|
79
|
+
* (fewer literal characters): headers merge by name, the most specific `cache` (or shorthand) wins.
|
|
80
|
+
*/
|
|
81
|
+
export type RouteRules = Readonly<Record<string, RouteRule>>;
|
|
82
|
+
/** Bounds of the in-process page store (`createApp({ routeCache })`). */
|
|
83
|
+
export interface RouteCacheOptions {
|
|
84
|
+
/** Stored bytes — bodies, their br / gzip copies, keys, headers (default 32 MiB); a page over a quarter of it is never stored. */
|
|
85
|
+
readonly maxBytes?: number;
|
|
86
|
+
/** Stored pages (default 5000). */
|
|
87
|
+
readonly maxEntries?: number;
|
|
88
|
+
/**
|
|
89
|
+
* The public origin pages are stored for (`https://shop.example`); requests for another origin bypass the cache.
|
|
90
|
+
* Required by `isr` rules. Without it the request's origin (from `Host` / trusted forwarded headers) is part of the
|
|
91
|
+
* key: a forged `Host` renders and stores a copy of its own (never served to other hosts) — set it, or a fixed
|
|
92
|
+
* `origin` on the node / fetch adapter (`start()` / `createFetchHandler()` pass theirs on).
|
|
93
|
+
*/
|
|
94
|
+
readonly origin?: string;
|
|
95
|
+
}
|
|
96
|
+
/** A stored page (exported for the node adapter's fast path). */
|
|
97
|
+
export interface CachedPage {
|
|
98
|
+
readonly key: string;
|
|
99
|
+
/** Pathname below the base (decoded). */
|
|
100
|
+
readonly path: string;
|
|
101
|
+
readonly tags: readonly string[];
|
|
102
|
+
/** The stored body (a nonce-free document when the app's policy was converted to hashes). */
|
|
103
|
+
readonly body: Uint8Array;
|
|
104
|
+
/** Response headers (lower-case names): content type, cache-control, CSP, validators, rule headers. */
|
|
105
|
+
readonly headers: readonly (readonly [string, string])[];
|
|
106
|
+
readonly etag: string;
|
|
107
|
+
/** `Last-Modified` (HTTP date) and its time (ms, second precision). */
|
|
108
|
+
readonly modified: string;
|
|
109
|
+
readonly modifiedAt: number;
|
|
110
|
+
/** Times (ms): stored, fresh until, served stale until. */
|
|
111
|
+
readonly created: number;
|
|
112
|
+
readonly fresh: number;
|
|
113
|
+
readonly stale: number;
|
|
114
|
+
/** CLOCK reference bit. */
|
|
115
|
+
used: boolean;
|
|
116
|
+
/** Bytes counted against `maxBytes` (body, key, headers, `charge`d copies). */
|
|
117
|
+
size: number;
|
|
118
|
+
/** Background refreshes that failed in a row, and when the next may start (ms; exponential backoff). */
|
|
119
|
+
failures: number;
|
|
120
|
+
retry: number;
|
|
121
|
+
/** Count `bytes` more against the store's `maxBytes` (an adapter's compressed copy of the body). */
|
|
122
|
+
charge(bytes: number): void;
|
|
123
|
+
}
|
|
124
|
+
/** Request header lookup (lower-case name). */
|
|
125
|
+
export type HeaderOf = (name: string) => string | null | undefined;
|
|
126
|
+
/** Fresh stored page for a GET / HEAD request, if any (node adapter fast path: before a `Request` exists). `origin`: the request URL's. */
|
|
127
|
+
export type CacheLookup = (method: string, origin: string, pathname: string, search: string, header: HeaderOf) => CachedPage | undefined;
|
|
128
|
+
/** Own property of a handler with route rules: the cache lookup. */
|
|
129
|
+
export declare const ROUTE_CACHE: unique symbol;
|
|
130
|
+
/** A handler with route rules. */
|
|
131
|
+
export type CachingHandler = AppHandler & {
|
|
132
|
+
readonly [ROUTE_CACHE]: CacheLookup;
|
|
133
|
+
};
|
|
134
|
+
interface Cache {
|
|
135
|
+
readonly maxAge: number;
|
|
136
|
+
readonly swr: number;
|
|
137
|
+
readonly tags: readonly string[];
|
|
138
|
+
readonly varies: readonly string[];
|
|
139
|
+
readonly query: boolean | readonly string[];
|
|
140
|
+
readonly cookies: boolean;
|
|
141
|
+
/** The `Cache-Control` stored pages answer with. */
|
|
142
|
+
readonly control: string;
|
|
143
|
+
/** Headers responses named in `Vary` (beyond `varies`): part of the key from then on. */
|
|
144
|
+
readonly learned: string[];
|
|
145
|
+
}
|
|
146
|
+
/** @internal A rule's normalised cache (exported for `shell-cache.ts`). */
|
|
147
|
+
export type { Cache as _Cache };
|
|
148
|
+
/** @internal */
|
|
149
|
+
export interface Resolved {
|
|
150
|
+
readonly headers: readonly (readonly [string, string])[];
|
|
151
|
+
readonly cache: Cache | undefined;
|
|
152
|
+
/** Shell cache (`RouteRule.shell`): wins over `cache` for documents. */
|
|
153
|
+
readonly shell?: Cache;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Compile `rules` (throws `TypeError` on a malformed pattern or rule) into a pathname → rule lookup. `origin`: a fixed
|
|
157
|
+
* origin is configured (`isr` rules need one).
|
|
158
|
+
*/
|
|
159
|
+
export declare function compileRules(rules: RouteRules, origin?: boolean): (pathname: string) => Resolved | undefined;
|
|
160
|
+
/** Bounded page store, CLOCK eviction (a hit sets one bit). Shell entries (`shell-cache.ts`) live here too (key `…\0shell`). */
|
|
161
|
+
declare class Store {
|
|
162
|
+
readonly pages: Map<string, CachedPage>;
|
|
163
|
+
/** Shell cache: rejected fills per route id (3 in a row → no more attempts until a `revalidate()`). */
|
|
164
|
+
readonly sticky: Map<string, number>;
|
|
165
|
+
bytes: number;
|
|
166
|
+
/** Fills running now (`path`, `tags`): a `revalidate()` matching one voids it (it answers but does not store). */
|
|
167
|
+
readonly filling: Set<{
|
|
168
|
+
readonly path: string;
|
|
169
|
+
readonly tags: readonly string[];
|
|
170
|
+
void: boolean;
|
|
171
|
+
}>;
|
|
172
|
+
readonly maxBytes: number;
|
|
173
|
+
readonly maxEntries: number;
|
|
174
|
+
readonly base: string;
|
|
175
|
+
constructor(maxBytes: number, maxEntries: number, base: string);
|
|
176
|
+
get(key: string): CachedPage | undefined;
|
|
177
|
+
set(page: CachedPage): void;
|
|
178
|
+
/** `page` (stored) grew by `bytes`. */
|
|
179
|
+
grow(page: CachedPage, bytes: number): void;
|
|
180
|
+
private evict;
|
|
181
|
+
delete(key: string): boolean;
|
|
182
|
+
}
|
|
183
|
+
/** @internal The page store type (`shell-cache.ts` keeps its entries in it). */
|
|
184
|
+
export type { Store as _Store };
|
|
185
|
+
/**
|
|
186
|
+
* The router's view of a raw pathname: `match` — segments percent-decoded (a decoded `/` stays `%2F`: one segment),
|
|
187
|
+
* what rules match and keys use; `canonical` — the raw path is that path's one encoding (only those are stored, so
|
|
188
|
+
* `/%61dmin` neither escapes an `/admin/**` rule nor adds a copy of `/admin`). Malformed escapes: not canonical.
|
|
189
|
+
*/
|
|
190
|
+
export declare function normalPath(pathname: string): {
|
|
191
|
+
readonly match: string;
|
|
192
|
+
readonly canonical: boolean;
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Drop stored pages (every app's in this process): by `path` (pathname, with or without the app's base; a trailing
|
|
196
|
+
* `/**` drops everything below it) and / or `tag` (`CacheRule.tags`). The next request renders; a render already
|
|
197
|
+
* running does not store its page. Returns how many pages were dropped here. Node `start({ workers })`: the other
|
|
198
|
+
* workers drop theirs too (relayed by the primary, asynchronously). Other servers and CDNs keep theirs until they
|
|
199
|
+
* expire.
|
|
200
|
+
*/
|
|
201
|
+
export declare function revalidate(target: {
|
|
202
|
+
readonly path?: string;
|
|
203
|
+
readonly tag?: string;
|
|
204
|
+
}): number;
|
|
205
|
+
/** `If-None-Match` (weak comparison) / `If-Modified-Since` (when no `If-None-Match`) hold for `page`. */
|
|
206
|
+
export declare function notModified(page: CachedPage, match: string | null | undefined, since: string | null | undefined): boolean;
|
|
207
|
+
/** Content-Security-Policy handling of stored pages (from `createApp` `csp`). */
|
|
208
|
+
export interface CachePolicy {
|
|
209
|
+
/** The app's policy for a nonce (`false`: none). A stored response whose policy differs (a route's own) is kept as rendered. */
|
|
210
|
+
readonly policy: (nonce: string) => string | false;
|
|
211
|
+
/**
|
|
212
|
+
* Convert the app's nonce policy to hashes of the page's nonce'd inline code (default / `CSPOptions` apps); `null`:
|
|
213
|
+
* no conversion (a `csp` function) — a page whose policy allows its nonce is then not stored (one nonce for every visitor).
|
|
214
|
+
*/
|
|
215
|
+
readonly hash: CSPOptions | null;
|
|
216
|
+
}
|
|
217
|
+
/** Own property the app sets on a request whose render reported a failure (`onError`: an error fallback was rendered). */
|
|
218
|
+
export declare const RENDER_FAILED: unique symbol;
|
|
219
|
+
/** @internal What `withRouteRules` hands the shell cache (`shell-cache.ts` `createShells`). */
|
|
220
|
+
export interface ShellHost {
|
|
221
|
+
readonly handler: AppHandler;
|
|
222
|
+
readonly store: Store;
|
|
223
|
+
readonly csp: CachePolicy;
|
|
224
|
+
readonly fixed: string | undefined;
|
|
225
|
+
readonly dev: boolean;
|
|
226
|
+
/** Build identity (the resume runtime's URL): part of each shell's `h`. */
|
|
227
|
+
readonly build: string;
|
|
228
|
+
keyOf(cache: Cache, origin: string, path: string, search: string, header: HeaderOf): string;
|
|
229
|
+
secondMiss(cache: Cache, search: string, header: HeaderOf): boolean;
|
|
230
|
+
readonly doorkeeper: Set<string>;
|
|
231
|
+
withHeaders(response: Response, headers: Resolved["headers"]): Response;
|
|
232
|
+
}
|
|
233
|
+
/** @internal The shell cache's request entry (`shell-cache.ts`); undefined: render without it. */
|
|
234
|
+
export type ShellServe = (request: Request, context: Parameters<AppHandler>[1], resolved: Resolved, origin: string, path: string, search: string) => Promise<Response> | undefined;
|
|
235
|
+
/**
|
|
236
|
+
* Wrap the app's handler with route rules. `base`: the app's base path (stripped before matching). The result
|
|
237
|
+
* carries `ROUTE_CACHE` (node adapter fast path). `shells`: the shell cache module (`createApp` loads it only for
|
|
238
|
+
* rules with `shell`); `internal.dev`: shell rules only probe (never store; reasons logged), `internal.build`: build id.
|
|
239
|
+
*/
|
|
240
|
+
export declare function withRouteRules(handler: AppHandler, rules: RouteRules, csp: CachePolicy, base?: string, options?: RouteCacheOptions, shells?: {
|
|
241
|
+
createShells(host: ShellHost): ShellServe;
|
|
242
|
+
}, internal?: {
|
|
243
|
+
dev?: boolean;
|
|
244
|
+
build?: string;
|
|
245
|
+
}): CachingHandler;
|