@rebask/core 0.3.0 → 0.4.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 (139) hide show
  1. package/dist/components/image.d.ts +16 -3
  2. package/dist/components/image.d.ts.map +1 -1
  3. package/dist/components/image.js +50 -68
  4. package/dist/components/link.d.ts.map +1 -1
  5. package/dist/components/link.js +6 -2
  6. package/dist/lib/image-optimization/fetch-remote-image.d.ts +17 -0
  7. package/dist/lib/image-optimization/fetch-remote-image.d.ts.map +1 -0
  8. package/dist/lib/image-optimization/fetch-remote-image.js +157 -0
  9. package/dist/lib/image-optimization/get-img-props.d.ts +3 -5
  10. package/dist/lib/image-optimization/get-img-props.d.ts.map +1 -1
  11. package/dist/lib/image-optimization/get-img-props.js +66 -40
  12. package/dist/lib/image-optimization/handler.d.ts +0 -3
  13. package/dist/lib/image-optimization/handler.d.ts.map +1 -1
  14. package/dist/lib/image-optimization/handler.js +339 -124
  15. package/dist/lib/image-optimization/image-config.d.ts +31 -4
  16. package/dist/lib/image-optimization/image-config.d.ts.map +1 -1
  17. package/dist/lib/image-optimization/image-config.js +6 -0
  18. package/dist/lib/image-optimization/image-error.d.ts +8 -0
  19. package/dist/lib/image-optimization/image-error.d.ts.map +1 -0
  20. package/dist/lib/image-optimization/image-error.js +10 -0
  21. package/dist/lib/image-optimization/image-plugin.d.ts.map +1 -1
  22. package/dist/lib/image-optimization/image-plugin.js +27 -14
  23. package/dist/lib/image-optimization/is-private-ip.d.ts +2 -0
  24. package/dist/lib/image-optimization/is-private-ip.d.ts.map +1 -0
  25. package/dist/lib/image-optimization/is-private-ip.js +43 -0
  26. package/dist/lib/image-optimization/match-patterns.d.ts +4 -0
  27. package/dist/lib/image-optimization/match-patterns.d.ts.map +1 -0
  28. package/dist/lib/image-optimization/match-patterns.js +39 -0
  29. package/dist/lib/image-optimization/read-body.d.ts +2 -0
  30. package/dist/lib/image-optimization/read-body.d.ts.map +1 -0
  31. package/dist/lib/image-optimization/read-body.js +27 -0
  32. package/dist/lib/image-optimization/static-image-loader.d.ts +2 -0
  33. package/dist/lib/image-optimization/static-image-loader.d.ts.map +1 -0
  34. package/dist/lib/image-optimization/static-image-loader.js +60 -0
  35. package/dist/lib/server-router/build-entries.d.ts.map +1 -1
  36. package/dist/lib/server-router/route-entries.js +1 -1
  37. package/dist/vite.d.ts.map +1 -1
  38. package/dist/vite.js +12 -4
  39. package/package.json +2 -1
  40. package/dist/__type_probe__.d.ts +0 -2
  41. package/dist/__type_probe__.d.ts.map +0 -1
  42. package/dist/__type_probe__.js +0 -4
  43. package/dist/components/error-boundary-client.d.ts +0 -49
  44. package/dist/components/error-boundary-client.d.ts.map +0 -1
  45. package/dist/components/error-boundary-client.js +0 -71
  46. package/dist/components/error-boundary.browser.d.ts +0 -8
  47. package/dist/components/error-boundary.browser.d.ts.map +0 -1
  48. package/dist/components/error-boundary.browser.js +0 -6
  49. package/dist/components/error.d.ts +0 -2
  50. package/dist/components/error.d.ts.map +0 -1
  51. package/dist/components/error.js +0 -5
  52. package/dist/components/not-found-activator.d.ts +0 -11
  53. package/dist/components/not-found-activator.d.ts.map +0 -1
  54. package/dist/components/not-found-activator.js +0 -26
  55. package/dist/components/not-found-boundary-client.d.ts +0 -3
  56. package/dist/components/not-found-boundary-client.d.ts.map +0 -1
  57. package/dist/components/not-found-boundary-client.js +0 -20
  58. package/dist/components/not-found-boundary.browser.d.ts +0 -8
  59. package/dist/components/not-found-boundary.browser.d.ts.map +0 -1
  60. package/dist/components/not-found-boundary.browser.js +0 -4
  61. package/dist/components/not-found-boundary.d.ts +0 -8
  62. package/dist/components/not-found-boundary.d.ts.map +0 -1
  63. package/dist/components/not-found-boundary.js +0 -9
  64. package/dist/components/not-found-thrower.d.ts +0 -2
  65. package/dist/components/not-found-thrower.d.ts.map +0 -1
  66. package/dist/components/not-found-thrower.js +0 -7
  67. package/dist/components/not-found.d.ts +0 -2
  68. package/dist/components/not-found.d.ts.map +0 -1
  69. package/dist/components/not-found.js +0 -5
  70. package/dist/components/status-page.d.ts +0 -6
  71. package/dist/components/status-page.d.ts.map +0 -1
  72. package/dist/components/status-page.js +0 -61
  73. package/dist/handler.d.ts +0 -12
  74. package/dist/handler.d.ts.map +0 -1
  75. package/dist/handler.js +0 -21
  76. package/dist/handlers/rsc/constants.d.ts +0 -3
  77. package/dist/handlers/rsc/constants.d.ts.map +0 -1
  78. package/dist/handlers/rsc/constants.js +0 -2
  79. package/dist/handlers/rsc/create-response.d.ts +0 -3
  80. package/dist/handlers/rsc/create-response.d.ts.map +0 -1
  81. package/dist/handlers/rsc/create-response.js +0 -378
  82. package/dist/handlers/rsc/render-with-retries.d.ts +0 -4
  83. package/dist/handlers/rsc/render-with-retries.d.ts.map +0 -1
  84. package/dist/handlers/rsc/render-with-retries.js +0 -154
  85. package/dist/handlers/rsc/retry-loop.d.ts +0 -3
  86. package/dist/handlers/rsc/retry-loop.d.ts.map +0 -1
  87. package/dist/handlers/rsc/retry-loop.js +0 -145
  88. package/dist/handlers/rsc/stream-rsc-payload.d.ts +0 -9
  89. package/dist/handlers/rsc/stream-rsc-payload.d.ts.map +0 -1
  90. package/dist/handlers/rsc/stream-rsc-payload.js +0 -20
  91. package/dist/handlers/rsc/types.d.ts +0 -26
  92. package/dist/handlers/rsc/types.d.ts.map +0 -1
  93. package/dist/handlers/rsc/types.js +0 -7
  94. package/dist/handlers/rsc.d.ts +0 -20
  95. package/dist/handlers/rsc.d.ts.map +0 -1
  96. package/dist/handlers/rsc.js +0 -872
  97. package/dist/integration.d.ts +0 -14
  98. package/dist/integration.d.ts.map +0 -1
  99. package/dist/integration.js +0 -9
  100. package/dist/lib/dev-module-load-race.d.ts +0 -8
  101. package/dist/lib/dev-module-load-race.d.ts.map +0 -1
  102. package/dist/lib/dev-module-load-race.js +0 -31
  103. package/dist/lib/dev-page-exports.d.ts +0 -5
  104. package/dist/lib/dev-page-exports.d.ts.map +0 -1
  105. package/dist/lib/dev-page-exports.js +0 -14
  106. package/dist/lib/environment-names.d.ts +0 -11
  107. package/dist/lib/environment-names.d.ts.map +0 -1
  108. package/dist/lib/environment-names.js +0 -10
  109. package/dist/lib/initial-hash-scroll.d.ts.map +0 -1
  110. package/dist/lib/not-found.d.ts +0 -5
  111. package/dist/lib/not-found.d.ts.map +0 -1
  112. package/dist/lib/not-found.js +0 -7
  113. package/dist/lib/page-exports.d.ts +0 -9
  114. package/dist/lib/page-exports.d.ts.map +0 -1
  115. package/dist/lib/page-exports.js +0 -47
  116. package/dist/lib/pattern-segments.d.ts +0 -8
  117. package/dist/lib/pattern-segments.d.ts.map +0 -1
  118. package/dist/lib/pattern-segments.js +0 -22
  119. package/dist/lib/ppr/cache-status.d.ts +0 -3
  120. package/dist/lib/ppr/cache-status.d.ts.map +0 -1
  121. package/dist/lib/ppr/cache-status.js +0 -5
  122. package/dist/lib/server-router-contract.d.ts +0 -42
  123. package/dist/lib/server-router-contract.d.ts.map +0 -1
  124. package/dist/lib/server-router-contract.js +0 -6
  125. package/dist/lib/server-router-loader.d.ts +0 -10
  126. package/dist/lib/server-router-loader.d.ts.map +0 -1
  127. package/dist/lib/server-router-loader.js +0 -180
  128. package/dist/lib/server-router.d.ts +0 -8
  129. package/dist/lib/server-router.d.ts.map +0 -1
  130. package/dist/lib/server-router.js +0 -173
  131. package/dist/plugins/ppr-upgrade.d.ts +0 -36
  132. package/dist/plugins/ppr-upgrade.d.ts.map +0 -1
  133. package/dist/plugins/ppr-upgrade.js +0 -32
  134. package/dist/plugins/server-router-fallback.d.ts +0 -15
  135. package/dist/plugins/server-router-fallback.d.ts.map +0 -1
  136. package/dist/plugins/server-router-fallback.js +0 -30
  137. package/dist/server.d.ts +0 -10
  138. package/dist/server.d.ts.map +0 -1
  139. package/dist/server.js +0 -57
@@ -1,14 +0,0 @@
1
- import type { handleApp, handleProxy } from "./entry.rsc.js";
2
- export interface LoadHandlersOptions {
3
- /** Vite build output directory. */
4
- root: string | URL;
5
- }
6
- export interface RebaskHandlers {
7
- /** Runs the proxy routes. Returns `null` when none answered the request. */
8
- handleProxy: typeof handleProxy;
9
- /** Runs the app routes, without the proxy. */
10
- handleApp: typeof handleApp;
11
- }
12
- /** Load Rebask's built proxy and app handlers into your server. */
13
- export declare function loadHandlers(options: LoadHandlersOptions): Promise<RebaskHandlers>;
14
- //# sourceMappingURL=integration.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../src/integration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,WAAW,mBAAmB;IACnC,mCAAmC;IACnC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC9B,4EAA4E;IAC5E,WAAW,EAAE,OAAO,WAAW,CAAA;IAC/B,8CAA8C;IAC9C,SAAS,EAAE,OAAO,SAAS,CAAA;CAC3B;AAED,mEAAmE;AACnE,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CASxF"}
@@ -1,9 +0,0 @@
1
- import { join, resolve } from "node:path";
2
- import { fileURLToPath, pathToFileURL } from "node:url";
3
- /** Load Rebask's built proxy and app handlers into your server. */
4
- export async function loadHandlers(options) {
5
- const root = options.root instanceof URL ? fileURLToPath(options.root) : resolve(options.root);
6
- process.env.REBASK_BUILD_DIR = join(root, ".rebask");
7
- const entry = (await import(pathToFileURL(join(root, "rsc", "index.js")).href));
8
- return { handleProxy: entry.handleProxy, handleApp: entry.handleApp };
9
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Detect Vite cold-start races where soft-nav imports fail because optimizeDeps
3
- * rewrote hashes mid-request (504 Outdated Optimize Dep). These are not user bugs.
4
- */
5
- export declare function isDevModuleLoadRace(error: unknown): boolean;
6
- /** Soft-recover by full reload once; returns true when recovery was triggered. */
7
- export declare function reloadForDevModuleLoadRace(error: unknown): boolean;
8
- //# sourceMappingURL=dev-module-load-race.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-module-load-race.d.ts","sourceRoot":"","sources":["../../src/lib/dev-module-load-race.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAkB3D;AAED,kFAAkF;AAClF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASlE"}
@@ -1,31 +0,0 @@
1
- /**
2
- * Detect Vite cold-start races where soft-nav imports fail because optimizeDeps
3
- * rewrote hashes mid-request (504 Outdated Optimize Dep). These are not user bugs.
4
- */
5
- export function isDevModuleLoadRace(error) {
6
- if (!import.meta.env.DEV || typeof window === "undefined")
7
- return false;
8
- const message = error instanceof Error
9
- ? error.message
10
- : typeof error === "string"
11
- ? error
12
- : error && typeof error === "object" && "message" in error
13
- ? String(error.message)
14
- : "";
15
- return (message.includes("Failed to fetch dynamically imported module") ||
16
- message.includes("error loading dynamically imported module") ||
17
- message.includes("Outdated Optimize Dep") ||
18
- message.includes("Importing a module script failed"));
19
- }
20
- /** Soft-recover by full reload once; returns true when recovery was triggered. */
21
- export function reloadForDevModuleLoadRace(error) {
22
- if (!isDevModuleLoadRace(error))
23
- return false;
24
- const key = "__rebask_dev_module_load_reload__";
25
- const w = window;
26
- if (w[key])
27
- return true;
28
- w[key] = true;
29
- window.location.reload();
30
- return true;
31
- }
@@ -1,5 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,14 +0,0 @@
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,11 +0,0 @@
1
- /**
2
- * The name of the Vite environment that builds and serves Rebask's RSC output. Server
3
- * integrations (like `rebask-nitro`) that provide their own routing to this environment (e.g.
4
- * via `fetchViteEnv`) should use this constant instead of hardcoding `"rsc"`.
5
- *
6
- * Kept in its own dependency-free module (rather than alongside the rest of `vite.ts`'s exports)
7
- * so runtime code — not just Vite config code — can import it without pulling in Rebask's Vite
8
- * plugin and its build-time-only dependencies.
9
- */
10
- export declare const REBASK_RSC_ENVIRONMENT_NAME = "rsc";
11
- //# sourceMappingURL=environment-names.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"environment-names.d.ts","sourceRoot":"","sources":["../../src/lib/environment-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,QAAQ,CAAA"}
@@ -1,10 +0,0 @@
1
- /**
2
- * The name of the Vite environment that builds and serves Rebask's RSC output. Server
3
- * integrations (like `rebask-nitro`) that provide their own routing to this environment (e.g.
4
- * via `fetchViteEnv`) should use this constant instead of hardcoding `"rsc"`.
5
- *
6
- * Kept in its own dependency-free module (rather than alongside the rest of `vite.ts`'s exports)
7
- * so runtime code — not just Vite config code — can import it without pulling in Rebask's Vite
8
- * plugin and its build-time-only dependencies.
9
- */
10
- export const REBASK_RSC_ENVIRONMENT_NAME = "rsc";
@@ -1 +0,0 @@
1
- {"version":3,"file":"initial-hash-scroll.d.ts","sourceRoot":"","sources":["../../src/lib/initial-hash-scroll.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,kwCAiCnC,CAAA"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Activate the nearest `<NotFoundBoundary>`. It works for both components and server actions.
3
- */
4
- export declare function notFound(): never;
5
- //# sourceMappingURL=not-found.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"not-found.d.ts","sourceRoot":"","sources":["../../src/lib/not-found.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
@@ -1,7 +0,0 @@
1
- import { NotFoundError } from "./errors.js";
2
- /**
3
- * Activate the nearest `<NotFoundBoundary>`. It works for both components and server actions.
4
- */
5
- export function notFound() {
6
- throw new NotFoundError();
7
- }
@@ -1,9 +0,0 @@
1
- export type PageExports = {
2
- default: boolean;
3
- notFound: boolean;
4
- };
5
- export declare function readPageExports(filePath: string): Promise<{
6
- default: boolean;
7
- notFound: boolean;
8
- }>;
9
- //# sourceMappingURL=page-exports.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-exports.d.ts","sourceRoot":"","sources":["../../src/lib/page-exports.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM;;;GAiDrD"}
@@ -1,47 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { parseSync } from "vite";
3
- export async function readPageExports(filePath) {
4
- const source = await readFile(filePath, "utf8");
5
- const { program } = parseSync(filePath, source);
6
- let hasDefault = false;
7
- let hasNotFound = false;
8
- for (const statement of program.body) {
9
- if (statement.type === "ExportDefaultDeclaration") {
10
- hasDefault = true;
11
- continue;
12
- }
13
- if (statement.type === "ExportAllDeclaration") {
14
- const exported = statement.exported;
15
- if (exported?.type === "Identifier" && exported.name === "default") {
16
- hasDefault = true;
17
- }
18
- continue;
19
- }
20
- if (statement.type !== "ExportNamedDeclaration")
21
- continue;
22
- const declaration = statement.declaration;
23
- if (declaration?.type === "VariableDeclaration") {
24
- for (const declarator of declaration.declarations) {
25
- if (declarator.id.type !== "Identifier")
26
- continue;
27
- if (declarator.id.name === "notFound") {
28
- let init = declarator.init;
29
- while (init &&
30
- (init.type === "TSAsExpression" ||
31
- init.type === "TSSatisfiesExpression" ||
32
- init.type === "ParenthesizedExpression")) {
33
- init = init.expression;
34
- }
35
- hasNotFound = init?.type === "Literal" && init.value === true;
36
- }
37
- }
38
- }
39
- for (const specifier of statement.specifiers ?? []) {
40
- if (specifier.exported.type !== "Identifier")
41
- continue;
42
- if (specifier.exported.name === "default")
43
- hasDefault = true;
44
- }
45
- }
46
- return { default: hasDefault, notFound: hasNotFound };
47
- }
@@ -1,8 +0,0 @@
1
- import type { RouteSegment } from "./route-matcher.js";
2
- /**
3
- * Parse a pattern string (e.g. `"/blog/:slug"`, `"/admin/*"`) into route segments.
4
- *
5
- * Used to convert proxy and image path patterns into `RouteSegment[]`, expected by `createMatcher`.
6
- */
7
- export declare function parsePatternToSegments(pattern: string): RouteSegment[];
8
- //# sourceMappingURL=pattern-segments.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pattern-segments.d.ts","sourceRoot":"","sources":["../../src/lib/pattern-segments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAgBtE"}
@@ -1,22 +0,0 @@
1
- /**
2
- * Parse a pattern string (e.g. `"/blog/:slug"`, `"/admin/*"`) into route segments.
3
- *
4
- * Used to convert proxy and image path patterns into `RouteSegment[]`, expected by `createMatcher`.
5
- */
6
- export function parsePatternToSegments(pattern) {
7
- const segments = [];
8
- for (const part of pattern.split("/")) {
9
- if (part === "")
10
- continue;
11
- if (part === "*") {
12
- segments.push({ type: "catch-all", name: "*" });
13
- }
14
- else if (part.startsWith(":")) {
15
- segments.push({ type: "dynamic", name: part.slice(1) });
16
- }
17
- else {
18
- segments.push({ type: "static", value: part });
19
- }
20
- }
21
- return segments;
22
- }
@@ -1,3 +0,0 @@
1
- import { type RebaskCacheStatus } from "./headers.js";
2
- export declare function cacheStatusHeader(cacheStatus: RebaskCacheStatus): Record<string, string>;
3
- //# sourceMappingURL=cache-status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-status.d.ts","sourceRoot":"","sources":["../../../src/lib/ppr/cache-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE1E,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExF"}
@@ -1,5 +0,0 @@
1
- import { pprConfig } from "virtual:rebask/ppr-config";
2
- import { REBASK_CACHE_HEADER } from "./headers.js";
3
- export function cacheStatusHeader(cacheStatus) {
4
- return pprConfig?.emitCacheStatus === false ? {} : { [REBASK_CACHE_HEADER]: cacheStatus };
5
- }
@@ -1,42 +0,0 @@
1
- import type { ProxyHandler } from "../proxy.js";
2
- import type { HttpMethod, LayoutRoute, Route, RouteHandlerRoute } from "./route-matcher.js";
3
- export declare enum RouteType {
4
- APP = 0,
5
- PROXY = 1,
6
- IMAGE = 2
7
- }
8
- type Handler = (request: Request, params: Record<string, string | string[]>) => Promise<Response>;
9
- type RequestHandler = (request: Request) => Promise<Response>;
10
- type AppEntry<T> = {
11
- methods: HttpMethod[];
12
- type: RouteType.APP;
13
- route: T;
14
- handler: Handler;
15
- };
16
- type PageRouteEntry = AppEntry<Route>;
17
- type RouteHandlerEntry = AppEntry<RouteHandlerRoute>;
18
- type LayoutRSCEntry = AppEntry<LayoutRoute>;
19
- type ProxyEntry = {
20
- type: RouteType.PROXY;
21
- methods: HttpMethod[];
22
- pattern: string;
23
- handler: ProxyHandler;
24
- };
25
- type ImageEntry = {
26
- type: RouteType.IMAGE;
27
- methods: HttpMethod[];
28
- pattern: string;
29
- handler: Handler;
30
- };
31
- export type RouteMatchEntry = PageRouteEntry | RouteHandlerEntry | LayoutRSCEntry | ProxyEntry | ImageEntry;
32
- /** A compiled route matcher that finds the best matching route for a given method + URL. */
33
- export interface RouteMatcher {
34
- find(method: string, url: string): RequestHandler | null;
35
- }
36
- /**
37
- * A router plugin provides an implementation of this function via the
38
- * `virtual:rebask/server-router` virtual module.
39
- */
40
- export type CreateMatcherFn = (entries: RouteMatchEntry[]) => RouteMatcher;
41
- export {};
42
- //# sourceMappingURL=server-router-contract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-router-contract.d.ts","sourceRoot":"","sources":["../../src/lib/server-router-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE3F,oBAAY,SAAS;IACpB,GAAG,IAAA;IACH,KAAK,IAAA;IACL,KAAK,IAAA;CACL;AAED,KAAK,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEjG,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7D,KAAK,QAAQ,CAAC,CAAC,IAAI;IAClB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,IAAI,EAAE,SAAS,CAAC,GAAG,CAAA;IACnB,KAAK,EAAE,CAAC,CAAA;IACR,OAAO,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,KAAK,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;AACrC,KAAK,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AACpD,KAAK,cAAc,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;AAE3C,KAAK,UAAU,GAAG;IACjB,IAAI,EAAE,SAAS,CAAC,KAAK,CAAA;IACrB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,YAAY,CAAA;CACrB,CAAA;AAED,KAAK,UAAU,GAAG;IACjB,IAAI,EAAE,SAAS,CAAC,KAAK,CAAA;IACrB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,eAAe,GACxB,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,UAAU,GACV,UAAU,CAAA;AAEb,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC5B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAA;CACxD;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,CAAA"}
@@ -1,6 +0,0 @@
1
- export var RouteType;
2
- (function (RouteType) {
3
- RouteType[RouteType["APP"] = 0] = "APP";
4
- RouteType[RouteType["PROXY"] = 1] = "PROXY";
5
- RouteType[RouteType["IMAGE"] = 2] = "IMAGE";
6
- })(RouteType || (RouteType = {}));
@@ -1,10 +0,0 @@
1
- type RequestHandler = (request: Request) => Promise<Response>;
2
- export interface RebaskRouter {
3
- find: (request: Request) => RequestHandler;
4
- }
5
- /**
6
- * Get the compiled server router for route matching.
7
- */
8
- export declare function getRouter(): Promise<RebaskRouter>;
9
- export {};
10
- //# sourceMappingURL=server-router-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-router-loader.d.ts","sourceRoot":"","sources":["../../src/lib/server-router-loader.ts"],"names":[],"mappings":"AA6BA,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7D,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,cAAc,CAAA;CAC1C;AA+MD;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAkBvD"}
@@ -1,180 +0,0 @@
1
- import { layoutRoutes as configLayoutRoutes, routeHandlerRoutes as configRouteHandlerRoutes, routes as configRoutes, } from "virtual:rebask/config";
2
- import { imageConfig } from "virtual:rebask/image-config";
3
- import { loadImageHandler } from "virtual:rebask/image-handler";
4
- import { proxyRouter } from "virtual:rebask/proxy-router";
5
- import { createMatcher } from "virtual:rebask/server-router";
6
- import { applyCookies, getSetCookieValues } from "../cookies.js";
7
- import { handleImageRequest } from "../handlers/image.js";
8
- import { handleRouteHandler } from "../handlers/route-handler.js";
9
- import { handlePageRoute } from "../handlers/rsc/index.js";
10
- import { handleLayoutRouteRequest } from "../handlers/segment.js";
11
- import { getDevServer } from "./dev-server.js";
12
- import { reinjectFlightHeaders, sanitizeForProxy } from "./flight-headers.js";
13
- import { parsePatternToSegments } from "./pattern-segments.js";
14
- import { buildProxy } from "./proxy/build-proxy.js";
15
- import { proxyExternal } from "./proxy/proxy-external.js";
16
- import { REWRITE_HEADER, rewriteHeaders } from "./proxy/rewrite.js";
17
- import { assertNoPageRouteHandlerConflicts, buildLayoutRoutes, buildRouteHandlerRoutes, buildRoutes, } from "./route-builder.js";
18
- const LAYOUT_PREFIX_SEGMENTS = [
19
- { type: "static", value: "_rebask" },
20
- { type: "static", value: "1" },
21
- ];
22
- function filterGroups(segments) {
23
- return segments.filter((s) => s.type !== "group");
24
- }
25
- function buildMainEntries(pageRoutes, routeHandlerRoutes, layoutRoutes) {
26
- const entries = [];
27
- // Image optimization route
28
- if (imageConfig !== null && loadImageHandler !== undefined) {
29
- entries.push({
30
- method: "GET",
31
- segments: parsePatternToSegments(imageConfig.path),
32
- data: { dispatch: (req) => handleImageRequest(req) },
33
- });
34
- }
35
- // Page routes — registered for GET and POST:
36
- // - GET: page loads, RSC requests, segment requests
37
- // - POST: server actions, form submissions, PPR resume
38
- for (const route of pageRoutes) {
39
- const segments = filterGroups(route.segments);
40
- const dispatch = (req, params) => handlePageRoute(req, route, params);
41
- const hasOptionalCatchAll = route.segments.some((s) => s.type === "optional-catch-all");
42
- if (hasOptionalCatchAll) {
43
- const catchAllSegment = route.segments.find((s) => s.type === "optional-catch-all");
44
- const catchAllName = catchAllSegment.name;
45
- const baseSegments = segments.filter((s) => s.type !== "optional-catch-all");
46
- const baseDispatch = (req, params) => handlePageRoute(req, route, { ...params, [catchAllName]: [] });
47
- entries.push({ method: "GET", segments: baseSegments, data: { dispatch: baseDispatch } });
48
- entries.push({ method: "GET", segments, data: { dispatch } });
49
- entries.push({ method: "POST", segments: baseSegments, data: { dispatch: baseDispatch } });
50
- entries.push({ method: "POST", segments, data: { dispatch } });
51
- }
52
- else {
53
- entries.push({ method: "GET", segments, data: { dispatch } });
54
- entries.push({ method: "POST", segments, data: { dispatch } });
55
- }
56
- }
57
- // Route handlers — registered for all methods so they can return 405
58
- // when the path exists but a specific method is not implemented.
59
- for (const route of routeHandlerRoutes) {
60
- const segments = filterGroups(route.segments);
61
- const dispatch = (req, params) => handleRouteHandler(req, route, params);
62
- entries.push({ method: undefined, segments, data: { dispatch } });
63
- }
64
- // Layout routes — registered under /_rebask/1/{path}
65
- for (const route of layoutRoutes) {
66
- const segments = [...LAYOUT_PREFIX_SEGMENTS, ...route.segments];
67
- const dispatch = (req, params) => handleLayoutRouteRequest(req, route, params);
68
- entries.push({ method: "GET", segments, data: { dispatch } });
69
- }
70
- return entries;
71
- }
72
- function buildMainRouter(pageRoutes, routeHandlerRoutes, layoutRoutes) {
73
- const entries = buildMainEntries(pageRoutes, routeHandlerRoutes, layoutRoutes);
74
- const matcher = createMatcher(entries);
75
- return {
76
- find(request) {
77
- const match = matcher.find(request.method, request.url);
78
- if (!match)
79
- return notFoundHandler;
80
- return (req) => match.data.dispatch(req, match.params);
81
- },
82
- };
83
- }
84
- async function notFoundHandler() {
85
- return new Response("Not Found", { status: 404 });
86
- }
87
- function createRouter(pageRoutes, routeHandlerRoutes, layoutRoutes, resolvedProxyRouter = proxyRouter) {
88
- const mainRouter = buildMainRouter(pageRoutes, routeHandlerRoutes, layoutRoutes);
89
- if (!resolvedProxyRouter)
90
- return mainRouter;
91
- // Compose proxy + main router
92
- return {
93
- find(request) {
94
- const proxyHandler = resolvedProxyRouter.find(request);
95
- if (proxyHandler) {
96
- return async (req) => {
97
- const { sanitized, stashed } = sanitizeForProxy(req);
98
- const result = await proxyHandler(sanitized);
99
- if (result) {
100
- const rewriteUrl = result.headers.get(REWRITE_HEADER);
101
- if (rewriteUrl) {
102
- const rewrittenUrl = new URL(rewriteUrl, req.url);
103
- const reqOrigin = new URL(req.url).origin;
104
- let response;
105
- if (rewrittenUrl.origin !== reqOrigin) {
106
- response = await proxyExternal(rewrittenUrl, req, result, stashed);
107
- }
108
- else {
109
- const mergedHeaders = new Headers(rewriteHeaders.get(result) ?? req.headers);
110
- reinjectFlightHeaders(mergedHeaders, stashed);
111
- // Always restore the `accept` header from the original request. The proxy must not
112
- // be able to change whether a request is treated as HTML or RSC.
113
- const accept = req.headers.get("accept");
114
- if (accept)
115
- mergedHeaders.set("accept", accept);
116
- // Build from URL string instead of `new Request(req, init)`. undici's Request uses
117
- // a private `#state` field, and `new Request` reads it from the existing request,
118
- // which fails when that request was created by a different undici module instance.
119
- const init = { headers: mergedHeaders, method: req.method };
120
- // Only pass the body for methods that support one, passing a stream for GET/HEAD
121
- // throws and would lock the original body.
122
- if (req.body && req.method !== "GET" && req.method !== "HEAD") {
123
- init.body = req.body;
124
- // @ts-expect-error - required for streaming body in Node.js
125
- init.duplex = "half";
126
- }
127
- const rewrittenReq = new Request(rewrittenUrl, init);
128
- const mainHandler = mainRouter.find(rewrittenReq);
129
- response = await mainHandler(rewrittenReq);
130
- }
131
- for (const cookie of getSetCookieValues(result.headers)) {
132
- response.headers.append("set-cookie", cookie);
133
- }
134
- return response;
135
- }
136
- return applyCookies(result);
137
- }
138
- // Fall through with the original request.
139
- const mainHandler = mainRouter.find(req);
140
- return mainHandler(req);
141
- };
142
- }
143
- return mainRouter.find(request);
144
- },
145
- };
146
- }
147
- // In production, build the router at module load time
148
- const router = import.meta.env.PROD
149
- ? createRouter(configRoutes, configRouteHandlerRoutes, configLayoutRoutes)
150
- : null;
151
- /**
152
- * Imports app manifest files through the dev server, without this our HMR tests for the proxy
153
- * don't work.
154
- */
155
- async function loadAppManifest() {
156
- const devServer = getDevServer();
157
- if (devServer) {
158
- const appManifest = await devServer.ssrLoadModule(new URL("./app-manifest.js", import.meta.url).pathname);
159
- return appManifest;
160
- }
161
- return await import("./app-manifest.js");
162
- }
163
- /**
164
- * Get the compiled server router for route matching.
165
- */
166
- export async function getRouter() {
167
- if (router)
168
- return router;
169
- // Development: build routes from module manifest
170
- const { layoutModules, pageModules, proxyModules, routeHandlerModules } = await loadAppManifest();
171
- const layouts = Object.keys(layoutModules);
172
- const pages = Object.keys(pageModules);
173
- assertNoPageRouteHandlerConflicts(pages, Object.keys(routeHandlerModules));
174
- const routes = buildRoutes(layouts, pages);
175
- const routeHandlerRoutes = buildRouteHandlerRoutes(Object.keys(routeHandlerModules));
176
- const layoutRoutes = buildLayoutRoutes(layouts);
177
- const proxyModule = await Object.values(proxyModules)[0]?.();
178
- const proxyRouterInDev = proxyModule && buildProxy(proxyModule.default);
179
- return createRouter(routes, routeHandlerRoutes, layoutRoutes, proxyRouterInDev);
180
- }
@@ -1,8 +0,0 @@
1
- type RequestHandler = (request: Request) => Promise<Response>;
2
- export interface RebaskRouter {
3
- find: (request: Request) => RequestHandler;
4
- }
5
- /** Get the compiled server router for route matching. */
6
- export declare function getRouter(): Promise<RebaskRouter>;
7
- export {};
8
- //# sourceMappingURL=server-router.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-router.d.ts","sourceRoot":"","sources":["../../src/lib/server-router.ts"],"names":[],"mappings":"AAkCA,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7D,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,cAAc,CAAA;CAC1C;AAuLD,yDAAyD;AACzD,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAiBvD"}