@rebask/core 0.1.5 → 0.2.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.
- package/dist/entry.rsc.d.ts +1 -0
- package/dist/entry.rsc.d.ts.map +1 -1
- package/dist/entry.rsc.js +1 -0
- package/dist/handlers/markdown.d.ts +16 -0
- package/dist/handlers/markdown.d.ts.map +1 -0
- package/dist/handlers/markdown.js +161 -0
- package/dist/handlers/rsc/cache-lookup.d.ts.map +1 -1
- package/dist/handlers/rsc/cache-lookup.js +10 -4
- package/dist/handlers/rsc/index.js +1 -1
- package/dist/handlers/rsc/render-to-response.js +6 -2
- package/dist/handlers/rsc/segment-shell.d.ts +1 -1
- package/dist/handlers/rsc/segment-shell.d.ts.map +1 -1
- package/dist/handlers/rsc/segment-shell.js +5 -9
- package/dist/handlers/rsc/state.d.ts +1 -0
- package/dist/handlers/rsc/state.d.ts.map +1 -1
- package/dist/handlers/rsc/state.js +4 -0
- package/dist/lib/app-manifest.d.ts +12 -4
- package/dist/lib/app-manifest.d.ts.map +1 -1
- package/dist/lib/app-manifest.js +5 -0
- package/dist/lib/cache-key-tags.d.ts +2 -0
- package/dist/lib/cache-key-tags.d.ts.map +1 -1
- package/dist/lib/cache-key-tags.js +2 -0
- package/dist/lib/cache-storage.d.ts +7 -2
- package/dist/lib/cache-storage.d.ts.map +1 -1
- package/dist/lib/cache-storage.js +1 -0
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +8 -3
- package/dist/lib/dev-page-exports.d.ts +5 -0
- package/dist/lib/dev-page-exports.d.ts.map +1 -0
- package/dist/lib/dev-page-exports.js +14 -0
- package/dist/lib/lru-cache.d.ts.map +1 -1
- package/dist/lib/lru-cache.js +2 -0
- package/dist/lib/markdown.d.ts +5 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +53 -0
- package/dist/lib/page-exports.d.ts +9 -0
- package/dist/lib/page-exports.d.ts.map +1 -0
- package/dist/lib/page-exports.js +47 -0
- package/dist/lib/ppr/cache-status.d.ts +3 -0
- package/dist/lib/ppr/cache-status.d.ts.map +1 -0
- package/dist/lib/ppr/cache-status.js +5 -0
- package/dist/lib/ppr/headers.d.ts +1 -1
- package/dist/lib/ppr/headers.d.ts.map +1 -1
- package/dist/lib/ppr/headers.js +1 -1
- package/dist/lib/prerender-params.d.ts +1 -1
- package/dist/lib/prerender-params.d.ts.map +1 -1
- package/dist/lib/prerender-params.js +17 -2
- package/dist/lib/project-files.d.ts +2 -1
- package/dist/lib/project-files.d.ts.map +1 -1
- package/dist/lib/project-files.js +16 -6
- package/dist/lib/route-builder.d.ts +4 -3
- package/dist/lib/route-builder.d.ts.map +1 -1
- package/dist/lib/route-builder.js +61 -13
- package/dist/lib/route-matcher.d.ts +4 -0
- package/dist/lib/route-matcher.d.ts.map +1 -1
- package/dist/lib/rsc-request.d.ts.map +1 -1
- package/dist/lib/rsc-request.js +3 -3
- package/dist/lib/server-router/get-router.d.ts.map +1 -1
- package/dist/lib/server-router/get-router.js +71 -16
- package/dist/lib/server-router/types.d.ts +4 -1
- package/dist/lib/server-router/types.d.ts.map +1 -1
- package/dist/lib/write-behind-cache.d.ts.map +1 -1
- package/dist/lib/write-behind-cache.js +5 -3
- package/dist/plugins/devtools.d.ts.map +1 -1
- package/dist/plugins/devtools.js +2 -2
- package/dist/plugins/ppr.d.ts +5 -0
- package/dist/plugins/ppr.d.ts.map +1 -1
- package/dist/plugins/prerender.d.ts.map +1 -1
- package/dist/plugins/prerender.js +114 -70
- package/dist/plugins/router/wint-router.d.ts.map +1 -1
- package/dist/plugins/router/wint-router.js +4 -2
- package/dist/router.d.ts +1 -1
- package/dist/router.js +1 -1
- package/dist/server-router.d.ts +1 -1
- package/dist/server-router.d.ts.map +1 -1
- package/dist/vite.d.ts +20 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +17 -4
- package/package.json +1 -5
- package/dist/components/prefetch-links.d.ts +0 -5
- package/dist/components/prefetch-links.d.ts.map +0 -1
- package/dist/components/prefetch-links.js +0 -174
package/dist/entry.rsc.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import "./lib/scheduler-patch.js";
|
|
|
2
2
|
import "./lib/fetch-tracker.js";
|
|
3
3
|
import { handleApp, handleProxy } from "./handlers/index.js";
|
|
4
4
|
export { handleApp, handleProxy };
|
|
5
|
+
export { handleMarkdownRoute } from "./handlers/markdown.js";
|
|
5
6
|
export { handlePageRoute } from "./handlers/rsc/index.js";
|
|
6
7
|
export { getIntermediateShellParams, getPrerenderParams } from "./lib/prerender-params.js";
|
|
7
8
|
export declare function hasCacheHandler(): boolean;
|
package/dist/entry.rsc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.rsc.d.ts","sourceRoot":"","sources":["../src/entry.rsc.tsx"],"names":[],"mappings":"AAEA,OAAO,0BAA0B,CAAA;AAEjC,OAAO,wBAAwB,CAAA;AAS/B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAA;AAK3E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE1F,wBAAgB,eAAe,IAAI,OAAO,CAEzC;;IAGM,KAAK,UAAU,OAAO"}
|
|
1
|
+
{"version":3,"file":"entry.rsc.d.ts","sourceRoot":"","sources":["../src/entry.rsc.tsx"],"names":[],"mappings":"AAEA,OAAO,0BAA0B,CAAA;AAEjC,OAAO,wBAAwB,CAAA;AAS/B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAA;AAK3E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAA;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE1F,wBAAgB,eAAe,IAAI,OAAO,CAEzC;;IAGM,KAAK,UAAU,OAAO"}
|
package/dist/entry.rsc.js
CHANGED
|
@@ -13,6 +13,7 @@ import { notifyRscUpdate } from "./lib/dev-server.js";
|
|
|
13
13
|
import { PROXY_ONLY_HEADER } from "./lib/proxy/types.js";
|
|
14
14
|
import { runtimeConfig } from "./runtime-config.js";
|
|
15
15
|
export { handleApp, handleProxy };
|
|
16
|
+
export { handleMarkdownRoute } from "./handlers/markdown.js";
|
|
16
17
|
export { handlePageRoute } from "./handlers/rsc/index.js";
|
|
17
18
|
export { getIntermediateShellParams, getPrerenderParams } from "./lib/prerender-params.js";
|
|
18
19
|
export function hasCacheHandler() {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PageRoute, RouteParams } from "../lib/route-matcher.js";
|
|
2
|
+
export declare function markdownNotFound(request: Request): Response;
|
|
3
|
+
export declare function handleMarkdownRoute(request: Request, route: PageRoute, params: RouteParams, options?: {
|
|
4
|
+
isBuildPrerender?: boolean;
|
|
5
|
+
onBuildPrerenderMeta?: (meta: {
|
|
6
|
+
hasRequestIO: boolean;
|
|
7
|
+
notFound: boolean;
|
|
8
|
+
static: boolean;
|
|
9
|
+
cacheLife: {
|
|
10
|
+
revalidate: number;
|
|
11
|
+
expire: number;
|
|
12
|
+
tags?: string[];
|
|
13
|
+
};
|
|
14
|
+
}) => void;
|
|
15
|
+
}): Promise<Response>;
|
|
16
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/handlers/markdown.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAwErE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,YAEhD;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE;IACR,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC7B,YAAY,EAAE,OAAO,CAAA;QACrB,QAAQ,EAAE,OAAO,CAAA;QACjB,MAAM,EAAE,OAAO,CAAA;QACf,SAAS,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAClE,KAAK,IAAI,CAAA;CACL,GACJ,OAAO,CAAC,QAAQ,CAAC,CAwInB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { pprConfig } from "virtual:rebask/ppr-config";
|
|
2
|
+
import { markdownHandlerModules, markdownSourceModules, pageModules } from "../lib/app-manifest.js";
|
|
3
|
+
import { CacheKeyTag } from "../lib/cache-key-tags.js";
|
|
4
|
+
import { getCacheKey } from "../lib/cache-keys.js";
|
|
5
|
+
import { CacheEntryType, STATIC } from "../lib/cache-storage.js";
|
|
6
|
+
import { getCacheHandler } from "../lib/config.js";
|
|
7
|
+
import { getMarkdownPathname } from "../lib/markdown.js";
|
|
8
|
+
import { getCacheControlHeader } from "../lib/ppr/headers.js";
|
|
9
|
+
import { prerenderPaths } from "../lib/prerender-paths.js";
|
|
10
|
+
import { recordResponseStatus, withRequestSpan } from "../lib/telemetry.js";
|
|
11
|
+
import { getCacheLife, hasRequestIO, mergeResponseHeaders, OutgoingResponseHeaders, withRequestStorage, } from "../request-context.js";
|
|
12
|
+
const MARKDOWN_CONTENT_TYPE = "text/markdown; charset=utf-8";
|
|
13
|
+
const NOT_FOUND_BODY = "# 404 Not Found\n\nThe requested page does not exist. Return to the [home page](/) to continue.\n";
|
|
14
|
+
function canonicalPath(request) {
|
|
15
|
+
const pathname = new URL(request.url).pathname;
|
|
16
|
+
if (!__REBASK_MARKDOWN_URLS)
|
|
17
|
+
return pathname;
|
|
18
|
+
return getMarkdownPathname(pathname) ?? pathname;
|
|
19
|
+
}
|
|
20
|
+
function markdownResponse(request, body, init = {}) {
|
|
21
|
+
const headers = mergeResponseHeaders(init.headers ?? {});
|
|
22
|
+
const status = init.notFound ? 404 : (init.status ?? 200);
|
|
23
|
+
if (!headers.has("content-type"))
|
|
24
|
+
headers.set("content-type", MARKDOWN_CONTENT_TYPE);
|
|
25
|
+
if (init.cacheTags?.length && pprConfig?.cacheTagsHeader) {
|
|
26
|
+
headers.set(pprConfig.cacheTagsHeader, init.cacheTags.join(","));
|
|
27
|
+
}
|
|
28
|
+
if (init.notFound || init.noStore) {
|
|
29
|
+
headers.set("cache-control", "no-store");
|
|
30
|
+
if (init.notFound)
|
|
31
|
+
headers.set("x-robots-tag", "noindex");
|
|
32
|
+
}
|
|
33
|
+
else if (!headers.has("cache-control")) {
|
|
34
|
+
headers.set("cache-control", status >= 200 && status < 300 ? (init.cacheControl ?? "no-store") : "no-store");
|
|
35
|
+
}
|
|
36
|
+
if (!headers.has("link")) {
|
|
37
|
+
headers.set("link", `<${canonicalPath(request)}>; rel="canonical"`);
|
|
38
|
+
}
|
|
39
|
+
if (request.method === "HEAD" && body instanceof ReadableStream) {
|
|
40
|
+
body.cancel().catch(() => { });
|
|
41
|
+
}
|
|
42
|
+
const vary = headers.get("vary");
|
|
43
|
+
if (!vary)
|
|
44
|
+
headers.set("vary", "accept");
|
|
45
|
+
else if (!vary
|
|
46
|
+
.toLowerCase()
|
|
47
|
+
.split(",")
|
|
48
|
+
.some((value) => value.trim() === "accept")) {
|
|
49
|
+
headers.set("vary", `${vary}, accept`);
|
|
50
|
+
}
|
|
51
|
+
return new Response(request.method === "HEAD" ? null : body, { status, headers });
|
|
52
|
+
}
|
|
53
|
+
export function markdownNotFound(request) {
|
|
54
|
+
return markdownResponse(request, NOT_FOUND_BODY, { notFound: true });
|
|
55
|
+
}
|
|
56
|
+
export async function handleMarkdownRoute(request, route, params, options = {}) {
|
|
57
|
+
return withRequestSpan("rebask.request", request, async (span) => {
|
|
58
|
+
const respond = (response) => recordResponseStatus(span, response);
|
|
59
|
+
span.setAttribute("http.request.method", request.method);
|
|
60
|
+
span.setAttribute("url.path", new URL(request.url).pathname);
|
|
61
|
+
span.setAttribute("rebask.route", route.filePath);
|
|
62
|
+
span.setAttribute("rebask.request.kind", "markdown");
|
|
63
|
+
const pathname = canonicalPath(request);
|
|
64
|
+
const pageModule = route.hasPage === false ? undefined : await pageModules[route.filePath]?.();
|
|
65
|
+
const routeNotFound = pageModule?.notFound === true;
|
|
66
|
+
const markdownFilePath = route.markdownFilePath;
|
|
67
|
+
const staticPathMiss = !routeNotFound && (await prerenderPaths.isStaticPathMiss(route.filePath, pathname));
|
|
68
|
+
// A static .md file has no params to inspect, but a handler can render its own 404 body.
|
|
69
|
+
if (staticPathMiss && markdownFilePath?.endsWith(".md"))
|
|
70
|
+
return markdownNotFound(request);
|
|
71
|
+
const cacheKey = getCacheKey(CacheKeyTag.Markdown, pathname);
|
|
72
|
+
if (!options.isBuildPrerender) {
|
|
73
|
+
const cacheHandler = getCacheHandler();
|
|
74
|
+
const cached = await cacheHandler.get(cacheKey);
|
|
75
|
+
if (cached?.type === CacheEntryType.MARKDOWN && !cacheHandler.getEntryStatus(cached).stale) {
|
|
76
|
+
return respond(markdownResponse(request, cached.markdown, {
|
|
77
|
+
cacheControl: getCacheControlHeader({
|
|
78
|
+
revalidate: cached.revalidate,
|
|
79
|
+
expire: cached.expire,
|
|
80
|
+
}),
|
|
81
|
+
cacheTags: cached.tags,
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!markdownFilePath) {
|
|
86
|
+
throw new Error(`Markdown route "${route.filePath}" has no Markdown file.`);
|
|
87
|
+
}
|
|
88
|
+
const response = await withRequestStorage({ input: { request, params }, response: { headers: new OutgoingResponseHeaders() } }, async () => {
|
|
89
|
+
let result;
|
|
90
|
+
if (markdownFilePath.endsWith(".md")) {
|
|
91
|
+
const loadSource = markdownSourceModules[markdownFilePath];
|
|
92
|
+
if (!loadSource) {
|
|
93
|
+
throw new Error(`Markdown source not found: ${markdownFilePath}`);
|
|
94
|
+
}
|
|
95
|
+
result = await loadSource();
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const loadHandler = markdownHandlerModules[markdownFilePath];
|
|
99
|
+
if (!loadHandler) {
|
|
100
|
+
throw new Error(`Markdown handler not found: ${markdownFilePath}`);
|
|
101
|
+
}
|
|
102
|
+
const handler = (await loadHandler()).default;
|
|
103
|
+
if (typeof handler !== "function") {
|
|
104
|
+
throw new Error(`Markdown handler "${markdownFilePath}" has no default export.`);
|
|
105
|
+
}
|
|
106
|
+
result = await handler();
|
|
107
|
+
}
|
|
108
|
+
if (typeof result !== "string" && !(result instanceof Response)) {
|
|
109
|
+
console.error(`Markdown handler "${markdownFilePath}" must return a string or Response.`);
|
|
110
|
+
return new Response("Internal Server Error", {
|
|
111
|
+
status: 500,
|
|
112
|
+
headers: { "cache-control": "no-store" },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const response = result instanceof Response
|
|
116
|
+
? result
|
|
117
|
+
: new Response(result, { headers: { "content-type": MARKDOWN_CONTENT_TYPE } });
|
|
118
|
+
const notFound = routeNotFound || staticPathMiss || response.status === 404;
|
|
119
|
+
const requestIO = hasRequestIO();
|
|
120
|
+
const cacheLife = getCacheLife();
|
|
121
|
+
const revalidate = requestIO ? 0 : (cacheLife?.revalidate ?? STATIC);
|
|
122
|
+
const expire = requestIO ? 0 : (cacheLife?.expire ?? revalidate);
|
|
123
|
+
const staticResult = !notFound &&
|
|
124
|
+
!requestIO &&
|
|
125
|
+
revalidate > 0 &&
|
|
126
|
+
typeof result === "string" &&
|
|
127
|
+
response.status === 200;
|
|
128
|
+
if (options.isBuildPrerender) {
|
|
129
|
+
options.onBuildPrerenderMeta?.({
|
|
130
|
+
hasRequestIO: requestIO,
|
|
131
|
+
notFound,
|
|
132
|
+
static: staticResult,
|
|
133
|
+
cacheLife: {
|
|
134
|
+
revalidate,
|
|
135
|
+
expire,
|
|
136
|
+
...(cacheLife?.tags && { tags: [...cacheLife.tags] }),
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (staticResult && typeof result === "string") {
|
|
141
|
+
await getCacheHandler().set(cacheKey, {
|
|
142
|
+
type: CacheEntryType.MARKDOWN,
|
|
143
|
+
markdown: result,
|
|
144
|
+
timestamp: Date.now(),
|
|
145
|
+
expire,
|
|
146
|
+
revalidate,
|
|
147
|
+
...(cacheLife?.tags && { tags: [...cacheLife.tags] }),
|
|
148
|
+
}, { durable: options.isBuildPrerender });
|
|
149
|
+
}
|
|
150
|
+
return markdownResponse(request, response.body, {
|
|
151
|
+
status: response.status,
|
|
152
|
+
headers: response.headers,
|
|
153
|
+
notFound,
|
|
154
|
+
noStore: requestIO,
|
|
155
|
+
cacheControl: getCacheControlHeader({ revalidate, expire }),
|
|
156
|
+
cacheTags: cacheLife?.tags ? [...cacheLife.tags] : undefined,
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
return respond(response);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-lookup.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/cache-lookup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmC,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"cache-lookup.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/cache-lookup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmC,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAWjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAepD,oBAAY,eAAe;IAC1B,OAAO,IAAA;IACP,SAAS,IAAA;IACT,MAAM,IAAA;IACN,IAAI,IAAA;CACJ;AAED,iGAAiG;AACjG,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAEvE,MAAM,MAAM,kBAAkB,GAC3B;IAAE,IAAI,EAAE,eAAe,CAAC,OAAO,CAAA;CAAE,GACjC;IACA,IAAI,EAAE,eAAe,CAAC,SAAS,CAAA;IAC/B,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,YAAY,EAAE,CAAA;CAC5B,GACD;IACA,IAAI,EAAE,eAAe,CAAC,MAAM,CAAA;IAC5B,KAAK,EAAE,cAAc,CAAA;IACrB,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,YAAY,EAAE,CAAA;CAC5B,GACD;IAAE,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,CAAA;AAMhE;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4L7F"}
|
|
@@ -2,8 +2,8 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { CacheKeyTag } from "../../lib/cache-key-tags.js";
|
|
3
3
|
import { getCacheKey } from "../../lib/cache-keys.js";
|
|
4
4
|
import { CacheEntryType } from "../../lib/cache-storage.js";
|
|
5
|
-
import { getCacheHandler } from "../../lib/config.js";
|
|
6
|
-
import { getCacheControlHeader, matchesIfNoneMatch,
|
|
5
|
+
import { cacheStatusHeader, getCacheHandler } from "../../lib/config.js";
|
|
6
|
+
import { getCacheControlHeader, matchesIfNoneMatch, REBASK_HTML_VARY_HEADER, RebaskCacheStatus, } from "../../lib/ppr/headers.js";
|
|
7
7
|
import { parseResumeState } from "../../lib/ppr/postponed-state.js";
|
|
8
8
|
import { ResumeMode } from "../../lib/ppr/types.js";
|
|
9
9
|
import { prerenderPaths } from "../../lib/prerender-paths.js";
|
|
@@ -101,8 +101,11 @@ export async function lookupCachedHtml(state) {
|
|
|
101
101
|
headers: {
|
|
102
102
|
ETag: etag,
|
|
103
103
|
"cache-control": getCacheControlHeader(entry),
|
|
104
|
-
|
|
104
|
+
...cacheStatusHeader(stale ? RebaskCacheStatus.STALE : RebaskCacheStatus.HIT),
|
|
105
105
|
vary: REBASK_HTML_VARY_HEADER,
|
|
106
|
+
...(state.markdownHref && {
|
|
107
|
+
link: `<${state.markdownHref}>; rel="alternate"; type="text/markdown"`,
|
|
108
|
+
}),
|
|
106
109
|
},
|
|
107
110
|
}),
|
|
108
111
|
};
|
|
@@ -119,8 +122,11 @@ export async function lookupCachedHtml(state) {
|
|
|
119
122
|
revalidate: entry.revalidate,
|
|
120
123
|
expire: entry.expire,
|
|
121
124
|
}),
|
|
122
|
-
|
|
125
|
+
...cacheStatusHeader(stale ? RebaskCacheStatus.STALE : RebaskCacheStatus.HIT),
|
|
123
126
|
vary: REBASK_HTML_VARY_HEADER,
|
|
127
|
+
...(state.markdownHref && {
|
|
128
|
+
link: `<${state.markdownHref}>; rel="alternate"; type="text/markdown"`,
|
|
129
|
+
}),
|
|
124
130
|
ETag: etag,
|
|
125
131
|
...(state.isNotFound || entry.notFound ? { "x-robots-tag": "noindex" } : {}),
|
|
126
132
|
},
|
|
@@ -87,7 +87,7 @@ export async function handlePageRoute(request, route, params, handleOptions) {
|
|
|
87
87
|
else {
|
|
88
88
|
const shellId = request.headers.get(REBASK_TAIL_HEADER);
|
|
89
89
|
if (shellId)
|
|
90
|
-
return respond(await servePageSegmentTail(state,
|
|
90
|
+
return respond(await servePageSegmentTail(state, shellId));
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
// Skip not-found routes because this cache would store a separate payload for every unmatched URL.
|
|
@@ -5,12 +5,13 @@ import {} from "../../lib/cache-context.js";
|
|
|
5
5
|
import { CacheKeyTag } from "../../lib/cache-key-tags.js";
|
|
6
6
|
import { getCacheKey } from "../../lib/cache-keys.js";
|
|
7
7
|
import { STATIC } from "../../lib/cache-storage.js";
|
|
8
|
+
import { cacheStatusHeader } from "../../lib/config.js";
|
|
8
9
|
import { getDeploymentIdHeader } from "../../lib/deployment-id.js";
|
|
9
10
|
import { sendDevError, sendDevWarning } from "../../lib/dev-server.js";
|
|
10
11
|
import { shellChannel } from "../../lib/devtools-channels.js";
|
|
11
12
|
import { documentRouteTag } from "../../lib/document-route.js";
|
|
12
13
|
import { noPrerenderWarning } from "../../lib/messages.js";
|
|
13
|
-
import { getCacheControlHeader,
|
|
14
|
+
import { getCacheControlHeader, REBASK_HTML_VARY_HEADER, RebaskCacheStatus, REBASK_PRERENDER_HEADER, } from "../../lib/ppr/headers.js";
|
|
14
15
|
import { createResumeState, serializeResumeState } from "../../lib/ppr/postponed-state.js";
|
|
15
16
|
import { ResumeMode } from "../../lib/ppr/types.js";
|
|
16
17
|
import { prerenderPaths } from "../../lib/prerender-paths.js";
|
|
@@ -184,6 +185,9 @@ async function finalizeRender(state, cacheContext, render) {
|
|
|
184
185
|
const responseHeaders = mergeResponseHeaders({
|
|
185
186
|
"Content-Type": upgradeShell?.contentType ?? "text/html; charset=utf-8",
|
|
186
187
|
vary: REBASK_HTML_VARY_HEADER,
|
|
188
|
+
...(state.markdownHref && {
|
|
189
|
+
link: `<${state.markdownHref}>; rel="alternate"; type="text/markdown"`,
|
|
190
|
+
}),
|
|
187
191
|
"Cache-Control": cacheControl,
|
|
188
192
|
...(state.isHtmlFillRequest &&
|
|
189
193
|
pprConfig?.cacheTagsHeader &&
|
|
@@ -191,7 +195,7 @@ async function finalizeRender(state, cacheContext, render) {
|
|
|
191
195
|
[pprConfig.cacheTagsHeader]: [...cacheLife.tags].join(","),
|
|
192
196
|
}),
|
|
193
197
|
...(state.isNotFound || hasNotFoundMark() ? { "x-robots-tag": "noindex" } : {}),
|
|
194
|
-
|
|
198
|
+
...cacheStatusHeader(cacheStatus),
|
|
195
199
|
...(isPrerenderedResume && { [REBASK_PRERENDER_HEADER]: "1" }),
|
|
196
200
|
...getDeploymentIdHeader(),
|
|
197
201
|
});
|
|
@@ -4,6 +4,6 @@ import type { PageRenderRequestState, RenderRequestState } from "./state.js";
|
|
|
4
4
|
export declare function servePageSegmentShell(state: PageRenderRequestState, filePath: string, resolvedParams: Set<string>): Promise<Response>;
|
|
5
5
|
/** Serve a layout segment's shell. */
|
|
6
6
|
export declare function serveLayoutSegmentShell(request: Request, route: LayoutRoute, params: RouteParams, fill: boolean): Promise<Response>;
|
|
7
|
-
export declare function servePageSegmentTail(state: RenderRequestState,
|
|
7
|
+
export declare function servePageSegmentTail(state: RenderRequestState, shellId: string): Promise<Response>;
|
|
8
8
|
export declare function serveLayoutSegmentTail(request: Request, route: LayoutRoute, params: RouteParams, shellId: string): Promise<Response>;
|
|
9
9
|
//# sourceMappingURL=segment-shell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segment-shell.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/segment-shell.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,MAAM,4BAA4B,CAAA;AAgBnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAiN5E,oCAAoC;AACpC,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,OAAO,CAAC,QAAQ,CAAC,CASnB;AAyBD,sCAAsC;AACtC,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,OAAO,GACX,OAAO,CAAC,QAAQ,CAAC,CAYnB;
|
|
1
|
+
{"version":3,"file":"segment-shell.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/segment-shell.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,MAAM,4BAA4B,CAAA;AAgBnC,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAiN5E,oCAAoC;AACpC,wBAAsB,qBAAqB,CAC1C,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,OAAO,CAAC,QAAQ,CAAC,CASnB;AAyBD,sCAAsC;AACtC,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,OAAO,GACX,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAsED,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
|
|
@@ -223,18 +223,16 @@ function skipBytes(stream, count) {
|
|
|
223
223
|
}
|
|
224
224
|
/** Serve a tail on identity match, else the full segment. */
|
|
225
225
|
async function serveTail(options) {
|
|
226
|
-
const
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
let matches = shellId === options.shellId;
|
|
230
|
-
const shellLength = matches ? Number(options.shellId.split(":")[0]) : 0;
|
|
226
|
+
const [length, claimedHash] = options.shellId.split(":");
|
|
227
|
+
const shellLength = Number(length);
|
|
228
|
+
let matches = Number.isSafeInteger(shellLength) && shellLength > 0 && claimedHash !== undefined;
|
|
231
229
|
return runRscRequest({
|
|
232
230
|
input: { request: options.request, params: options.params, isStaticGeneration: true },
|
|
233
231
|
response: { headers: new OutgoingResponseHeaders() },
|
|
234
232
|
}, {}, async () => {
|
|
235
233
|
let rscStream = await options.render();
|
|
236
234
|
if (matches) {
|
|
237
|
-
// A
|
|
235
|
+
// A shell can outlive the data it rendered, so re-hash the fresh prefix before slicing.
|
|
238
236
|
const [prefix, full] = rscStream.tee();
|
|
239
237
|
const reader = prefix.getReader();
|
|
240
238
|
const hash = createHash("sha256");
|
|
@@ -257,11 +255,10 @@ async function serveTail(options) {
|
|
|
257
255
|
});
|
|
258
256
|
});
|
|
259
257
|
}
|
|
260
|
-
export async function servePageSegmentTail(state,
|
|
258
|
+
export async function servePageSegmentTail(state, shellId) {
|
|
261
259
|
return serveTail({
|
|
262
260
|
request: state.request,
|
|
263
261
|
params: state.params,
|
|
264
|
-
cacheKey: pageShellCacheKey(state, filePath),
|
|
265
262
|
shellId,
|
|
266
263
|
render: async () => {
|
|
267
264
|
const seedData = await renderPageSegment({ route: state.route, params: state.params }, state.postBody.actionThrownError);
|
|
@@ -276,7 +273,6 @@ export async function serveLayoutSegmentTail(request, route, params, shellId) {
|
|
|
276
273
|
return serveTail({
|
|
277
274
|
request,
|
|
278
275
|
params,
|
|
279
|
-
cacheKey: buildShellCacheKey(route.filePath),
|
|
280
276
|
shellId,
|
|
281
277
|
render: async () => {
|
|
282
278
|
const built = await buildLayoutPayload(route);
|
|
@@ -47,6 +47,7 @@ export type RenderRequestState = RouteClassification & {
|
|
|
47
47
|
readonly isStaticOnly: boolean;
|
|
48
48
|
/** `true` when this route unambiguously renders a 404: a `notFound` page or the default route. */
|
|
49
49
|
readonly isNotFound: boolean;
|
|
50
|
+
readonly markdownHref: string | null;
|
|
50
51
|
readonly routeTree: RouteTree;
|
|
51
52
|
readonly routePrediction: RoutePrediction | undefined;
|
|
52
53
|
readonly fullParamsSet: Set<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/state.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/handlers/rsc/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,9 @@ export async function buildRenderRequestState(request, route, params, handleOpti
|
|
|
24
24
|
? (await pageModules[route.filePath]?.())?.notFound === true
|
|
25
25
|
: false;
|
|
26
26
|
const isNotFound = isNotFoundPage || isDefaultNotFound;
|
|
27
|
+
const markdownHref = __REBASK_MARKDOWN_URLS && isPageRoute && route.markdownFilePath
|
|
28
|
+
? `${url.pathname.replace(/\/+$/, "") || "/"}.md`
|
|
29
|
+
: null;
|
|
27
30
|
// An always-404 page has nothing prefetch-worthy: every URL it matches answers 404, so a
|
|
28
31
|
// (catch-all) prediction would only teach clients to prefetch 404s and shadow real sibling
|
|
29
32
|
// routes. Suppress it.
|
|
@@ -79,6 +82,7 @@ export async function buildRenderRequestState(request, route, params, handleOpti
|
|
|
79
82
|
isDynamicRoute,
|
|
80
83
|
isStaticOnly,
|
|
81
84
|
isNotFound,
|
|
85
|
+
markdownHref,
|
|
82
86
|
routeTree,
|
|
83
87
|
routePrediction,
|
|
84
88
|
fullParamsSet,
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { ComponentType } from "react";
|
|
2
2
|
import type { ProxyRoutes } from "./proxy/types.js";
|
|
3
3
|
import type { RouteParams } from "./route-matcher.js";
|
|
4
|
-
type Comp = {
|
|
5
|
-
default: ComponentType<any>;
|
|
6
|
-
};
|
|
7
4
|
export type PrerenderParamsResult = {
|
|
8
5
|
params: RouteParams[];
|
|
9
6
|
allowExtraParams?: boolean;
|
|
@@ -14,13 +11,24 @@ export type PrerenderParamsResult = {
|
|
|
14
11
|
*/
|
|
15
12
|
predictPaths?: number;
|
|
16
13
|
};
|
|
14
|
+
type Comp = {
|
|
15
|
+
default: ComponentType<any>;
|
|
16
|
+
};
|
|
17
|
+
type PrerenderParamsFn = () => PrerenderParamsResult | Promise<PrerenderParamsResult>;
|
|
18
|
+
type MarkdownHandler = () => string | Response | Promise<string | Response>;
|
|
19
|
+
export type MarkdownModule = {
|
|
20
|
+
default: MarkdownHandler;
|
|
21
|
+
prerenderParams?: PrerenderParamsFn;
|
|
22
|
+
};
|
|
17
23
|
export type PageModule = Comp & {
|
|
18
|
-
prerenderParams?:
|
|
24
|
+
prerenderParams?: PrerenderParamsFn;
|
|
19
25
|
/** `true` when this page is a not-found route: every URL it matches renders a 404. */
|
|
20
26
|
notFound?: boolean;
|
|
21
27
|
};
|
|
22
28
|
export declare const pageModules: Record<string, () => Promise<PageModule>>;
|
|
23
29
|
export declare const layoutModules: Record<string, () => Promise<PageModule>>;
|
|
30
|
+
export declare const markdownSourceModules: Record<string, () => Promise<string>>;
|
|
31
|
+
export declare const markdownHandlerModules: Record<string, () => Promise<MarkdownModule>>;
|
|
24
32
|
export declare const routeHandlerModules: Record<string, () => Promise<Partial<Record<"DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT", (request: Request, context: {
|
|
25
33
|
params: RouteParams;
|
|
26
34
|
}) => Response | Promise<Response>>>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/app-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEjE,KAAK,IAAI,GAAG;IAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;CAAE,CAAA;AAE3C,
|
|
1
|
+
{"version":3,"file":"app-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/app-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IACnC,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,KAAK,IAAI,GAAG;IAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAA;CAAE,CAAA;AAE3C,KAAK,iBAAiB,GAAG,MAAM,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAErF,KAAK,eAAe,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAA;AAE3E,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,eAAe,CAAA;IACxB,eAAe,CAAC,EAAE,iBAAiB,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG;IAC/B,eAAe,CAAC,EAAE,iBAAiB,CAAA;IACnC,sFAAsF;IACtF,QAAQ,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,WAAW,2CAA+D,CAAA;AAEvF,eAAO,MAAM,aAAa,2CAAiE,CAAA;AAE3F,eAAO,MAAM,qBAAqB,uCAGhC,CAAA;AAEF,eAAO,MAAM,sBAAsB,+CAElC,CAAA;AASD,eAAO,MAAM,mBAAmB,0HAJpB,OAAO,WAAW;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAMrF,CAAA;AAED,eAAO,MAAM,YAAY;aAA+B,WAAW;GAA+B,CAAA"}
|
package/dist/lib/app-manifest.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export const pageModules = import.meta.glob("/app/**/page.{jsx,js,tsx,ts}");
|
|
2
2
|
export const layoutModules = import.meta.glob("/app/**/layout.{jsx,js,tsx,ts}");
|
|
3
|
+
export const markdownSourceModules = import.meta.glob("/app/**/markdown.md", {
|
|
4
|
+
query: "?raw",
|
|
5
|
+
import: "default",
|
|
6
|
+
});
|
|
7
|
+
export const markdownHandlerModules = import.meta.glob("/app/**/markdown.{jsx,js,tsx,ts}");
|
|
3
8
|
export const routeHandlerModules = import.meta.glob("/app/**/route.{jsx,js,tsx,ts}");
|
|
4
9
|
export const proxyModules = import.meta.glob(["/proxy.{ts,mts,mjs,js}"]);
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
export declare enum CacheKeyTag {
|
|
6
6
|
/** Page HTML: shared, intermediate and pathname shells, complete HTML. */
|
|
7
7
|
PageHtml = "ph",
|
|
8
|
+
/** Page Markdown representation. */
|
|
9
|
+
Markdown = "pm",
|
|
8
10
|
/** Page or layout RSC payload. */
|
|
9
11
|
SegmentRsc = "pr",
|
|
10
12
|
/** Page or layout RSC shell. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-key-tags.d.ts","sourceRoot":"","sources":["../../src/lib/cache-key-tags.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,WAAW;IACtB,0EAA0E;IAC1E,QAAQ,OAAO;IACf,kCAAkC;IAClC,UAAU,OAAO;IACjB,gCAAgC;IAChC,YAAY,OAAO;IACnB,2BAA2B;IAC3B,QAAQ,OAAO;IACf,4BAA4B;IAC5B,YAAY,OAAO;CACnB"}
|
|
1
|
+
{"version":3,"file":"cache-key-tags.d.ts","sourceRoot":"","sources":["../../src/lib/cache-key-tags.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,WAAW;IACtB,0EAA0E;IAC1E,QAAQ,OAAO;IACf,oCAAoC;IACpC,QAAQ,OAAO;IACf,kCAAkC;IAClC,UAAU,OAAO;IACjB,gCAAgC;IAChC,YAAY,OAAO;IACnB,2BAA2B;IAC3B,QAAQ,OAAO;IACf,4BAA4B;IAC5B,YAAY,OAAO;CACnB"}
|
|
@@ -6,6 +6,8 @@ export var CacheKeyTag;
|
|
|
6
6
|
(function (CacheKeyTag) {
|
|
7
7
|
/** Page HTML: shared, intermediate and pathname shells, complete HTML. */
|
|
8
8
|
CacheKeyTag["PageHtml"] = "ph";
|
|
9
|
+
/** Page Markdown representation. */
|
|
10
|
+
CacheKeyTag["Markdown"] = "pm";
|
|
9
11
|
/** Page or layout RSC payload. */
|
|
10
12
|
CacheKeyTag["SegmentRsc"] = "pr";
|
|
11
13
|
/** Page or layout RSC shell. */
|
|
@@ -3,7 +3,8 @@ export declare enum CacheEntryType {
|
|
|
3
3
|
RSC = 1,
|
|
4
4
|
HTML = 2,
|
|
5
5
|
USE_CACHE = 3,
|
|
6
|
-
DURABLE_CACHE = 4
|
|
6
|
+
DURABLE_CACHE = 4,
|
|
7
|
+
MARKDOWN = 5
|
|
7
8
|
}
|
|
8
9
|
export interface CacheEntryBase {
|
|
9
10
|
timestamp: number;
|
|
@@ -25,6 +26,10 @@ export interface RSCCacheEntry extends CacheEntryBase {
|
|
|
25
26
|
/** Preserves a rendered 404 status when the payload is served from cache. */
|
|
26
27
|
notFound?: true;
|
|
27
28
|
}
|
|
29
|
+
export interface MarkdownCacheEntry extends CacheEntryBase {
|
|
30
|
+
type: CacheEntryType.MARKDOWN;
|
|
31
|
+
markdown: string;
|
|
32
|
+
}
|
|
28
33
|
export interface UseCacheEntry extends CacheEntryBase {
|
|
29
34
|
type: CacheEntryType.USE_CACHE;
|
|
30
35
|
/** deflated "use cache" payload stream, base64 */
|
|
@@ -44,7 +49,7 @@ export interface HTMLCacheEntry extends CacheEntryBase {
|
|
|
44
49
|
/** `true` when the HTML rendered a 404, so cached hits replay 404 and not 200. */
|
|
45
50
|
notFound?: true;
|
|
46
51
|
}
|
|
47
|
-
export type CacheEntry = RSCCacheEntry | HTMLCacheEntry | UseCacheEntry | DurableCacheEntry;
|
|
52
|
+
export type CacheEntry = RSCCacheEntry | HTMLCacheEntry | MarkdownCacheEntry | UseCacheEntry | DurableCacheEntry;
|
|
48
53
|
export interface CacheEntryStatus {
|
|
49
54
|
/** Entry is past its `revalidate` window but still within `expire`. Safe to serve, should be revalidated. */
|
|
50
55
|
stale: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-storage.d.ts","sourceRoot":"","sources":["../../src/lib/cache-storage.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,WAAW,CAAA;AAE9B,oBAAY,cAAc;IACzB,GAAG,IAAI;IACP,IAAI,IAAI;IACR,SAAS,IAAI;IACb,aAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"cache-storage.d.ts","sourceRoot":"","sources":["../../src/lib/cache-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export var CacheEntryType;
|
|
|
5
5
|
CacheEntryType[CacheEntryType["HTML"] = 2] = "HTML";
|
|
6
6
|
CacheEntryType[CacheEntryType["USE_CACHE"] = 3] = "USE_CACHE";
|
|
7
7
|
CacheEntryType[CacheEntryType["DURABLE_CACHE"] = 4] = "DURABLE_CACHE";
|
|
8
|
+
CacheEntryType[CacheEntryType["MARKDOWN"] = 5] = "MARKDOWN";
|
|
8
9
|
})(CacheEntryType || (CacheEntryType = {}));
|
|
9
10
|
/**
|
|
10
11
|
* Abstract base class for cache storage implementations. Tag invalidation can be handled two ways:
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import type { CacheStorage } from "./cache-storage.js";
|
|
2
|
+
import { type RebaskCacheStatus } from "./ppr/headers.js";
|
|
2
3
|
export declare function getCacheHandler(): CacheStorage;
|
|
4
|
+
export declare function cacheStatusHeader(cacheStatus: RebaskCacheStatus): Record<string, string>;
|
|
3
5
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAItD,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAW9E,wBAAgB,eAAe,IAAI,YAAY,CAW9C;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExF"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
+
import { pprConfig } from "virtual:rebask/ppr-config";
|
|
1
2
|
import { cacheHandler as ch } from "../cache-handler.js";
|
|
2
3
|
import { runtimeConfig } from "../runtime-config.js";
|
|
3
4
|
import { getBuildPaths } from "./build-paths.js";
|
|
4
5
|
import { NoopCacheStorage, withExpiryGuard } from "./cache-storage.js";
|
|
5
6
|
import { FilesystemCacheStorage } from "./file-system-cache.js";
|
|
6
7
|
import { withLRU } from "./lru-cache.js";
|
|
8
|
+
import { REBASK_CACHE_HEADER } from "./ppr/headers.js";
|
|
7
9
|
import { withWriteBehind } from "./write-behind-cache.js";
|
|
8
10
|
let resolvedCacheHandler;
|
|
11
|
+
function fsCache() {
|
|
12
|
+
const { cacheDir } = getBuildPaths();
|
|
13
|
+
return withLRU(withWriteBehind(new FilesystemCacheStorage(cacheDir)));
|
|
14
|
+
}
|
|
9
15
|
export function getCacheHandler() {
|
|
10
16
|
// In development, use noop cache (no caching, fresh content on every request).
|
|
11
17
|
// In production, use filesystem cache with LRU.
|
|
@@ -15,7 +21,6 @@ export function getCacheHandler() {
|
|
|
15
21
|
(import.meta.env.PROD ? (runtimeConfig?.cacheHandler ?? fsCache()) : new NoopCacheStorage()));
|
|
16
22
|
return resolvedCacheHandler;
|
|
17
23
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
return withLRU(withWriteBehind(new FilesystemCacheStorage(cacheDir)));
|
|
24
|
+
export function cacheStatusHeader(cacheStatus) {
|
|
25
|
+
return pprConfig?.emitCacheStatus === false ? {} : { [REBASK_CACHE_HEADER]: cacheStatus };
|
|
21
26
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PageExports } from "./page-exports.js";
|
|
2
|
+
export declare function getDevPageExports(filePath: string): any;
|
|
3
|
+
export declare function setDevPageExports(filePath: string, exports: PageExports): void;
|
|
4
|
+
export declare function clearDevPageExports(): void;
|
|
5
|
+
//# sourceMappingURL=dev-page-exports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-page-exports.d.ts","sourceRoot":"","sources":["../../src/lib/dev-page-exports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAWpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,OAEjD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,QAEvE;AAED,wBAAgB,mBAAmB,SAElC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const CACHE_KEY = "__rebaskDevPageExports";
|
|
2
|
+
const globalVar = globalThis;
|
|
3
|
+
function cache() {
|
|
4
|
+
return (globalVar[CACHE_KEY] ??= new Map());
|
|
5
|
+
}
|
|
6
|
+
export function getDevPageExports(filePath) {
|
|
7
|
+
return cache().get(filePath);
|
|
8
|
+
}
|
|
9
|
+
export function setDevPageExports(filePath, exports) {
|
|
10
|
+
cache().set(filePath, exports);
|
|
11
|
+
}
|
|
12
|
+
export function clearDevPageExports() {
|
|
13
|
+
cache().clear();
|
|
14
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../src/lib/lru-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,UAAU,EAGf,KAAK,YAAY,EACjB,MAAM,oBAAoB,CAAA;AAiB3B;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAsB;IAErD,YAAY,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAKhE;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAK9B;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CA2B/B;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMxB;IAED,kDAAkD;IAClD,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAQjD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;CAMjB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;CACpC;
|
|
1
|
+
{"version":3,"file":"lru-cache.d.ts","sourceRoot":"","sources":["../../src/lib/lru-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,UAAU,EAGf,KAAK,YAAY,EACjB,MAAM,oBAAoB,CAAA;AAiB3B;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAsB;IAErD,YAAY,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,EAKhE;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAK9B;IAED,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CA2B/B;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMxB;IAED,kDAAkD;IAClD,UAAU,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAQjD;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;CAMjB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;CACpC;AAaD;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACtB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,eAAe,CAAC,UAAU,CAAM,GACvC,YAAY,CA2Cd"}
|