@reckona/mreact-router 0.0.203 → 0.0.205

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 (140) hide show
  1. package/README.md +53 -9
  2. package/dist/actions.d.ts +6 -0
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +70 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/adapters/aws-lambda.d.ts +15 -4
  7. package/dist/adapters/aws-lambda.d.ts.map +1 -1
  8. package/dist/adapters/aws-lambda.js +301 -63
  9. package/dist/adapters/aws-lambda.js.map +1 -1
  10. package/dist/adapters/cloudflare.d.ts +2 -1
  11. package/dist/adapters/cloudflare.d.ts.map +1 -1
  12. package/dist/adapters/cloudflare.js +18 -10
  13. package/dist/adapters/cloudflare.js.map +1 -1
  14. package/dist/adapters/edge.d.ts +1 -1
  15. package/dist/adapters/edge.d.ts.map +1 -1
  16. package/dist/adapters/edge.js.map +1 -1
  17. package/dist/adapters/node.d.ts +5 -3
  18. package/dist/adapters/node.d.ts.map +1 -1
  19. package/dist/adapters/node.js +2 -1
  20. package/dist/adapters/node.js.map +1 -1
  21. package/dist/adapters/static.d.ts.map +1 -1
  22. package/dist/adapters/static.js +24 -2
  23. package/dist/adapters/static.js.map +1 -1
  24. package/dist/build.d.ts +1 -0
  25. package/dist/build.d.ts.map +1 -1
  26. package/dist/build.js +91 -5
  27. package/dist/build.js.map +1 -1
  28. package/dist/built-runtime.d.ts +2 -0
  29. package/dist/built-runtime.d.ts.map +1 -1
  30. package/dist/built-runtime.js +16 -0
  31. package/dist/built-runtime.js.map +1 -1
  32. package/dist/cache.d.ts +3 -1
  33. package/dist/cache.d.ts.map +1 -1
  34. package/dist/cache.js +211 -13
  35. package/dist/cache.js.map +1 -1
  36. package/dist/cli.js +12 -1
  37. package/dist/cli.js.map +1 -1
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +32 -1
  40. package/dist/client.js.map +1 -1
  41. package/dist/config.d.ts +3 -0
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +21 -2
  44. package/dist/config.js.map +1 -1
  45. package/dist/csp.d.ts +1 -0
  46. package/dist/csp.d.ts.map +1 -1
  47. package/dist/csp.js +11 -6
  48. package/dist/csp.js.map +1 -1
  49. package/dist/dehydrate-policy.d.ts +3 -0
  50. package/dist/dehydrate-policy.d.ts.map +1 -0
  51. package/dist/dehydrate-policy.js +16 -0
  52. package/dist/dehydrate-policy.js.map +1 -0
  53. package/dist/dev-server.d.ts +7 -2
  54. package/dist/dev-server.d.ts.map +1 -1
  55. package/dist/dev-server.js +120 -11
  56. package/dist/dev-server.js.map +1 -1
  57. package/dist/http.d.ts +1 -1
  58. package/dist/http.d.ts.map +1 -1
  59. package/dist/http.js +147 -7
  60. package/dist/http.js.map +1 -1
  61. package/dist/index.d.ts +4 -3
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/logger.d.ts +22 -1
  66. package/dist/logger.d.ts.map +1 -1
  67. package/dist/logger.js +22 -8
  68. package/dist/logger.js.map +1 -1
  69. package/dist/metadata.d.ts +8 -0
  70. package/dist/metadata.d.ts.map +1 -1
  71. package/dist/metadata.js +60 -22
  72. package/dist/metadata.js.map +1 -1
  73. package/dist/navigation-marker.d.ts.map +1 -1
  74. package/dist/navigation-marker.js +72 -9
  75. package/dist/navigation-marker.js.map +1 -1
  76. package/dist/navigation.d.ts +1 -0
  77. package/dist/navigation.d.ts.map +1 -1
  78. package/dist/navigation.js +1 -1
  79. package/dist/navigation.js.map +1 -1
  80. package/dist/node-server.d.ts +5 -2
  81. package/dist/node-server.d.ts.map +1 -1
  82. package/dist/node-server.js +75 -6
  83. package/dist/node-server.js.map +1 -1
  84. package/dist/prerender-entry.d.ts +14 -0
  85. package/dist/prerender-entry.d.ts.map +1 -1
  86. package/dist/prerender-entry.js +40 -3
  87. package/dist/prerender-entry.js.map +1 -1
  88. package/dist/render.d.ts +9 -1
  89. package/dist/render.d.ts.map +1 -1
  90. package/dist/render.js +102 -123
  91. package/dist/render.js.map +1 -1
  92. package/dist/serve.d.ts +8 -2
  93. package/dist/serve.d.ts.map +1 -1
  94. package/dist/serve.js +22 -20
  95. package/dist/serve.js.map +1 -1
  96. package/dist/session.d.ts.map +1 -1
  97. package/dist/session.js +52 -19
  98. package/dist/session.js.map +1 -1
  99. package/dist/upgrade.d.ts +59 -2
  100. package/dist/upgrade.d.ts.map +1 -1
  101. package/dist/upgrade.js +282 -1
  102. package/dist/upgrade.js.map +1 -1
  103. package/dist/vite-config.d.ts +2 -0
  104. package/dist/vite-config.d.ts.map +1 -1
  105. package/dist/vite-config.js +2 -0
  106. package/dist/vite-config.js.map +1 -1
  107. package/dist/vite.d.ts +4 -1
  108. package/dist/vite.d.ts.map +1 -1
  109. package/dist/vite.js +117 -6
  110. package/dist/vite.js.map +1 -1
  111. package/package.json +11 -11
  112. package/src/actions.ts +81 -11
  113. package/src/adapters/aws-lambda.ts +426 -115
  114. package/src/adapters/cloudflare.ts +29 -13
  115. package/src/adapters/edge.ts +2 -0
  116. package/src/adapters/node.ts +8 -10
  117. package/src/adapters/static.ts +31 -2
  118. package/src/build.ts +117 -10
  119. package/src/built-runtime.ts +28 -0
  120. package/src/cache.ts +262 -15
  121. package/src/cli.ts +14 -1
  122. package/src/client.ts +32 -1
  123. package/src/config.ts +43 -6
  124. package/src/csp.ts +14 -11
  125. package/src/dehydrate-policy.ts +23 -0
  126. package/src/dev-server.ts +188 -15
  127. package/src/http.ts +172 -6
  128. package/src/index.ts +14 -1
  129. package/src/logger.ts +47 -10
  130. package/src/metadata.ts +125 -60
  131. package/src/navigation-marker.ts +79 -9
  132. package/src/navigation.ts +1 -1
  133. package/src/node-server.ts +128 -22
  134. package/src/prerender-entry.ts +52 -3
  135. package/src/render.ts +807 -753
  136. package/src/serve.ts +49 -56
  137. package/src/session.ts +56 -25
  138. package/src/upgrade.ts +402 -3
  139. package/src/vite-config.ts +6 -0
  140. package/src/vite.ts +157 -5
@@ -1,8 +1,11 @@
1
1
  import type { BuiltPrerenderedRoute } from "./build.js";
2
+ import { responseHeadersContainCspNonce } from "./csp.js";
2
3
  import { hasNavigationRouteMarker } from "./navigation-marker.js";
3
4
 
4
5
  export const PRERENDERED_ROUTE_SCHEMA_VERSION = 4;
5
6
 
7
+ const validatedNavigationHtmlByEntry = new WeakMap<object, string | null>();
8
+
6
9
  export function isCurrentPrerenderedRoute(value: unknown): value is BuiltPrerenderedRoute {
7
10
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
8
11
  return false;
@@ -17,9 +20,6 @@ export function isCurrentPrerenderedRoute(value: unknown): value is BuiltPrerend
17
20
  !hasStoredHstsHeader(entry.headers) &&
18
21
  isCanonicalHstsHeader(entry.strictTransportSecurity) &&
19
22
  typeof entry.html === "string" &&
20
- (entry.navigationHtml === undefined ||
21
- (typeof entry.navigationHtml === "string" &&
22
- hasNavigationRouteMarker(entry.navigationHtml))) &&
23
23
  typeof entry.status === "number" &&
24
24
  Number.isInteger(entry.status) &&
25
25
  entry.status >= 100 &&
@@ -27,6 +27,39 @@ export function isCurrentPrerenderedRoute(value: unknown): value is BuiltPrerend
27
27
  );
28
28
  }
29
29
 
30
+ /**
31
+ * Returns a navigation variant only after validating its route marker.
32
+ *
33
+ * Stored entries are stable objects during a runtime's lifetime, so the
34
+ * marker scan is cached by identity. Document requests never call this
35
+ * function and therefore never inspect navigation HTML.
36
+ */
37
+ export function validatedPrerenderedNavigationHtml(
38
+ entry: BuiltPrerenderedRoute,
39
+ ): string | undefined {
40
+ const cached = validatedNavigationHtmlByEntry.get(entry);
41
+ if (cached !== undefined) {
42
+ return cached === null ? undefined : cached;
43
+ }
44
+
45
+ const candidate = entry.navigationHtml;
46
+ const validated =
47
+ typeof candidate === "string" && hasNavigationRouteMarker(candidate) ? candidate : null;
48
+ validatedNavigationHtmlByEntry.set(entry, validated);
49
+ return validated === null ? undefined : validated;
50
+ }
51
+
52
+ /**
53
+ * Adds a regenerated navigation variant only when it satisfies the marker
54
+ * contract. Invalid navigation output must not replace a valid document.
55
+ */
56
+ export function mergePrerenderedNavigationHtml(
57
+ entry: BuiltPrerenderedRoute,
58
+ navigationHtml: string,
59
+ ): BuiltPrerenderedRoute {
60
+ return hasNavigationRouteMarker(navigationHtml) ? { ...entry, navigationHtml } : entry;
61
+ }
62
+
30
63
  function hasStoredHstsHeader(headers: Record<string, string>): boolean {
31
64
  try {
32
65
  return new Headers(headers).has("strict-transport-security");
@@ -47,6 +80,21 @@ export function isVisitorDependentResponse(response: Response): boolean {
47
80
  return isVisitorDependentHeaders(response.headers);
48
81
  }
49
82
 
83
+ export function protectNonceBearingResponse(response: Response): Response {
84
+ if (!responseHeadersContainCspNonce(response.headers)) {
85
+ return response;
86
+ }
87
+
88
+ const headers = new Headers(response.headers);
89
+ headers.set("cache-control", "private, no-store");
90
+ headers.set("x-mreact-cache", "DYNAMIC");
91
+ return new Response(response.body, {
92
+ headers,
93
+ status: response.status,
94
+ statusText: response.statusText,
95
+ });
96
+ }
97
+
50
98
  export function storedPrerenderedRouteHeaders(headers: Headers): Record<string, string> {
51
99
  const stored: Record<string, string> = {};
52
100
 
@@ -114,6 +162,7 @@ function isVisitorDependentHeaders(headers: Headers): boolean {
114
162
  return (
115
163
  headers.get("x-mreact-cache")?.toUpperCase() === "DYNAMIC" ||
116
164
  headers.has("set-cookie") ||
165
+ responseHeadersContainCspNonce(headers) ||
117
166
  hasVisitorDependentVary ||
118
167
  forbidsSharedStorage
119
168
  );