@nifrajs/web 3.5.0 → 4.0.2

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 (390) 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 +18 -6
  10. package/dist/build-plan.d.ts.map +1 -1
  11. package/dist/build-plan.js +82 -34
  12. package/dist/build-plan.js.map +1 -1
  13. package/dist/build-vite.d.ts +4 -0
  14. package/dist/build-vite.d.ts.map +1 -1
  15. package/dist/build-vite.js +68 -13
  16. package/dist/build-vite.js.map +1 -1
  17. package/dist/build.d.ts +57 -23
  18. package/dist/build.d.ts.map +1 -1
  19. package/dist/build.js +356 -85
  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 +3 -1
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +136 -35
  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/dev-client.d.ts +76 -0
  40. package/dist/dev-client.d.ts.map +1 -0
  41. package/dist/dev-client.js +280 -0
  42. package/dist/dev-client.js.map +1 -0
  43. package/dist/dev-diagnostics.d.ts +26 -2
  44. package/dist/dev-diagnostics.d.ts.map +1 -1
  45. package/dist/dev-diagnostics.js +38 -7
  46. package/dist/dev-diagnostics.js.map +1 -1
  47. package/dist/dev-error.d.ts +4 -13
  48. package/dist/dev-error.d.ts.map +1 -1
  49. package/dist/dev-error.js +46 -4
  50. package/dist/dev-error.js.map +1 -1
  51. package/dist/dev-feed.d.ts +298 -0
  52. package/dist/dev-feed.d.ts.map +1 -0
  53. package/dist/dev-feed.js +797 -0
  54. package/dist/dev-feed.js.map +1 -0
  55. package/dist/dev-indicator.d.ts +38 -0
  56. package/dist/dev-indicator.d.ts.map +1 -0
  57. package/dist/dev-indicator.js +93 -0
  58. package/dist/dev-indicator.js.map +1 -0
  59. package/dist/dev-session.d.ts +77 -0
  60. package/dist/dev-session.d.ts.map +1 -0
  61. package/dist/dev-session.js +580 -0
  62. package/dist/dev-session.js.map +1 -0
  63. package/dist/dev-sourcemap.d.ts +27 -0
  64. package/dist/dev-sourcemap.d.ts.map +1 -0
  65. package/dist/dev-sourcemap.js +235 -0
  66. package/dist/dev-sourcemap.js.map +1 -0
  67. package/dist/dev-ssr-graph.d.ts.map +1 -1
  68. package/dist/dev-ssr-graph.js +13 -5
  69. package/dist/dev-ssr-graph.js.map +1 -1
  70. package/dist/dev.d.ts +15 -2
  71. package/dist/dev.d.ts.map +1 -1
  72. package/dist/dev.js +69 -44
  73. package/dist/dev.js.map +1 -1
  74. package/dist/diagnostic-catalog.d.ts +35 -0
  75. package/dist/diagnostic-catalog.d.ts.map +1 -0
  76. package/dist/diagnostic-catalog.js +203 -0
  77. package/dist/diagnostic-catalog.js.map +1 -0
  78. package/dist/diagnostic-prompt.d.ts +49 -0
  79. package/dist/diagnostic-prompt.d.ts.map +1 -0
  80. package/dist/diagnostic-prompt.js +303 -0
  81. package/dist/diagnostic-prompt.js.map +1 -0
  82. package/dist/diagnostic.d.ts +17 -23
  83. package/dist/diagnostic.d.ts.map +1 -1
  84. package/dist/diagnostic.js +31 -39
  85. package/dist/diagnostic.js.map +1 -1
  86. package/dist/draft.d.ts.map +1 -1
  87. package/dist/draft.js +4 -1
  88. package/dist/draft.js.map +1 -1
  89. package/dist/fn.d.ts +5 -0
  90. package/dist/fn.d.ts.map +1 -1
  91. package/dist/fn.js +13 -3
  92. package/dist/fn.js.map +1 -1
  93. package/dist/fs.d.ts.map +1 -1
  94. package/dist/fs.js +4 -2
  95. package/dist/fs.js.map +1 -1
  96. package/dist/index.d.ts +13 -15
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +11 -12
  99. package/dist/index.js.map +1 -1
  100. package/dist/internal/cdn/cloudflare.d.ts +48 -0
  101. package/dist/internal/cdn/cloudflare.d.ts.map +1 -0
  102. package/dist/internal/cdn/cloudflare.js +94 -0
  103. package/dist/internal/cdn/cloudflare.js.map +1 -0
  104. package/dist/internal/cdn/core.d.ts +91 -0
  105. package/dist/internal/cdn/core.d.ts.map +1 -0
  106. package/dist/internal/cdn/core.js +220 -0
  107. package/dist/internal/cdn/core.js.map +1 -0
  108. package/dist/internal/cdn/fastly.d.ts +17 -0
  109. package/dist/internal/cdn/fastly.d.ts.map +1 -0
  110. package/dist/internal/cdn/fastly.js +43 -0
  111. package/dist/internal/cdn/fastly.js.map +1 -0
  112. package/dist/internal/cdn/vercel.d.ts +31 -0
  113. package/dist/internal/cdn/vercel.d.ts.map +1 -0
  114. package/dist/internal/cdn/vercel.js +56 -0
  115. package/dist/internal/cdn/vercel.js.map +1 -0
  116. package/dist/internal/code-unit-order.d.ts +4 -0
  117. package/dist/internal/code-unit-order.d.ts.map +1 -0
  118. package/dist/internal/code-unit-order.js +6 -0
  119. package/dist/internal/code-unit-order.js.map +1 -0
  120. package/dist/internal/codegen.d.ts.map +1 -1
  121. package/dist/internal/codegen.js +141 -25
  122. package/dist/internal/codegen.js.map +1 -1
  123. package/dist/internal/dev-csp.d.ts +24 -0
  124. package/dist/internal/dev-csp.d.ts.map +1 -0
  125. package/dist/internal/dev-csp.js +160 -0
  126. package/dist/internal/dev-csp.js.map +1 -0
  127. package/dist/internal/dev-reserved.d.ts +25 -0
  128. package/dist/internal/dev-reserved.d.ts.map +1 -0
  129. package/dist/internal/dev-reserved.js +39 -0
  130. package/dist/internal/dev-reserved.js.map +1 -0
  131. package/dist/internal/html-spans.d.ts +10 -0
  132. package/dist/internal/html-spans.d.ts.map +1 -0
  133. package/dist/internal/html-spans.js +46 -0
  134. package/dist/internal/html-spans.js.map +1 -0
  135. package/dist/internal/loading-runtime.d.ts +44 -0
  136. package/dist/internal/loading-runtime.d.ts.map +1 -0
  137. package/dist/internal/loading-runtime.js +206 -0
  138. package/dist/internal/loading-runtime.js.map +1 -0
  139. package/dist/internal/matches-runtime.d.ts +8 -0
  140. package/dist/internal/matches-runtime.d.ts.map +1 -0
  141. package/dist/internal/matches-runtime.js +61 -0
  142. package/dist/internal/matches-runtime.js.map +1 -0
  143. package/dist/internal/mount-shadow.d.ts +36 -0
  144. package/dist/internal/mount-shadow.d.ts.map +1 -0
  145. package/dist/internal/mount-shadow.js +65 -0
  146. package/dist/internal/mount-shadow.js.map +1 -0
  147. package/dist/internal/node-builtins.d.ts +3 -0
  148. package/dist/internal/node-builtins.d.ts.map +1 -0
  149. package/dist/internal/node-builtins.js +79 -0
  150. package/dist/internal/node-builtins.js.map +1 -0
  151. package/dist/internal/output-guard.d.ts +65 -0
  152. package/dist/internal/output-guard.d.ts.map +1 -0
  153. package/dist/internal/output-guard.js +630 -0
  154. package/dist/internal/output-guard.js.map +1 -0
  155. package/dist/internal/page-execution.d.ts +20 -8
  156. package/dist/internal/page-execution.d.ts.map +1 -1
  157. package/dist/internal/page-execution.js +571 -105
  158. package/dist/internal/page-execution.js.map +1 -1
  159. package/dist/internal/parity.d.ts +21 -0
  160. package/dist/internal/parity.d.ts.map +1 -1
  161. package/dist/internal/parity.js +104 -22
  162. package/dist/internal/parity.js.map +1 -1
  163. package/dist/internal/private-env.d.ts +12 -0
  164. package/dist/internal/private-env.d.ts.map +1 -0
  165. package/dist/internal/private-env.js +335 -0
  166. package/dist/internal/private-env.js.map +1 -0
  167. package/dist/internal/public-url.d.ts +3 -0
  168. package/dist/internal/public-url.d.ts.map +1 -0
  169. package/dist/internal/public-url.js +18 -0
  170. package/dist/internal/public-url.js.map +1 -0
  171. package/dist/internal/render-document.d.ts +25 -19
  172. package/dist/internal/render-document.d.ts.map +1 -1
  173. package/dist/internal/render-document.js +77 -61
  174. package/dist/internal/render-document.js.map +1 -1
  175. package/dist/internal/response-controls.d.ts +75 -0
  176. package/dist/internal/response-controls.d.ts.map +1 -0
  177. package/dist/internal/response-controls.js +256 -0
  178. package/dist/internal/response-controls.js.map +1 -0
  179. package/dist/internal/runtime-contract.d.ts +11 -16
  180. package/dist/internal/runtime-contract.d.ts.map +1 -1
  181. package/dist/internal/runtime-contract.js.map +1 -1
  182. package/dist/internal/secret-scan.d.ts +104 -0
  183. package/dist/internal/secret-scan.d.ts.map +1 -0
  184. package/dist/internal/secret-scan.js +503 -0
  185. package/dist/internal/secret-scan.js.map +1 -0
  186. package/dist/internal/server-boundary.d.ts +6 -29
  187. package/dist/internal/server-boundary.d.ts.map +1 -1
  188. package/dist/internal/server-boundary.js +6 -66
  189. package/dist/internal/server-boundary.js.map +1 -1
  190. package/dist/internal/source-map.d.ts +47 -0
  191. package/dist/internal/source-map.d.ts.map +1 -0
  192. package/dist/internal/source-map.js +225 -0
  193. package/dist/internal/source-map.js.map +1 -0
  194. package/dist/internal/target-compat.d.ts +27 -0
  195. package/dist/internal/target-compat.d.ts.map +1 -0
  196. package/dist/internal/target-compat.js +77 -0
  197. package/dist/internal/target-compat.js.map +1 -0
  198. package/dist/internal/timing-safe-equal.d.ts +6 -0
  199. package/dist/internal/timing-safe-equal.d.ts.map +1 -1
  200. package/dist/internal/timing-safe-equal.js +10 -0
  201. package/dist/internal/timing-safe-equal.js.map +1 -1
  202. package/dist/internal/vitals-runtime.d.ts +18 -0
  203. package/dist/internal/vitals-runtime.d.ts.map +1 -0
  204. package/dist/internal/vitals-runtime.js +38 -0
  205. package/dist/internal/vitals-runtime.js.map +1 -0
  206. package/dist/internal/web-app.d.ts +38 -9
  207. package/dist/internal/web-app.d.ts.map +1 -1
  208. package/dist/internal/web-app.js +199 -59
  209. package/dist/internal/web-app.js.map +1 -1
  210. package/dist/internal/zone-graph.d.ts +89 -0
  211. package/dist/internal/zone-graph.d.ts.map +1 -0
  212. package/dist/internal/zone-graph.js +492 -0
  213. package/dist/internal/zone-graph.js.map +1 -0
  214. package/dist/isr.d.ts +83 -6
  215. package/dist/isr.d.ts.map +1 -1
  216. package/dist/isr.js +263 -36
  217. package/dist/isr.js.map +1 -1
  218. package/dist/llms-txt.d.ts.map +1 -1
  219. package/dist/llms-txt.js +31 -6
  220. package/dist/llms-txt.js.map +1 -1
  221. package/dist/manifest.d.ts +220 -13
  222. package/dist/manifest.d.ts.map +1 -1
  223. package/dist/manifest.js +394 -9
  224. package/dist/manifest.js.map +1 -1
  225. package/dist/module-graph.d.ts +26 -5
  226. package/dist/module-graph.d.ts.map +1 -1
  227. package/dist/module-graph.js +17 -7
  228. package/dist/module-graph.js.map +1 -1
  229. package/dist/navigation.d.ts +17 -3
  230. package/dist/navigation.d.ts.map +1 -1
  231. package/dist/navigation.js +11 -5
  232. package/dist/navigation.js.map +1 -1
  233. package/dist/nonce.d.ts +47 -0
  234. package/dist/nonce.d.ts.map +1 -0
  235. package/dist/nonce.js +63 -0
  236. package/dist/nonce.js.map +1 -0
  237. package/dist/plugins/css-modules.d.ts.map +1 -1
  238. package/dist/plugins/css-modules.js +4 -3
  239. package/dist/plugins/css-modules.js.map +1 -1
  240. package/dist/plugins/kit.d.ts +9 -0
  241. package/dist/plugins/kit.d.ts.map +1 -1
  242. package/dist/plugins/kit.js +18 -0
  243. package/dist/plugins/kit.js.map +1 -1
  244. package/dist/plugins/svg.d.ts +22 -3
  245. package/dist/plugins/svg.d.ts.map +1 -1
  246. package/dist/plugins/svg.js +112 -1
  247. package/dist/plugins/svg.js.map +1 -1
  248. package/dist/plugins/vite-leak-guard.d.ts +107 -3
  249. package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
  250. package/dist/plugins/vite-leak-guard.js +378 -17
  251. package/dist/plugins/vite-leak-guard.js.map +1 -1
  252. package/dist/plugins/vite-zone-guard.d.ts +61 -0
  253. package/dist/plugins/vite-zone-guard.d.ts.map +1 -0
  254. package/dist/plugins/vite-zone-guard.js +208 -0
  255. package/dist/plugins/vite-zone-guard.js.map +1 -0
  256. package/dist/plugins/zone-guard.d.ts +27 -0
  257. package/dist/plugins/zone-guard.d.ts.map +1 -0
  258. package/dist/plugins/zone-guard.js +80 -0
  259. package/dist/plugins/zone-guard.js.map +1 -0
  260. package/dist/prerender.d.ts +10 -0
  261. package/dist/prerender.d.ts.map +1 -1
  262. package/dist/prerender.js +35 -3
  263. package/dist/prerender.js.map +1 -1
  264. package/dist/public-dir.d.ts +9 -0
  265. package/dist/public-dir.d.ts.map +1 -1
  266. package/dist/public-dir.js +67 -9
  267. package/dist/public-dir.js.map +1 -1
  268. package/dist/pwa-manifest.d.ts +68 -0
  269. package/dist/pwa-manifest.d.ts.map +1 -0
  270. package/dist/pwa-manifest.js +178 -0
  271. package/dist/pwa-manifest.js.map +1 -0
  272. package/dist/query.js +4 -4
  273. package/dist/query.js.map +1 -1
  274. package/dist/render-seam.d.ts +42 -2
  275. package/dist/render-seam.d.ts.map +1 -1
  276. package/dist/render-seam.js +6 -0
  277. package/dist/render-seam.js.map +1 -1
  278. package/dist/route-manifest.d.ts +3 -0
  279. package/dist/route-manifest.d.ts.map +1 -1
  280. package/dist/route-manifest.js +26 -3
  281. package/dist/route-manifest.js.map +1 -1
  282. package/dist/route-types.d.ts +24 -0
  283. package/dist/route-types.d.ts.map +1 -0
  284. package/dist/route-types.js +195 -0
  285. package/dist/route-types.js.map +1 -0
  286. package/dist/router.d.ts +28 -6
  287. package/dist/router.d.ts.map +1 -1
  288. package/dist/router.js +129 -40
  289. package/dist/router.js.map +1 -1
  290. package/dist/vitals.d.ts +33 -0
  291. package/dist/vitals.d.ts.map +1 -0
  292. package/dist/vitals.js +16 -0
  293. package/dist/vitals.js.map +1 -0
  294. package/dist/vite.d.ts +16 -1
  295. package/dist/vite.d.ts.map +1 -1
  296. package/dist/vite.js +248 -43
  297. package/dist/vite.js.map +1 -1
  298. package/dist/zones.d.ts +70 -0
  299. package/dist/zones.d.ts.map +1 -0
  300. package/dist/zones.js +365 -0
  301. package/dist/zones.js.map +1 -0
  302. package/package.json +67 -14
  303. package/src/backend-only.ts +16 -0
  304. package/src/boundary.ts +18 -5
  305. package/src/build-plan.ts +90 -35
  306. package/src/build-vite.ts +77 -11
  307. package/src/build.ts +466 -96
  308. package/src/bun-dev-entry.ts +1 -1
  309. package/src/cdn.ts +216 -0
  310. package/src/client.ts +135 -36
  311. package/src/conformance.ts +16 -3
  312. package/src/csp.ts +194 -0
  313. package/src/dev-client.ts +349 -0
  314. package/src/dev-diagnostics.ts +60 -7
  315. package/src/dev-error.ts +49 -5
  316. package/src/dev-feed.ts +1140 -0
  317. package/src/dev-indicator.ts +113 -0
  318. package/src/dev-session.ts +729 -0
  319. package/src/dev-sourcemap.ts +281 -0
  320. package/src/dev-ssr-graph.ts +16 -5
  321. package/src/dev.ts +86 -43
  322. package/src/diagnostic-catalog.ts +243 -0
  323. package/src/diagnostic-prompt.ts +355 -0
  324. package/src/diagnostic.ts +63 -66
  325. package/src/draft.ts +4 -1
  326. package/src/fn.ts +19 -3
  327. package/src/fs.ts +13 -2
  328. package/src/index.ts +42 -10
  329. package/src/internal/cdn/cloudflare.ts +146 -0
  330. package/src/internal/cdn/core.ts +316 -0
  331. package/src/internal/cdn/fastly.ts +62 -0
  332. package/src/internal/cdn/vercel.ts +95 -0
  333. package/src/internal/code-unit-order.ts +5 -0
  334. package/src/internal/codegen.ts +161 -24
  335. package/src/internal/dev-csp.ts +176 -0
  336. package/src/internal/dev-reserved.ts +52 -0
  337. package/src/internal/html-spans.ts +50 -0
  338. package/src/internal/loading-runtime.ts +244 -0
  339. package/src/internal/matches-runtime.ts +62 -0
  340. package/src/internal/mount-shadow.ts +88 -0
  341. package/src/internal/node-builtins.ts +79 -0
  342. package/src/internal/output-guard.ts +701 -0
  343. package/src/internal/page-execution.ts +795 -185
  344. package/src/internal/parity.ts +150 -36
  345. package/src/internal/private-env.ts +334 -0
  346. package/src/internal/public-url.ts +22 -0
  347. package/src/internal/render-document.ts +114 -67
  348. package/src/internal/response-controls.ts +284 -0
  349. package/src/internal/runtime-contract.ts +10 -15
  350. package/src/internal/secret-scan.ts +638 -0
  351. package/src/internal/server-boundary.ts +6 -69
  352. package/src/internal/source-map.ts +256 -0
  353. package/src/internal/target-compat.ts +92 -0
  354. package/src/internal/timing-safe-equal.ts +13 -0
  355. package/src/internal/vitals-runtime.ts +53 -0
  356. package/src/internal/web-app.ts +262 -84
  357. package/src/internal/zone-graph.ts +593 -0
  358. package/src/isr.ts +325 -37
  359. package/src/llms-txt.ts +28 -4
  360. package/src/manifest.ts +682 -16
  361. package/src/module-graph.ts +53 -9
  362. package/src/navigation.ts +29 -6
  363. package/src/nonce.ts +104 -0
  364. package/src/plugins/css-modules.ts +5 -3
  365. package/src/plugins/kit.ts +24 -0
  366. package/src/plugins/svg.ts +135 -4
  367. package/src/plugins/vite-leak-guard.ts +529 -16
  368. package/src/plugins/vite-zone-guard.ts +263 -0
  369. package/src/plugins/zone-guard.ts +119 -0
  370. package/src/prerender.ts +49 -3
  371. package/src/public-dir.ts +69 -8
  372. package/src/pwa-manifest.ts +226 -0
  373. package/src/query.ts +4 -4
  374. package/src/render-seam.ts +46 -1
  375. package/src/route-manifest.ts +15 -3
  376. package/src/route-types.ts +264 -0
  377. package/src/router.ts +163 -63
  378. package/src/vitals.ts +44 -0
  379. package/src/vite.ts +257 -42
  380. package/src/zones.ts +430 -0
  381. package/dist/plugins/vite-server-only.d.ts +0 -49
  382. package/dist/plugins/vite-server-only.d.ts.map +0 -1
  383. package/dist/plugins/vite-server-only.js +0 -57
  384. package/dist/plugins/vite-server-only.js.map +0 -1
  385. package/dist/server-only.d.ts +0 -21
  386. package/dist/server-only.d.ts.map +0 -1
  387. package/dist/server-only.js +0 -25
  388. package/dist/server-only.js.map +0 -1
  389. package/src/plugins/vite-server-only.ts +0 -75
  390. package/src/server-only.ts +0 -25
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `source` without its HTML comments. A browser ends one at `-->`, and also at `--!>`; an opener
3
+ * with no end after it is kept as text.
4
+ */
5
+ export declare function withoutComments(source: string): string;
6
+ /** The text between each `open` and the first `close` after it, read on from that `close`. */
7
+ export declare function delimitedSpans(source: string, open: string, close: string): string[];
8
+ /** `source` without the spans the global `pattern` matches, each handed to `onMatch` first. */
9
+ export declare function withoutMatches(source: string, pattern: RegExp, onMatch?: (match: RegExpMatchArray) => void): string;
10
+ //# sourceMappingURL=html-spans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-spans.d.ts","sourceRoot":"","sources":["../../src/internal/html-spans.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAatD;AAED,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASpF;AAED,+FAA+F;AAC/F,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAC1C,MAAM,CAUR"}
@@ -0,0 +1,46 @@
1
+ // The comment and delimiter readers scan instead of matching one lazy RegExp: a pattern like
2
+ // `<!--[\s\S]*?-->` reads to the end of the source again from every opener that never closes.
3
+ /**
4
+ * `source` without its HTML comments. A browser ends one at `-->`, and also at `--!>`; an opener
5
+ * with no end after it is kept as text.
6
+ */
7
+ export function withoutComments(source) {
8
+ const end = /--!?>/g;
9
+ let kept = "";
10
+ let from = 0;
11
+ for (let start = source.indexOf("<!--"); start !== -1; start = source.indexOf("<!--", from)) {
12
+ end.lastIndex = start + 4;
13
+ const close = end.exec(source);
14
+ // No later opener has an end after it either.
15
+ if (close === null)
16
+ break;
17
+ kept += source.slice(from, start);
18
+ from = close.index + close[0].length;
19
+ }
20
+ return kept + source.slice(from);
21
+ }
22
+ /** The text between each `open` and the first `close` after it, read on from that `close`. */
23
+ export function delimitedSpans(source, open, close) {
24
+ const spans = [];
25
+ for (let start = source.indexOf(open); start !== -1;) {
26
+ const end = source.indexOf(close, start + open.length);
27
+ if (end === -1)
28
+ break;
29
+ spans.push(source.slice(start + open.length, end));
30
+ start = source.indexOf(open, end + close.length);
31
+ }
32
+ return spans;
33
+ }
34
+ /** `source` without the spans the global `pattern` matches, each handed to `onMatch` first. */
35
+ export function withoutMatches(source, pattern, onMatch) {
36
+ let kept = "";
37
+ let from = 0;
38
+ for (const match of source.matchAll(pattern)) {
39
+ onMatch?.(match);
40
+ const start = match.index ?? 0;
41
+ kept += source.slice(from, start);
42
+ from = start + match[0].length;
43
+ }
44
+ return kept + source.slice(from);
45
+ }
46
+ //# sourceMappingURL=html-spans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-spans.js","sourceRoot":"","sources":["../../src/internal/html-spans.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,8FAA8F;AAE9F;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAA;IACpB,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,SAAS,GAAG,KAAK,GAAG,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,8CAA8C;QAC9C,IAAI,KAAK,KAAK,IAAI;YAAE,MAAK;QACzB,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACjC,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACtC,CAAC;IACD,OAAO,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAY,EAAE,KAAa;IACxE,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,GAAI,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QACtD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAK;QACrB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;QAClD,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IAClD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,OAAe,EACf,OAA2C;IAE3C,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;QAChB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAA;QAC9B,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QACjC,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAChC,CAAC;IACD,OAAO,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `_loading` pages. The router is untouched: {@link withLoading} only swaps the leaf of the state the
3
+ * view is told while a navigation is pending, so no adapter knows a loading page exists.
4
+ */
5
+ import type { MatchChain } from "../render-seam.js";
6
+ import { type ClientRouter } from "../router.js";
7
+ /** How long a navigation may run before its `_loading` page shows. Shorter loads swap straight to the
8
+ * new page: a skeleton that flashes for a few frames reads as a glitch, not as feedback. */
9
+ export declare const LOADING_DELAY_MS = 120;
10
+ /**
11
+ * One route's row: its layout ids (outermost → innermost), and the `_loading` pages above it
12
+ * (outermost → innermost), each paired with how many of those layouts sit at or above it.
13
+ */
14
+ export type LoadingRoute = readonly [
15
+ layoutIds: readonly string[],
16
+ loadings: ReadonlyArray<readonly [id: string, layouts: number]>
17
+ ];
18
+ export interface LoadingOptions {
19
+ /** Every route id → its {@link LoadingRoute} row. A route id absent here has no layouts. */
20
+ readonly routes: Readonly<Record<string, LoadingRoute>>;
21
+ /** `_loading` id → a lazy import of its module. */
22
+ readonly modules: Readonly<Record<string, () => Promise<{
23
+ readonly default?: unknown;
24
+ readonly handle?: unknown;
25
+ }>>>;
26
+ /** The mounted view's route id → component chain table. The wrapper adds a chain per loading view. */
27
+ readonly chains: Record<string, readonly unknown[]>;
28
+ /** Route id → search-schema chain, kept in step with {@link chains}. */
29
+ readonly searchSchemas: Record<string, readonly unknown[]>;
30
+ /** Route id → what `useMatches` reports, kept in step with {@link chains}. */
31
+ readonly matchChains?: Record<string, MatchChain>;
32
+ /** Override {@link LOADING_DELAY_MS}. */
33
+ readonly delayMs?: number;
34
+ /** Where a navigation goes when it fails after its loading page was shown. Defaults to a document
35
+ * load of the path. */
36
+ readonly fallback?: (path: string) => void;
37
+ }
38
+ /**
39
+ * Shows the innermost `_loading` within the layouts both pages share once a navigation outlasts
40
+ * `delayMs`. `navigate` settles when it shows, so a view transition does not hold across the wait; a
41
+ * later failure goes to `fallback`, or replaces the entry for a redirect out of the app.
42
+ */
43
+ export declare function withLoading(router: ClientRouter, options: LoadingOptions): ClientRouter;
44
+ //# sourceMappingURL=loading-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/loading-runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,KAAK,YAAY,EAAgC,MAAM,cAAc,CAAA;AAE9E;4FAC4F;AAC5F,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAEnC;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS;IAClC,SAAS,EAAE,SAAS,MAAM,EAAE;IAC5B,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;CAChE,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;IACvD,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CACxB,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CACzF,CAAA;IACD,sGAAsG;IACtG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAA;IACnD,wEAAwE;IACxE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC,CAAA;IAC1D,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACjD,yCAAyC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;2BACuB;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC3C;AAOD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY,CAiMvF"}
@@ -0,0 +1,206 @@
1
+ import { redirectOf } from "../router.js";
2
+ /** How long a navigation may run before its `_loading` page shows. Shorter loads swap straight to the
3
+ * new page: a skeleton that flashes for a few frames reads as a glitch, not as feedback. */
4
+ export const LOADING_DELAY_MS = 120;
5
+ const pathnameOf = (path) => {
6
+ const q = path.indexOf("?");
7
+ return q === -1 ? path : path.slice(0, q);
8
+ };
9
+ /**
10
+ * Shows the innermost `_loading` within the layouts both pages share once a navigation outlasts
11
+ * `delayMs`. `navigate` settles when it shows, so a view transition does not hold across the wait; a
12
+ * later failure goes to `fallback`, or replaces the entry for a redirect out of the app.
13
+ */
14
+ export function withLoading(router, options) {
15
+ const { routes, modules, chains, searchSchemas, matchChains } = options;
16
+ const delayMs = options.delayMs ?? LOADING_DELAY_MS;
17
+ const fallback = options.fallback ?? ((path) => location.assign(path));
18
+ const listeners = new Set();
19
+ const components = new Map();
20
+ const handles = new Map();
21
+ const inflight = new Map();
22
+ /** Bumped per navigation through this wrapper - the latest one owns the page slot. */
23
+ let seq = 0;
24
+ /** The loading view on screen (its chain id), and the navigation it belongs to. */
25
+ let shown;
26
+ let owner = 0;
27
+ // One derived state per (router state, loading view) so `snapshot` is referentially stable.
28
+ let base;
29
+ let derived;
30
+ const emit = () => {
31
+ for (const listener of [...listeners])
32
+ listener();
33
+ };
34
+ const load = (id) => {
35
+ if (components.has(id))
36
+ return Promise.resolve();
37
+ const running = inflight.get(id);
38
+ if (running !== undefined)
39
+ return running;
40
+ const importer = modules[id];
41
+ const job = (importer === undefined ? Promise.reject(new Error(`no _loading module "${id}"`)) : importer())
42
+ .then((mod) => {
43
+ if (mod.default !== undefined)
44
+ components.set(id, mod.default);
45
+ handles.set(id, mod.handle);
46
+ })
47
+ .finally(() => {
48
+ inflight.delete(id);
49
+ });
50
+ inflight.set(id, job);
51
+ return job;
52
+ };
53
+ const pick = (fromId, toId) => {
54
+ const target = routes[toId];
55
+ if (target === undefined)
56
+ return undefined;
57
+ const current = routes[fromId]?.[0] ?? [];
58
+ const [layouts, candidates] = target;
59
+ let shared = 0;
60
+ while (shared < current.length &&
61
+ shared < layouts.length &&
62
+ current[shared] === layouts[shared]) {
63
+ shared++;
64
+ }
65
+ for (let i = candidates.length - 1; i >= 0; i--) {
66
+ const candidate = candidates[i];
67
+ if (candidate !== undefined && candidate[1] <= shared)
68
+ return { id: candidate[0], shared };
69
+ }
70
+ return undefined;
71
+ };
72
+ const snapshot = () => {
73
+ const state = router.snapshot();
74
+ if (shown === undefined || !state.pending)
75
+ return state;
76
+ if (base !== state || derived === undefined || derived.routeId !== shown) {
77
+ base = state;
78
+ // The layouts keep their data and the URL-derived fields stay the current page's; only the leaf
79
+ // changes, and it has no loader data of its own.
80
+ derived = { ...state, routeId: shown, data: null };
81
+ }
82
+ return derived;
83
+ };
84
+ const navigate = (path) => {
85
+ const match = router.match(path);
86
+ // Unmatched: the router ignores it, so whatever is on screen stays as it is.
87
+ if (match === null)
88
+ return router.navigate(path);
89
+ const mine = ++seq;
90
+ const from = router.snapshot();
91
+ const choice = pathnameOf(from.path) === pathnameOf(path) ? undefined : pick(from.routeId, match.routeId);
92
+ // NUL-prefixed: a chain id no route file can produce.
93
+ const view = choice === undefined ? undefined : `\0${choice.id}\0${from.routeId}\0${choice.shared}`;
94
+ const wasShown = shown !== undefined;
95
+ // A newer navigation that would show the same view keeps it, rather than flashing the old page.
96
+ const carried = wasShown && shown === view;
97
+ if (carried)
98
+ owner = mine;
99
+ else
100
+ shown = undefined;
101
+ const done = router.navigate(path);
102
+ if (choice === undefined || view === undefined) {
103
+ if (wasShown)
104
+ emit();
105
+ return done;
106
+ }
107
+ let finished = false;
108
+ let revealed = carried;
109
+ let timer;
110
+ const reveal = new Promise((resolve) => {
111
+ if (carried) {
112
+ setTimeout(resolve, 0);
113
+ return;
114
+ }
115
+ const show = () => {
116
+ if (finished || mine !== seq || !router.snapshot().pending)
117
+ return;
118
+ const component = components.get(choice.id);
119
+ if (component === undefined)
120
+ return;
121
+ chains[view] ??= [...(chains[from.routeId] ?? []).slice(0, choice.shared), component];
122
+ // The current route's schemas: the URL is still its URL, so its layouts read the same search.
123
+ searchSchemas[view] ??= searchSchemas[from.routeId] ?? [];
124
+ if (matchChains !== undefined) {
125
+ const current = matchChains[from.routeId];
126
+ matchChains[view] ??= {
127
+ ids: [...(current?.ids ?? []).slice(0, choice.shared), choice.id],
128
+ handles: [...(current?.handles ?? []).slice(0, choice.shared), handles.get(choice.id)],
129
+ };
130
+ }
131
+ shown = view;
132
+ owner = mine;
133
+ revealed = true;
134
+ emit();
135
+ // A macrotask later, so the view has committed the loading page before the caller resumes.
136
+ setTimeout(resolve, 0);
137
+ };
138
+ const ready = load(choice.id);
139
+ // A `_loading` module that fails to load costs only the loading page, never the navigation.
140
+ ready.catch(() => { });
141
+ timer = setTimeout(() => {
142
+ ready.then(show, () => { });
143
+ }, wasShown ? 0 : delayMs);
144
+ });
145
+ const finish = () => {
146
+ finished = true;
147
+ clearTimeout(timer);
148
+ if (owner !== mine || shown === undefined)
149
+ return;
150
+ shown = undefined;
151
+ // A navigation that ended without publishing (superseded inside the router) leaves the store
152
+ // pending: tell the view the page slot is the current page's again.
153
+ if (router.snapshot().pending)
154
+ emit();
155
+ };
156
+ const settled = done.then(finish, (error) => {
157
+ finish();
158
+ // A newer navigation owns the document now; even an aborted older fetch can reject late.
159
+ if (mine !== seq)
160
+ return;
161
+ if (!revealed)
162
+ throw error;
163
+ const to = redirectOf(error);
164
+ if (to === undefined)
165
+ fallback(path);
166
+ else
167
+ location.replace(to);
168
+ });
169
+ return Promise.race([settled, reveal]);
170
+ };
171
+ return {
172
+ ...router,
173
+ snapshot,
174
+ subscribe(listener) {
175
+ listeners.add(listener);
176
+ const unsubscribe = router.subscribe(listener);
177
+ return () => {
178
+ listeners.delete(listener);
179
+ unsubscribe();
180
+ };
181
+ },
182
+ navigate,
183
+ submit(action, body, opts) {
184
+ ++seq;
185
+ shown = undefined;
186
+ return router.submit(action, body, opts);
187
+ },
188
+ invalidate(paths) {
189
+ if (paths === undefined || paths.includes(router.snapshot().path)) {
190
+ ++seq;
191
+ shown = undefined;
192
+ }
193
+ return router.invalidate(paths);
194
+ },
195
+ prefetch(path) {
196
+ // Warm the loading pages a navigation there could show, alongside the route itself.
197
+ const match = router.match(path);
198
+ if (match !== null) {
199
+ for (const [id] of routes[match.routeId]?.[1] ?? [])
200
+ load(id).catch(() => { });
201
+ }
202
+ return router.prefetch(path);
203
+ },
204
+ };
205
+ }
206
+ //# sourceMappingURL=loading-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loading-runtime.js","sourceRoot":"","sources":["../../src/internal/loading-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `useMatches` for every adapter. It reads only {@link RenderProps}, which SSR and the mounted router
3
+ * both build, so server and browser agree. Layout prefixes follow the `filePathToRoutes` grammar.
4
+ */
5
+ import type { RenderProps, UIMatch } from "../render-seam.js";
6
+ /** The matches of one render, outermost layout first. Empty when the render carries no chain. */
7
+ export declare function chainMatches(props: RenderProps): readonly UIMatch[];
8
+ //# sourceMappingURL=matches-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matches-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/matches-runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAO7D,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,OAAO,EAAE,CAiDnE"}
@@ -0,0 +1,61 @@
1
+ const GROUP = /^\(.+\)$/;
2
+ const OPTIONAL = /^\[\[([A-Za-z_][A-Za-z0-9_]*)\]\]$/;
3
+ const CATCH_ALL = /^\[\.\.\.([A-Za-z_][A-Za-z0-9_]*)\]$/;
4
+ const MARKER = /\[([A-Za-z_][A-Za-z0-9_]*)\]/g;
5
+ /** The matches of one render, outermost layout first. Empty when the render carries no chain. */
6
+ export function chainMatches(props) {
7
+ const chain = props.matchChain;
8
+ if (chain === undefined)
9
+ return [];
10
+ const path = props.path ?? "";
11
+ const query = path.indexOf("?");
12
+ const pathname = query === -1 ? path : path.slice(0, query);
13
+ const segments = pathname.split("/").filter((segment) => segment !== "");
14
+ const params = props.params ?? {};
15
+ const last = chain.ids.length - 1;
16
+ return chain.ids.map((id, index) => {
17
+ const handle = chain.handles[index];
18
+ if (index === last)
19
+ return { id, pathname, params, data: props.data, handle };
20
+ const owned = {};
21
+ let depth = 0;
22
+ let rest = false;
23
+ const slash = id.lastIndexOf("/");
24
+ for (const part of slash === -1 ? [] : id.slice(0, slash).split("/")) {
25
+ if (part === "index" || GROUP.test(part))
26
+ continue;
27
+ const optional = OPTIONAL.exec(part)?.[1];
28
+ if (optional !== undefined) {
29
+ const value = params[optional];
30
+ if (value !== undefined) {
31
+ owned[optional] = value;
32
+ depth += 1;
33
+ }
34
+ continue;
35
+ }
36
+ const catchAll = CATCH_ALL.exec(part)?.[1];
37
+ if (catchAll !== undefined) {
38
+ const value = params[catchAll];
39
+ if (value !== undefined)
40
+ owned[catchAll] = value;
41
+ rest = true;
42
+ break;
43
+ }
44
+ for (const marker of part.matchAll(MARKER)) {
45
+ const name = marker[1];
46
+ const value = params[name];
47
+ if (value !== undefined)
48
+ owned[name] = value;
49
+ }
50
+ depth += 1;
51
+ }
52
+ return {
53
+ id,
54
+ pathname: rest ? pathname : `/${segments.slice(0, depth).join("/")}`,
55
+ params: owned,
56
+ data: props.layoutData?.[index] ?? null,
57
+ handle,
58
+ };
59
+ });
60
+ }
61
+ //# sourceMappingURL=matches-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matches-runtime.js","sourceRoot":"","sources":["../../src/internal/matches-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Page routes a mount makes unreachable.
3
+ *
4
+ * A pre-route mount (the auto-mounted backend at `apiPrefix`, a `mounts` entry, an `app.mount()` in
5
+ * `use`) answers every request under its path before page routing, and its 404 is final -
6
+ * `fallbackOn: 404` only tries the next mount. A page file whose URL sits under one therefore never
7
+ * renders, and nothing says so: the request gets the mount's 404. This finds those pages so the app
8
+ * fails at startup, at build, and in `nifra check` instead.
9
+ *
10
+ * Pure and fs-free: it takes the manifest and the mount paths, so the runtime, the build and the static
11
+ * check all run the same comparison.
12
+ */
13
+ import type { Manifest } from "../manifest.js";
14
+ /** A page file whose URL pattern sits under a mount. */
15
+ export interface ShadowedPage {
16
+ /** The route file, as the manifest names it (relative to `routes/`). */
17
+ readonly file: string;
18
+ /** The URL pattern the file serves. */
19
+ readonly pattern: string;
20
+ /** The mount path, normalized as the server matches it. */
21
+ readonly mount: string;
22
+ }
23
+ /**
24
+ * Normalize a mount path the way the server's mount table does: drop a trailing `/*` and a trailing
25
+ * `/`, keep `/` for a root mount. `undefined` for a path the server would refuse (not absolute, a
26
+ * query or hash, a param or an inner wildcard) - the mount itself reports that.
27
+ */
28
+ export declare function normalizeMountPath(path: string): string | undefined;
29
+ /**
30
+ * The page routes and nested `_404` scopes that sit under one of `mountPaths`, in manifest order. Paths
31
+ * are normalized here; one the server would refuse is skipped.
32
+ */
33
+ export declare function shadowedPages(manifest: Pick<Manifest, "routes" | "notFounds">, mountPaths: readonly string[]): readonly ShadowedPage[];
34
+ /** The message every surface reports shadowed pages with. */
35
+ export declare function formatShadowedPages(pages: readonly ShadowedPage[]): string;
36
+ //# sourceMappingURL=mount-shadow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount-shadow.d.ts","sourceRoot":"","sources":["../../src/internal/mount-shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMnE;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC,EAChD,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,SAAS,YAAY,EAAE,CAuBzB;AAED,6DAA6D;AAC7D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAS1E"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Normalize a mount path the way the server's mount table does: drop a trailing `/*` and a trailing
3
+ * `/`, keep `/` for a root mount. `undefined` for a path the server would refuse (not absolute, a
4
+ * query or hash, a param or an inner wildcard) - the mount itself reports that.
5
+ */
6
+ export function normalizeMountPath(path) {
7
+ if (!path.startsWith("/") || path.includes("?") || path.includes("#"))
8
+ return undefined;
9
+ const bare = path.endsWith("/*") ? path.slice(0, -2) : path;
10
+ if (bare.includes("*") || bare.includes(":"))
11
+ return undefined;
12
+ if (bare.length === 0)
13
+ return "/";
14
+ return bare.length > 1 && bare.endsWith("/") ? bare.slice(0, -1) : bare;
15
+ }
16
+ /** Whether every request a pattern serves lands under `mount`: its leading segments equal the mount's
17
+ * segments literally. A param or wildcard segment is not the mount's literal text, so `/:lang/x` is
18
+ * reachable for every other value and is not reported. */
19
+ function patternUnderMount(pattern, mount) {
20
+ if (mount === "/")
21
+ return true;
22
+ return pattern === mount || pattern.startsWith(`${mount}/`);
23
+ }
24
+ /**
25
+ * The page routes and nested `_404` scopes that sit under one of `mountPaths`, in manifest order. Paths
26
+ * are normalized here; one the server would refuse is skipped.
27
+ */
28
+ export function shadowedPages(manifest, mountPaths) {
29
+ const mounts = [];
30
+ for (const path of mountPaths) {
31
+ const normalized = normalizeMountPath(path);
32
+ if (normalized !== undefined && !mounts.includes(normalized))
33
+ mounts.push(normalized);
34
+ }
35
+ if (mounts.length === 0)
36
+ return [];
37
+ const found = [];
38
+ const under = (pattern) => {
39
+ for (const mount of mounts)
40
+ if (patternUnderMount(pattern, mount))
41
+ return mount;
42
+ return undefined;
43
+ };
44
+ for (const route of manifest.routes) {
45
+ const mount = under(route.pattern);
46
+ if (mount !== undefined)
47
+ found.push({ file: route.file, pattern: route.pattern, mount });
48
+ }
49
+ for (const entry of Object.values(manifest.notFounds ?? {})) {
50
+ for (const scope of entry.scopes) {
51
+ const mount = under(scope.pattern);
52
+ if (mount !== undefined)
53
+ found.push({ file: entry.file, pattern: scope.pattern, mount });
54
+ }
55
+ }
56
+ return found;
57
+ }
58
+ /** The message every surface reports shadowed pages with. */
59
+ export function formatShadowedPages(pages) {
60
+ const lines = pages.map((page) => ` ${page.file} serves ${page.pattern}, under the mount at ${page.mount}`);
61
+ return (`${pages.length === 1 ? "1 page route" : `${pages.length} page routes`} can never render: a mount answers every request under its path before page routing, and its 404 is final.\n` +
62
+ `${lines.join("\n")}\n` +
63
+ 'Move each file out of the mounted path, or serve that URL from the mounted app. The backend\'s mount path is `apiPrefix` (default "/api"; export it from framework.ts, or set it to "" to turn the mount off).');
64
+ }
65
+ //# sourceMappingURL=mount-shadow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount-shadow.js","sourceRoot":"","sources":["../../src/internal/mount-shadow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Whether `specifier` names a Node built-in without the `node:` prefix (`fs/promises`). */
2
+ export declare const isBareNodeBuiltin: (specifier: string) => boolean;
3
+ //# sourceMappingURL=node-builtins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-builtins.d.ts","sourceRoot":"","sources":["../../src/internal/node-builtins.ts"],"names":[],"mappings":"AA6EA,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,OAA8C,CAAA"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Node's built-in module names without the `node:` prefix (`fs`, `fs/promises`, ...), for the client
3
+ * build guards. A fixed list rather than `module.builtinModules`, which differs between Node and Bun
4
+ * (Bun adds `bun:*`), so a leak reads the same whichever runtime runs the build. Names that exist only
5
+ * with the prefix (`node:test`, `node:sqlite`) are covered by the prefix itself.
6
+ */
7
+ const NODE_BUILTIN_MODULES = new Set([
8
+ "_http_agent",
9
+ "_http_client",
10
+ "_http_common",
11
+ "_http_incoming",
12
+ "_http_outgoing",
13
+ "_http_server",
14
+ "_stream_duplex",
15
+ "_stream_passthrough",
16
+ "_stream_readable",
17
+ "_stream_transform",
18
+ "_stream_wrap",
19
+ "_stream_writable",
20
+ "_tls_common",
21
+ "_tls_wrap",
22
+ "assert",
23
+ "assert/strict",
24
+ "async_hooks",
25
+ "buffer",
26
+ "child_process",
27
+ "cluster",
28
+ "console",
29
+ "constants",
30
+ "crypto",
31
+ "dgram",
32
+ "diagnostics_channel",
33
+ "dns",
34
+ "dns/promises",
35
+ "domain",
36
+ "events",
37
+ "fs",
38
+ "fs/promises",
39
+ "http",
40
+ "http2",
41
+ "https",
42
+ "inspector",
43
+ "inspector/promises",
44
+ "module",
45
+ "net",
46
+ "os",
47
+ "path",
48
+ "path/posix",
49
+ "path/win32",
50
+ "perf_hooks",
51
+ "process",
52
+ "punycode",
53
+ "querystring",
54
+ "readline",
55
+ "readline/promises",
56
+ "repl",
57
+ "stream",
58
+ "stream/consumers",
59
+ "stream/promises",
60
+ "stream/web",
61
+ "string_decoder",
62
+ "sys",
63
+ "timers",
64
+ "timers/promises",
65
+ "tls",
66
+ "trace_events",
67
+ "tty",
68
+ "url",
69
+ "util",
70
+ "util/types",
71
+ "v8",
72
+ "vm",
73
+ "wasi",
74
+ "worker_threads",
75
+ "zlib",
76
+ ]);
77
+ /** Whether `specifier` names a Node built-in without the `node:` prefix (`fs/promises`). */
78
+ export const isBareNodeBuiltin = (specifier) => NODE_BUILTIN_MODULES.has(specifier);
79
+ //# sourceMappingURL=node-builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-builtins.js","sourceRoot":"","sources":["../../src/internal/node-builtins.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,aAAa;IACb,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,qBAAqB;IACrB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,WAAW;IACX,QAAQ;IACR,eAAe;IACf,aAAa;IACb,QAAQ;IACR,eAAe;IACf,SAAS;IACT,SAAS;IACT,WAAW;IACX,QAAQ;IACR,OAAO;IACP,qBAAqB;IACrB,KAAK;IACL,cAAc;IACd,QAAQ;IACR,QAAQ;IACR,IAAI;IACJ,aAAa;IACb,MAAM;IACN,OAAO;IACP,OAAO;IACP,WAAW;IACX,oBAAoB;IACpB,QAAQ;IACR,KAAK;IACL,IAAI;IACJ,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,SAAS;IACT,UAAU;IACV,aAAa;IACb,UAAU;IACV,mBAAmB;IACnB,MAAM;IACN,QAAQ;IACR,kBAAkB;IAClB,iBAAiB;IACjB,YAAY;IACZ,gBAAgB;IAChB,KAAK;IACL,QAAQ;IACR,iBAAiB;IACjB,KAAK;IACL,cAAc;IACd,KAAK;IACL,KAAK;IACL,MAAM;IACN,YAAY;IACZ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,gBAAgB;IAChB,MAAM;CACP,CAAC,CAAA;AAEF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAiB,EAAW,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA"}