@rebask/core 0.1.4 → 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.
Files changed (84) hide show
  1. package/dist/entry.rsc.d.ts +1 -0
  2. package/dist/entry.rsc.d.ts.map +1 -1
  3. package/dist/entry.rsc.js +1 -0
  4. package/dist/handlers/markdown.d.ts +16 -0
  5. package/dist/handlers/markdown.d.ts.map +1 -0
  6. package/dist/handlers/markdown.js +161 -0
  7. package/dist/handlers/rsc/cache-lookup.d.ts.map +1 -1
  8. package/dist/handlers/rsc/cache-lookup.js +10 -4
  9. package/dist/handlers/rsc/index.js +1 -1
  10. package/dist/handlers/rsc/render-to-response.js +6 -2
  11. package/dist/handlers/rsc/segment-shell.d.ts +1 -1
  12. package/dist/handlers/rsc/segment-shell.d.ts.map +1 -1
  13. package/dist/handlers/rsc/segment-shell.js +5 -9
  14. package/dist/handlers/rsc/state.d.ts +1 -0
  15. package/dist/handlers/rsc/state.d.ts.map +1 -1
  16. package/dist/handlers/rsc/state.js +4 -0
  17. package/dist/lib/app-manifest.d.ts +12 -4
  18. package/dist/lib/app-manifest.d.ts.map +1 -1
  19. package/dist/lib/app-manifest.js +5 -0
  20. package/dist/lib/cache-key-tags.d.ts +2 -0
  21. package/dist/lib/cache-key-tags.d.ts.map +1 -1
  22. package/dist/lib/cache-key-tags.js +2 -0
  23. package/dist/lib/cache-storage.d.ts +7 -2
  24. package/dist/lib/cache-storage.d.ts.map +1 -1
  25. package/dist/lib/cache-storage.js +1 -0
  26. package/dist/lib/config.d.ts +2 -0
  27. package/dist/lib/config.d.ts.map +1 -1
  28. package/dist/lib/config.js +8 -3
  29. package/dist/lib/dev-page-exports.d.ts +5 -0
  30. package/dist/lib/dev-page-exports.d.ts.map +1 -0
  31. package/dist/lib/dev-page-exports.js +14 -0
  32. package/dist/lib/lru-cache.d.ts.map +1 -1
  33. package/dist/lib/lru-cache.js +2 -0
  34. package/dist/lib/markdown.d.ts +5 -0
  35. package/dist/lib/markdown.d.ts.map +1 -0
  36. package/dist/lib/markdown.js +53 -0
  37. package/dist/lib/page-exports.d.ts +9 -0
  38. package/dist/lib/page-exports.d.ts.map +1 -0
  39. package/dist/lib/page-exports.js +47 -0
  40. package/dist/lib/ppr/cache-status.d.ts +3 -0
  41. package/dist/lib/ppr/cache-status.d.ts.map +1 -0
  42. package/dist/lib/ppr/cache-status.js +5 -0
  43. package/dist/lib/ppr/headers.d.ts +1 -1
  44. package/dist/lib/ppr/headers.d.ts.map +1 -1
  45. package/dist/lib/ppr/headers.js +1 -1
  46. package/dist/lib/prerender-params.d.ts +1 -1
  47. package/dist/lib/prerender-params.d.ts.map +1 -1
  48. package/dist/lib/prerender-params.js +17 -2
  49. package/dist/lib/project-files.d.ts +2 -1
  50. package/dist/lib/project-files.d.ts.map +1 -1
  51. package/dist/lib/project-files.js +16 -6
  52. package/dist/lib/route-builder.d.ts +4 -3
  53. package/dist/lib/route-builder.d.ts.map +1 -1
  54. package/dist/lib/route-builder.js +61 -13
  55. package/dist/lib/route-matcher.d.ts +4 -0
  56. package/dist/lib/route-matcher.d.ts.map +1 -1
  57. package/dist/lib/rsc-request.d.ts.map +1 -1
  58. package/dist/lib/rsc-request.js +3 -3
  59. package/dist/lib/server-router/get-router.d.ts.map +1 -1
  60. package/dist/lib/server-router/get-router.js +71 -16
  61. package/dist/lib/server-router/types.d.ts +4 -1
  62. package/dist/lib/server-router/types.d.ts.map +1 -1
  63. package/dist/lib/write-behind-cache.d.ts.map +1 -1
  64. package/dist/lib/write-behind-cache.js +5 -3
  65. package/dist/plugins/devtools.d.ts.map +1 -1
  66. package/dist/plugins/devtools.js +2 -2
  67. package/dist/plugins/ppr.d.ts +5 -0
  68. package/dist/plugins/ppr.d.ts.map +1 -1
  69. package/dist/plugins/prerender.d.ts.map +1 -1
  70. package/dist/plugins/prerender.js +114 -70
  71. package/dist/plugins/router/wint-router.d.ts.map +1 -1
  72. package/dist/plugins/router/wint-router.js +4 -2
  73. package/dist/router.d.ts +1 -1
  74. package/dist/router.d.ts.map +1 -1
  75. package/dist/router.js +3 -1
  76. package/dist/server-router.d.ts +1 -1
  77. package/dist/server-router.d.ts.map +1 -1
  78. package/dist/vite.d.ts +20 -1
  79. package/dist/vite.d.ts.map +1 -1
  80. package/dist/vite.js +17 -4
  81. package/package.json +1 -5
  82. package/dist/components/prefetch-links.d.ts +0 -5
  83. package/dist/components/prefetch-links.d.ts.map +0 -1
  84. package/dist/components/prefetch-links.js +0 -174
@@ -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;
@@ -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;AAYjG,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,CAsL7F"}
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, REBASK_CACHE_HEADER, REBASK_HTML_VARY_HEADER, RebaskCacheStatus, } from "../../lib/ppr/headers.js";
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
- [REBASK_CACHE_HEADER]: stale ? RebaskCacheStatus.STALE : RebaskCacheStatus.HIT,
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
- [REBASK_CACHE_HEADER]: stale ? RebaskCacheStatus.STALE : RebaskCacheStatus.HIT,
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, filePath, shellId));
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, REBASK_CACHE_HEADER, REBASK_HTML_VARY_HEADER, RebaskCacheStatus, REBASK_PRERENDER_HEADER, } from "../../lib/ppr/headers.js";
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
- [REBASK_CACHE_HEADER]: cacheStatus,
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, filePath: string, shellId: string): Promise<Response>;
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;AAyED,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,GACb,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 cached = await getCacheHandler().get(options.cacheKey);
227
- const entry = cached?.type === CacheEntryType.RSC ? cached : null;
228
- const shellId = entry && shellIdentity(entry);
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 cached shell can outlive the data it rendered, so re-hash the fresh prefix before slicing.
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, filePath, shellId) {
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?: () => PrerenderParamsResult | Promise<PrerenderParamsResult>;
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,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,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG;IAC/B,eAAe,CAAC,EAAE,MAAM,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC9E,sFAAsF;IACtF,QAAQ,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,WAAW,2CAA+D,CAAA;AAEvF,eAAO,MAAM,aAAa,2CAAiE,CAAA;AAS3F,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"}
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"}
@@ -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":"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"}
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:
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAQtD,wBAAgB,eAAe,IAAI,YAAY,CAW9C"}
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"}
@@ -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 fsCache() {
19
- const { cacheDir } = getBuildPaths();
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;AAYD;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CACtB,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,eAAe,CAAC,UAAU,CAAM,GACvC,YAAY,CA2Cd"}
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"}