@nifrajs/web 4.0.2 → 5.1.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 (426) hide show
  1. package/README.md +19 -0
  2. package/dist/build-vite.d.ts +19 -0
  3. package/dist/build-vite.d.ts.map +1 -1
  4. package/dist/build-vite.js +31 -10
  5. package/dist/build-vite.js.map +1 -1
  6. package/dist/build.d.ts +8 -10
  7. package/dist/build.d.ts.map +1 -1
  8. package/dist/build.js +90 -31
  9. package/dist/build.js.map +1 -1
  10. package/dist/cdn.d.ts +8 -0
  11. package/dist/cdn.d.ts.map +1 -1
  12. package/dist/cdn.js +14 -15
  13. package/dist/cdn.js.map +1 -1
  14. package/dist/client.d.ts +6 -6
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +46 -18
  17. package/dist/client.js.map +1 -1
  18. package/dist/deferred.d.ts +2 -2
  19. package/dist/deferred.d.ts.map +1 -1
  20. package/dist/deferred.js +28 -7
  21. package/dist/deferred.js.map +1 -1
  22. package/dist/dev-feed.d.ts.map +1 -1
  23. package/dist/dev-feed.js +24 -5
  24. package/dist/dev-feed.js.map +1 -1
  25. package/dist/dev-port.d.ts +3 -2
  26. package/dist/dev-port.d.ts.map +1 -1
  27. package/dist/dev-port.js +2 -6
  28. package/dist/dev-port.js.map +1 -1
  29. package/dist/dev-session.d.ts.map +1 -1
  30. package/dist/dev-session.js +4 -14
  31. package/dist/dev-session.js.map +1 -1
  32. package/dist/dev.d.ts +7 -17
  33. package/dist/dev.d.ts.map +1 -1
  34. package/dist/dev.js +13 -1
  35. package/dist/dev.js.map +1 -1
  36. package/dist/draft.d.ts +8 -5
  37. package/dist/draft.d.ts.map +1 -1
  38. package/dist/draft.js +30 -13
  39. package/dist/draft.js.map +1 -1
  40. package/dist/fonts-google.d.ts.map +1 -1
  41. package/dist/fonts-google.js +7 -0
  42. package/dist/fonts-google.js.map +1 -1
  43. package/dist/index.d.ts +5 -4
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -3
  46. package/dist/index.js.map +1 -1
  47. package/dist/internal/codegen.d.ts +1 -0
  48. package/dist/internal/codegen.d.ts.map +1 -1
  49. package/dist/internal/codegen.js +56 -29
  50. package/dist/internal/codegen.js.map +1 -1
  51. package/dist/internal/disposable-dir.d.ts +8 -0
  52. package/dist/internal/disposable-dir.d.ts.map +1 -0
  53. package/dist/internal/disposable-dir.js +25 -0
  54. package/dist/internal/disposable-dir.js.map +1 -0
  55. package/dist/internal/entry-chunks.d.ts +9 -0
  56. package/dist/internal/entry-chunks.d.ts.map +1 -0
  57. package/dist/internal/entry-chunks.js +15 -0
  58. package/dist/internal/entry-chunks.js.map +1 -0
  59. package/dist/internal/evidence-traversal.d.ts +12 -0
  60. package/dist/internal/evidence-traversal.d.ts.map +1 -0
  61. package/dist/internal/evidence-traversal.js +48 -0
  62. package/dist/internal/evidence-traversal.js.map +1 -0
  63. package/dist/internal/head-merge.d.ts +6 -0
  64. package/dist/internal/head-merge.d.ts.map +1 -1
  65. package/dist/internal/head-merge.js +9 -0
  66. package/dist/internal/head-merge.js.map +1 -1
  67. package/dist/internal/js-string.d.ts +2 -0
  68. package/dist/internal/js-string.d.ts.map +1 -1
  69. package/dist/internal/js-string.js +5 -1
  70. package/dist/internal/js-string.js.map +1 -1
  71. package/dist/internal/mount-shadow.js +1 -1
  72. package/dist/internal/mount-shadow.js.map +1 -1
  73. package/dist/internal/output-guard.d.ts +7 -0
  74. package/dist/internal/output-guard.d.ts.map +1 -1
  75. package/dist/internal/output-guard.js +80 -8
  76. package/dist/internal/output-guard.js.map +1 -1
  77. package/dist/internal/package-entries.d.ts +34 -0
  78. package/dist/internal/package-entries.d.ts.map +1 -0
  79. package/dist/internal/package-entries.js +324 -0
  80. package/dist/internal/package-entries.js.map +1 -0
  81. package/dist/internal/page-execution.d.ts +6 -0
  82. package/dist/internal/page-execution.d.ts.map +1 -1
  83. package/dist/internal/page-execution.js +437 -114
  84. package/dist/internal/page-execution.js.map +1 -1
  85. package/dist/internal/parity.d.ts.map +1 -1
  86. package/dist/internal/parity.js +15 -2
  87. package/dist/internal/parity.js.map +1 -1
  88. package/dist/internal/private-env.d.ts +8 -0
  89. package/dist/internal/private-env.d.ts.map +1 -1
  90. package/dist/internal/private-env.js +25 -10
  91. package/dist/internal/private-env.js.map +1 -1
  92. package/dist/internal/progressive-cookies.d.ts +14 -0
  93. package/dist/internal/progressive-cookies.d.ts.map +1 -0
  94. package/dist/internal/progressive-cookies.js +43 -0
  95. package/dist/internal/progressive-cookies.js.map +1 -0
  96. package/dist/internal/public-env.d.ts +2 -0
  97. package/dist/internal/public-env.d.ts.map +1 -0
  98. package/dist/internal/public-env.js +13 -0
  99. package/dist/internal/public-env.js.map +1 -0
  100. package/dist/internal/render-document.d.ts +5 -44
  101. package/dist/internal/render-document.d.ts.map +1 -1
  102. package/dist/internal/render-document.js +51 -63
  103. package/dist/internal/render-document.js.map +1 -1
  104. package/dist/internal/response-controls.d.ts +2 -0
  105. package/dist/internal/response-controls.d.ts.map +1 -1
  106. package/dist/internal/response-controls.js +26 -16
  107. package/dist/internal/response-controls.js.map +1 -1
  108. package/dist/internal/revive-dates.d.ts +16 -0
  109. package/dist/internal/revive-dates.d.ts.map +1 -0
  110. package/dist/internal/revive-dates.js +32 -0
  111. package/dist/internal/revive-dates.js.map +1 -0
  112. package/dist/internal/route-path.d.ts +14 -0
  113. package/dist/internal/route-path.d.ts.map +1 -0
  114. package/dist/internal/route-path.js +19 -0
  115. package/dist/internal/route-path.js.map +1 -0
  116. package/dist/internal/secret-scan.d.ts.map +1 -1
  117. package/dist/internal/secret-scan.js +190 -20
  118. package/dist/internal/secret-scan.js.map +1 -1
  119. package/dist/internal/server-boundary.d.ts.map +1 -1
  120. package/dist/internal/server-boundary.js +33 -5
  121. package/dist/internal/server-boundary.js.map +1 -1
  122. package/dist/internal/web-app.d.ts +25 -18
  123. package/dist/internal/web-app.d.ts.map +1 -1
  124. package/dist/internal/web-app.js +81 -24
  125. package/dist/internal/web-app.js.map +1 -1
  126. package/dist/internal/wire-date.d.ts +3 -0
  127. package/dist/internal/wire-date.d.ts.map +1 -0
  128. package/dist/internal/wire-date.js +14 -0
  129. package/dist/internal/wire-date.js.map +1 -0
  130. package/dist/internal/without-query.d.ts +4 -0
  131. package/dist/internal/without-query.d.ts.map +1 -0
  132. package/dist/internal/without-query.js +9 -0
  133. package/dist/internal/without-query.js.map +1 -0
  134. package/dist/internal/zone-graph.d.ts +4 -0
  135. package/dist/internal/zone-graph.d.ts.map +1 -1
  136. package/dist/internal/zone-graph.js +71 -20
  137. package/dist/internal/zone-graph.js.map +1 -1
  138. package/dist/isr.d.ts +59 -3
  139. package/dist/isr.d.ts.map +1 -1
  140. package/dist/isr.js +311 -41
  141. package/dist/isr.js.map +1 -1
  142. package/dist/llms-txt.d.ts +2 -0
  143. package/dist/llms-txt.d.ts.map +1 -1
  144. package/dist/llms-txt.js +29 -3
  145. package/dist/llms-txt.js.map +1 -1
  146. package/dist/manifest.d.ts +37 -4
  147. package/dist/manifest.d.ts.map +1 -1
  148. package/dist/manifest.js +4 -0
  149. package/dist/manifest.js.map +1 -1
  150. package/dist/open-resolved.d.ts +18 -0
  151. package/dist/open-resolved.d.ts.map +1 -0
  152. package/dist/open-resolved.js +62 -0
  153. package/dist/open-resolved.js.map +1 -0
  154. package/dist/plugins/kit.d.ts +1 -0
  155. package/dist/plugins/kit.d.ts.map +1 -1
  156. package/dist/plugins/kit.js +26 -11
  157. package/dist/plugins/kit.js.map +1 -1
  158. package/dist/plugins/vite-leak-guard.d.ts +9 -1
  159. package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
  160. package/dist/plugins/vite-leak-guard.js +84 -7
  161. package/dist/plugins/vite-leak-guard.js.map +1 -1
  162. package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
  163. package/dist/plugins/vite-zone-guard.js +17 -21
  164. package/dist/plugins/vite-zone-guard.js.map +1 -1
  165. package/dist/plugins/zone-guard.d.ts.map +1 -1
  166. package/dist/plugins/zone-guard.js +44 -3
  167. package/dist/plugins/zone-guard.js.map +1 -1
  168. package/dist/prerender.d.ts +5 -1
  169. package/dist/prerender.d.ts.map +1 -1
  170. package/dist/prerender.js +41 -19
  171. package/dist/prerender.js.map +1 -1
  172. package/dist/public-dir.d.ts +8 -1
  173. package/dist/public-dir.d.ts.map +1 -1
  174. package/dist/public-dir.js +17 -6
  175. package/dist/public-dir.js.map +1 -1
  176. package/dist/query.d.ts +13 -4
  177. package/dist/query.d.ts.map +1 -1
  178. package/dist/query.js +89 -26
  179. package/dist/query.js.map +1 -1
  180. package/dist/render-seam.d.ts +25 -2
  181. package/dist/render-seam.d.ts.map +1 -1
  182. package/dist/render-seam.js +1 -0
  183. package/dist/render-seam.js.map +1 -1
  184. package/dist/route-types.d.ts.map +1 -1
  185. package/dist/route-types.js +20 -9
  186. package/dist/route-types.js.map +1 -1
  187. package/dist/router.d.ts +9 -2
  188. package/dist/router.d.ts.map +1 -1
  189. package/dist/router.js +47 -50
  190. package/dist/router.js.map +1 -1
  191. package/dist/seo.d.ts +49 -0
  192. package/dist/seo.d.ts.map +1 -0
  193. package/dist/seo.js +48 -0
  194. package/dist/seo.js.map +1 -0
  195. package/dist/server-components/build-info.d.ts +3 -0
  196. package/dist/server-components/build-info.d.ts.map +1 -0
  197. package/dist/server-components/build-info.js +7 -0
  198. package/dist/server-components/build-info.js.map +1 -0
  199. package/dist/server-components/build-target.d.ts +12 -0
  200. package/dist/server-components/build-target.d.ts.map +1 -0
  201. package/dist/server-components/build-target.js +153 -0
  202. package/dist/server-components/build-target.js.map +1 -0
  203. package/dist/server-components/build.d.ts +24 -0
  204. package/dist/server-components/build.d.ts.map +1 -0
  205. package/dist/server-components/build.js +366 -0
  206. package/dist/server-components/build.js.map +1 -0
  207. package/dist/server-components/bundle-proof.d.ts +3 -0
  208. package/dist/server-components/bundle-proof.d.ts.map +1 -0
  209. package/dist/server-components/bundle-proof.js +23 -0
  210. package/dist/server-components/bundle-proof.js.map +1 -0
  211. package/dist/server-components/client.d.ts +46 -0
  212. package/dist/server-components/client.d.ts.map +1 -0
  213. package/dist/server-components/client.js +594 -0
  214. package/dist/server-components/client.js.map +1 -0
  215. package/dist/server-components/definition.d.ts +11 -0
  216. package/dist/server-components/definition.d.ts.map +1 -0
  217. package/dist/server-components/definition.js +94 -0
  218. package/dist/server-components/definition.js.map +1 -0
  219. package/dist/server-components/dev-http.d.ts +5 -0
  220. package/dist/server-components/dev-http.d.ts.map +1 -0
  221. package/dist/server-components/dev-http.js +71 -0
  222. package/dist/server-components/dev-http.js.map +1 -0
  223. package/dist/server-components/error.d.ts +9 -0
  224. package/dist/server-components/error.d.ts.map +1 -0
  225. package/dist/server-components/error.js +24 -0
  226. package/dist/server-components/error.js.map +1 -0
  227. package/dist/server-components/frames.d.ts +7 -0
  228. package/dist/server-components/frames.d.ts.map +1 -0
  229. package/dist/server-components/frames.js +169 -0
  230. package/dist/server-components/frames.js.map +1 -0
  231. package/dist/server-components/html-policy.d.ts +6 -0
  232. package/dist/server-components/html-policy.d.ts.map +1 -0
  233. package/dist/server-components/html-policy.js +75 -0
  234. package/dist/server-components/html-policy.js.map +1 -0
  235. package/dist/server-components/html.d.ts +4 -0
  236. package/dist/server-components/html.d.ts.map +1 -0
  237. package/dist/server-components/html.js +67 -0
  238. package/dist/server-components/html.js.map +1 -0
  239. package/dist/server-components/islands.d.ts +44 -0
  240. package/dist/server-components/islands.d.ts.map +1 -0
  241. package/dist/server-components/islands.js +42 -0
  242. package/dist/server-components/islands.js.map +1 -0
  243. package/dist/server-components/native.d.ts +4 -0
  244. package/dist/server-components/native.d.ts.map +1 -0
  245. package/dist/server-components/native.js +81 -0
  246. package/dist/server-components/native.js.map +1 -0
  247. package/dist/server-components/portal.d.ts +6 -0
  248. package/dist/server-components/portal.d.ts.map +1 -0
  249. package/dist/server-components/portal.js +35 -0
  250. package/dist/server-components/portal.js.map +1 -0
  251. package/dist/server-components/props.d.ts +3 -0
  252. package/dist/server-components/props.d.ts.map +1 -0
  253. package/dist/server-components/props.js +14 -0
  254. package/dist/server-components/props.js.map +1 -0
  255. package/dist/server-components/protocol.d.ts +44 -0
  256. package/dist/server-components/protocol.d.ts.map +1 -0
  257. package/dist/server-components/protocol.js +139 -0
  258. package/dist/server-components/protocol.js.map +1 -0
  259. package/dist/server-components/range.d.ts +24 -0
  260. package/dist/server-components/range.d.ts.map +1 -0
  261. package/dist/server-components/range.js +263 -0
  262. package/dist/server-components/range.js.map +1 -0
  263. package/dist/server-components/registry.d.ts +6 -0
  264. package/dist/server-components/registry.d.ts.map +1 -0
  265. package/dist/server-components/registry.js +30 -0
  266. package/dist/server-components/registry.js.map +1 -0
  267. package/dist/server-components/response.d.ts +4 -0
  268. package/dist/server-components/response.d.ts.map +1 -0
  269. package/dist/server-components/response.js +32 -0
  270. package/dist/server-components/response.js.map +1 -0
  271. package/dist/server-components/router-integration.d.ts +9 -0
  272. package/dist/server-components/router-integration.d.ts.map +1 -0
  273. package/dist/server-components/router-integration.js +29 -0
  274. package/dist/server-components/router-integration.js.map +1 -0
  275. package/dist/server-components/runtime.d.ts +14 -0
  276. package/dist/server-components/runtime.d.ts.map +1 -0
  277. package/dist/server-components/runtime.js +276 -0
  278. package/dist/server-components/runtime.js.map +1 -0
  279. package/dist/server-components/scheduler.d.ts +14 -0
  280. package/dist/server-components/scheduler.d.ts.map +1 -0
  281. package/dist/server-components/scheduler.js +74 -0
  282. package/dist/server-components/scheduler.js.map +1 -0
  283. package/dist/server-components/schema.d.ts +4 -0
  284. package/dist/server-components/schema.d.ts.map +1 -0
  285. package/dist/server-components/schema.js +77 -0
  286. package/dist/server-components/schema.js.map +1 -0
  287. package/dist/server-components/server-entry.d.ts +12 -0
  288. package/dist/server-components/server-entry.d.ts.map +1 -0
  289. package/dist/server-components/server-entry.js +90 -0
  290. package/dist/server-components/server-entry.js.map +1 -0
  291. package/dist/server-components/source.d.ts +15 -0
  292. package/dist/server-components/source.d.ts.map +1 -0
  293. package/dist/server-components/source.js +269 -0
  294. package/dist/server-components/source.js.map +1 -0
  295. package/dist/server-components/state.d.ts +4 -0
  296. package/dist/server-components/state.d.ts.map +1 -0
  297. package/dist/server-components/state.js +123 -0
  298. package/dist/server-components/state.js.map +1 -0
  299. package/dist/server-components/stream.d.ts +6 -0
  300. package/dist/server-components/stream.d.ts.map +1 -0
  301. package/dist/server-components/stream.js +70 -0
  302. package/dist/server-components/stream.js.map +1 -0
  303. package/dist/server-components/trusted-html.d.ts +3 -0
  304. package/dist/server-components/trusted-html.d.ts.map +1 -0
  305. package/dist/server-components/trusted-html.js +14 -0
  306. package/dist/server-components/trusted-html.js.map +1 -0
  307. package/dist/server-components/types.d.ts +107 -0
  308. package/dist/server-components/types.d.ts.map +1 -0
  309. package/dist/server-components/types.js +2 -0
  310. package/dist/server-components/types.js.map +1 -0
  311. package/dist/server-components/typescript.d.ts +11 -0
  312. package/dist/server-components/typescript.d.ts.map +1 -0
  313. package/dist/server-components/typescript.js +28 -0
  314. package/dist/server-components/typescript.js.map +1 -0
  315. package/dist/server-components/value.d.ts +5 -0
  316. package/dist/server-components/value.d.ts.map +1 -0
  317. package/dist/server-components/value.js +77 -0
  318. package/dist/server-components/value.js.map +1 -0
  319. package/dist/server-components/vite.d.ts +12 -0
  320. package/dist/server-components/vite.d.ts.map +1 -0
  321. package/dist/server-components/vite.js +197 -0
  322. package/dist/server-components/vite.js.map +1 -0
  323. package/dist/server-components.d.ts +5 -0
  324. package/dist/server-components.d.ts.map +1 -0
  325. package/dist/server-components.js +4 -0
  326. package/dist/server-components.js.map +1 -0
  327. package/dist/service-worker.d.ts +8 -1
  328. package/dist/service-worker.d.ts.map +1 -1
  329. package/dist/service-worker.js +20 -6
  330. package/dist/service-worker.js.map +1 -1
  331. package/dist/vite.d.ts +12 -0
  332. package/dist/vite.d.ts.map +1 -1
  333. package/dist/vite.js +7 -1
  334. package/dist/vite.js.map +1 -1
  335. package/dist/zones.d.ts +64 -2
  336. package/dist/zones.d.ts.map +1 -1
  337. package/dist/zones.js +331 -28
  338. package/dist/zones.js.map +1 -1
  339. package/package.json +102 -4
  340. package/src/build-vite.ts +31 -9
  341. package/src/build.ts +109 -31
  342. package/src/cdn.ts +18 -12
  343. package/src/client.ts +48 -17
  344. package/src/deferred.ts +27 -9
  345. package/src/dev-feed.ts +24 -5
  346. package/src/dev-port.ts +4 -10
  347. package/src/dev-session.ts +4 -13
  348. package/src/dev.ts +29 -1
  349. package/src/draft.ts +35 -14
  350. package/src/fonts-google.ts +10 -0
  351. package/src/index.ts +5 -6
  352. package/src/internal/codegen.ts +60 -29
  353. package/src/internal/disposable-dir.ts +24 -0
  354. package/src/internal/entry-chunks.ts +18 -0
  355. package/src/internal/evidence-traversal.ts +57 -0
  356. package/src/internal/head-merge.ts +16 -0
  357. package/src/internal/js-string.ts +6 -1
  358. package/src/internal/mount-shadow.ts +1 -1
  359. package/src/internal/output-guard.ts +88 -7
  360. package/src/internal/package-entries.ts +331 -0
  361. package/src/internal/page-execution.ts +573 -114
  362. package/src/internal/parity.ts +15 -2
  363. package/src/internal/private-env.ts +27 -13
  364. package/src/internal/progressive-cookies.ts +60 -0
  365. package/src/internal/public-env.ts +14 -0
  366. package/src/internal/render-document.ts +66 -89
  367. package/src/internal/response-controls.ts +31 -14
  368. package/src/internal/revive-dates.ts +35 -0
  369. package/src/internal/route-path.ts +24 -0
  370. package/src/internal/secret-scan.ts +190 -18
  371. package/src/internal/server-boundary.ts +29 -5
  372. package/src/internal/web-app.ts +126 -42
  373. package/src/internal/wire-date.ts +16 -0
  374. package/src/internal/without-query.ts +8 -0
  375. package/src/internal/zone-graph.ts +78 -25
  376. package/src/isr.ts +364 -45
  377. package/src/llms-txt.ts +32 -3
  378. package/src/manifest.ts +38 -4
  379. package/src/open-resolved.ts +64 -0
  380. package/src/plugins/kit.ts +31 -11
  381. package/src/plugins/vite-leak-guard.ts +104 -8
  382. package/src/plugins/vite-zone-guard.ts +21 -19
  383. package/src/plugins/zone-guard.ts +41 -2
  384. package/src/prerender.ts +39 -18
  385. package/src/public-dir.ts +27 -8
  386. package/src/query.ts +107 -26
  387. package/src/render-seam.ts +30 -2
  388. package/src/route-types.ts +34 -7
  389. package/src/router.ts +66 -59
  390. package/src/seo.ts +68 -0
  391. package/src/server-components/build-info.ts +11 -0
  392. package/src/server-components/build-target.ts +194 -0
  393. package/src/server-components/build.ts +419 -0
  394. package/src/server-components/bundle-proof.ts +33 -0
  395. package/src/server-components/client.ts +663 -0
  396. package/src/server-components/definition.ts +125 -0
  397. package/src/server-components/dev-http.ts +75 -0
  398. package/src/server-components/error.ts +24 -0
  399. package/src/server-components/frames.ts +181 -0
  400. package/src/server-components/html-policy.ts +94 -0
  401. package/src/server-components/html.ts +81 -0
  402. package/src/server-components/islands.ts +111 -0
  403. package/src/server-components/native.ts +101 -0
  404. package/src/server-components/portal.ts +42 -0
  405. package/src/server-components/props.ts +19 -0
  406. package/src/server-components/protocol.ts +167 -0
  407. package/src/server-components/range.ts +313 -0
  408. package/src/server-components/registry.ts +34 -0
  409. package/src/server-components/response.ts +44 -0
  410. package/src/server-components/router-integration.ts +40 -0
  411. package/src/server-components/runtime.ts +376 -0
  412. package/src/server-components/scheduler.ts +84 -0
  413. package/src/server-components/schema.ts +69 -0
  414. package/src/server-components/server-entry.ts +98 -0
  415. package/src/server-components/source.ts +324 -0
  416. package/src/server-components/state.ts +143 -0
  417. package/src/server-components/stream.ts +71 -0
  418. package/src/server-components/trusted-html.ts +21 -0
  419. package/src/server-components/types.ts +138 -0
  420. package/src/server-components/typescript.ts +39 -0
  421. package/src/server-components/value.ts +82 -0
  422. package/src/server-components/vite.ts +242 -0
  423. package/src/server-components.ts +32 -0
  424. package/src/service-worker.ts +24 -7
  425. package/src/vite.ts +8 -1
  426. package/src/zones.ts +418 -32
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `t.date()` across the wire, server half. JSON has no dates, so the output guard hands the page a
3
+ * `wireDate()`: a real `Date` for the server render that serializes as `{ "__nifra_date": iso }`. The
4
+ * browser half (`revive-dates.ts`) rebuilds those tags, so both renders see the same value.
5
+ */
6
+ import { DATE_TAG } from "./revive-dates.ts"
7
+
8
+ const WIRE_JSON: PropertyDescriptor = {
9
+ value(this: Date): Readonly<Record<string, string>> {
10
+ return { [DATE_TAG]: this.toISOString() }
11
+ },
12
+ }
13
+
14
+ /** A `Date` that crosses JSON tagged, so the browser can tell it from a string that looks like one. */
15
+ export const wireDate = (time: number): Date =>
16
+ Object.defineProperty(new Date(time), "toJSON", WIRE_JSON)
@@ -0,0 +1,8 @@
1
+ /** A module id or specifier up to its first `?` or `#`. An index scan, since `/[?#].*$/` retries
2
+ * from every `#` and runs in quadratic time on a long run of them before a line break. */
3
+ export function withoutQuery(value: string): string {
4
+ const query = value.indexOf("?")
5
+ const hash = value.indexOf("#")
6
+ const cut = query === -1 ? hash : hash === -1 ? query : Math.min(query, hash)
7
+ return cut === -1 ? value : value.slice(0, cut)
8
+ }
@@ -19,6 +19,7 @@ import {
19
19
  } from "../zones.ts"
20
20
  import { codeUnitOrder } from "./code-unit-order.ts"
21
21
  import { isBareNodeBuiltin } from "./node-builtins.ts"
22
+ import { withoutQuery } from "./without-query.ts"
22
23
 
23
24
  /** What a graph module id names. */
24
25
  export type ModuleSource =
@@ -30,9 +31,8 @@ export type ModuleSource =
30
31
 
31
32
  /** A namespace prefix needs two characters, so a Windows drive letter still reads as a path. */
32
33
  const NAMESPACED = /^([a-z][\w.+-]+):(.*)$/i
33
- const stripQuery = (id: string): string => id.replace(/[?#].*$/, "")
34
34
  const virtualOf = (rest: string): ModuleSource => {
35
- const file = stripQuery(rest)
35
+ const file = withoutQuery(rest)
36
36
  return isAbsolute(file) && existsSync(file) ? { kind: "virtual", file } : { kind: "virtual" }
37
37
  }
38
38
 
@@ -42,7 +42,7 @@ export function bunModuleSource(cwd: string): (id: string) => ModuleSource {
42
42
  if (id.startsWith("node:") || id.startsWith("bun:")) return { kind: "builtin" }
43
43
  const namespaced = NAMESPACED.exec(id)
44
44
  if (namespaced !== null && namespaced[1] !== "file") return virtualOf(namespaced[2] ?? "")
45
- return { kind: "file", file: resolve(cwd, stripQuery(namespaced?.[2] ?? id)) }
45
+ return { kind: "file", file: resolve(cwd, withoutQuery(namespaced?.[2] ?? id)) }
46
46
  }
47
47
  }
48
48
 
@@ -50,7 +50,7 @@ export function bunModuleSource(cwd: string): (id: string) => ModuleSource {
50
50
  export function rollupModuleSource(id: string): ModuleSource {
51
51
  if (id.startsWith("node:") || id.includes("__vite-browser-external")) return { kind: "builtin" }
52
52
  if (id.startsWith("\0")) return virtualOf(id.slice(1).replace(/^[\w-]+:/, ""))
53
- const file = stripQuery(id)
53
+ const file = withoutQuery(id)
54
54
  return isAbsolute(file) ? { kind: "file", file } : { kind: "virtual" }
55
55
  }
56
56
 
@@ -60,6 +60,38 @@ export interface ZoneLeak {
60
60
  readonly reason: string
61
61
  /** Shortest import path from an entry: `[entry, ...as-written specifiers]`. */
62
62
  readonly chain: readonly string[]
63
+ /** The undeclared package the refusal is about; its files share one line in the report. */
64
+ readonly package?: string
65
+ }
66
+
67
+ const leakLine = (leak: ZoneLeak, module = leak.module): string =>
68
+ ` - ${module}: ${leak.reason}${leak.chain.length > 1 ? `\n via ${leak.chain.join(" → ")}` : ""}`
69
+
70
+ /** One line per leak, except that the files of one undeclared package share a single line. */
71
+ function leakLines(leaks: readonly ZoneLeak[]): string[] {
72
+ const byPackage = new Map<string, ZoneLeak[]>()
73
+ for (const leak of leaks) {
74
+ if (leak.package === undefined) continue
75
+ const group = byPackage.get(leak.package)
76
+ if (group === undefined) byPackage.set(leak.package, [leak])
77
+ else group.push(leak)
78
+ }
79
+ const lines: string[] = []
80
+ for (const leak of leaks) {
81
+ const group = leak.package === undefined ? undefined : byPackage.get(leak.package)
82
+ if (group === undefined || group.length < 2) {
83
+ lines.push(leakLine(leak))
84
+ continue
85
+ }
86
+ if (group[0] !== leak) continue
87
+ const shown = group
88
+ .slice(0, 3)
89
+ .map((item) => item.module)
90
+ .join(", ")
91
+ const more = group.length > 3 ? ` and ${group.length - 3} more` : ""
92
+ lines.push(leakLine(leak, `${group.length} files (${shown}${more})`))
93
+ }
94
+ return lines
63
95
  }
64
96
 
65
97
  export interface ClientGraphVerdict {
@@ -71,6 +103,8 @@ export interface ClientGraphVerdict {
71
103
  }
72
104
 
73
105
  export interface VerifyClientGraphOptions {
106
+ /** Exact modules certified by the component compiler in this generation. */
107
+ readonly componentModules?: ReadonlySet<string>
74
108
  readonly classifier: ZoneClassifier
75
109
  readonly sourceOf: (id: string) => ModuleSource
76
110
  /** The private-env denial for a browser-code file (see `privateEnvCheck`); unchecked when absent. */
@@ -192,16 +226,21 @@ export function verifyClientGraph(
192
226
  }
193
227
 
194
228
  const denied = new Map<string, string>()
229
+ const deniedPackage = new Map<string, string>()
195
230
  for (const id of [...Object.keys(graph.modules), ...dropped]) {
196
231
  const source = sourceOf(id)
197
232
  const file = source.kind === "builtin" ? undefined : source.file
198
233
  if (file === undefined) continue
199
234
  const classification = classifier.classify(file)
200
235
  let reason = browserDenial(classification)
201
- for (const spec of specifiers.get(id) ?? []) reason ??= browserDenial(classification, spec)
236
+ // An import that names a package entry is judged by that entry's own declared side.
237
+ for (const spec of specifiers.get(id) ?? [])
238
+ reason ??= browserDenial(classifier.classify(file, spec), spec)
202
239
  if (reason === undefined && BROWSER_CODE.has(classification.zone))
203
240
  reason = options.privateEnv?.(file)
204
241
  if (reason !== undefined) denied.set(id, reason)
242
+ if (classification.zone === "error" && classification.package !== undefined)
243
+ deniedPackage.set(id, classification.package)
205
244
  }
206
245
 
207
246
  // Chains start at a route file where they can: a lazily split module is an entry of its own chunk,
@@ -225,11 +264,15 @@ export function verifyClientGraph(
225
264
  : entries
226
265
  const chains = denied.size === 0 ? new Map<string, string[]>() : shortestChains(roots, edges)
227
266
  const leaks = [...denied]
228
- .map(([id, reason]) => ({
229
- module: labelOf(id),
230
- reason,
231
- chain: (chains.get(id) ?? [id]).map((label, i) => (i === 0 ? labelOf(label) : label)),
232
- }))
267
+ .map(([id, reason]): ZoneLeak => {
268
+ const leak = {
269
+ module: labelOf(id),
270
+ reason,
271
+ chain: (chains.get(id) ?? [id]).map((label, i) => (i === 0 ? labelOf(label) : label)),
272
+ }
273
+ const pkg = deniedPackage.get(id)
274
+ return pkg === undefined ? leak : { ...leak, package: pkg }
275
+ })
233
276
  .sort((a, b) => codeUnitOrder(a.module, b.module))
234
277
 
235
278
  const misplacedExports: string[] = []
@@ -333,10 +376,14 @@ export function verifyServerGraph(
333
376
  readonly module: string
334
377
  readonly reason: string
335
378
  readonly tail?: string
379
+ readonly package?: string
336
380
  }> = []
337
381
  for (const [id, module] of Object.entries(graph.modules)) {
338
382
  const from = classOf(id)
339
- if (from?.zone === "error") found.push({ at: id, module: labelOf(id), reason: from.reason })
383
+ if (from?.zone === "error") {
384
+ const at = { at: id, module: labelOf(id), reason: from.reason }
385
+ found.push(from.package === undefined ? at : { ...at, package: from.package })
386
+ }
340
387
  const file = fileOf(id)
341
388
  const env =
342
389
  from !== undefined && file !== undefined && BROWSER_CODE.has(from.zone)
@@ -361,10 +408,23 @@ export function verifyServerGraph(
361
408
  const target = resolveEdge(im)
362
409
  if (target === undefined) continue
363
410
  out.push({ to: target, label: im.original ?? labelOf(target) })
364
- const to = classOf(target)
411
+ const targetFile = fileOf(target)
412
+ const to =
413
+ im.original === undefined || targetFile === undefined
414
+ ? classOf(target)
415
+ : classifier.classify(targetFile, im.original)
416
+ if (to?.zone === "error" && to.entry !== undefined)
417
+ found.push({
418
+ at: id,
419
+ module: labelOf(target),
420
+ reason: to.reason,
421
+ tail: im.original ?? labelOf(target),
422
+ })
365
423
  if (from === undefined || to === undefined || from.zone === "error" || to.zone === "error")
366
424
  continue
367
- if (!importAllowed(from.zone, to.zone)) {
425
+ const componentBridge =
426
+ to.zone === "component" && options.componentModules?.has(fileOf(target) ?? "") === true
427
+ if (!componentBridge && !importAllowed(from.zone, to.zone)) {
368
428
  found.push({
369
429
  at: id,
370
430
  module: labelOf(target),
@@ -386,9 +446,10 @@ export function verifyServerGraph(
386
446
  ]
387
447
  const chains = shortestChains(entries, edges)
388
448
  const violations = found
389
- .map(({ at, module, reason, tail }) => {
449
+ .map(({ at, module, reason, tail, package: pkg }): ZoneLeak => {
390
450
  const chain = (chains.get(at) ?? [at]).map((label, i) => (i === 0 ? labelOf(label) : label))
391
- return { module, reason, chain: tail === undefined ? chain : [...chain, tail] }
451
+ const violation = { module, reason, chain: tail === undefined ? chain : [...chain, tail] }
452
+ return pkg === undefined ? violation : { ...violation, package: pkg }
392
453
  })
393
454
  .sort((a, b) => codeUnitOrder(a.module, b.module) || codeUnitOrder(a.reason, b.reason))
394
455
  return { violations }
@@ -397,11 +458,7 @@ export function verifyServerGraph(
397
458
  /** The build-failing message for a server graph that breaks the zone rules. */
398
459
  export function formatServerGraphVerdict(verdict: ServerGraphVerdict): string | undefined {
399
460
  if (verdict.violations.length === 0) return undefined
400
- const lines = verdict.violations.map(
401
- (v) =>
402
- ` - ${v.module}: ${v.reason}${v.chain.length > 1 ? `\n via ${v.chain.join(" → ")}` : ""}`,
403
- )
404
- return `[nifra/web] the server build breaks the zone rules:\n${lines.join("\n")}`
461
+ return `[nifra/web] the server build breaks the zone rules:\n${leakLines(verdict.violations).join("\n")}`
405
462
  }
406
463
 
407
464
  /** One emitted file, as the accounting sees it. */
@@ -561,12 +618,8 @@ const indent = (lines: readonly string[]): string => lines.map((line) => ` - ${
561
618
  export function formatClientGraphVerdict(verdict: ClientGraphVerdict): string | undefined {
562
619
  const sections: string[] = []
563
620
  if (verdict.leaks.length > 0) {
564
- const lines = verdict.leaks.map(
565
- (leak) =>
566
- ` - ${leak.module}: ${leak.reason}${leak.chain.length > 1 ? `\n via ${leak.chain.join(" → ")}` : ""}`,
567
- )
568
621
  sections.push(
569
- `[nifra/web] the browser build reached code that may not ship to a browser:\n${lines.join("\n")}\n` +
622
+ `[nifra/web] the browser build reached code that may not ship to a browser:\n${leakLines(verdict.leaks).join("\n")}\n` +
570
623
  "Reach backend code through a route's backend half (x.backend.ts) or a *.fn.ts server function; " +
571
624
  "code both sides need belongs in shared/.",
572
625
  )