@nifrajs/web 3.3.0 → 4.0.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 (407) hide show
  1. package/dist/backend-only.d.ts +15 -0
  2. package/dist/backend-only.d.ts.map +1 -0
  3. package/dist/backend-only.js +16 -0
  4. package/dist/backend-only.js.map +1 -0
  5. package/dist/boundary.d.ts +5 -0
  6. package/dist/boundary.d.ts.map +1 -1
  7. package/dist/boundary.js +11 -2
  8. package/dist/boundary.js.map +1 -1
  9. package/dist/build-plan.d.ts +35 -6
  10. package/dist/build-plan.d.ts.map +1 -1
  11. package/dist/build-plan.js +89 -35
  12. package/dist/build-plan.js.map +1 -1
  13. package/dist/build-vite.d.ts +18 -0
  14. package/dist/build-vite.d.ts.map +1 -1
  15. package/dist/build-vite.js +97 -17
  16. package/dist/build-vite.js.map +1 -1
  17. package/dist/build.d.ts +72 -23
  18. package/dist/build.d.ts.map +1 -1
  19. package/dist/build.js +411 -98
  20. package/dist/build.js.map +1 -1
  21. package/dist/bun-dev-entry.d.ts +1 -1
  22. package/dist/bun-dev-entry.js +1 -1
  23. package/dist/cdn.d.ts +74 -0
  24. package/dist/cdn.d.ts.map +1 -0
  25. package/dist/cdn.js +132 -0
  26. package/dist/cdn.js.map +1 -0
  27. package/dist/client.d.ts +21 -1
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +226 -15
  30. package/dist/client.js.map +1 -1
  31. package/dist/conformance.d.ts +4 -3
  32. package/dist/conformance.d.ts.map +1 -1
  33. package/dist/conformance.js +12 -3
  34. package/dist/conformance.js.map +1 -1
  35. package/dist/csp.d.ts +93 -0
  36. package/dist/csp.d.ts.map +1 -0
  37. package/dist/csp.js +122 -0
  38. package/dist/csp.js.map +1 -0
  39. package/dist/css-contract.d.ts +21 -0
  40. package/dist/css-contract.d.ts.map +1 -0
  41. package/dist/css-contract.js +28 -0
  42. package/dist/css-contract.js.map +1 -0
  43. package/dist/dev-client.d.ts +76 -0
  44. package/dist/dev-client.d.ts.map +1 -0
  45. package/dist/dev-client.js +280 -0
  46. package/dist/dev-client.js.map +1 -0
  47. package/dist/dev-diagnostics.d.ts +26 -2
  48. package/dist/dev-diagnostics.d.ts.map +1 -1
  49. package/dist/dev-diagnostics.js +38 -7
  50. package/dist/dev-diagnostics.js.map +1 -1
  51. package/dist/dev-error.d.ts +4 -13
  52. package/dist/dev-error.d.ts.map +1 -1
  53. package/dist/dev-error.js +46 -4
  54. package/dist/dev-error.js.map +1 -1
  55. package/dist/dev-feed.d.ts +298 -0
  56. package/dist/dev-feed.d.ts.map +1 -0
  57. package/dist/dev-feed.js +797 -0
  58. package/dist/dev-feed.js.map +1 -0
  59. package/dist/dev-indicator.d.ts +38 -0
  60. package/dist/dev-indicator.d.ts.map +1 -0
  61. package/dist/dev-indicator.js +93 -0
  62. package/dist/dev-indicator.js.map +1 -0
  63. package/dist/dev-session.d.ts +77 -0
  64. package/dist/dev-session.d.ts.map +1 -0
  65. package/dist/dev-session.js +580 -0
  66. package/dist/dev-session.js.map +1 -0
  67. package/dist/dev-sourcemap.d.ts +27 -0
  68. package/dist/dev-sourcemap.d.ts.map +1 -0
  69. package/dist/dev-sourcemap.js +235 -0
  70. package/dist/dev-sourcemap.js.map +1 -0
  71. package/dist/dev-ssr-graph.d.ts.map +1 -1
  72. package/dist/dev-ssr-graph.js +13 -5
  73. package/dist/dev-ssr-graph.js.map +1 -1
  74. package/dist/dev.d.ts +15 -2
  75. package/dist/dev.d.ts.map +1 -1
  76. package/dist/dev.js +69 -44
  77. package/dist/dev.js.map +1 -1
  78. package/dist/diagnostic-catalog.d.ts +35 -0
  79. package/dist/diagnostic-catalog.d.ts.map +1 -0
  80. package/dist/diagnostic-catalog.js +203 -0
  81. package/dist/diagnostic-catalog.js.map +1 -0
  82. package/dist/diagnostic-prompt.d.ts +49 -0
  83. package/dist/diagnostic-prompt.d.ts.map +1 -0
  84. package/dist/diagnostic-prompt.js +303 -0
  85. package/dist/diagnostic-prompt.js.map +1 -0
  86. package/dist/diagnostic.d.ts +17 -23
  87. package/dist/diagnostic.d.ts.map +1 -1
  88. package/dist/diagnostic.js +31 -39
  89. package/dist/diagnostic.js.map +1 -1
  90. package/dist/draft.d.ts.map +1 -1
  91. package/dist/draft.js +4 -1
  92. package/dist/draft.js.map +1 -1
  93. package/dist/fn.d.ts +5 -0
  94. package/dist/fn.d.ts.map +1 -1
  95. package/dist/fn.js +13 -3
  96. package/dist/fn.js.map +1 -1
  97. package/dist/fs.d.ts.map +1 -1
  98. package/dist/fs.js +4 -2
  99. package/dist/fs.js.map +1 -1
  100. package/dist/index.d.ts +15 -15
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +13 -12
  103. package/dist/index.js.map +1 -1
  104. package/dist/internal/cdn/cloudflare.d.ts +48 -0
  105. package/dist/internal/cdn/cloudflare.d.ts.map +1 -0
  106. package/dist/internal/cdn/cloudflare.js +94 -0
  107. package/dist/internal/cdn/cloudflare.js.map +1 -0
  108. package/dist/internal/cdn/core.d.ts +91 -0
  109. package/dist/internal/cdn/core.d.ts.map +1 -0
  110. package/dist/internal/cdn/core.js +220 -0
  111. package/dist/internal/cdn/core.js.map +1 -0
  112. package/dist/internal/cdn/fastly.d.ts +17 -0
  113. package/dist/internal/cdn/fastly.d.ts.map +1 -0
  114. package/dist/internal/cdn/fastly.js +43 -0
  115. package/dist/internal/cdn/fastly.js.map +1 -0
  116. package/dist/internal/cdn/vercel.d.ts +31 -0
  117. package/dist/internal/cdn/vercel.d.ts.map +1 -0
  118. package/dist/internal/cdn/vercel.js +56 -0
  119. package/dist/internal/cdn/vercel.js.map +1 -0
  120. package/dist/internal/code-unit-order.d.ts +4 -0
  121. package/dist/internal/code-unit-order.d.ts.map +1 -0
  122. package/dist/internal/code-unit-order.js +6 -0
  123. package/dist/internal/code-unit-order.js.map +1 -0
  124. package/dist/internal/codegen.d.ts +3 -0
  125. package/dist/internal/codegen.d.ts.map +1 -1
  126. package/dist/internal/codegen.js +151 -30
  127. package/dist/internal/codegen.js.map +1 -1
  128. package/dist/internal/dev-csp.d.ts +24 -0
  129. package/dist/internal/dev-csp.d.ts.map +1 -0
  130. package/dist/internal/dev-csp.js +160 -0
  131. package/dist/internal/dev-csp.js.map +1 -0
  132. package/dist/internal/dev-reserved.d.ts +25 -0
  133. package/dist/internal/dev-reserved.d.ts.map +1 -0
  134. package/dist/internal/dev-reserved.js +39 -0
  135. package/dist/internal/dev-reserved.js.map +1 -0
  136. package/dist/internal/html-spans.d.ts +10 -0
  137. package/dist/internal/html-spans.d.ts.map +1 -0
  138. package/dist/internal/html-spans.js +46 -0
  139. package/dist/internal/html-spans.js.map +1 -0
  140. package/dist/internal/loading-runtime.d.ts +44 -0
  141. package/dist/internal/loading-runtime.d.ts.map +1 -0
  142. package/dist/internal/loading-runtime.js +206 -0
  143. package/dist/internal/loading-runtime.js.map +1 -0
  144. package/dist/internal/matches-runtime.d.ts +8 -0
  145. package/dist/internal/matches-runtime.d.ts.map +1 -0
  146. package/dist/internal/matches-runtime.js +61 -0
  147. package/dist/internal/matches-runtime.js.map +1 -0
  148. package/dist/internal/mount-shadow.d.ts +36 -0
  149. package/dist/internal/mount-shadow.d.ts.map +1 -0
  150. package/dist/internal/mount-shadow.js +65 -0
  151. package/dist/internal/mount-shadow.js.map +1 -0
  152. package/dist/internal/node-builtins.d.ts +3 -0
  153. package/dist/internal/node-builtins.d.ts.map +1 -0
  154. package/dist/internal/node-builtins.js +79 -0
  155. package/dist/internal/node-builtins.js.map +1 -0
  156. package/dist/internal/output-guard.d.ts +65 -0
  157. package/dist/internal/output-guard.d.ts.map +1 -0
  158. package/dist/internal/output-guard.js +630 -0
  159. package/dist/internal/output-guard.js.map +1 -0
  160. package/dist/internal/page-execution.d.ts +69 -0
  161. package/dist/internal/page-execution.d.ts.map +1 -0
  162. package/dist/internal/page-execution.js +1021 -0
  163. package/dist/internal/page-execution.js.map +1 -0
  164. package/dist/internal/parity.d.ts +21 -0
  165. package/dist/internal/parity.d.ts.map +1 -1
  166. package/dist/internal/parity.js +104 -22
  167. package/dist/internal/parity.js.map +1 -1
  168. package/dist/internal/private-env.d.ts +12 -0
  169. package/dist/internal/private-env.d.ts.map +1 -0
  170. package/dist/internal/private-env.js +335 -0
  171. package/dist/internal/private-env.js.map +1 -0
  172. package/dist/internal/public-url.d.ts +3 -0
  173. package/dist/internal/public-url.d.ts.map +1 -0
  174. package/dist/internal/public-url.js +18 -0
  175. package/dist/internal/public-url.js.map +1 -0
  176. package/dist/internal/render-document.d.ts +37 -21
  177. package/dist/internal/render-document.d.ts.map +1 -1
  178. package/dist/internal/render-document.js +104 -65
  179. package/dist/internal/render-document.js.map +1 -1
  180. package/dist/internal/request-url.d.ts +3 -0
  181. package/dist/internal/request-url.d.ts.map +1 -0
  182. package/dist/internal/request-url.js +14 -0
  183. package/dist/internal/request-url.js.map +1 -0
  184. package/dist/internal/response-controls.d.ts +75 -0
  185. package/dist/internal/response-controls.d.ts.map +1 -0
  186. package/dist/internal/response-controls.js +256 -0
  187. package/dist/internal/response-controls.js.map +1 -0
  188. package/dist/internal/runtime-contract.d.ts +11 -16
  189. package/dist/internal/runtime-contract.d.ts.map +1 -1
  190. package/dist/internal/runtime-contract.js.map +1 -1
  191. package/dist/internal/secret-scan.d.ts +104 -0
  192. package/dist/internal/secret-scan.d.ts.map +1 -0
  193. package/dist/internal/secret-scan.js +485 -0
  194. package/dist/internal/secret-scan.js.map +1 -0
  195. package/dist/internal/server-boundary.d.ts +6 -29
  196. package/dist/internal/server-boundary.d.ts.map +1 -1
  197. package/dist/internal/server-boundary.js +6 -66
  198. package/dist/internal/server-boundary.js.map +1 -1
  199. package/dist/internal/source-map.d.ts +47 -0
  200. package/dist/internal/source-map.d.ts.map +1 -0
  201. package/dist/internal/source-map.js +225 -0
  202. package/dist/internal/source-map.js.map +1 -0
  203. package/dist/internal/target-compat.d.ts +27 -0
  204. package/dist/internal/target-compat.d.ts.map +1 -0
  205. package/dist/internal/target-compat.js +77 -0
  206. package/dist/internal/target-compat.js.map +1 -0
  207. package/dist/internal/timing-safe-equal.d.ts +6 -0
  208. package/dist/internal/timing-safe-equal.d.ts.map +1 -1
  209. package/dist/internal/timing-safe-equal.js +10 -0
  210. package/dist/internal/timing-safe-equal.js.map +1 -1
  211. package/dist/internal/vitals-runtime.d.ts +18 -0
  212. package/dist/internal/vitals-runtime.d.ts.map +1 -0
  213. package/dist/internal/vitals-runtime.js +38 -0
  214. package/dist/internal/vitals-runtime.js.map +1 -0
  215. package/dist/internal/web-app.d.ts +56 -8
  216. package/dist/internal/web-app.d.ts.map +1 -1
  217. package/dist/internal/web-app.js +215 -772
  218. package/dist/internal/web-app.js.map +1 -1
  219. package/dist/internal/zone-graph.d.ts +89 -0
  220. package/dist/internal/zone-graph.d.ts.map +1 -0
  221. package/dist/internal/zone-graph.js +492 -0
  222. package/dist/internal/zone-graph.js.map +1 -0
  223. package/dist/isr.d.ts +83 -6
  224. package/dist/isr.d.ts.map +1 -1
  225. package/dist/isr.js +301 -39
  226. package/dist/isr.js.map +1 -1
  227. package/dist/llms-txt.d.ts +3 -0
  228. package/dist/llms-txt.d.ts.map +1 -1
  229. package/dist/llms-txt.js +37 -9
  230. package/dist/llms-txt.js.map +1 -1
  231. package/dist/manifest.d.ts +221 -14
  232. package/dist/manifest.d.ts.map +1 -1
  233. package/dist/manifest.js +386 -9
  234. package/dist/manifest.js.map +1 -1
  235. package/dist/module-graph.d.ts +26 -5
  236. package/dist/module-graph.d.ts.map +1 -1
  237. package/dist/module-graph.js +17 -7
  238. package/dist/module-graph.js.map +1 -1
  239. package/dist/navigation.d.ts +17 -3
  240. package/dist/navigation.d.ts.map +1 -1
  241. package/dist/navigation.js +11 -5
  242. package/dist/navigation.js.map +1 -1
  243. package/dist/nonce.d.ts +47 -0
  244. package/dist/nonce.d.ts.map +1 -0
  245. package/dist/nonce.js +63 -0
  246. package/dist/nonce.js.map +1 -0
  247. package/dist/plugins/css-modules.d.ts.map +1 -1
  248. package/dist/plugins/css-modules.js +4 -3
  249. package/dist/plugins/css-modules.js.map +1 -1
  250. package/dist/plugins/kit.d.ts +9 -0
  251. package/dist/plugins/kit.d.ts.map +1 -1
  252. package/dist/plugins/kit.js +18 -0
  253. package/dist/plugins/kit.js.map +1 -1
  254. package/dist/plugins/svg.d.ts +22 -3
  255. package/dist/plugins/svg.d.ts.map +1 -1
  256. package/dist/plugins/svg.js +112 -1
  257. package/dist/plugins/svg.js.map +1 -1
  258. package/dist/plugins/vite-leak-guard.d.ts +107 -3
  259. package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
  260. package/dist/plugins/vite-leak-guard.js +378 -17
  261. package/dist/plugins/vite-leak-guard.js.map +1 -1
  262. package/dist/plugins/vite-zone-guard.d.ts +61 -0
  263. package/dist/plugins/vite-zone-guard.d.ts.map +1 -0
  264. package/dist/plugins/vite-zone-guard.js +208 -0
  265. package/dist/plugins/vite-zone-guard.js.map +1 -0
  266. package/dist/plugins/zone-guard.d.ts +27 -0
  267. package/dist/plugins/zone-guard.d.ts.map +1 -0
  268. package/dist/plugins/zone-guard.js +72 -0
  269. package/dist/plugins/zone-guard.js.map +1 -0
  270. package/dist/prerender.d.ts +10 -0
  271. package/dist/prerender.d.ts.map +1 -1
  272. package/dist/prerender.js +35 -3
  273. package/dist/prerender.js.map +1 -1
  274. package/dist/public-dir.d.ts +9 -0
  275. package/dist/public-dir.d.ts.map +1 -1
  276. package/dist/public-dir.js +131 -48
  277. package/dist/public-dir.js.map +1 -1
  278. package/dist/pwa-manifest.d.ts +68 -0
  279. package/dist/pwa-manifest.d.ts.map +1 -0
  280. package/dist/pwa-manifest.js +178 -0
  281. package/dist/pwa-manifest.js.map +1 -0
  282. package/dist/query.js +4 -4
  283. package/dist/query.js.map +1 -1
  284. package/dist/render-seam.d.ts +42 -2
  285. package/dist/render-seam.d.ts.map +1 -1
  286. package/dist/render-seam.js +6 -0
  287. package/dist/render-seam.js.map +1 -1
  288. package/dist/route-manifest.d.ts +3 -0
  289. package/dist/route-manifest.d.ts.map +1 -1
  290. package/dist/route-manifest.js +26 -3
  291. package/dist/route-manifest.js.map +1 -1
  292. package/dist/route-types.d.ts +24 -0
  293. package/dist/route-types.d.ts.map +1 -0
  294. package/dist/route-types.js +195 -0
  295. package/dist/route-types.js.map +1 -0
  296. package/dist/router.d.ts +28 -6
  297. package/dist/router.d.ts.map +1 -1
  298. package/dist/router.js +129 -40
  299. package/dist/router.js.map +1 -1
  300. package/dist/trusted-html.d.ts +34 -0
  301. package/dist/trusted-html.d.ts.map +1 -0
  302. package/dist/trusted-html.js +35 -0
  303. package/dist/trusted-html.js.map +1 -0
  304. package/dist/vitals.d.ts +33 -0
  305. package/dist/vitals.d.ts.map +1 -0
  306. package/dist/vitals.js +16 -0
  307. package/dist/vitals.js.map +1 -0
  308. package/dist/vite.d.ts +16 -1
  309. package/dist/vite.d.ts.map +1 -1
  310. package/dist/vite.js +187 -36
  311. package/dist/vite.js.map +1 -1
  312. package/dist/zones.d.ts +70 -0
  313. package/dist/zones.d.ts.map +1 -0
  314. package/dist/zones.js +365 -0
  315. package/dist/zones.js.map +1 -0
  316. package/package.json +67 -14
  317. package/src/backend-only.ts +16 -0
  318. package/src/boundary.ts +18 -5
  319. package/src/build-plan.ts +113 -36
  320. package/src/build-vite.ts +124 -15
  321. package/src/build.ts +535 -102
  322. package/src/bun-dev-entry.ts +1 -1
  323. package/src/cdn.ts +216 -0
  324. package/src/client.ts +251 -18
  325. package/src/conformance.ts +16 -3
  326. package/src/csp.ts +194 -0
  327. package/src/css-contract.ts +44 -0
  328. package/src/dev-client.ts +349 -0
  329. package/src/dev-diagnostics.ts +60 -7
  330. package/src/dev-error.ts +49 -5
  331. package/src/dev-feed.ts +1140 -0
  332. package/src/dev-indicator.ts +113 -0
  333. package/src/dev-session.ts +729 -0
  334. package/src/dev-sourcemap.ts +281 -0
  335. package/src/dev-ssr-graph.ts +16 -5
  336. package/src/dev.ts +86 -43
  337. package/src/diagnostic-catalog.ts +243 -0
  338. package/src/diagnostic-prompt.ts +355 -0
  339. package/src/diagnostic.ts +63 -66
  340. package/src/draft.ts +4 -1
  341. package/src/fn.ts +19 -3
  342. package/src/fs.ts +13 -2
  343. package/src/index.ts +57 -10
  344. package/src/internal/cdn/cloudflare.ts +146 -0
  345. package/src/internal/cdn/core.ts +316 -0
  346. package/src/internal/cdn/fastly.ts +62 -0
  347. package/src/internal/cdn/vercel.ts +95 -0
  348. package/src/internal/code-unit-order.ts +5 -0
  349. package/src/internal/codegen.ts +180 -29
  350. package/src/internal/dev-csp.ts +176 -0
  351. package/src/internal/dev-reserved.ts +52 -0
  352. package/src/internal/html-spans.ts +50 -0
  353. package/src/internal/loading-runtime.ts +244 -0
  354. package/src/internal/matches-runtime.ts +62 -0
  355. package/src/internal/mount-shadow.ts +88 -0
  356. package/src/internal/node-builtins.ts +79 -0
  357. package/src/internal/output-guard.ts +701 -0
  358. package/src/internal/page-execution.ts +1371 -0
  359. package/src/internal/parity.ts +150 -36
  360. package/src/internal/private-env.ts +334 -0
  361. package/src/internal/public-url.ts +22 -0
  362. package/src/internal/render-document.ts +153 -73
  363. package/src/internal/request-url.ts +14 -0
  364. package/src/internal/response-controls.ts +284 -0
  365. package/src/internal/runtime-contract.ts +10 -15
  366. package/src/internal/secret-scan.ts +623 -0
  367. package/src/internal/server-boundary.ts +6 -69
  368. package/src/internal/source-map.ts +256 -0
  369. package/src/internal/target-compat.ts +92 -0
  370. package/src/internal/timing-safe-equal.ts +13 -0
  371. package/src/internal/vitals-runtime.ts +53 -0
  372. package/src/internal/web-app.ts +290 -879
  373. package/src/internal/zone-graph.ts +593 -0
  374. package/src/isr.ts +366 -39
  375. package/src/llms-txt.ts +44 -8
  376. package/src/manifest.ts +671 -17
  377. package/src/module-graph.ts +53 -9
  378. package/src/navigation.ts +29 -6
  379. package/src/nonce.ts +104 -0
  380. package/src/plugins/css-modules.ts +5 -3
  381. package/src/plugins/kit.ts +24 -0
  382. package/src/plugins/svg.ts +135 -4
  383. package/src/plugins/vite-leak-guard.ts +529 -16
  384. package/src/plugins/vite-zone-guard.ts +263 -0
  385. package/src/plugins/zone-guard.ts +110 -0
  386. package/src/prerender.ts +49 -3
  387. package/src/public-dir.ts +135 -49
  388. package/src/pwa-manifest.ts +226 -0
  389. package/src/query.ts +4 -4
  390. package/src/render-seam.ts +46 -1
  391. package/src/route-manifest.ts +15 -3
  392. package/src/route-types.ts +264 -0
  393. package/src/router.ts +163 -63
  394. package/src/trusted-html.ts +44 -0
  395. package/src/vitals.ts +44 -0
  396. package/src/vite.ts +207 -36
  397. package/src/zones.ts +430 -0
  398. package/dist/plugins/vite-server-only.d.ts +0 -49
  399. package/dist/plugins/vite-server-only.d.ts.map +0 -1
  400. package/dist/plugins/vite-server-only.js +0 -57
  401. package/dist/plugins/vite-server-only.js.map +0 -1
  402. package/dist/server-only.d.ts +0 -21
  403. package/dist/server-only.d.ts.map +0 -1
  404. package/dist/server-only.js +0 -25
  405. package/dist/server-only.js.map +0 -1
  406. package/src/plugins/vite-server-only.ts +0 -75
  407. package/src/server-only.ts +0 -25
package/dist/zones.js ADDED
@@ -0,0 +1,365 @@
1
+ /**
2
+ * `@nifrajs/web/zones` - which side of the app a source file belongs to.
3
+ *
4
+ * One classifier, used by both client builds, both dev servers and `nifra check`, so they cannot
5
+ * disagree about what may reach a browser. It classifies a RESOLVED file by its real path: the
6
+ * bundler has already applied tsconfig `paths`, aliases and package `exports`, and a workspace
7
+ * package linked through `node_modules` resolves to a path outside any `node_modules` directory, so
8
+ * it is first-party and must say which side it is on.
9
+ *
10
+ * Default-deny: a first-party file that no rule places is an error, never "probably fine".
11
+ */
12
+ import { closeSync, existsSync, openSync, readFileSync, readSync, realpathSync } from "node:fs";
13
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
14
+ import { SERVER_FN_MODULE } from "./internal/server-boundary.js";
15
+ const PACKAGE_ENVIRONMENTS = new Set([
16
+ "frontend",
17
+ "backend",
18
+ "shared",
19
+ "library",
20
+ ]);
21
+ /** Zones whose code may ship to a browser. `fn` is listed because its stub is what ships. */
22
+ export const BROWSER_ZONES = new Set([
23
+ "route-frontend",
24
+ "frontend",
25
+ "shared",
26
+ "fn",
27
+ "generated",
28
+ "library",
29
+ ]);
30
+ const SERVER_ZONES = new Set(["route-backend", "backend", "fn"]);
31
+ const FRONTEND_ZONES = new Set(["route-frontend", "frontend"]);
32
+ /**
33
+ * Third-party packages that never belong in a browser bundle: database drivers, ORMs' server
34
+ * entries, mailers and server SDKs. A package reaching a `node:` builtin is caught separately; this
35
+ * list covers the ones that bundle "fine" and leak credentials or query code instead.
36
+ */
37
+ export const SERVER_PACKAGES = [
38
+ "@libsql/client",
39
+ "@neondatabase/serverless",
40
+ "@planetscale/database",
41
+ "@prisma/client",
42
+ "@sendgrid/mail",
43
+ "@vercel/postgres",
44
+ "argon2",
45
+ "bcrypt",
46
+ "bcryptjs",
47
+ "better-sqlite3",
48
+ "drizzle-kit",
49
+ "firebase-admin",
50
+ "ioredis",
51
+ "jsonwebtoken",
52
+ "knex",
53
+ "mongodb",
54
+ "mongoose",
55
+ "mysql",
56
+ "mysql2",
57
+ "nodemailer",
58
+ "pg",
59
+ "pg-pool",
60
+ "postgres",
61
+ "prisma",
62
+ "redis",
63
+ "resend",
64
+ "sequelize",
65
+ "server-only",
66
+ "sqlite3",
67
+ "stripe",
68
+ "twilio",
69
+ "typeorm",
70
+ ];
71
+ /** `drizzle-orm` is a browser-safe query builder until one of its driver entries is imported. */
72
+ const SERVER_SUBPATHS = /^drizzle-orm\/(?:node-postgres|postgres-js|mysql2|better-sqlite3|libsql|bun-sqlite|neon-serverless|neon-http|vercel-postgres|planetscale-serverless|d1|pglite)(?:\/|$)/;
73
+ /** The nifra marker a module imports to refuse the browser outright. */
74
+ export const BACKEND_ONLY_MARKER = "@nifrajs/web/backend-only";
75
+ const SOURCE = "(?:[cm]?[jt]sx?|svelte|vue|mdx)";
76
+ /** A route's backend half: `x.backend.ts`. Script extensions only; JSX belongs to the frontend half. */
77
+ export const ROUTE_BACKEND_FILE = /\.backend\.(?:[cm]?[jt]s)$/;
78
+ const ZONE_SUFFIX = new RegExp(`\\.(frontend|backend|shared|fn)\\.${SOURCE}$`);
79
+ const LEGACY_SERVER_SUFFIX = new RegExp(`\\.server\\.${SOURCE}$`);
80
+ const ZONE_FOLDERS = {
81
+ frontend: "frontend",
82
+ backend: "backend",
83
+ shared: "shared",
84
+ public: "frontend",
85
+ };
86
+ const toPosix = (path) => path.replaceAll("\\", "/");
87
+ // `generateServerManifest`'s first line. The manifest composes both halves of every route, so it
88
+ // imports frontend code from wherever the build wrote it - next to the server entry, often backend/.
89
+ const GENERATED_SERVER_MANIFEST = "// GENERATED by @nifrajs/web generateServerManifest";
90
+ const SERVER_MANIFEST_FILE = /^server-manifest\.[cm]?[jt]s$/;
91
+ function isGeneratedServerManifest(file) {
92
+ let fd;
93
+ try {
94
+ fd = openSync(file, "r");
95
+ const head = Buffer.alloc(GENERATED_SERVER_MANIFEST.length);
96
+ const read = readSync(fd, head, 0, head.length, 0);
97
+ return head.toString("utf8", 0, read) === GENERATED_SERVER_MANIFEST;
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ finally {
103
+ if (fd !== undefined)
104
+ closeSync(fd);
105
+ }
106
+ }
107
+ /** The real path of a file, or the normalized input when it does not exist on disk. */
108
+ function realFile(path) {
109
+ try {
110
+ return toPosix(realpathSync.native(path));
111
+ }
112
+ catch {
113
+ // A path that does not exist yet keeps its directory's real spelling, so it still compares with
114
+ // the paths around it: a Windows short name or a symlinked temp dir spells one directory two ways.
115
+ const parent = dirname(path);
116
+ if (parent === path)
117
+ return toPosix(path);
118
+ const real = realFile(parent);
119
+ return `${real.endsWith("/") ? real : `${real}/`}${basename(path)}`;
120
+ }
121
+ }
122
+ const isInside = (child, parent) => child === parent || child.startsWith(parent.endsWith("/") ? parent : `${parent}/`);
123
+ /** `@scope/name` or `name` from the LAST `node_modules/` segment of a path. */
124
+ function nodeModulesPackage(path) {
125
+ const at = path.lastIndexOf("/node_modules/");
126
+ if (at === -1)
127
+ return undefined;
128
+ const parts = path.slice(at + "/node_modules/".length).split("/");
129
+ const first = parts[0];
130
+ if (first === undefined || first === "")
131
+ return undefined;
132
+ return first.startsWith("@") && parts[1] !== undefined ? `${first}/${parts[1]}` : first;
133
+ }
134
+ /**
135
+ * Create a classifier for one app. Cheap to create; it caches per file and per package directory,
136
+ * so build plugins and dev servers keep one for the life of a build or a session.
137
+ */
138
+ export function createZoneClassifier(options) {
139
+ const appRoot = realFile(resolve(options.appRoot));
140
+ const routesDir = realFile(resolve(options.routesDir ?? join(options.appRoot, "routes")));
141
+ const generated = new Set((options.generatedFiles ?? []).map((file) => realFile(resolve(file))));
142
+ const cache = new Map();
143
+ const packages = new Map();
144
+ /** The nearest `package.json` at or above `dir`, cached by directory. */
145
+ const packageFor = (dir) => {
146
+ const seen = [];
147
+ let current = dir;
148
+ for (;;) {
149
+ const cached = packages.get(current);
150
+ if (cached !== undefined) {
151
+ for (const visited of seen)
152
+ packages.set(visited, cached);
153
+ return cached ?? undefined;
154
+ }
155
+ seen.push(current);
156
+ const manifest = join(current, "package.json");
157
+ if (existsSync(manifest)) {
158
+ let parsed = {};
159
+ try {
160
+ parsed = JSON.parse(readFileSync(manifest, "utf8"));
161
+ }
162
+ catch {
163
+ // An unreadable manifest declares nothing; the caller reports the missing declaration.
164
+ }
165
+ const info = {
166
+ dir: current,
167
+ name: typeof parsed.name === "string" ? parsed.name : undefined,
168
+ environment: typeof parsed.nifra?.environment === "string" ? parsed.nifra.environment : undefined,
169
+ };
170
+ for (const visited of seen)
171
+ packages.set(visited, info);
172
+ return info;
173
+ }
174
+ const parent = toPosix(dirname(current));
175
+ if (parent === current) {
176
+ for (const visited of seen)
177
+ packages.set(visited, null);
178
+ return undefined;
179
+ }
180
+ current = parent;
181
+ }
182
+ };
183
+ const classifyUncached = (file) => {
184
+ if (generated.has(file))
185
+ return { zone: "generated" };
186
+ const thirdParty = nodeModulesPackage(file);
187
+ if (thirdParty !== undefined) {
188
+ const info = packageFor(toPosix(dirname(file)));
189
+ const declared = info?.environment !== undefined && PACKAGE_ENVIRONMENTS.has(info.environment)
190
+ ? info.environment
191
+ : undefined;
192
+ return {
193
+ zone: "library",
194
+ packageName: thirdParty,
195
+ modulePath: file.slice(file.lastIndexOf("/node_modules/") + "/node_modules/".length),
196
+ ...(declared ? { declared } : {}),
197
+ };
198
+ }
199
+ const base = file.slice(file.lastIndexOf("/") + 1);
200
+ if (isInside(file, appRoot)) {
201
+ if (SERVER_MANIFEST_FILE.test(base) && isGeneratedServerManifest(file)) {
202
+ return { zone: "generated" };
203
+ }
204
+ if (LEGACY_SERVER_SUFFIX.test(base)) {
205
+ return {
206
+ zone: "error",
207
+ reason: `"${relativeTo(appRoot, file)}" uses the retired ".server" suffix. Rename it to ".backend" (or move it under backend/); nifra no longer empties .server modules in the browser build`,
208
+ };
209
+ }
210
+ const rel = relativeTo(appRoot, file);
211
+ const top = rel.split("/")[0] ?? "";
212
+ if (top.startsWith(".nifra"))
213
+ return { zone: "generated" };
214
+ const suffix = ZONE_SUFFIX.exec(base)?.[1];
215
+ // Only a script module is replaced by the calls a browser makes; any other ".fn" file would
216
+ // ship to the browser exactly as written.
217
+ if (suffix === "fn" && !SERVER_FN_MODULE.test(base)) {
218
+ return {
219
+ zone: "error",
220
+ reason: `"${rel}" is named as a server function, but only a script module (.ts, .js) can be one - the browser build would ship this file as it is. Rename it`,
221
+ };
222
+ }
223
+ if (isInside(file, routesDir)) {
224
+ if (ROUTE_BACKEND_FILE.test(base))
225
+ return { zone: "route-backend" };
226
+ if (suffix === "fn")
227
+ return { zone: "fn" };
228
+ if (suffix === "backend")
229
+ return { zone: "route-backend" };
230
+ if (suffix === "shared")
231
+ return { zone: "shared" };
232
+ return { zone: "route-frontend" };
233
+ }
234
+ const folder = ZONE_FOLDERS[top];
235
+ if (folder !== undefined) {
236
+ if (suffix === undefined || suffix === folder)
237
+ return { zone: folder };
238
+ if (suffix === "fn" && folder === "backend")
239
+ return { zone: "fn" };
240
+ return {
241
+ zone: "error",
242
+ reason: `"${rel}" sits in ${top}/ but its ".${suffix}" suffix says otherwise. A file belongs to one side: move it, or drop the suffix`,
243
+ };
244
+ }
245
+ if (suffix !== undefined)
246
+ return { zone: suffix === "fn" ? "fn" : suffix };
247
+ return { zone: "error", reason: unzonedReason(rel) };
248
+ }
249
+ // First-party code outside the app: a workspace package, or a relative import out of the app.
250
+ const info = packageFor(toPosix(dirname(file)));
251
+ const environment = info?.environment;
252
+ if (environment !== undefined && PACKAGE_ENVIRONMENTS.has(environment)) {
253
+ return environment === "library"
254
+ ? {
255
+ zone: "library",
256
+ ...(info?.name ? { packageName: info.name } : {}),
257
+ declared: "library",
258
+ }
259
+ : { zone: environment };
260
+ }
261
+ const where = info?.name ?? info?.dir ?? dirname(file);
262
+ return {
263
+ zone: "error",
264
+ reason: `"${file}" is first-party code outside the app (${where}) and declares no side. Add "nifra": { "environment": "frontend" | "backend" | "shared" | "library" } to ${info === undefined ? "its package.json" : `${info.dir}/package.json`}`,
265
+ };
266
+ };
267
+ return {
268
+ appRoot,
269
+ classify(input) {
270
+ const absolute = isAbsolute(input) ? input : resolve(appRoot, input);
271
+ const file = realFile(absolute);
272
+ const cached = cache.get(file);
273
+ if (cached !== undefined)
274
+ return cached;
275
+ const result = classifyUncached(file);
276
+ cache.set(file, result);
277
+ return result;
278
+ },
279
+ };
280
+ }
281
+ function relativeTo(root, file) {
282
+ return toPosix(relative(root, file)).split(sep).join("/");
283
+ }
284
+ const RETIRED_ROOT_FILES = {
285
+ "backend.ts": "backend/app.ts",
286
+ "framework.ts": "backend/framework.ts",
287
+ };
288
+ function unzonedReason(rel) {
289
+ const moved = RETIRED_ROOT_FILES[rel];
290
+ if (moved !== undefined) {
291
+ return `"${rel}" moved: it lives at ${moved} now (run \`nifra migrate layout\`)`;
292
+ }
293
+ return `"${rel}" is in no zone. Every file a build loads lives under routes/, frontend/, backend/ or shared/, or carries a .frontend/.backend/.shared suffix`;
294
+ }
295
+ /** The package name a bare specifier names, or `undefined` for a relative path, a builtin, a
296
+ * subpath import (`#x`) or a bundler-virtual id. */
297
+ export function specifierPackage(specifier) {
298
+ if (/^(?:\.|\/|#|\0|[a-z]+:)/i.test(specifier))
299
+ return undefined;
300
+ if (specifier.startsWith("@") && !/^@[^/]+\/[^/]/.test(specifier))
301
+ return undefined;
302
+ const parts = specifier.split("/");
303
+ return specifier.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
304
+ }
305
+ /**
306
+ * Why a classified file may not ship to a browser, or `undefined` when it may. A `drizzle-orm` driver
307
+ * entry is recognized by the import as written (`specifier`) or by the file's path in the package.
308
+ */
309
+ export function browserDenial(classification, specifier) {
310
+ if (classification.zone === "error")
311
+ return classification.reason;
312
+ if (!BROWSER_ZONES.has(classification.zone)) {
313
+ return classification.zone === "route-backend"
314
+ ? "it is a route's backend half, which runs on the server only"
315
+ : "it is backend code";
316
+ }
317
+ if (classification.zone !== "library")
318
+ return undefined;
319
+ const name = classification.packageName;
320
+ if (classification.declared === "backend")
321
+ return `package "${name}" declares itself backend-only`;
322
+ if (name !== undefined && SERVER_PACKAGES.includes(name)) {
323
+ return `package "${name}" is server code (a driver, server SDK or credential helper)`;
324
+ }
325
+ if (specifier !== undefined && SERVER_SUBPATHS.test(specifier)) {
326
+ return `"${specifier}" is a database driver entry`;
327
+ }
328
+ const driver = classification.modulePath?.match(SERVER_SUBPATHS)?.[0];
329
+ if (driver !== undefined)
330
+ return `"${driver.replace(/\/$/, "")}" is a database driver entry`;
331
+ return undefined;
332
+ }
333
+ /** Whether a module in `from` may import (with a value import) a module in `to`. */
334
+ export function importAllowed(from, to) {
335
+ if (from === "generated" || from === "library")
336
+ return true;
337
+ if (to === "generated" || to === "library")
338
+ return true;
339
+ if (FRONTEND_ZONES.has(from))
340
+ return FRONTEND_ZONES.has(to) || to === "shared" || to === "fn";
341
+ if (SERVER_ZONES.has(from))
342
+ return !FRONTEND_ZONES.has(to);
343
+ // shared
344
+ return to === "shared";
345
+ }
346
+ /** The message for an import {@link importAllowed} refuses. */
347
+ export function importRuleMessage(fromFile, from, toFile, to) {
348
+ const side = (zone) => zone === "route-frontend"
349
+ ? "a route's frontend half"
350
+ : zone === "route-backend"
351
+ ? "a route's backend half"
352
+ : zone === "fn"
353
+ ? "a server-function module"
354
+ : `${zone} code`;
355
+ const hint = from === "shared"
356
+ ? "shared code runs on both sides, so it may import only shared code and third-party packages"
357
+ : SERVER_ZONES.has(from)
358
+ ? "backend code may not import frontend code; move what both need into shared/"
359
+ : "frontend code may not import backend code; reach it through a loader, an action or a *.fn.ts server function";
360
+ return `${fromFile} (${side(from)}) imports ${toFile} (${side(to)}): ${hint}. A type-only import (\`import type\`) is allowed`;
361
+ }
362
+ export { isSensitiveFieldName } from "./internal/output-guard.js";
363
+ export { privateEnvReads, privateEnvReason } from "./internal/private-env.js";
364
+ export { publicScanFiles, scanForSecrets, } from "./internal/secret-scan.js";
365
+ //# sourceMappingURL=zones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zones.js","sourceRoot":"","sources":["../src/zones.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/web",
3
- "version": "3.3.0",
3
+ "version": "4.0.0",
4
4
  "description": "Framework-agnostic SSR core for nifra - the render seam + HTML document orchestration.",
5
5
  "keywords": [
6
6
  "bun",
@@ -20,6 +20,9 @@
20
20
  "streaming-ssr"
21
21
  ],
22
22
  "type": "module",
23
+ "nifra": {
24
+ "environment": "library"
25
+ },
23
26
  "main": "./dist/index.js",
24
27
  "module": "./dist/index.js",
25
28
  "types": "./dist/index.d.ts",
@@ -39,11 +42,31 @@
39
42
  "types": "./dist/client.d.ts",
40
43
  "default": "./dist/client.js"
41
44
  },
45
+ "./vitals": {
46
+ "bun": "./src/vitals.ts",
47
+ "types": "./dist/vitals.d.ts",
48
+ "default": "./dist/vitals.js"
49
+ },
42
50
  "./diagnostic": {
43
51
  "bun": "./src/diagnostic.ts",
44
52
  "types": "./dist/diagnostic.d.ts",
45
53
  "default": "./dist/diagnostic.js"
46
54
  },
55
+ "./cdn": {
56
+ "bun": "./src/cdn.ts",
57
+ "types": "./dist/cdn.d.ts",
58
+ "default": "./dist/cdn.js"
59
+ },
60
+ "./diagnostic-prompt": {
61
+ "bun": "./src/diagnostic-prompt.ts",
62
+ "types": "./dist/diagnostic-prompt.d.ts",
63
+ "default": "./dist/diagnostic-prompt.js"
64
+ },
65
+ "./dev-feed": {
66
+ "bun": "./src/dev-feed.ts",
67
+ "types": "./dist/dev-feed.d.ts",
68
+ "default": "./dist/dev-feed.js"
69
+ },
47
70
  "./forms": {
48
71
  "bun": "./src/forms.ts",
49
72
  "types": "./dist/forms.d.ts",
@@ -69,10 +92,25 @@
69
92
  "types": "./dist/service-worker.d.ts",
70
93
  "default": "./dist/service-worker.js"
71
94
  },
72
- "./server-only": {
73
- "bun": "./src/server-only.ts",
74
- "types": "./dist/server-only.d.ts",
75
- "default": "./dist/server-only.js"
95
+ "./pwa-manifest": {
96
+ "bun": "./src/pwa-manifest.ts",
97
+ "types": "./dist/pwa-manifest.d.ts",
98
+ "default": "./dist/pwa-manifest.js"
99
+ },
100
+ "./zones": {
101
+ "bun": "./src/zones.ts",
102
+ "types": "./dist/zones.d.ts",
103
+ "default": "./dist/zones.js"
104
+ },
105
+ "./route-types": {
106
+ "bun": "./src/route-types.ts",
107
+ "types": "./dist/route-types.d.ts",
108
+ "default": "./dist/route-types.js"
109
+ },
110
+ "./backend-only": {
111
+ "bun": "./src/backend-only.ts",
112
+ "types": "./dist/backend-only.d.ts",
113
+ "default": "./dist/backend-only.js"
76
114
  },
77
115
  "./build": {
78
116
  "bun": "./src/build.ts",
@@ -155,16 +193,16 @@
155
193
  "types": "./dist/plugins/vite-server-fn.d.ts",
156
194
  "default": "./dist/plugins/vite-server-fn.js"
157
195
  },
158
- "./plugins/vite-server-only": {
159
- "bun": "./src/plugins/vite-server-only.ts",
160
- "types": "./dist/plugins/vite-server-only.d.ts",
161
- "default": "./dist/plugins/vite-server-only.js"
162
- },
163
196
  "./fn-state": {
164
197
  "bun": "./src/fn-state.ts",
165
198
  "types": "./dist/fn-state.d.ts",
166
199
  "default": "./dist/fn-state.js"
167
200
  },
201
+ "./internal/dev-reserved": {
202
+ "bun": "./src/internal/dev-reserved.ts",
203
+ "types": "./dist/internal/dev-reserved.d.ts",
204
+ "default": "./dist/internal/dev-reserved.js"
205
+ },
168
206
  "./internal/parity": {
169
207
  "bun": "./src/internal/parity.ts",
170
208
  "types": "./dist/internal/parity.d.ts",
@@ -179,6 +217,16 @@
179
217
  "bun": "./src/internal/fetcher-runtime.ts",
180
218
  "types": "./dist/internal/fetcher-runtime.d.ts",
181
219
  "default": "./dist/internal/fetcher-runtime.js"
220
+ },
221
+ "./internal/loading-runtime": {
222
+ "bun": "./src/internal/loading-runtime.ts",
223
+ "types": "./dist/internal/loading-runtime.d.ts",
224
+ "default": "./dist/internal/loading-runtime.js"
225
+ },
226
+ "./internal/matches-runtime": {
227
+ "bun": "./src/internal/matches-runtime.ts",
228
+ "types": "./dist/internal/matches-runtime.d.ts",
229
+ "default": "./dist/internal/matches-runtime.js"
182
230
  }
183
231
  },
184
232
  "files": [
@@ -196,8 +244,8 @@
196
244
  "access": "public"
197
245
  },
198
246
  "dependencies": {
199
- "@nifrajs/core": "3.3.0",
200
- "@nifrajs/island-trigger": "3.3.0"
247
+ "@nifrajs/core": "4.0.0",
248
+ "@nifrajs/island-trigger": "4.0.0"
201
249
  },
202
250
  "peerDependencies": {
203
251
  "@babel/core": "^7.26.0",
@@ -206,7 +254,8 @@
206
254
  "@babel/plugin-syntax-typescript": "^7.25.9",
207
255
  "@stylexjs/babel-plugin": "^0.19.0",
208
256
  "sass": "^1.0.0",
209
- "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
257
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
258
+ "web-vitals": "^6.0.0"
210
259
  },
211
260
  "peerDependenciesMeta": {
212
261
  "@babel/core": {
@@ -229,6 +278,9 @@
229
278
  },
230
279
  "vite": {
231
280
  "optional": true
281
+ },
282
+ "web-vitals": {
283
+ "optional": true
232
284
  }
233
285
  },
234
286
  "devDependencies": {
@@ -243,7 +295,8 @@
243
295
  "@stylexjs/babel-plugin": "^0.19.0",
244
296
  "@stylexjs/stylex": "^0.19.0",
245
297
  "sass": "^1.77.0",
246
- "vite": "^8.2.1"
298
+ "vite": "^8.2.1",
299
+ "web-vitals": "^6.2.2"
247
300
  },
248
301
  "repository": {
249
302
  "type": "git",
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `@nifrajs/web/backend-only` - the poison-import marker (Next's `import "server-only"`). A module that
3
+ * must never reach a browser can say so with a side-effect import at its top:
4
+ *
5
+ * import "@nifrajs/web/backend-only"
6
+ *
7
+ * Every browser build and dev server refuses a module graph that reaches this specifier, naming the
8
+ * import chain. The zone rules already keep `backend/` and `*.backend.ts` out of the browser; the
9
+ * marker is for a module that must stay server-side wherever it is imported from, such as one inside
10
+ * a shared workspace package. On the server it is an empty module, so the marked file runs untouched.
11
+ *
12
+ * Pair it with the type-level {@link BackendOnly} brand (from `@nifrajs/web`) on the module's exports.
13
+ */
14
+
15
+ // Intentionally empty: the marker is the import itself.
16
+ export {}
package/src/boundary.ts CHANGED
@@ -18,6 +18,8 @@ export interface BoundaryRequestCtx {
18
18
  /** Build-safe inputs available to a static boundary. It intentionally has no request/session/params API. */
19
19
  export interface StaticCtx {
20
20
  readonly phase: "build"
21
+ /** The deployment's origin, when the caller resolving static boundaries knows it. A request never
22
+ * supplies it: the value is cached for every visitor, and a Host header is the client's to choose. */
21
23
  readonly origin?: string
22
24
  }
23
25
 
@@ -127,17 +129,23 @@ export interface DynamicBoundaryBatch {
127
129
  export interface StaticBoundaryCache {
128
130
  get(boundary: BoundaryRegistration): Promise<unknown> | undefined
129
131
  set(boundary: BoundaryRegistration, value: Promise<unknown>): void
132
+ /** Drop a value whose load failed, so the next request retries it. */
133
+ delete?(boundary: BoundaryRegistration): void
130
134
  }
131
135
 
132
136
  export class MemoryStaticBoundaryCache implements StaticBoundaryCache {
133
- readonly #values = new WeakMap<object, Promise<unknown>>()
137
+ readonly #values = new WeakMap<BoundaryRegistration, Promise<unknown>>()
134
138
 
135
139
  get(boundary: BoundaryRegistration): Promise<unknown> | undefined {
136
- return this.#values.get(boundary as object)
140
+ return this.#values.get(boundary)
137
141
  }
138
142
 
139
143
  set(boundary: BoundaryRegistration, value: Promise<unknown>): void {
140
- this.#values.set(boundary as object, value)
144
+ this.#values.set(boundary, value)
145
+ }
146
+
147
+ delete(boundary: BoundaryRegistration): void {
148
+ this.#values.delete(boundary)
141
149
  }
142
150
  }
143
151
 
@@ -373,8 +381,13 @@ export async function resolveStaticBoundaries(
373
381
  }
374
382
  let value = cache.get(boundary)
375
383
  if (value === undefined) {
376
- value = Promise.resolve().then(() => boundary.load?.(context))
377
- cache.set(boundary, value)
384
+ const loading = Promise.resolve().then(() => boundary.load?.(context))
385
+ cache.set(boundary, loading)
386
+ // A failed load is not the boundary's value: the next request loads it again.
387
+ loading.catch(() => {
388
+ if (cache.get(boundary) === loading) cache.delete?.(boundary)
389
+ })
390
+ value = loading
378
391
  }
379
392
  try {
380
393
  const data = await value