@lovrozagar/flare 0.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 (387) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/package.json +146 -0
  4. package/scripts/download-fonts.ts +136 -0
  5. package/scripts/populate-fonts.ts +721 -0
  6. package/src/await.ts +2 -0
  7. package/src/boundaries/index.ts +99 -0
  8. package/src/broadcast/channel.ts +65 -0
  9. package/src/broadcast/context.ts +12 -0
  10. package/src/broadcast/index.ts +75 -0
  11. package/src/broadcast/provider.tsx +7 -0
  12. package/src/build-location.ts +2 -0
  13. package/src/caches/index.ts +384 -0
  14. package/src/client/index.ts +75 -0
  15. package/src/client.tsx +2 -0
  16. package/src/codegen/index.ts +41 -0
  17. package/src/components/await.tsx +140 -0
  18. package/src/components/dev-error-overlay.tsx +154 -0
  19. package/src/components/direction-script.tsx +22 -0
  20. package/src/components/index.ts +150 -0
  21. package/src/components/locale-script.tsx +26 -0
  22. package/src/components/reset-css.tsx +14 -0
  23. package/src/components/ssr-context.tsx +37 -0
  24. package/src/components/theme-script.tsx +22 -0
  25. package/src/components/view-transition-css.tsx +21 -0
  26. package/src/config/index.ts +84 -0
  27. package/src/create-client-only-fn.ts +1 -0
  28. package/src/create-isomorphic-fn.ts +2 -0
  29. package/src/create-layout.ts +1 -0
  30. package/src/create-page.ts +1 -0
  31. package/src/create-path-segment.ts +1 -0
  32. package/src/create-query-client-getter.ts +2 -0
  33. package/src/create-root-layout.ts +1 -0
  34. package/src/create-router.ts +8 -0
  35. package/src/create-server-only-fn.ts +1 -0
  36. package/src/dedupe/index.ts +151 -0
  37. package/src/defer/index.ts +82 -0
  38. package/src/direction/index.tsx +163 -0
  39. package/src/direction.ts +3 -0
  40. package/src/duration/index.ts +18 -0
  41. package/src/env-fn/index.ts +101 -0
  42. package/src/env-fn.ts +2 -0
  43. package/src/errors/index.ts +166 -0
  44. package/src/fonts/abeezee.ts +50 -0
  45. package/src/fonts/abel.ts +26 -0
  46. package/src/fonts/abril-fatface.ts +34 -0
  47. package/src/fonts/acme.ts +26 -0
  48. package/src/fonts/advent-pro.ts +92 -0
  49. package/src/fonts/alegreya-sans.ts +228 -0
  50. package/src/fonts/alegreya.ts +228 -0
  51. package/src/fonts/alex-brush.ts +42 -0
  52. package/src/fonts/alfa-slab-one.ts +42 -0
  53. package/src/fonts/alice.ts +48 -0
  54. package/src/fonts/amatic-sc.ts +94 -0
  55. package/src/fonts/amiri.ts +114 -0
  56. package/src/fonts/antic-slab.ts +26 -0
  57. package/src/fonts/anton.ts +42 -0
  58. package/src/fonts/archivo-black.ts +34 -0
  59. package/src/fonts/archivo-narrow.ts +114 -0
  60. package/src/fonts/archivo.ts +66 -0
  61. package/src/fonts/arimo.ts +256 -0
  62. package/src/fonts/arvo.ts +50 -0
  63. package/src/fonts/asap.ts +66 -0
  64. package/src/fonts/assistant.ts +64 -0
  65. package/src/fonts/baloo-2.ts +82 -0
  66. package/src/fonts/barlow-condensed.ts +114 -0
  67. package/src/fonts/barlow-semi-condensed.ts +114 -0
  68. package/src/fonts/barlow.ts +114 -0
  69. package/src/fonts/be-vietnam-pro.ts +114 -0
  70. package/src/fonts/bebas-neue.ts +34 -0
  71. package/src/fonts/besley.ts +82 -0
  72. package/src/fonts/biorhyme.ts +50 -0
  73. package/src/fonts/bitter.ts +94 -0
  74. package/src/fonts/black-ops-one.ts +49 -0
  75. package/src/fonts/bree-serif.ts +34 -0
  76. package/src/fonts/bricolage-grotesque.ts +66 -0
  77. package/src/fonts/cabin.ts +114 -0
  78. package/src/fonts/cairo.ts +66 -0
  79. package/src/fonts/cardo.ts +193 -0
  80. package/src/fonts/catamaran.ts +41 -0
  81. package/src/fonts/caveat.ts +78 -0
  82. package/src/fonts/chakra-petch.ts +142 -0
  83. package/src/fonts/chivo.ts +66 -0
  84. package/src/fonts/cinzel.ts +50 -0
  85. package/src/fonts/comfortaa.ts +109 -0
  86. package/src/fonts/commissioner.ts +64 -0
  87. package/src/fonts/component.tsx +27 -0
  88. package/src/fonts/cormorant-garamond.ts +171 -0
  89. package/src/fonts/cormorant.ts +170 -0
  90. package/src/fonts/courgette.ts +34 -0
  91. package/src/fonts/courier-prime.ts +82 -0
  92. package/src/fonts/create-font.ts +47 -0
  93. package/src/fonts/create-registry-font.ts +40 -0
  94. package/src/fonts/crete-round.ts +50 -0
  95. package/src/fonts/crimson-text.ts +114 -0
  96. package/src/fonts/css.ts +86 -0
  97. package/src/fonts/dancing-script.ts +66 -0
  98. package/src/fonts/dm-mono.ts +50 -0
  99. package/src/fonts/dm-sans.ts +50 -0
  100. package/src/fonts/dm-serif-display.ts +50 -0
  101. package/src/fonts/domine.ts +50 -0
  102. package/src/fonts/dosis.ts +66 -0
  103. package/src/fonts/eb-garamond.ts +228 -0
  104. package/src/fonts/eczar.ts +94 -0
  105. package/src/fonts/encode-sans.ts +42 -0
  106. package/src/fonts/epilogue.ts +66 -0
  107. package/src/fonts/exo-2.ts +94 -0
  108. package/src/fonts/exo.ts +66 -0
  109. package/src/fonts/figtree.ts +82 -0
  110. package/src/fonts/fira-code.ts +121 -0
  111. package/src/fonts/fira-sans-condensed.ts +228 -0
  112. package/src/fonts/fira-sans.ts +228 -0
  113. package/src/fonts/fjalla-one.ts +49 -0
  114. package/src/fonts/font-urls.gen.json +1962 -0
  115. package/src/fonts/fraunces.ts +66 -0
  116. package/src/fonts/fredoka.ts +64 -0
  117. package/src/fonts/gelasio.ts +114 -0
  118. package/src/fonts/gloria-hallelujah.ts +34 -0
  119. package/src/fonts/gothic-a1.ts +124 -0
  120. package/src/fonts/great-vibes.ts +64 -0
  121. package/src/fonts/gudea.ts +66 -0
  122. package/src/fonts/heebo.ts +57 -0
  123. package/src/fonts/hind-siliguri.ts +66 -0
  124. package/src/fonts/hind.ts +66 -0
  125. package/src/fonts/ibm-plex-mono.ts +172 -0
  126. package/src/fonts/ibm-plex-sans-arabic.ts +80 -0
  127. package/src/fonts/ibm-plex-sans.ts +199 -0
  128. package/src/fonts/ibm-plex-serif.ts +171 -0
  129. package/src/fonts/inconsolata.ts +66 -0
  130. package/src/fonts/index.ts +4 -0
  131. package/src/fonts/indie-flower.ts +34 -0
  132. package/src/fonts/instrument-sans.ts +82 -0
  133. package/src/fonts/instrument-serif.ts +50 -0
  134. package/src/fonts/inter-display.ts +52 -0
  135. package/src/fonts/inter-tight.ts +124 -0
  136. package/src/fonts/inter.ts +123 -0
  137. package/src/fonts/jetbrains-mono.ts +199 -0
  138. package/src/fonts/josefin-sans.ts +114 -0
  139. package/src/fonts/josefin-slab.ts +50 -0
  140. package/src/fonts/jost.ts +64 -0
  141. package/src/fonts/kalam.ts +66 -0
  142. package/src/fonts/kanit.ts +142 -0
  143. package/src/fonts/karla.ts +82 -0
  144. package/src/fonts/khand.ts +66 -0
  145. package/src/fonts/lato.ts +82 -0
  146. package/src/fonts/league-spartan.ts +42 -0
  147. package/src/fonts/lexend-deca.ts +42 -0
  148. package/src/fonts/lexend.ts +42 -0
  149. package/src/fonts/libre-baskerville.ts +82 -0
  150. package/src/fonts/libre-franklin.ts +95 -0
  151. package/src/fonts/lilita-one.ts +34 -0
  152. package/src/fonts/lobster-two.ts +50 -0
  153. package/src/fonts/lobster.ts +56 -0
  154. package/src/fonts/lora.ts +235 -0
  155. package/src/fonts/m-plus-rounded-1c.ts +138 -0
  156. package/src/fonts/manrope.ts +109 -0
  157. package/src/fonts/maven-pro.ts +66 -0
  158. package/src/fonts/merriweather-sans.ts +142 -0
  159. package/src/fonts/merriweather.ts +171 -0
  160. package/src/fonts/montserrat-alternates.ts +171 -0
  161. package/src/fonts/montserrat.ts +94 -0
  162. package/src/fonts/mukta.ts +66 -0
  163. package/src/fonts/mulish.ts +170 -0
  164. package/src/fonts/nanum-gothic.ts +34 -0
  165. package/src/fonts/nanum-myeongjo.ts +34 -0
  166. package/src/fonts/neuton.ts +66 -0
  167. package/src/fonts/newsreader.ts +114 -0
  168. package/src/fonts/noticia-text.ts +114 -0
  169. package/src/fonts/noto-sans-arabic.ts +58 -0
  170. package/src/fonts/noto-sans-hk.ts +49 -0
  171. package/src/fonts/noto-sans-jp.ts +49 -0
  172. package/src/fonts/noto-sans-kr.ts +49 -0
  173. package/src/fonts/noto-sans-sc.ts +49 -0
  174. package/src/fonts/noto-sans-tc.ts +49 -0
  175. package/src/fonts/noto-sans.ts +140 -0
  176. package/src/fonts/noto-serif-jp.ts +80 -0
  177. package/src/fonts/noto-serif.ts +140 -0
  178. package/src/fonts/nunito-sans.ts +170 -0
  179. package/src/fonts/nunito.ts +170 -0
  180. package/src/fonts/old-standard-tt.ts +133 -0
  181. package/src/fonts/onest.ts +48 -0
  182. package/src/fonts/open-sans.ts +340 -0
  183. package/src/fonts/orbitron.ts +34 -0
  184. package/src/fonts/oswald.ts +94 -0
  185. package/src/fonts/outfit.ts +34 -0
  186. package/src/fonts/overpass.ts +94 -0
  187. package/src/fonts/oxygen.ts +50 -0
  188. package/src/fonts/pacifico.ts +56 -0
  189. package/src/fonts/passion-one.ts +50 -0
  190. package/src/fonts/pathway-gothic-one.ts +34 -0
  191. package/src/fonts/permanent-marker.ts +26 -0
  192. package/src/fonts/philosopher.ts +172 -0
  193. package/src/fonts/play.ts +109 -0
  194. package/src/fonts/playfair-display.ts +142 -0
  195. package/src/fonts/plus-jakarta-sans.ts +142 -0
  196. package/src/fonts/poppins.ts +114 -0
  197. package/src/fonts/prompt.ts +142 -0
  198. package/src/fonts/pt-sans-narrow.ts +78 -0
  199. package/src/fonts/pt-sans.ts +138 -0
  200. package/src/fonts/pt-serif.ts +138 -0
  201. package/src/fonts/public-sans.ts +66 -0
  202. package/src/fonts/questrial.ts +42 -0
  203. package/src/fonts/quicksand.ts +66 -0
  204. package/src/fonts/rajdhani.ts +66 -0
  205. package/src/fonts/raleway.ts +94 -0
  206. package/src/fonts/recursive.ts +80 -0
  207. package/src/fonts/red-hat-display.ts +82 -0
  208. package/src/fonts/red-rose.ts +66 -0
  209. package/src/fonts/registry.gen.ts +173 -0
  210. package/src/fonts/righteous.ts +34 -0
  211. package/src/fonts/roboto-condensed.ts +124 -0
  212. package/src/fonts/roboto-flex.ts +64 -0
  213. package/src/fonts/roboto-mono.ts +199 -0
  214. package/src/fonts/roboto-slab.ts +72 -0
  215. package/src/fonts/roboto.ts +156 -0
  216. package/src/fonts/rokkitt.ts +66 -0
  217. package/src/fonts/rubik.ts +199 -0
  218. package/src/fonts/sacramento.ts +34 -0
  219. package/src/fonts/saira.ts +66 -0
  220. package/src/fonts/sarabun.ts +142 -0
  221. package/src/fonts/satisfy.ts +26 -0
  222. package/src/fonts/sawarabi-mincho.ts +41 -0
  223. package/src/fonts/shadows-into-light.ts +34 -0
  224. package/src/fonts/signika-negative.ts +66 -0
  225. package/src/fonts/signika.ts +66 -0
  226. package/src/fonts/slabo-27px.ts +34 -0
  227. package/src/fonts/sora.ts +50 -0
  228. package/src/fonts/source-code-pro.ts +228 -0
  229. package/src/fonts/source-sans-3.ts +228 -0
  230. package/src/fonts/source-serif-4.ts +199 -0
  231. package/src/fonts/space-grotesk.ts +66 -0
  232. package/src/fonts/space-mono.ts +114 -0
  233. package/src/fonts/spectral.ts +170 -0
  234. package/src/fonts/tajawal.ts +50 -0
  235. package/src/fonts/teko.ts +66 -0
  236. package/src/fonts/tenor-sans.ts +41 -0
  237. package/src/fonts/tinos.ts +256 -0
  238. package/src/fonts/titillium-web.ts +82 -0
  239. package/src/fonts/types.ts +43 -0
  240. package/src/fonts/ubuntu-condensed.ts +63 -0
  241. package/src/fonts/ubuntu-mono.ts +195 -0
  242. package/src/fonts/ubuntu.ts +195 -0
  243. package/src/fonts/unbounded.ts +94 -0
  244. package/src/fonts/unicode-ranges.gen.ts +28 -0
  245. package/src/fonts/urbanist.ts +50 -0
  246. package/src/fonts/varela-round.ts +49 -0
  247. package/src/fonts/vollkorn.ts +199 -0
  248. package/src/fonts/work-sans.ts +66 -0
  249. package/src/fonts/yanone-kaffeesatz.ts +128 -0
  250. package/src/fonts/yantramanav.ts +66 -0
  251. package/src/fonts/yellowtail.ts +34 -0
  252. package/src/fonts/young-serif.ts +34 -0
  253. package/src/fonts/zen-kaku-gothic-new.ts +64 -0
  254. package/src/fonts/zilla-slab.ts +82 -0
  255. package/src/form/index.tsx +205 -0
  256. package/src/generators/index.ts +1589 -0
  257. package/src/head-client/index.ts +649 -0
  258. package/src/history/index.ts +210 -0
  259. package/src/hooks.ts +61 -0
  260. package/src/hydrate/index.tsx +381 -0
  261. package/src/hydration/index.ts +187 -0
  262. package/src/i18n/index.ts +250 -0
  263. package/src/i18n/jsx.tsx +42 -0
  264. package/src/i18n/message-format.ts +174 -0
  265. package/src/image/index.tsx +473 -0
  266. package/src/image.ts +12 -0
  267. package/src/intercept-outlet/index.tsx +18 -0
  268. package/src/intercept-outlet.ts +2 -0
  269. package/src/internal/index.ts +143 -0
  270. package/src/internal/once-idle.ts +24 -0
  271. package/src/internal.ts +12 -0
  272. package/src/lazy/index.tsx +205 -0
  273. package/src/link/index.tsx +367 -0
  274. package/src/loader-pipeline/index.ts +639 -0
  275. package/src/locale/index.tsx +137 -0
  276. package/src/locale.ts +3 -0
  277. package/src/logger.ts +22 -0
  278. package/src/middleware/builtins/api-proxy.ts +64 -0
  279. package/src/middleware/builtins/cdn-proxy.ts +58 -0
  280. package/src/middleware/builtins/i18n.ts +256 -0
  281. package/src/middleware/builtins/keepalive.ts +24 -0
  282. package/src/middleware/builtins/markdown-negotiation.ts +141 -0
  283. package/src/middleware/builtins/static-assets.ts +32 -0
  284. package/src/middleware/index.ts +223 -0
  285. package/src/module-graph/index.ts +181 -0
  286. package/src/mount/index.ts +146 -0
  287. package/src/navigate.ts +1 -0
  288. package/src/navigation/index.ts +1278 -0
  289. package/src/navigation/types.ts +59 -0
  290. package/src/navigation-progress/index.tsx +247 -0
  291. package/src/navigation-progress.ts +1 -0
  292. package/src/ndjson-client/index.ts +376 -0
  293. package/src/ndjson-server/index.ts +284 -0
  294. package/src/outlet/index.tsx +633 -0
  295. package/src/outlet/types.ts +243 -0
  296. package/src/plugins/css-transform.ts +70 -0
  297. package/src/plugins/dev-cdn-cache.ts +454 -0
  298. package/src/plugins/dev-dashboard/client.tsx +2603 -0
  299. package/src/plugins/dev-dashboard/match-route-tree.ts +159 -0
  300. package/src/plugins/dev-dashboard/plugin.ts +404 -0
  301. package/src/plugins/dev-prerender.ts +168 -0
  302. package/src/plugins/dev-server.ts +327 -0
  303. package/src/plugins/generate-watch.ts +32 -0
  304. package/src/plugins/image-plugin.ts +171 -0
  305. package/src/plugins/index.ts +445 -0
  306. package/src/plugins/options.ts +37 -0
  307. package/src/plugins/parse-utils.ts +59 -0
  308. package/src/plugins/prerender-plugin.ts +144 -0
  309. package/src/plugins/purge.ts +242 -0
  310. package/src/plugins/server-fn.ts +641 -0
  311. package/src/plugins/service-worker.ts +225 -0
  312. package/src/plugins/solid-jsx.d.ts +12 -0
  313. package/src/plugins/sx-ast/atomic.ts +166 -0
  314. package/src/plugins/sx-ast/evaluator.ts +235 -0
  315. package/src/plugins/sx-ast/index.ts +372 -0
  316. package/src/plugins/sx-ast/parser.ts +22 -0
  317. package/src/plugins/sx-ast/rewrite.ts +763 -0
  318. package/src/plugins/sx.d.ts +14 -0
  319. package/src/plugins/tw-compile.ts +240 -0
  320. package/src/plugins/types.ts +41 -0
  321. package/src/plugins/virtual.d.ts +110 -0
  322. package/src/plugins/virtual.ts +184 -0
  323. package/src/preload/index.ts +77 -0
  324. package/src/prerender/index.ts +431 -0
  325. package/src/query-client/index.tsx +168 -0
  326. package/src/registry/index.ts +88 -0
  327. package/src/reset-css.ts +1 -0
  328. package/src/revalidation/index.ts +84 -0
  329. package/src/rewrite/index.ts +83 -0
  330. package/src/route-builder/create-layout.ts +655 -0
  331. package/src/route-builder/create-page.ts +806 -0
  332. package/src/route-builder/create-path-segment.ts +34 -0
  333. package/src/route-builder/create-root-layout.ts +608 -0
  334. package/src/route-builder/index.ts +49 -0
  335. package/src/route-builder/register.ts +242 -0
  336. package/src/route-builder/types.ts +294 -0
  337. package/src/router-config/index.ts +91 -0
  338. package/src/router-primitives/index.ts +25 -0
  339. package/src/router-primitives/location.ts +29 -0
  340. package/src/router-primitives/match-id.ts +111 -0
  341. package/src/router-primitives/paths.ts +109 -0
  342. package/src/router-primitives/tree.ts +243 -0
  343. package/src/router-primitives/types.ts +74 -0
  344. package/src/router.ts +31 -0
  345. package/src/search-engine/bing.ts +32 -0
  346. package/src/search-engine/google-jwt.ts +95 -0
  347. package/src/search-engine/google.ts +139 -0
  348. package/src/search-engine/index-now.ts +64 -0
  349. package/src/search-engine/index.ts +12 -0
  350. package/src/security/index.ts +230 -0
  351. package/src/server/index.ts +286 -0
  352. package/src/server-context/browser.ts +113 -0
  353. package/src/server-context/index.ts +217 -0
  354. package/src/server-fn/index.ts +710 -0
  355. package/src/server-fn-query.ts +169 -0
  356. package/src/server-handler/etag.ts +51 -0
  357. package/src/server-handler/headers.ts +5 -0
  358. package/src/server-handler/index.ts +1664 -0
  359. package/src/server-handler/types.ts +24 -0
  360. package/src/server-handler/validate-static-params.ts +130 -0
  361. package/src/server.ts +2 -0
  362. package/src/service-worker/template.ts +153 -0
  363. package/src/service-worker-hook/index.ts +70 -0
  364. package/src/sitemap/index.ts +231 -0
  365. package/src/ssr/critical-css.ts +150 -0
  366. package/src/ssr/head-prefix.ts +65 -0
  367. package/src/ssr/head.ts +259 -0
  368. package/src/ssr/index.tsx +879 -0
  369. package/src/state-parser/index.ts +266 -0
  370. package/src/store/filesystem.ts +131 -0
  371. package/src/store/index.ts +29 -0
  372. package/src/styles/index.ts +1200 -0
  373. package/src/styles/sx-types.ts +11 -0
  374. package/src/testing/index.ts +251 -0
  375. package/src/testing.ts +2 -0
  376. package/src/theme/index.tsx +232 -0
  377. package/src/theme.ts +3 -0
  378. package/src/tracing/index.ts +4 -0
  379. package/src/tracing/noop.ts +13 -0
  380. package/src/tracing/otel.ts +37 -0
  381. package/src/tracing/timing.ts +34 -0
  382. package/src/tracing/types.ts +9 -0
  383. package/src/url/index.ts +140 -0
  384. package/src/use-router.ts +11 -0
  385. package/src/use-suspense-query.ts +2 -0
  386. package/src/validation/index.ts +57 -0
  387. package/src/view-transition-css.ts +1 -0
@@ -0,0 +1,242 @@
1
+ import type { AuthenticateMode } from "./types.ts";
2
+
3
+ /**
4
+ * Module augmentation target. Apps extend via:
5
+ *
6
+ * declare module "@lovrozagar/flare" {
7
+ * interface FlareRegister {
8
+ * auth: AppAuth
9
+ * }
10
+ * }
11
+ */
12
+ export interface FlareRegister {}
13
+
14
+ /* ── Path param extraction ────────────────────────────────── */
15
+
16
+ type _ExtractSegment<T extends string> = T extends `[[...${infer N}]]`
17
+ ? { [K in N]: string[] | undefined }
18
+ : T extends `[[${infer N}]]`
19
+ ? { [K in N]: string | undefined }
20
+ : T extends `[...${infer N}]`
21
+ ? { [K in N]: string[] }
22
+ : T extends `[${infer N}]`
23
+ ? { [K in N]: string }
24
+ : {};
25
+
26
+ type _ExtractPathParams<T extends string> = T extends `${infer Head}/${infer Tail}`
27
+ ? _ExtractSegment<Head> & _ExtractPathParams<Tail>
28
+ : _ExtractSegment<T>;
29
+
30
+ export type ExtractPathParams<T extends string> =
31
+ _ExtractPathParams<T> extends infer R ? { [K in keyof R]: R[K] } : never;
32
+
33
+ /* resolve env type: user-augmented when set, unknown fallback otherwise */
34
+ export type ResolvedEnv = FlareRegister extends { env: infer E } ? E : unknown;
35
+
36
+ /* resolve serverContext type: user-augmented when set, loose fallback otherwise */
37
+ export type ResolvedServerContext = FlareRegister extends { serverContext: infer SC } ? SC : Record<string, unknown>;
38
+
39
+ /* resolve queryClient: present when hasQueryClient is true, absent otherwise */
40
+ export type ResolvedQueryClient = FlareRegister extends { hasQueryClient: true }
41
+ ? { queryClient: import("@tanstack/solid-query").QueryClient }
42
+ : {};
43
+
44
+ /* resolve auth type: Auth when required, Auth|null when optional, null when false */
45
+ type RegisteredAuth = FlareRegister extends { auth: infer A } ? A : null;
46
+
47
+ export type ResolvedAuth<TAuth extends AuthenticateMode> = TAuth extends true
48
+ ? RegisteredAuth
49
+ : TAuth extends "optional"
50
+ ? RegisteredAuth | null
51
+ : null;
52
+
53
+ /* ── Auth mode utilities ───────────────────────────────────── */
54
+
55
+ /* registered auth modes map — virtualPath → AuthenticateMode */
56
+ type RegisteredAuthModes = FlareRegister extends { authModes: infer M } ? M : {};
57
+
58
+ /** Infer auth mode from a route module result type */
59
+ export type InferAuthMode<T> = T extends { authenticateMode: infer M extends AuthenticateMode } ? M : false;
60
+
61
+ /** Auth mode for a route by virtualPath — reads from generated authModes map */
62
+ export type RouteAuthMode<TPath extends string> = TPath extends keyof RegisteredAuthModes
63
+ ? RegisteredAuthModes[TPath] extends AuthenticateMode
64
+ ? RegisteredAuthModes[TPath]
65
+ : false
66
+ : false;
67
+
68
+ /** Resolve effective auth from parent chain — strictest wins: true > "optional" > false */
69
+ type StrictestAuth<A extends AuthenticateMode, B extends AuthenticateMode> = A extends true
70
+ ? true
71
+ : B extends true
72
+ ? true
73
+ : A extends "optional"
74
+ ? "optional"
75
+ : B extends "optional"
76
+ ? "optional"
77
+ : false;
78
+
79
+ type AuthChain<TPaths extends readonly string[]> = TPaths extends readonly [
80
+ infer First extends string,
81
+ ...infer Rest extends readonly string[],
82
+ ]
83
+ ? StrictestAuth<RouteAuthMode<First>, AuthChain<Rest>>
84
+ : false;
85
+
86
+ /** Initial auth for a route based on parent chain */
87
+ export type ParentAuthResolution<TPath extends string> = TPath extends keyof RegisteredRouteParents
88
+ ? RegisteredRouteParents[TPath] extends readonly string[]
89
+ ? AuthChain<RegisteredRouteParents[TPath]>
90
+ : false
91
+ : false;
92
+
93
+ /* ── Route type utilities ──────────────────────────────────── */
94
+
95
+ /* registered maps — resolve to empty when not augmented */
96
+ type RegisteredRoutes = FlareRegister extends { routes: infer R } ? R : {};
97
+ type RegisteredRouteModules = FlareRegister extends { routeModules: infer M } ? M : {};
98
+ type RegisteredRouteParents = FlareRegister extends { routeParents: infer P } ? P : {};
99
+
100
+ /** All registered URL paths (e.g. "/about", "/blog/[slug]") — string when not registered */
101
+ export type RoutePaths = "routes" extends keyof FlareRegister ? keyof RegisteredRoutes & string : string;
102
+
103
+ /** All registered virtualPaths (e.g. "_root_/about") — string when not registered */
104
+ export type RouteVirtualPaths = "routeModules" extends keyof FlareRegister
105
+ ? keyof RegisteredRouteModules & string
106
+ : string;
107
+
108
+ /** Resolve the route module type for a given virtualPath */
109
+ export type RouteModule<TPath extends string> = TPath extends keyof RegisteredRouteModules
110
+ ? RegisteredRouteModules[TPath]
111
+ : never;
112
+
113
+ /** Extract loaderData type from a route module's render props */
114
+ export type InferLoaderData<T> = T extends { render: (props: infer P) => unknown }
115
+ ? P extends { loaderData: infer L }
116
+ ? L
117
+ : void
118
+ : void;
119
+
120
+ /** Extract own preloader context from a route module's render props */
121
+ export type InferPreloaderContext<T> = T extends { render: (props: infer P) => unknown }
122
+ ? P extends { preloaderContext: infer C }
123
+ ? C
124
+ : {}
125
+ : {};
126
+
127
+ /** Extract params type from a route module's render props */
128
+ export type InferParams<T> = T extends { render: (props: infer P) => unknown }
129
+ ? P extends { location: { params: infer Params } }
130
+ ? Params
131
+ : Record<string, string | string[]>
132
+ : Record<string, string | string[]>;
133
+
134
+ /** Extract search params type from a route module's render props */
135
+ export type InferSearchParams<T> = T extends { render: (props: infer P) => unknown }
136
+ ? P extends { location: { search: infer S } }
137
+ ? S
138
+ : Record<string, string>
139
+ : Record<string, string>;
140
+
141
+ /** Recursively intersect preloader contexts from a tuple of virtualPaths */
142
+ export type PreloaderChain<TPaths extends readonly string[]> = TPaths extends readonly [
143
+ infer First extends string,
144
+ ...infer Rest extends readonly string[],
145
+ ]
146
+ ? InferPreloaderContext<RouteModule<First>> & PreloaderChain<Rest>
147
+ : {};
148
+
149
+ /* ── Route search params utilities ────────────────────────── */
150
+
151
+ type RegisteredRouteSearchParams = FlareRegister extends { routeSearchParams: infer S } ? S : {};
152
+
153
+ /** Resolved search param type for a URL path — specific when registered, loose otherwise */
154
+ export type RouteSearchType<TPath extends string> = "routeSearchParams" extends keyof FlareRegister
155
+ ? TPath extends keyof RegisteredRouteSearchParams
156
+ ? RegisteredRouteSearchParams[TPath]
157
+ : Record<string, unknown>
158
+ : Record<string, unknown>;
159
+
160
+ /** Optional search prop — typed when route has .input(), loose otherwise */
161
+ export type RouteSearchProps<TPath extends string> = { search?: RouteSearchType<TPath> };
162
+
163
+ /* ── Route params utilities ──────────────────────────────── */
164
+
165
+ type RegisteredRouteParams = FlareRegister extends { routeParams: infer P } ? P : {};
166
+
167
+ /** Extract params shape — prefers routeParams (validator-inferred) over routes (URL-derived) */
168
+ export type RouteParams<TPath extends string> = "routeParams" extends keyof FlareRegister
169
+ ? TPath extends keyof RegisteredRouteParams
170
+ ? RegisteredRouteParams[TPath]
171
+ : "routes" extends keyof FlareRegister
172
+ ? TPath extends keyof RegisteredRoutes
173
+ ? RegisteredRoutes[TPath] extends { params: infer P }
174
+ ? P
175
+ : {}
176
+ : {}
177
+ : ExtractPathParams<TPath>
178
+ : "routes" extends keyof FlareRegister
179
+ ? TPath extends keyof RegisteredRoutes
180
+ ? RegisteredRoutes[TPath] extends { params: infer P }
181
+ ? P
182
+ : {}
183
+ : {}
184
+ : ExtractPathParams<TPath>;
185
+
186
+ /** Conditional params prop — required when route has params, forbidden otherwise */
187
+ export type RouteParamsProps<TPath extends string> = "routeParams" extends keyof FlareRegister
188
+ ? _ParamsFromInferred<TPath>
189
+ : "routes" extends keyof FlareRegister
190
+ ? _ParamsForRoute<TPath>
191
+ : _ParamsFromPath<TPath>;
192
+
193
+ type _ParamsFromInferred<TPath extends string> = TPath extends keyof RegisteredRouteParams
194
+ ? [keyof RegisteredRouteParams[TPath]] extends [never]
195
+ ? { params?: never }
196
+ : { params: RegisteredRouteParams[TPath] }
197
+ : "routes" extends keyof FlareRegister
198
+ ? _ParamsForRoute<TPath>
199
+ : _ParamsFromPath<TPath>;
200
+
201
+ type _ParamsForRoute<TPath extends string> = TPath extends keyof RegisteredRoutes
202
+ ? RegisteredRoutes[TPath] extends { params: infer P }
203
+ ? [keyof P] extends [never]
204
+ ? { params?: never }
205
+ : { params: P }
206
+ : { params?: never }
207
+ : { params?: never };
208
+
209
+ type _ParamsFromPath<TPath extends string> = [keyof ExtractPathParams<TPath>] extends [never]
210
+ ? { params?: never }
211
+ : { params: ExtractPathParams<TPath> };
212
+
213
+ /** Loader data type for a route by virtualPath — falls back to unknown for unregistered paths */
214
+ export type RouteLoaderData<TPath extends string> = [RouteModule<TPath>] extends [never]
215
+ ? unknown
216
+ : InferLoaderData<RouteModule<TPath>>;
217
+
218
+ /** Path params type for a route by virtualPath — falls back to ExtractPathParams for unregistered paths */
219
+ export type RoutePathParams<TPath extends string> = [RouteModule<TPath>] extends [never]
220
+ ? ExtractPathParams<TPath>
221
+ : InferParams<RouteModule<TPath>>;
222
+
223
+ /** Search params type for a route by virtualPath — falls back to unknown for unregistered paths */
224
+ export type RouteSearchParams<TPath extends string> = [RouteModule<TPath>] extends [never]
225
+ ? unknown
226
+ : InferSearchParams<RouteModule<TPath>>;
227
+
228
+ /** Parent preloader context for a route (parents only, excludes self) — used by builders */
229
+ export type ParentPreloaderContext<TPath extends string> = TPath extends keyof RegisteredRouteParents
230
+ ? RegisteredRouteParents[TPath] extends readonly string[]
231
+ ? PreloaderChain<RegisteredRouteParents[TPath]>
232
+ : {}
233
+ : {};
234
+
235
+ /** Accumulated preloader context for a route (includes all parent layouts) — falls back to unknown */
236
+ export type RoutePreloaderContext<TPath extends string> = [RouteModule<TPath>] extends [never]
237
+ ? unknown
238
+ : TPath extends keyof RegisteredRouteParents
239
+ ? RegisteredRouteParents[TPath] extends readonly string[]
240
+ ? PreloaderChain<[...RegisteredRouteParents[TPath], TPath]>
241
+ : InferPreloaderContext<RouteModule<TPath>>
242
+ : InferPreloaderContext<RouteModule<TPath>>;
@@ -0,0 +1,294 @@
1
+ import type { Duration } from "../duration/index.ts";
2
+ import type { RedirectOptions } from "../errors/index.ts";
3
+ import type { Location } from "../router-primitives/index.ts";
4
+ import type { FlareStore, FlareStoreEntry, StaticEntryData } from "../store/index.ts";
5
+ import type { RouteParamsProps, RoutePaths, RouteSearchProps } from "./register.ts";
6
+
7
+ export type { FlareStore, FlareStoreEntry, StaticEntryData };
8
+
9
+ export type AuthenticateMode = false | "optional" | true;
10
+
11
+ /**
12
+ * Symbol marker for route builder chain methods that look like render fns
13
+ * but return builder objects. Used to filter them out in SSR/hydration/navigation
14
+ * so Outlet doesn't try to call them as component render fns.
15
+ */
16
+ export const BUILDER_MARKER = Symbol("flare-builder");
17
+
18
+ /* server-only throw helpers — attached to preloader/authorize/loader contexts */
19
+ export interface ServerThrowHelpers {
20
+ notFound: (message?: string) => never;
21
+ redirect: <TPath extends RoutePaths>(options: RedirectOptions<TPath>) => never;
22
+ unauthenticated: (message?: string) => never;
23
+ unauthorized: (message?: string) => never;
24
+ }
25
+
26
+ /* cache config */
27
+ export type PrefetchStrategy = false | "intent" | "render" | "viewport";
28
+
29
+ export interface ClientCacheConfig {
30
+ cacheDeferred?: boolean;
31
+ gcTime?: Duration;
32
+ prefetch?: PrefetchStrategy;
33
+ prefetchGcTime?: Duration;
34
+ prefetchStaleTime?: Duration;
35
+ staleTime?: Duration;
36
+ }
37
+
38
+ export interface SsrCacheConfig {
39
+ key?: (ctx: { params: Record<string, string | string[]> }) => string;
40
+ staleTime?: Duration;
41
+ tags?: string[] | ((ctx: { params: Record<string, string | string[]> }) => string[]);
42
+ ttl?: Duration;
43
+ }
44
+
45
+ export interface CdnCacheConfig {
46
+ maxAge?: Duration;
47
+ private?: boolean;
48
+ swr?: Duration;
49
+ tags?: string[] | ((ctx: { params: Record<string, string | string[]> }) => string[]);
50
+ vary?: string[];
51
+ }
52
+
53
+ /* static/ISR route cache — conditional on path params */
54
+ type _Segment<T extends string> = T extends `[[...${infer N}]]`
55
+ ? { [K in N]: string[] | undefined }
56
+ : T extends `[[${infer N}]]`
57
+ ? { [K in N]: string | undefined }
58
+ : T extends `[...${infer N}]`
59
+ ? { [K in N]: string[] }
60
+ : T extends `[${infer N}]`
61
+ ? { [K in N]: string }
62
+ : {};
63
+
64
+ type _PathParams<T extends string> = T extends `${infer H}/${infer R}` ? _Segment<H> & _PathParams<R> : _Segment<T>;
65
+
66
+ type FlatPathParams<T extends string> = _PathParams<T> extends infer R ? { [K in keyof R]: R[K] } : never;
67
+
68
+ type HasDynamicSegments<T extends string> = T extends `${string}[${string}]${string}` ? true : false;
69
+
70
+ export type StaticDeferMode = "resolve" | "stream";
71
+
72
+ type ParamsFn<TPath extends string> = (ctx: {
73
+ params: Record<string, string | string[]>;
74
+ }) => FlatPathParams<TPath>[] | Promise<FlatPathParams<TPath>[]>;
75
+
76
+ /**
77
+ * SSG config — fully static at build time, no revalidation.
78
+ *
79
+ * - `true` — static, inherits params from parent layouts
80
+ * - `{ defer?: ... }` — static with defer mode
81
+ * - `(ctx) => Params[]` — static with dynamic segments (shorthand)
82
+ * - `{ params, defer? }` — static with dynamic segments + options
83
+ */
84
+ type SsgCacheConfig<TPath extends string> =
85
+ | true
86
+ | { defer?: StaticDeferMode }
87
+ | (HasDynamicSegments<TPath> extends true
88
+ ? ParamsFn<TPath> | { defer?: StaticDeferMode; params: ParamsFn<TPath> }
89
+ : never);
90
+
91
+ /**
92
+ * ISR config — incremental static regeneration.
93
+ *
94
+ * - `true` — on-demand ISR, no build-time prerender, tag-invalidated only
95
+ * - `{ revalidate?, defer? }` — time-based ISR, inherits params from parent layouts
96
+ * - `{ revalidate?, params, defer?, dynamicParams? }` — ISR with dynamic segments
97
+ *
98
+ * When `revalidate` is omitted, pages are cached forever and only
99
+ * refreshed via on-demand revalidation (tags/keys).
100
+ *
101
+ * `dynamicParams` (default `true`): when `false`, unlisted param values return 404.
102
+ * When `true`, unlisted values fall through to on-demand SSR.
103
+ */
104
+ type IsrCacheConfig<TPath extends string> =
105
+ | true
106
+ | { defer?: StaticDeferMode; revalidate?: Duration }
107
+ | (HasDynamicSegments<TPath> extends true
108
+ ? {
109
+ defer?: StaticDeferMode;
110
+ dynamicParams?: boolean;
111
+ params: ParamsFn<TPath>;
112
+ revalidate?: Duration;
113
+ }
114
+ : never);
115
+
116
+ interface BaseCacheConfig {
117
+ cdn?: CdnCacheConfig | false;
118
+ client?: ClientCacheConfig | false;
119
+ }
120
+
121
+ /* ssg, isr, ssr are mutually exclusive rendering strategies via discriminated union */
122
+ export type CacheConfig<TPath extends string = string> = BaseCacheConfig &
123
+ (
124
+ | { isr: IsrCacheConfig<TPath>; ssg?: never; ssr?: never }
125
+ | { isr?: never; ssg: SsgCacheConfig<TPath>; ssr?: never }
126
+ | { isr?: never; ssg?: never; ssr: SsrCacheConfig }
127
+ | { isr?: never; ssg?: never; ssr?: never }
128
+ );
129
+
130
+ /* input validation — uses unified Validator<T> from validation module */
131
+ import type { StandardSchemaV1 } from "../validation/index.ts";
132
+
133
+ export type { Validator } from "../validation/index.ts";
134
+
135
+ /* Params validators receive Record<string, string | string[]> at runtime.
136
+ * Standard Schema validators work directly on the plain object. */
137
+ export type ParamsValidator<T> =
138
+ | StandardSchemaV1<T>
139
+ | { parse: (raw: Record<string, string | string[]>) => T }
140
+ | ((raw: Record<string, string | string[]>) => T);
141
+
142
+ /* Search params validators receive URLSearchParams at runtime.
143
+ * Standard Schema validators get auto-converted to plain object in the pipeline. */
144
+ export type SearchParamsValidator<T> =
145
+ | StandardSchemaV1<T>
146
+ | { parse: (raw: URLSearchParams) => T }
147
+ | ((raw: URLSearchParams) => T);
148
+
149
+ export interface InputConfig<TParams, TSearch> {
150
+ params?: ParamsValidator<TParams>;
151
+ searchParams?: SearchParamsValidator<TSearch>;
152
+ }
153
+
154
+ /* effects */
155
+ export interface EffectsContext<TParams, TSearch> {
156
+ location: {
157
+ current: { hash: string; params: TParams; pathname: string; search: TSearch };
158
+ next: { hash: string; params: TParams; pathname: string; search: TSearch };
159
+ };
160
+ trigger: "initial" | "navigation" | "revalidation";
161
+ }
162
+
163
+ export interface EffectsConfig<TParams, TSearch> {
164
+ loaderDeps?: (ctx: { search: TSearch }) => unknown[];
165
+ shouldRefetch?: (ctx: EffectsContext<TParams, TSearch>) => boolean;
166
+ }
167
+
168
+ /* loader */
169
+ export type LoaderCause = "enter" | "prefetch" | "stay";
170
+
171
+ export interface Deferred<T> {
172
+ __deferred: true;
173
+ key: string;
174
+ prerender?: StaticDeferMode;
175
+ promise: Promise<T>;
176
+ }
177
+
178
+ export type DeferFn = <T>(fn: () => Promise<T>, options?: { key?: string; prerender?: StaticDeferMode }) => Deferred<T>;
179
+
180
+ /* head */
181
+ export interface SeoImage {
182
+ alt?: string;
183
+ height?: number;
184
+ type?: string;
185
+ url: string;
186
+ width?: number;
187
+ }
188
+
189
+ export interface FaviconConfig {
190
+ "96x96"?: string;
191
+ "192x192"?: string;
192
+ "512x512"?: string;
193
+ appleTouchIcon?: string;
194
+ ico?: string;
195
+ svg?: string;
196
+ }
197
+
198
+ export interface RobotsConfig {
199
+ follow?: boolean;
200
+ index?: boolean;
201
+ "max-image-preview"?: "large" | "none" | "standard";
202
+ "max-snippet"?: number;
203
+ "max-video-preview"?: number;
204
+ noarchive?: boolean;
205
+ noimageindex?: boolean;
206
+ }
207
+
208
+ export interface OpenGraphConfig {
209
+ alternateLocale?: string[];
210
+ audio?: Array<{ secureUrl?: string; type?: string; url: string }>;
211
+ description?: string;
212
+ images?: SeoImage[];
213
+ locale?: string;
214
+ siteName?: string;
215
+ title?: string;
216
+ type?: "article" | "product" | "profile" | "website";
217
+ url?: string;
218
+ videos?: Array<{
219
+ height?: number;
220
+ secureUrl?: string;
221
+ type?: string;
222
+ url: string;
223
+ width?: number;
224
+ }>;
225
+ }
226
+
227
+ export interface TwitterConfig {
228
+ card?: "app" | "player" | "summary" | "summary_large_image";
229
+ creator?: string;
230
+ description?: string;
231
+ images?: Array<{ alt?: string; url: string }>;
232
+ site?: string;
233
+ title?: string;
234
+ }
235
+
236
+ export interface MetaConfig {
237
+ applicationName?: string;
238
+ appleMobileWebAppCapable?: "no" | "yes";
239
+ appleMobileWebAppStatusBarStyle?: "black" | "black-translucent" | "default";
240
+ appleMobileWebAppTitle?: string;
241
+ author?: string;
242
+ charset?: string;
243
+ creator?: string;
244
+ generator?: string;
245
+ manifest?: string;
246
+ mobileWebAppCapable?: "no" | "yes";
247
+ publisher?: string;
248
+ viewport?: false | string;
249
+ }
250
+
251
+ export interface CustomHeadConfig {
252
+ links?: Array<Record<string, string>>;
253
+ meta?: Array<Record<string, string>>;
254
+ scripts?: Array<{ async?: boolean; children?: string; extra?: Record<string, string>; src?: string; type?: string }>;
255
+ styles?: Array<{ children: string }>;
256
+ }
257
+
258
+ export interface HeadConfig {
259
+ canonical?: string;
260
+ css?: string | string[];
261
+ custom?: CustomHeadConfig;
262
+ description?: string;
263
+ favicons?: FaviconConfig;
264
+ images?: SeoImage[];
265
+ jsonLd?: Array<Record<string, unknown>>;
266
+ keywords?: string;
267
+ languages?: Record<string, string>;
268
+ meta?: MetaConfig;
269
+ openGraph?: OpenGraphConfig;
270
+ robots?: RobotsConfig;
271
+ title?: string;
272
+ twitter?: TwitterConfig;
273
+ }
274
+
275
+ export interface HeadOptions {
276
+ replace?: boolean;
277
+ }
278
+
279
+ export type ResponseHeaders = Record<string, string | string[]>;
280
+
281
+ /* type-safe URL building — shared by FlareRouter (client) and server contexts */
282
+ export type BuildUrlOptions<TPath extends RoutePaths = RoutePaths> = {
283
+ hash?: string;
284
+ to: TPath;
285
+ } & RouteParamsProps<TPath> &
286
+ RouteSearchProps<TPath>;
287
+
288
+ /* server-only URL helpers — attached to preloader/authorize/loader/head/headers contexts */
289
+ export interface ServerUrlHelpers {
290
+ buildUrl: <TPath extends RoutePaths>(options: BuildUrlOptions<TPath>) => string;
291
+ }
292
+
293
+ /* re-export Location for convenience */
294
+ export type { Location };
@@ -0,0 +1,91 @@
1
+ import type { DirectionConfig } from "../direction.ts";
2
+ import type { LocaleConfig } from "../locale/index.tsx";
3
+ import type { LocationRewrite } from "../rewrite/index.ts";
4
+ import type { ClientCacheConfig } from "../route-builder/types.ts";
5
+ import type { Location, TreeNode } from "../router-primitives/types.ts";
6
+ import { parseFlareState as _parseFlareState } from "../state-parser/index.ts";
7
+ import type { ThemeConfig } from "../theme.ts";
8
+
9
+ export type PrefetchStrategy = false | "intent" | "render" | "viewport";
10
+ export type TrailingSlashMode = "always" | "never" | "preserve";
11
+ export type ViewTransitionDefaults = boolean | { types: string[] };
12
+
13
+ export interface RouterCacheConfig {
14
+ client?: ClientCacheConfig | false;
15
+ }
16
+
17
+ export interface RouterConfig {
18
+ basePath?: string;
19
+ cache?: RouterCacheConfig;
20
+ caseSensitive?: boolean;
21
+ direction?: DirectionConfig;
22
+ getScrollRestorationKey?: (location: Location) => string;
23
+ layouts: Record<string, () => Promise<{ default: unknown }>>;
24
+ locale?: LocaleConfig;
25
+ notFoundMode?: "fuzzy" | "root";
26
+ queryClientGetter?: () => unknown;
27
+ rewrite?: LocationRewrite;
28
+ routeCacheMaxEntries?: number;
29
+ routeTree: TreeNode;
30
+ scrollRestoration?: boolean;
31
+ scrollRestorationBehavior?: "auto" | "smooth";
32
+ scrollRestorationMaxEntries?: number;
33
+ theme?: ThemeConfig;
34
+ trailingSlash?: TrailingSlashMode;
35
+ viewTransitions?: ViewTransitionDefaults;
36
+ }
37
+
38
+ export interface SerializableRouterConfig {
39
+ basePath?: string;
40
+ cache?: RouterCacheConfig;
41
+ caseSensitive?: boolean;
42
+ direction?: DirectionConfig;
43
+ keepalive?: false | number;
44
+ locale?: LocaleConfig;
45
+ notFoundMode?: "fuzzy" | "root";
46
+ routeCacheMaxEntries?: number;
47
+ scrollRestoration?: boolean;
48
+ scrollRestorationBehavior?: "auto" | "smooth";
49
+ scrollRestorationMaxEntries?: number;
50
+ theme?: ThemeConfig;
51
+ trailingSlash?: TrailingSlashMode;
52
+ viewTransitions?: ViewTransitionDefaults;
53
+ }
54
+
55
+ const MARKER = Symbol.for("flare/router-config");
56
+
57
+ export interface MarkedRouterConfig extends RouterConfig {
58
+ [key: symbol]: true;
59
+ }
60
+
61
+ export function createRouter(config: RouterConfig): MarkedRouterConfig {
62
+ return { ...config, [MARKER]: true } as MarkedRouterConfig;
63
+ }
64
+
65
+ export function isRouterConfig(value: unknown): value is MarkedRouterConfig {
66
+ return (
67
+ value !== null &&
68
+ value !== undefined &&
69
+ typeof value === "object" &&
70
+ MARKER in (value as Record<symbol, unknown>) &&
71
+ (value as Record<symbol, unknown>)[MARKER] === true
72
+ );
73
+ }
74
+
75
+ export function extractSerializable(router: MarkedRouterConfig): SerializableRouterConfig {
76
+ const {
77
+ getScrollRestorationKey: _gsr,
78
+ layouts: _l,
79
+ queryClientGetter: _q,
80
+ rewrite: _rw,
81
+ routeTree: _rt,
82
+ ...clean
83
+ } = router;
84
+
85
+ /* remove symbol marker */
86
+ const result = { ...clean } as Record<string | symbol, unknown>;
87
+ delete result[MARKER];
88
+ return result as SerializableRouterConfig;
89
+ }
90
+
91
+ export const parseFlareState = _parseFlareState;
@@ -0,0 +1,25 @@
1
+ export { buildLocation } from "./location.ts";
2
+ export { computeMatchId, parseMatchId } from "./match-id.ts";
3
+ export {
4
+ deriveLayouts,
5
+ deriveParams,
6
+ extractLayoutKey,
7
+ isParamSegment,
8
+ isRootLayoutPath,
9
+ stripGroups,
10
+ toUrlPath,
11
+ toVirtualPath,
12
+ } from "./paths.ts";
13
+ export { createTreeNode, insertRoute, matchRoute, matchRoutePartial, toLocaleMatch } from "./tree.ts";
14
+ export type { LocaleMatch } from "./tree.ts";
15
+ export type {
16
+ ComputeMatchIdOptions,
17
+ Location,
18
+ MatchResult,
19
+ ParsedMatchId,
20
+ PrefetchStrategy,
21
+ RouteData,
22
+ RouteMeta,
23
+ RouteMetaClient,
24
+ TreeNode,
25
+ } from "./types.ts";
@@ -0,0 +1,29 @@
1
+ import type { SearchParams } from "../url/index.ts";
2
+ import { parseSearchParams } from "../url/index.ts";
3
+ import type { Location } from "./types.ts";
4
+
5
+ export function buildLocation<
6
+ TParams extends Record<string, string | string[]>,
7
+ TSearch = SearchParams,
8
+ THash = string,
9
+ >(
10
+ url: URL,
11
+ params: TParams,
12
+ virtualPath: string,
13
+ variablePath: string,
14
+ search?: TSearch,
15
+ hash?: THash,
16
+ ): Location<TParams, TSearch, THash> {
17
+ const resolvedSearch = search ?? (parseSearchParams(url.searchParams) as TSearch);
18
+ const resolvedHash = hash ?? (url.hash as THash);
19
+
20
+ return {
21
+ hash: resolvedHash,
22
+ params,
23
+ pathname: url.pathname,
24
+ search: resolvedSearch,
25
+ url,
26
+ variablePath,
27
+ virtualPath,
28
+ };
29
+ }