vorma 0.84.0 → 0.85.0-pre.1

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 (330) hide show
  1. package/README.md +1 -1
  2. package/kit/_typescript/converters/converters.ts +6 -5
  3. package/kit/_typescript/cookies/cookies.ts +9 -2
  4. package/kit/_typescript/csrf/AGENTS.md +2 -0
  5. package/kit/_typescript/debounce/debounce.ts +6 -2
  6. package/kit/_typescript/json/deep_equals.ts +14 -5
  7. package/kit/_typescript/json/search_param_serializer.ts +3 -3
  8. package/kit/_typescript/matcher/AGENTS.md +2 -0
  9. package/kit/_typescript/matcher/find_best_match.ts +34 -25
  10. package/kit/_typescript/matcher/register.ts +11 -10
  11. package/kit/_typescript/theme/theme.ts +41 -16
  12. package/kit/_typescript/url/url.ts +25 -1
  13. package/npm_dist/.buildts_cache.json +1 -0
  14. package/npm_dist/kit/_typescript/chunk-LNARYAGF.js +203 -0
  15. package/npm_dist/kit/_typescript/chunk-LNARYAGF.js.map +7 -0
  16. package/npm_dist/kit/_typescript/converters/converters.d.ts +4 -4
  17. package/npm_dist/kit/_typescript/converters/converters.d.ts.map +1 -1
  18. package/npm_dist/kit/_typescript/converters/converters.js.map +2 -2
  19. package/npm_dist/kit/_typescript/cookies/cookies.d.ts.map +1 -1
  20. package/npm_dist/kit/_typescript/cookies/cookies.js +9 -2
  21. package/npm_dist/kit/_typescript/cookies/cookies.js.map +2 -2
  22. package/npm_dist/kit/_typescript/debounce/debounce.d.ts.map +1 -1
  23. package/npm_dist/kit/_typescript/debounce/debounce.js +6 -2
  24. package/npm_dist/kit/_typescript/debounce/debounce.js.map +2 -2
  25. package/npm_dist/kit/_typescript/json/deep_equals.d.ts.map +1 -1
  26. package/npm_dist/kit/_typescript/json/json.js +11 -5
  27. package/npm_dist/kit/_typescript/json/json.js.map +2 -2
  28. package/npm_dist/kit/_typescript/json/search_param_serializer.d.ts +1 -1
  29. package/npm_dist/kit/_typescript/json/search_param_serializer.d.ts.map +1 -1
  30. package/npm_dist/kit/_typescript/matcher/find_best_match.d.ts.map +1 -1
  31. package/npm_dist/kit/_typescript/matcher/find_best_match.js +27 -18
  32. package/npm_dist/kit/_typescript/matcher/find_best_match.js.map +2 -2
  33. package/npm_dist/kit/_typescript/matcher/find_nested_matches.js +1 -1
  34. package/npm_dist/kit/_typescript/matcher/register.d.ts.map +1 -1
  35. package/npm_dist/kit/_typescript/matcher/register.js +1 -1
  36. package/npm_dist/kit/_typescript/theme/theme.d.ts.map +1 -1
  37. package/npm_dist/kit/_typescript/theme/theme.js +26 -16
  38. package/npm_dist/kit/_typescript/theme/theme.js.map +2 -2
  39. package/npm_dist/kit/_typescript/url/url.d.ts +10 -0
  40. package/npm_dist/kit/_typescript/url/url.d.ts.map +1 -1
  41. package/npm_dist/kit/_typescript/url/url.js +16 -1
  42. package/npm_dist/kit/_typescript/url/url.js.map +2 -2
  43. package/npm_dist/vormaclient/client/buildtime.d.ts +5 -0
  44. package/npm_dist/vormaclient/client/buildtime.d.ts.map +1 -0
  45. package/npm_dist/vormaclient/client/buildtime.js +7 -0
  46. package/npm_dist/vormaclient/client/buildtime.js.map +7 -0
  47. package/npm_dist/vormaclient/client/chunk-FSS7CPEB.js +4352 -0
  48. package/npm_dist/vormaclient/client/chunk-FSS7CPEB.js.map +7 -0
  49. package/npm_dist/vormaclient/client/chunk-SNLAUOLY.js +4411 -0
  50. package/npm_dist/vormaclient/client/chunk-SNLAUOLY.js.map +7 -0
  51. package/npm_dist/vormaclient/client/chunk-UZYFIXMX.js +4400 -0
  52. package/npm_dist/vormaclient/client/chunk-UZYFIXMX.js.map +7 -0
  53. package/npm_dist/vormaclient/client/chunk-X2HRWFEN.js +4411 -0
  54. package/npm_dist/vormaclient/client/chunk-X2HRWFEN.js.map +7 -0
  55. package/npm_dist/vormaclient/client/chunk-Z5RFOZDO.js +4494 -0
  56. package/npm_dist/vormaclient/client/chunk-Z5RFOZDO.js.map +7 -0
  57. package/npm_dist/vormaclient/client/index.d.ts +11 -0
  58. package/npm_dist/vormaclient/client/index.d.ts.map +1 -0
  59. package/npm_dist/vormaclient/client/index.js +197 -0
  60. package/npm_dist/vormaclient/client/index.js.map +7 -0
  61. package/npm_dist/vormaclient/client/internal.d.ts +7 -0
  62. package/npm_dist/vormaclient/client/internal.d.ts.map +1 -0
  63. package/npm_dist/vormaclient/client/internal.js +161 -0
  64. package/npm_dist/vormaclient/client/internal.js.map +7 -0
  65. package/npm_dist/{internal/framework/_typescript/client/src/vorma_ctx/vorma_ctx.d.ts → vormaclient/client/src/app/context.d.ts} +35 -21
  66. package/npm_dist/vormaclient/client/src/app/context.d.ts.map +1 -0
  67. package/npm_dist/{internal/framework/_typescript/client/src/vorma_app_helpers/vorma_app_helpers.d.ts → vormaclient/client/src/app/helpers.d.ts} +40 -10
  68. package/npm_dist/vormaclient/client/src/app/helpers.d.ts.map +1 -0
  69. package/npm_dist/vormaclient/client/src/app/init.d.ts +13 -0
  70. package/npm_dist/vormaclient/client/src/app/init.d.ts.map +1 -0
  71. package/npm_dist/vormaclient/client/src/client.d.ts +33 -0
  72. package/npm_dist/vormaclient/client/src/client.d.ts.map +1 -0
  73. package/npm_dist/vormaclient/client/src/core/extras.d.ts +31 -0
  74. package/npm_dist/vormaclient/client/src/core/extras.d.ts.map +1 -0
  75. package/npm_dist/{internal/framework/_typescript/client/src → vormaclient/client/src/core}/links.d.ts +12 -11
  76. package/npm_dist/vormaclient/client/src/core/links.d.ts.map +1 -0
  77. package/npm_dist/vormaclient/client/src/core/navigation/begin_navigation.d.ts +20 -0
  78. package/npm_dist/vormaclient/client/src/core/navigation/begin_navigation.d.ts.map +1 -0
  79. package/npm_dist/vormaclient/client/src/core/navigation/begin_navigation_flow.d.ts +80 -0
  80. package/npm_dist/vormaclient/client/src/core/navigation/begin_navigation_flow.d.ts.map +1 -0
  81. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data.d.ts +3 -0
  82. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data.d.ts.map +1 -0
  83. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data_server.d.ts +50 -0
  84. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data_server.d.ts.map +1 -0
  85. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data_skip.d.ts +18 -0
  86. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data_skip.d.ts.map +1 -0
  87. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data_skip_match.d.ts +41 -0
  88. package/npm_dist/vormaclient/client/src/core/navigation/fetch_route_data_skip_match.d.ts.map +1 -0
  89. package/npm_dist/vormaclient/client/src/core/navigation/navigation_controls.d.ts +18 -0
  90. package/npm_dist/vormaclient/client/src/core/navigation/navigation_controls.d.ts.map +1 -0
  91. package/npm_dist/vormaclient/client/src/core/navigation/runtime.d.ts +9 -0
  92. package/npm_dist/vormaclient/client/src/core/navigation/runtime.d.ts.map +1 -0
  93. package/npm_dist/vormaclient/client/src/core/navigation/runtime_navigation_outcome.d.ts +24 -0
  94. package/npm_dist/vormaclient/client/src/core/navigation/runtime_navigation_outcome.d.ts.map +1 -0
  95. package/npm_dist/vormaclient/client/src/core/navigation/runtime_slots.d.ts +26 -0
  96. package/npm_dist/vormaclient/client/src/core/navigation/runtime_slots.d.ts.map +1 -0
  97. package/npm_dist/vormaclient/client/src/core/navigation/runtime_submit.d.ts +16 -0
  98. package/npm_dist/vormaclient/client/src/core/navigation/runtime_submit.d.ts.map +1 -0
  99. package/npm_dist/vormaclient/client/src/core/navigation/types.d.ts +86 -0
  100. package/npm_dist/vormaclient/client/src/core/navigation/types.d.ts.map +1 -0
  101. package/npm_dist/{internal/framework/_typescript/client/src/redirects → vormaclient/client/src/core}/redirects.d.ts +3 -2
  102. package/npm_dist/vormaclient/client/src/core/redirects.d.ts.map +1 -0
  103. package/npm_dist/vormaclient/client/src/core/render_runtime.d.ts +62 -0
  104. package/npm_dist/vormaclient/client/src/core/render_runtime.d.ts.map +1 -0
  105. package/npm_dist/{internal/framework/_typescript/client/src → vormaclient/client/src/platform}/events.d.ts +1 -1
  106. package/npm_dist/vormaclient/client/src/platform/events.d.ts.map +1 -0
  107. package/npm_dist/vormaclient/client/src/platform/history.d.ts +26 -0
  108. package/npm_dist/vormaclient/client/src/platform/history.d.ts.map +1 -0
  109. package/npm_dist/vormaclient/client/src/platform/safety.d.ts +9 -0
  110. package/npm_dist/vormaclient/client/src/platform/safety.d.ts.map +1 -0
  111. package/npm_dist/vormaclient/client/src/platform/scroll.d.ts +22 -0
  112. package/npm_dist/vormaclient/client/src/platform/scroll.d.ts.map +1 -0
  113. package/npm_dist/vormaclient/client/src/platform/url.d.ts +35 -0
  114. package/npm_dist/vormaclient/client/src/platform/url.d.ts.map +1 -0
  115. package/npm_dist/vormaclient/client/src/tests/contracts/contract_test_harness.d.ts +99 -0
  116. package/npm_dist/vormaclient/client/src/tests/contracts/contract_test_harness.d.ts.map +1 -0
  117. package/npm_dist/{internal/framework/_typescript/client/src/head_elements/head_elements.d.ts → vormaclient/client/src/ui/head.d.ts} +2 -2
  118. package/npm_dist/vormaclient/client/src/ui/head.d.ts.map +1 -0
  119. package/npm_dist/vormaclient/client/src/ui/helpers.d.ts +62 -0
  120. package/npm_dist/vormaclient/client/src/ui/helpers.d.ts.map +1 -0
  121. package/npm_dist/vormaclient/client/src/ui/route_outlet_runtime.d.ts +44 -0
  122. package/npm_dist/vormaclient/client/src/ui/route_outlet_runtime.d.ts.map +1 -0
  123. package/npm_dist/vormaclient/client/vitest.dist.config.d.ts +3 -0
  124. package/npm_dist/vormaclient/client/vitest.dist.config.d.ts.map +1 -0
  125. package/npm_dist/vormaclient/create/main.d.ts.map +1 -0
  126. package/npm_dist/vormaclient/create/runtime_helpers.d.ts +28 -0
  127. package/npm_dist/vormaclient/create/runtime_helpers.d.ts.map +1 -0
  128. package/npm_dist/vormaclient/preact/index.d.ts.map +1 -0
  129. package/npm_dist/vormaclient/preact/index.js +284 -0
  130. package/npm_dist/vormaclient/preact/index.js.map +7 -0
  131. package/npm_dist/vormaclient/preact/src/helpers.d.ts.map +1 -0
  132. package/npm_dist/{internal/framework/_typescript → vormaclient}/preact/src/link.d.ts +4 -4
  133. package/npm_dist/vormaclient/preact/src/link.d.ts.map +1 -0
  134. package/npm_dist/{internal/framework/_typescript → vormaclient}/preact/src/preact.d.ts +5 -5
  135. package/npm_dist/vormaclient/preact/src/preact.d.ts.map +1 -0
  136. package/npm_dist/vormaclient/react/index.d.ts.map +1 -0
  137. package/npm_dist/vormaclient/react/index.js +308 -0
  138. package/npm_dist/vormaclient/react/index.js.map +7 -0
  139. package/npm_dist/vormaclient/react/src/helpers.d.ts.map +1 -0
  140. package/npm_dist/{internal/framework/_typescript → vormaclient}/react/src/link.d.ts +3 -3
  141. package/npm_dist/vormaclient/react/src/link.d.ts.map +1 -0
  142. package/npm_dist/vormaclient/react/src/react.d.ts.map +1 -0
  143. package/npm_dist/vormaclient/solid/index.d.ts.map +1 -0
  144. package/npm_dist/vormaclient/solid/index.js +453 -0
  145. package/npm_dist/vormaclient/solid/index.js.map +7 -0
  146. package/npm_dist/vormaclient/solid/src/helpers.d.ts.map +1 -0
  147. package/npm_dist/{internal/framework/_typescript → vormaclient}/solid/src/link.d.ts +4 -3
  148. package/npm_dist/vormaclient/solid/src/link.d.ts.map +1 -0
  149. package/npm_dist/{internal/framework/_typescript → vormaclient}/solid/src/solid.d.ts +4 -4
  150. package/npm_dist/vormaclient/solid/src/solid.d.ts.map +1 -0
  151. package/npm_dist/{internal/framework/_typescript → vormaclient}/vite/vite.d.ts +3 -1
  152. package/npm_dist/vormaclient/vite/vite.d.ts.map +1 -0
  153. package/npm_dist/vormaclient/vite/vite.js +177 -0
  154. package/npm_dist/vormaclient/vite/vite.js.map +7 -0
  155. package/package.json +35 -26
  156. package/tsconfig.base.json +30 -1
  157. package/{internal/framework/_typescript/client/src/static_route_defs/route_def_helpers.ts → vormaclient/client/buildtime.ts} +0 -9
  158. package/vormaclient/client/dist_tests/ambient_modules.d.ts +18 -0
  159. package/vormaclient/client/dist_tests/dist_test_harness.ts +94 -0
  160. package/vormaclient/client/dist_tests/tsconfig.json +8 -0
  161. package/vormaclient/client/index.ts +56 -0
  162. package/vormaclient/client/internal.ts +26 -0
  163. package/vormaclient/client/src/app/context.ts +188 -0
  164. package/{internal/framework/_typescript/client/src/vorma_app_helpers/vorma_app_helpers.ts → vormaclient/client/src/app/helpers.ts} +162 -55
  165. package/vormaclient/client/src/app/init.ts +221 -0
  166. package/vormaclient/client/src/client.ts +116 -0
  167. package/vormaclient/client/src/core/extras.ts +350 -0
  168. package/vormaclient/client/src/core/links.ts +464 -0
  169. package/vormaclient/client/src/core/navigation/begin_navigation.ts +177 -0
  170. package/vormaclient/client/src/core/navigation/begin_navigation_flow.ts +328 -0
  171. package/vormaclient/client/src/core/navigation/fetch_route_data.ts +68 -0
  172. package/vormaclient/client/src/core/navigation/fetch_route_data_server.ts +264 -0
  173. package/vormaclient/client/src/core/navigation/fetch_route_data_skip.ts +225 -0
  174. package/vormaclient/client/src/core/navigation/fetch_route_data_skip_match.ts +270 -0
  175. package/vormaclient/client/src/core/navigation/navigation_controls.ts +203 -0
  176. package/vormaclient/client/src/core/navigation/runtime.ts +234 -0
  177. package/vormaclient/client/src/core/navigation/runtime_navigation_outcome.ts +544 -0
  178. package/vormaclient/client/src/core/navigation/runtime_slots.ts +324 -0
  179. package/vormaclient/client/src/core/navigation/runtime_submit.ts +516 -0
  180. package/vormaclient/client/src/core/navigation/types.ts +103 -0
  181. package/vormaclient/client/src/core/redirects.ts +417 -0
  182. package/vormaclient/client/src/core/render_runtime.ts +724 -0
  183. package/vormaclient/client/src/import_meta.d.ts +21 -0
  184. package/{internal/framework/_typescript/client/src → vormaclient/client/src/platform}/events.ts +18 -9
  185. package/vormaclient/client/src/platform/history.ts +245 -0
  186. package/vormaclient/client/src/platform/safety.ts +72 -0
  187. package/vormaclient/client/src/platform/scroll.ts +191 -0
  188. package/vormaclient/client/src/platform/url.ts +137 -0
  189. package/vormaclient/client/src/tests/contracts/README.md +25 -0
  190. package/vormaclient/client/src/tests/contracts/contract_test_harness.ts +504 -0
  191. package/{internal/framework/_typescript/client/src/head_elements/head_elements.ts → vormaclient/client/src/ui/head.ts} +154 -66
  192. package/vormaclient/client/src/ui/helpers.ts +262 -0
  193. package/vormaclient/client/src/ui/route_outlet_runtime.ts +258 -0
  194. package/vormaclient/client/tsconfig.json +4 -0
  195. package/vormaclient/client/vitest.dist.config.ts +74 -0
  196. package/{internal/framework/_typescript → vormaclient}/create/main.ts +51 -36
  197. package/{internal/framework/_typescript → vormaclient}/create/package.json +7 -4
  198. package/{internal/framework/_typescript → vormaclient}/create/pnpm-lock.yaml +14 -14
  199. package/vormaclient/create/runtime_helpers.ts +164 -0
  200. package/vormaclient/create/tsconfig.json +3 -0
  201. package/{internal/framework/_typescript → vormaclient}/preact/src/helpers.ts +16 -27
  202. package/{internal/framework/_typescript → vormaclient}/preact/src/link.tsx +18 -26
  203. package/vormaclient/preact/src/preact.tsx +247 -0
  204. package/{internal/framework/_typescript → vormaclient}/preact/tsconfig.json +1 -1
  205. package/{internal/framework/_typescript → vormaclient}/react/src/helpers.ts +18 -19
  206. package/{internal/framework/_typescript → vormaclient}/react/src/link.tsx +18 -28
  207. package/vormaclient/react/src/react.tsx +239 -0
  208. package/{internal/framework/_typescript → vormaclient}/react/tsconfig.json +1 -1
  209. package/{internal/framework/_typescript → vormaclient}/solid/src/helpers.ts +27 -25
  210. package/{internal/framework/_typescript → vormaclient}/solid/src/link.tsx +18 -23
  211. package/vormaclient/solid/src/solid.tsx +468 -0
  212. package/{internal/framework/_typescript → vormaclient}/solid/tsconfig.json +1 -1
  213. package/vormaclient/vite/tsconfig.json +3 -0
  214. package/vormaclient/vite/vite.ts +256 -0
  215. package/internal/framework/_typescript/client/index.ts +0 -64
  216. package/internal/framework/_typescript/client/src/asset_manager.ts +0 -67
  217. package/internal/framework/_typescript/client/src/client.ts +0 -1201
  218. package/internal/framework/_typescript/client/src/client_loaders.ts +0 -249
  219. package/internal/framework/_typescript/client/src/component_loader.ts +0 -105
  220. package/internal/framework/_typescript/client/src/error_boundary.ts +0 -7
  221. package/internal/framework/_typescript/client/src/global_loading_indicator/global_loading_indicator.ts +0 -125
  222. package/internal/framework/_typescript/client/src/hard_reload.ts +0 -1
  223. package/internal/framework/_typescript/client/src/history/history.ts +0 -118
  224. package/internal/framework/_typescript/client/src/history/npm_history_types.ts +0 -83
  225. package/internal/framework/_typescript/client/src/hmr/hmr.ts +0 -71
  226. package/internal/framework/_typescript/client/src/init_client.ts +0 -134
  227. package/internal/framework/_typescript/client/src/links.ts +0 -218
  228. package/internal/framework/_typescript/client/src/redirects/redirects.ts +0 -203
  229. package/internal/framework/_typescript/client/src/rendering.ts +0 -135
  230. package/internal/framework/_typescript/client/src/resolve_public_href.ts +0 -15
  231. package/internal/framework/_typescript/client/src/scroll_state_manager.ts +0 -100
  232. package/internal/framework/_typescript/client/src/ui_lib_impl_helpers/link_components.ts +0 -131
  233. package/internal/framework/_typescript/client/src/ui_lib_impl_helpers/route_components.ts +0 -56
  234. package/internal/framework/_typescript/client/src/ui_lib_impl_helpers/typed_navigate.ts +0 -58
  235. package/internal/framework/_typescript/client/src/utils/errors.ts +0 -10
  236. package/internal/framework/_typescript/client/src/utils/logging.ts +0 -7
  237. package/internal/framework/_typescript/client/src/vorma_ctx/vorma_ctx.ts +0 -128
  238. package/internal/framework/_typescript/client/src/window_focus_revalidation/window_focus_revalidation.ts +0 -32
  239. package/internal/framework/_typescript/client/tsconfig.json +0 -3
  240. package/internal/framework/_typescript/create/tsconfig.json +0 -3
  241. package/internal/framework/_typescript/preact/src/preact.tsx +0 -191
  242. package/internal/framework/_typescript/react/src/react.tsx +0 -299
  243. package/internal/framework/_typescript/solid/src/solid.tsx +0 -204
  244. package/internal/framework/_typescript/vite/tsconfig.json +0 -3
  245. package/internal/framework/_typescript/vite/vite.ts +0 -93
  246. package/npm_dist/internal/framework/_typescript/client/index.d.ts +0 -17
  247. package/npm_dist/internal/framework/_typescript/client/index.d.ts.map +0 -1
  248. package/npm_dist/internal/framework/_typescript/client/index.js +0 -2489
  249. package/npm_dist/internal/framework/_typescript/client/index.js.map +0 -7
  250. package/npm_dist/internal/framework/_typescript/client/src/asset_manager.d.ts +0 -6
  251. package/npm_dist/internal/framework/_typescript/client/src/asset_manager.d.ts.map +0 -1
  252. package/npm_dist/internal/framework/_typescript/client/src/client.d.ts +0 -119
  253. package/npm_dist/internal/framework/_typescript/client/src/client.d.ts.map +0 -1
  254. package/npm_dist/internal/framework/_typescript/client/src/client_loaders.d.ts +0 -18
  255. package/npm_dist/internal/framework/_typescript/client/src/client_loaders.d.ts.map +0 -1
  256. package/npm_dist/internal/framework/_typescript/client/src/component_loader.d.ts +0 -10
  257. package/npm_dist/internal/framework/_typescript/client/src/component_loader.d.ts.map +0 -1
  258. package/npm_dist/internal/framework/_typescript/client/src/error_boundary.d.ts +0 -3
  259. package/npm_dist/internal/framework/_typescript/client/src/error_boundary.d.ts.map +0 -1
  260. package/npm_dist/internal/framework/_typescript/client/src/events.d.ts.map +0 -1
  261. package/npm_dist/internal/framework/_typescript/client/src/global_loading_indicator/global_loading_indicator.d.ts +0 -12
  262. package/npm_dist/internal/framework/_typescript/client/src/global_loading_indicator/global_loading_indicator.d.ts.map +0 -1
  263. package/npm_dist/internal/framework/_typescript/client/src/hard_reload.d.ts +0 -2
  264. package/npm_dist/internal/framework/_typescript/client/src/hard_reload.d.ts.map +0 -1
  265. package/npm_dist/internal/framework/_typescript/client/src/head_elements/head_elements.d.ts.map +0 -1
  266. package/npm_dist/internal/framework/_typescript/client/src/history/history.d.ts +0 -14
  267. package/npm_dist/internal/framework/_typescript/client/src/history/history.d.ts.map +0 -1
  268. package/npm_dist/internal/framework/_typescript/client/src/history/npm_history_types.d.ts +0 -84
  269. package/npm_dist/internal/framework/_typescript/client/src/history/npm_history_types.d.ts.map +0 -1
  270. package/npm_dist/internal/framework/_typescript/client/src/hmr/hmr.d.ts +0 -3
  271. package/npm_dist/internal/framework/_typescript/client/src/hmr/hmr.d.ts.map +0 -1
  272. package/npm_dist/internal/framework/_typescript/client/src/init_client.d.ts +0 -9
  273. package/npm_dist/internal/framework/_typescript/client/src/init_client.d.ts.map +0 -1
  274. package/npm_dist/internal/framework/_typescript/client/src/links.d.ts.map +0 -1
  275. package/npm_dist/internal/framework/_typescript/client/src/redirects/redirects.d.ts.map +0 -1
  276. package/npm_dist/internal/framework/_typescript/client/src/rendering.d.ts +0 -18
  277. package/npm_dist/internal/framework/_typescript/client/src/rendering.d.ts.map +0 -1
  278. package/npm_dist/internal/framework/_typescript/client/src/resolve_public_href.d.ts +0 -2
  279. package/npm_dist/internal/framework/_typescript/client/src/resolve_public_href.d.ts.map +0 -1
  280. package/npm_dist/internal/framework/_typescript/client/src/scroll_state_manager.d.ts +0 -22
  281. package/npm_dist/internal/framework/_typescript/client/src/scroll_state_manager.d.ts.map +0 -1
  282. package/npm_dist/internal/framework/_typescript/client/src/static_route_defs/route_def_helpers.d.ts +0 -12
  283. package/npm_dist/internal/framework/_typescript/client/src/static_route_defs/route_def_helpers.d.ts.map +0 -1
  284. package/npm_dist/internal/framework/_typescript/client/src/ui_lib_impl_helpers/link_components.d.ts +0 -28
  285. package/npm_dist/internal/framework/_typescript/client/src/ui_lib_impl_helpers/link_components.d.ts.map +0 -1
  286. package/npm_dist/internal/framework/_typescript/client/src/ui_lib_impl_helpers/route_components.d.ts +0 -18
  287. package/npm_dist/internal/framework/_typescript/client/src/ui_lib_impl_helpers/route_components.d.ts.map +0 -1
  288. package/npm_dist/internal/framework/_typescript/client/src/ui_lib_impl_helpers/typed_navigate.d.ts +0 -11
  289. package/npm_dist/internal/framework/_typescript/client/src/ui_lib_impl_helpers/typed_navigate.d.ts.map +0 -1
  290. package/npm_dist/internal/framework/_typescript/client/src/utils/errors.d.ts +0 -3
  291. package/npm_dist/internal/framework/_typescript/client/src/utils/errors.d.ts.map +0 -1
  292. package/npm_dist/internal/framework/_typescript/client/src/utils/logging.d.ts +0 -3
  293. package/npm_dist/internal/framework/_typescript/client/src/utils/logging.d.ts.map +0 -1
  294. package/npm_dist/internal/framework/_typescript/client/src/vorma_app_helpers/vorma_app_helpers.d.ts.map +0 -1
  295. package/npm_dist/internal/framework/_typescript/client/src/vorma_ctx/vorma_ctx.d.ts.map +0 -1
  296. package/npm_dist/internal/framework/_typescript/client/src/window_focus_revalidation/window_focus_revalidation.d.ts +0 -10
  297. package/npm_dist/internal/framework/_typescript/client/src/window_focus_revalidation/window_focus_revalidation.d.ts.map +0 -1
  298. package/npm_dist/internal/framework/_typescript/create/main.d.ts.map +0 -1
  299. package/npm_dist/internal/framework/_typescript/preact/index.d.ts.map +0 -1
  300. package/npm_dist/internal/framework/_typescript/preact/index.js +0 -283
  301. package/npm_dist/internal/framework/_typescript/preact/index.js.map +0 -7
  302. package/npm_dist/internal/framework/_typescript/preact/src/helpers.d.ts.map +0 -1
  303. package/npm_dist/internal/framework/_typescript/preact/src/link.d.ts.map +0 -1
  304. package/npm_dist/internal/framework/_typescript/preact/src/preact.d.ts.map +0 -1
  305. package/npm_dist/internal/framework/_typescript/react/index.d.ts.map +0 -1
  306. package/npm_dist/internal/framework/_typescript/react/index.js +0 -370
  307. package/npm_dist/internal/framework/_typescript/react/index.js.map +0 -7
  308. package/npm_dist/internal/framework/_typescript/react/src/helpers.d.ts.map +0 -1
  309. package/npm_dist/internal/framework/_typescript/react/src/link.d.ts.map +0 -1
  310. package/npm_dist/internal/framework/_typescript/react/src/react.d.ts.map +0 -1
  311. package/npm_dist/internal/framework/_typescript/solid/index.d.ts.map +0 -1
  312. package/npm_dist/internal/framework/_typescript/solid/index.js +0 -314
  313. package/npm_dist/internal/framework/_typescript/solid/index.js.map +0 -7
  314. package/npm_dist/internal/framework/_typescript/solid/src/helpers.d.ts.map +0 -1
  315. package/npm_dist/internal/framework/_typescript/solid/src/link.d.ts.map +0 -1
  316. package/npm_dist/internal/framework/_typescript/solid/src/solid.d.ts.map +0 -1
  317. package/npm_dist/internal/framework/_typescript/vite/vite.d.ts.map +0 -1
  318. package/npm_dist/internal/framework/_typescript/vite/vite.js +0 -82
  319. package/npm_dist/internal/framework/_typescript/vite/vite.js.map +0 -7
  320. /package/npm_dist/{internal/framework/_typescript → vormaclient}/create/main.d.ts +0 -0
  321. /package/npm_dist/{internal/framework/_typescript → vormaclient}/preact/index.d.ts +0 -0
  322. /package/npm_dist/{internal/framework/_typescript → vormaclient}/preact/src/helpers.d.ts +0 -0
  323. /package/npm_dist/{internal/framework/_typescript → vormaclient}/react/index.d.ts +0 -0
  324. /package/npm_dist/{internal/framework/_typescript → vormaclient}/react/src/helpers.d.ts +0 -0
  325. /package/npm_dist/{internal/framework/_typescript → vormaclient}/react/src/react.d.ts +0 -0
  326. /package/npm_dist/{internal/framework/_typescript → vormaclient}/solid/index.d.ts +0 -0
  327. /package/npm_dist/{internal/framework/_typescript → vormaclient}/solid/src/helpers.d.ts +0 -0
  328. /package/{internal/framework/_typescript → vormaclient}/preact/index.tsx +0 -0
  329. /package/{internal/framework/_typescript → vormaclient}/react/index.tsx +0 -0
  330. /package/{internal/framework/_typescript → vormaclient}/solid/index.tsx +0 -0
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ---
6
6
 
7
- The Next.js of Golang, powered by Vite.
7
+ The Golang metaframework, powered by Vite.
8
8
 
9
9
  ## Links
10
10
 
@@ -29,7 +29,7 @@ export function bytesToBase64(bytes: Uint8Array): Base64 {
29
29
  }
30
30
 
31
31
  // --> BASE64URL
32
- export function bytesToBase64URL(bytes: Uint8Array): Base64 {
32
+ export function bytesToBase64URL(bytes: Uint8Array): Base64URL {
33
33
  const base64 = bytesToBase64(bytes);
34
34
  return base64ToBase64URL(base64);
35
35
  }
@@ -56,7 +56,7 @@ export function utf8ToBase64(utf8: UTF8): Base64 {
56
56
  }
57
57
 
58
58
  // --> BASE64URL
59
- export function utf8ToBase64URL(utf8: UTF8): Base64 {
59
+ export function utf8ToBase64URL(utf8: UTF8): Base64URL {
60
60
  const bytes = utf8ToBytes(utf8);
61
61
  return bytesToBase64URL(bytes);
62
62
  }
@@ -69,7 +69,8 @@ export function utf8ToBase64URL(utf8: UTF8): Base64 {
69
69
  export function hexToBytes(hex: Hex): Uint8Array {
70
70
  const cleanHex = hex.startsWith("0x") ? hex.slice(2) : hex;
71
71
  const bytes =
72
- cleanHex.match(/.{1,2}/g)?.map((byte) => Number.parseInt(byte, 16)) || [];
72
+ cleanHex.match(/.{1,2}/g)?.map((byte) => Number.parseInt(byte, 16)) ||
73
+ [];
73
74
  return new Uint8Array(bytes);
74
75
  }
75
76
 
@@ -86,7 +87,7 @@ export function hexToBase64(hex: Hex): Base64 {
86
87
  }
87
88
 
88
89
  // --> BASE64URL
89
- export function hexToBase64URL(hex: Hex): Base64 {
90
+ export function hexToBase64URL(hex: Hex): Base64URL {
90
91
  const bytes = hexToBytes(hex);
91
92
  return bytesToBase64URL(bytes);
92
93
  }
@@ -113,7 +114,7 @@ export function base64ToHex(base64: Base64): Hex {
113
114
  }
114
115
 
115
116
  // --> BASE64URL
116
- export function base64ToBase64URL(base64: Base64): Base64 {
117
+ export function base64ToBase64URL(base64: Base64): Base64URL {
117
118
  return base64
118
119
  .replace(/[\r\n\t ]+/g, "")
119
120
  .replace(/\+/g, "-")
@@ -3,8 +3,15 @@
3
3
  * found, otherwise undefined. Does not do any encoding or decoding.
4
4
  */
5
5
  export function getClientCookie(name: string) {
6
- const match = document.cookie.match(new RegExp(`(^| )${name}=([^;]*)`));
7
- return match ? match[2] : undefined;
6
+ const expectedPrefix = `${name}=`;
7
+ const cookiePairs = document.cookie.split(";");
8
+ for (const cookiePair of cookiePairs) {
9
+ const trimmedPair = cookiePair.trim();
10
+ if (trimmedPair.startsWith(expectedPrefix)) {
11
+ return trimmedPair.slice(expectedPrefix.length);
12
+ }
13
+ }
14
+ return undefined;
8
15
  }
9
16
 
10
17
  /**
@@ -0,0 +1,2 @@
1
+ Must stay aligned with corresponding server code in `kit/csrf/csrf.go` /
2
+ `kit/cookies/cookies.go`.
@@ -7,10 +7,14 @@ export function debounce<T extends Fn>(
7
7
  let timeoutID: number;
8
8
 
9
9
  return (...args: Parameters<T>) => {
10
- return new Promise<Awaited<ReturnType<T>>>((resolve) => {
10
+ return new Promise<Awaited<ReturnType<T>>>((resolve, reject) => {
11
11
  clearTimeout(timeoutID);
12
12
  timeoutID = window.setTimeout(() => {
13
- resolve(fn(...args));
13
+ try {
14
+ resolve(fn(...args));
15
+ } catch (error) {
16
+ reject(error);
17
+ }
14
18
  }, delayInMs);
15
19
  });
16
20
  };
@@ -30,23 +30,32 @@ export function jsonDeepEquals(a: unknown, b: unknown): boolean {
30
30
 
31
31
  // Handle arrays
32
32
  if (aIsArray && bIsArray) {
33
- if (a.length !== b.length) {
33
+ const leftArray = a as unknown[];
34
+ const rightArray = b as unknown[];
35
+ if (leftArray.length !== rightArray.length) {
34
36
  return false;
35
37
  }
36
- return a.every((item, index) => jsonDeepEquals(item, b[index]));
38
+ return leftArray.every((item, index) =>
39
+ jsonDeepEquals(item, rightArray[index]),
40
+ );
37
41
  }
38
42
 
39
43
  // Handle objects
40
44
  if (typeof a === "object" && typeof b === "object") {
41
- const aKeys = Object.keys(a as object);
42
- const bKeys = Object.keys(b as object);
45
+ const leftObject = a as Record<string, unknown>;
46
+ const rightObject = b as Record<string, unknown>;
47
+ const aKeys = Object.keys(leftObject);
48
+ const bKeys = Object.keys(rightObject);
43
49
 
44
50
  if (aKeys.length !== bKeys.length) {
45
51
  return false;
46
52
  }
47
53
 
48
54
  return aKeys.every((key) => {
49
- return Object.hasOwn(b, key) && jsonDeepEquals((a as any)[key], (b as any)[key]);
55
+ return (
56
+ Object.hasOwn(rightObject, key) &&
57
+ jsonDeepEquals(leftObject[key], rightObject[key])
58
+ );
50
59
  });
51
60
  }
52
61
 
@@ -1,7 +1,7 @@
1
- export function serializeToSearchParams(obj: Record<any, any>): URLSearchParams {
1
+ export function serializeToSearchParams(obj: unknown): URLSearchParams {
2
2
  const params = new URLSearchParams();
3
3
 
4
- function appendValue(key: string, value: any) {
4
+ function appendValue(key: string, value: unknown) {
5
5
  if (value === null || value === undefined) {
6
6
  params.append(key, "");
7
7
  return;
@@ -19,7 +19,7 @@ export function serializeToSearchParams(obj: Record<any, any>): URLSearchParams
19
19
  }
20
20
 
21
21
  if (typeof value === "object") {
22
- const entries = Object.entries(value);
22
+ const entries = Object.entries(value as Record<string, unknown>);
23
23
  if (entries.length === 0) {
24
24
  params.append(key, "");
25
25
  } else {
@@ -0,0 +1,2 @@
1
+ It is crucial that this package always stays in sync with its Go counterpart at
2
+ `/kit/matcher`.
@@ -24,15 +24,24 @@ type DfsBestState = {
24
24
  foundMatch: boolean;
25
25
  };
26
26
 
27
- function dfsBest(
28
- registry: PatternRegistry,
29
- node: SegmentNode,
30
- segments: string[],
31
- depth: number,
32
- score: number,
33
- state: DfsBestState,
34
- checkTrailingSlash: boolean,
35
- ): void {
27
+ function dfsBest(props: {
28
+ registry: PatternRegistry;
29
+ node: SegmentNode;
30
+ segments: string[];
31
+ depth: number;
32
+ score: number;
33
+ state: DfsBestState;
34
+ checkTrailingSlash: boolean;
35
+ }): void {
36
+ const {
37
+ registry,
38
+ node,
39
+ segments,
40
+ depth,
41
+ score,
42
+ state,
43
+ checkTrailingSlash,
44
+ } = props;
36
45
  const atNormalEnd = checkTrailingSlash && depth === segments.length - 1;
37
46
 
38
47
  if (node.pattern.length > 0) {
@@ -62,15 +71,15 @@ function dfsBest(
62
71
  if (node.children !== null) {
63
72
  const child = node.children.get(segments[depth]!);
64
73
  if (child) {
65
- dfsBest(
74
+ dfsBest({
66
75
  registry,
67
- child,
76
+ node: child,
68
77
  segments,
69
- depth + 1,
70
- score + SCORE_STATIC_MATCH,
78
+ depth: depth + 1,
79
+ score: score + SCORE_STATIC_MATCH,
71
80
  state,
72
81
  checkTrailingSlash,
73
- );
82
+ });
74
83
 
75
84
  if (
76
85
  state.foundMatch &&
@@ -86,15 +95,15 @@ function dfsBest(
86
95
  switch (child.nodeType) {
87
96
  case NODE_DYNAMIC:
88
97
  if (segments[depth] !== "") {
89
- dfsBest(
98
+ dfsBest({
90
99
  registry,
91
- child,
100
+ node: child,
92
101
  segments,
93
- depth + 1,
94
- score + SCORE_DYNAMIC,
102
+ depth: depth + 1,
103
+ score: score + SCORE_DYNAMIC,
95
104
  state,
96
105
  checkTrailingSlash,
97
- );
106
+ });
98
107
  }
99
108
  break;
100
109
 
@@ -161,15 +170,15 @@ export function findBestMatch(
161
170
  foundMatch: false,
162
171
  };
163
172
 
164
- dfsBest(
173
+ dfsBest({
165
174
  registry,
166
- registry.rootNode,
175
+ node: registry.rootNode,
167
176
  segments,
168
- 0,
169
- 0,
177
+ depth: 0,
178
+ score: 0,
170
179
  state,
171
- hasTrailingSlash,
172
- );
180
+ checkTrailingSlash: hasTrailingSlash,
181
+ });
173
182
 
174
183
  if (!state.foundMatch || !state.best) {
175
184
  return null;
@@ -109,11 +109,12 @@ function addDynamicChild(node: SegmentNode, segment: string): SegmentNode {
109
109
  return child;
110
110
  }
111
111
 
112
- function getSegmentType(
113
- segment: string,
114
- dynamicPrefix: string,
115
- splatRune: string,
116
- ): SegType {
112
+ function getSegmentType(props: {
113
+ segment: string;
114
+ dynamicPrefix: string;
115
+ splatRune: string;
116
+ }): SegType {
117
+ const { segment, dynamicPrefix, splatRune } = props;
117
118
  if (segment === "") return SEG_TYPES.index;
118
119
  if (segment.length === 1 && segment === splatRune) return SEG_TYPES.splat;
119
120
  if (segment.length > 0 && segment[0] === dynamicPrefix)
@@ -160,11 +161,11 @@ function normalizePattern(
160
161
 
161
162
  for (const seg of rawSegments) {
162
163
  let normalizedVal = seg;
163
- const segType = getSegmentType(
164
- seg,
165
- config.dynamicParamPrefixRune,
166
- config.splatSegmentRune,
167
- );
164
+ const segType = getSegmentType({
165
+ segment: seg,
166
+ dynamicPrefix: config.dynamicParamPrefixRune,
167
+ splatRune: config.splatSegmentRune,
168
+ });
168
169
 
169
170
  if (segType === SEG_TYPES.dynamic) {
170
171
  numberOfDynamicParamSegs++;
@@ -24,6 +24,21 @@ type ThemeChangeEventDetail = {
24
24
  resolvedTheme: ResolvedTheme;
25
25
  };
26
26
 
27
+ type ThemeStorageBackend = {
28
+ getItem: (key: string) => string | null | undefined;
29
+ setItem: (key: string, value: string) => void;
30
+ };
31
+
32
+ const cookieThemeStorageBackend: ThemeStorageBackend = {
33
+ getItem: getClientCookie,
34
+ setItem: setClientCookie,
35
+ };
36
+
37
+ const localThemeStorageBackend: ThemeStorageBackend = {
38
+ getItem: (key: string) => localStorage.getItem(key),
39
+ setItem: (key: string, value: string) => localStorage.setItem(key, value),
40
+ };
41
+
27
42
  /////////////////////////////////////////////////////////////////////
28
43
  ///////// BROADCAST CHANNEL
29
44
  /////////////////////////////////////////////////////////////////////
@@ -66,38 +81,36 @@ PREFERS_DARK_QUERY.addEventListener("change", () => {
66
81
  /////////////////////////////////////////////////////////////////////
67
82
 
68
83
  export function getTheme(): Theme {
69
- const theme = getClientCookie(THEME_KEY);
70
- return __isTheme(theme) ? theme : THEMES.System;
84
+ return readThemeOrDefault(cookieThemeStorageBackend);
71
85
  }
72
86
 
73
87
  export function getThemeLocal(): Theme {
74
- const theme = localStorage.getItem(THEME_KEY);
75
- return __isTheme(theme) ? theme : THEMES.System;
88
+ return readThemeOrDefault(localThemeStorageBackend);
76
89
  }
77
90
 
78
91
  export function getResolvedTheme(): ResolvedTheme {
79
- const resolvedTheme = getClientCookie(RESOLVED_THEME_KEY);
80
- return __isResolvedTheme(resolvedTheme) ? resolvedTheme : THEMES.Light;
92
+ return readResolvedThemeOrDefault(cookieThemeStorageBackend);
81
93
  }
82
94
 
83
95
  export function getResolvedThemeLocal(): ResolvedTheme {
84
- const resolvedTheme = localStorage.getItem(RESOLVED_THEME_KEY);
85
- return __isResolvedTheme(resolvedTheme) ? resolvedTheme : THEMES.Light;
96
+ return readResolvedThemeOrDefault(localThemeStorageBackend);
86
97
  }
87
98
 
88
99
  export function setTheme(theme: Theme) {
89
- const resolvedTheme = __getResolvedThemeFromTheme(theme);
90
- setClientCookie(THEME_KEY, theme);
91
- setClientCookie(RESOLVED_THEME_KEY, resolvedTheme);
92
- const detail: ThemeChangeEventDetail = { theme, resolvedTheme };
93
- __setClassesAndDispatchEvent(detail);
94
- bc.postMessage(detail);
100
+ writeThemeAndBroadcast(cookieThemeStorageBackend, theme);
95
101
  }
96
102
 
97
103
  export function setThemeLocal(theme: Theme) {
104
+ writeThemeAndBroadcast(localThemeStorageBackend, theme);
105
+ }
106
+
107
+ function writeThemeAndBroadcast(
108
+ storageBackend: ThemeStorageBackend,
109
+ theme: Theme,
110
+ ) {
98
111
  const resolvedTheme = __getResolvedThemeFromTheme(theme);
99
- localStorage.setItem(THEME_KEY, theme);
100
- localStorage.setItem(RESOLVED_THEME_KEY, resolvedTheme);
112
+ storageBackend.setItem(THEME_KEY, theme);
113
+ storageBackend.setItem(RESOLVED_THEME_KEY, resolvedTheme);
101
114
  const detail: ThemeChangeEventDetail = { theme, resolvedTheme };
102
115
  __setClassesAndDispatchEvent(detail);
103
116
  bc.postMessage(detail);
@@ -170,6 +183,18 @@ function __isTheme(theme: string | undefined | null): theme is Theme {
170
183
  return THEME_VALUES.includes(theme as Theme);
171
184
  }
172
185
 
186
+ function readThemeOrDefault(storageBackend: ThemeStorageBackend): Theme {
187
+ const theme = storageBackend.getItem(THEME_KEY);
188
+ return __isTheme(theme) ? theme : THEMES.System;
189
+ }
190
+
191
+ function readResolvedThemeOrDefault(
192
+ storageBackend: ThemeStorageBackend,
193
+ ): ResolvedTheme {
194
+ const resolvedTheme = storageBackend.getItem(RESOLVED_THEME_KEY);
195
+ return __isResolvedTheme(resolvedTheme) ? resolvedTheme : THEMES.Light;
196
+ }
197
+
173
198
  function __isResolvedTheme(
174
199
  theme: string | undefined | null,
175
200
  ): theme is ResolvedTheme {
@@ -1,6 +1,7 @@
1
1
  export function getIsErrorRes(response: Response) {
2
2
  return (
3
- String(response.status).startsWith("4") || String(response.status).startsWith("5")
3
+ String(response.status).startsWith("4") ||
4
+ String(response.status).startsWith("5")
4
5
  );
5
6
  }
6
7
 
@@ -12,6 +13,29 @@ export function getIsGETRequest(requestInit?: RequestInit) {
12
13
  );
13
14
  }
14
15
 
16
+ export function resolveAbsoluteHref(props: {
17
+ href: string | URL;
18
+ baseHref?: string;
19
+ }): string {
20
+ return new URL(props.href, props.baseHref ?? window.location.href).href;
21
+ }
22
+
23
+ export function resolveAbsoluteHrefWithOptionalSearchAndHash(props: {
24
+ href: string | URL;
25
+ search?: string;
26
+ hash?: string;
27
+ baseHref?: string;
28
+ }): string {
29
+ const url = new URL(props.href, props.baseHref ?? window.location.href);
30
+ if (props.search !== undefined) {
31
+ url.search = props.search;
32
+ }
33
+ if (props.hash !== undefined) {
34
+ url.hash = props.hash;
35
+ }
36
+ return url.href;
37
+ }
38
+
15
39
  export function getAnchorDetailsFromEvent(event: MouseEvent) {
16
40
  if (!event || !event.target || !(event.target as HTMLElement).closest) {
17
41
  return null;
@@ -0,0 +1 @@
1
+ {"version":1,"input_hash":"ac9add715826cef60dc450dca9c08c53f0ac0856ae2e9b9e602854171f45d827","output_hash":"95ee61dfbc9321a9cb41e595871a396873fff4c5d546e98145e34b9749bd7c80"}
@@ -0,0 +1,203 @@
1
+ // kit/_typescript/matcher/parse_segments.ts
2
+ function parseSegments(path) {
3
+ if (path === "" || path === "/") {
4
+ return path === "/" ? [""] : [];
5
+ }
6
+ const startIdx = path.startsWith("/") ? 1 : 0;
7
+ const segments = [];
8
+ let start = startIdx;
9
+ for (let i = startIdx; i < path.length; i++) {
10
+ if (path[i] === "/") {
11
+ if (i > start) {
12
+ segments.push(path.substring(start, i));
13
+ }
14
+ start = i + 1;
15
+ }
16
+ }
17
+ if (start < path.length) {
18
+ segments.push(path.substring(start));
19
+ }
20
+ if (path.endsWith("/")) {
21
+ segments.push("");
22
+ }
23
+ return segments;
24
+ }
25
+
26
+ // kit/_typescript/matcher/register.ts
27
+ var NODE_STATIC = 0;
28
+ var NODE_DYNAMIC = 1;
29
+ var NODE_SPLAT = 2;
30
+ var SCORE_STATIC_MATCH = 2;
31
+ var SCORE_DYNAMIC = 1;
32
+ var SEG_TYPES = {
33
+ splat: "splat",
34
+ static: "static",
35
+ dynamic: "dynamic",
36
+ index: "index"
37
+ };
38
+ function createSegmentNode() {
39
+ return {
40
+ pattern: "",
41
+ nodeType: NODE_STATIC,
42
+ children: null,
43
+ dynChildren: [],
44
+ paramName: "",
45
+ finalScore: 0
46
+ };
47
+ }
48
+ function findOrCreateChild(node, segment) {
49
+ if (segment === "*" || segment.length > 0 && segment[0] === ":") {
50
+ for (const child2 of node.dynChildren) {
51
+ if (child2.paramName === segment.substring(1)) return child2;
52
+ }
53
+ return addDynamicChild(node, segment);
54
+ }
55
+ if (node.children === null) node.children = /* @__PURE__ */ new Map();
56
+ let child = node.children.get(segment);
57
+ if (child) return child;
58
+ child = createSegmentNode();
59
+ child.nodeType = NODE_STATIC;
60
+ node.children.set(segment, child);
61
+ return child;
62
+ }
63
+ function addDynamicChild(node, segment) {
64
+ const child = createSegmentNode();
65
+ if (segment === "*") {
66
+ child.nodeType = NODE_SPLAT;
67
+ } else {
68
+ child.nodeType = NODE_DYNAMIC;
69
+ child.paramName = segment.substring(1);
70
+ }
71
+ node.dynChildren.push(child);
72
+ return child;
73
+ }
74
+ function getSegmentType(props) {
75
+ const { segment, dynamicPrefix, splatRune } = props;
76
+ if (segment === "") return SEG_TYPES.index;
77
+ if (segment.length === 1 && segment === splatRune) return SEG_TYPES.splat;
78
+ if (segment.length > 0 && segment[0] === dynamicPrefix)
79
+ return SEG_TYPES.dynamic;
80
+ return SEG_TYPES.static;
81
+ }
82
+ function isStatic(segments) {
83
+ for (const segment of segments) {
84
+ if (segment.segType === SEG_TYPES.splat || segment.segType === SEG_TYPES.dynamic) {
85
+ return false;
86
+ }
87
+ }
88
+ return true;
89
+ }
90
+ function normalizePattern(originalPattern, config) {
91
+ let normalizedPattern = originalPattern;
92
+ if (config.usingExplicitIndexSegment) {
93
+ if (normalizedPattern.endsWith("/")) {
94
+ if (normalizedPattern !== "/") {
95
+ throw new Error(`bad trailing slash: ${originalPattern}`);
96
+ }
97
+ normalizedPattern = normalizedPattern.replace(/\/+$/, "");
98
+ }
99
+ if (normalizedPattern.endsWith(config.slashIndexSegment)) {
100
+ normalizedPattern = normalizedPattern.slice(
101
+ 0,
102
+ -config.explicitIndexSegment.length
103
+ );
104
+ }
105
+ }
106
+ const rawSegments = parseSegments(normalizedPattern);
107
+ const segments = [];
108
+ let numberOfDynamicParamSegs = 0;
109
+ for (const seg of rawSegments) {
110
+ let normalizedVal = seg;
111
+ const segType = getSegmentType({
112
+ segment: seg,
113
+ dynamicPrefix: config.dynamicParamPrefixRune,
114
+ splatRune: config.splatSegmentRune
115
+ });
116
+ if (segType === SEG_TYPES.dynamic) {
117
+ numberOfDynamicParamSegs++;
118
+ normalizedVal = ":" + seg.substring(1);
119
+ }
120
+ if (segType === SEG_TYPES.splat) {
121
+ normalizedVal = "*";
122
+ }
123
+ segments.push({ normalizedVal, segType });
124
+ }
125
+ const segLen = segments.length;
126
+ let lastType = segLen > 0 ? segments[segLen - 1].segType : SEG_TYPES.static;
127
+ let finalNormalizedPattern = "/";
128
+ for (let i = 0; i < segments.length; i++) {
129
+ finalNormalizedPattern += segments[i].normalizedVal;
130
+ if (i < segLen - 1) finalNormalizedPattern += "/";
131
+ }
132
+ if (finalNormalizedPattern.endsWith("/") && lastType !== SEG_TYPES.index) {
133
+ finalNormalizedPattern = finalNormalizedPattern.replace(/\/+$/, "");
134
+ }
135
+ return {
136
+ originalPattern,
137
+ normalizedPattern: finalNormalizedPattern,
138
+ normalizedSegments: segments,
139
+ lastSegType: lastType,
140
+ lastSegIsNonRootSplat: lastType === SEG_TYPES.splat && segLen > 1,
141
+ lastSegIsIndex: lastType === SEG_TYPES.index,
142
+ numberOfDynamicParamSegs
143
+ };
144
+ }
145
+ function createPatternRegistry(opts) {
146
+ const config = {
147
+ dynamicParamPrefixRune: opts?.dynamicParamPrefixRune ?? ":",
148
+ splatSegmentRune: opts?.splatSegmentRune ?? "*",
149
+ explicitIndexSegment: opts?.explicitIndexSegment ?? "",
150
+ slashIndexSegment: "/" + (opts?.explicitIndexSegment ?? ""),
151
+ usingExplicitIndexSegment: (opts?.explicitIndexSegment ?? "") !== ""
152
+ };
153
+ if (config.explicitIndexSegment.includes("/")) {
154
+ throw new Error("explicit index segment cannot contain /");
155
+ }
156
+ return {
157
+ staticPatterns: /* @__PURE__ */ new Map(),
158
+ dynamicPatterns: /* @__PURE__ */ new Map(),
159
+ rootNode: createSegmentNode(),
160
+ config
161
+ };
162
+ }
163
+ function registerPattern(registry, originalPattern) {
164
+ const normalized = normalizePattern(originalPattern, registry.config);
165
+ if (!(globalThis.window && globalThis.document) && (registry.staticPatterns.has(normalized.normalizedPattern) || registry.dynamicPatterns.has(normalized.normalizedPattern))) {
166
+ console.warn(`already registered: ${originalPattern}`);
167
+ }
168
+ if (isStatic(normalized.normalizedSegments)) {
169
+ registry.staticPatterns.set(normalized.normalizedPattern, normalized);
170
+ return normalized;
171
+ }
172
+ registry.dynamicPatterns.set(normalized.normalizedPattern, normalized);
173
+ let current = registry.rootNode;
174
+ let nodeScore = 0;
175
+ for (let i = 0; i < normalized.normalizedSegments.length; i++) {
176
+ const segment = normalized.normalizedSegments[i];
177
+ const child = findOrCreateChild(current, segment.normalizedVal);
178
+ if (segment.segType === SEG_TYPES.dynamic) {
179
+ nodeScore += SCORE_DYNAMIC;
180
+ } else if (segment.segType !== SEG_TYPES.splat) {
181
+ nodeScore += SCORE_STATIC_MATCH;
182
+ }
183
+ if (i === normalized.normalizedSegments.length - 1) {
184
+ child.finalScore = nodeScore;
185
+ child.pattern = normalized.normalizedPattern;
186
+ }
187
+ current = child;
188
+ }
189
+ return normalized;
190
+ }
191
+
192
+ export {
193
+ parseSegments,
194
+ NODE_STATIC,
195
+ NODE_DYNAMIC,
196
+ NODE_SPLAT,
197
+ SCORE_STATIC_MATCH,
198
+ SCORE_DYNAMIC,
199
+ SEG_TYPES,
200
+ createPatternRegistry,
201
+ registerPattern
202
+ };
203
+ //# sourceMappingURL=chunk-LNARYAGF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../kit/_typescript/matcher/parse_segments.ts", "../../../kit/_typescript/matcher/register.ts"],
4
+ "sourcesContent": ["export function parseSegments(path: string): string[] {\n\tif (path === \"\" || path === \"/\") {\n\t\treturn path === \"/\" ? [\"\"] : [];\n\t}\n\n\tconst startIdx = path.startsWith(\"/\") ? 1 : 0;\n\tconst segments: string[] = [];\n\tlet start = startIdx;\n\n\tfor (let i = startIdx; i < path.length; i++) {\n\t\tif (path[i] === \"/\") {\n\t\t\tif (i > start) {\n\t\t\t\tsegments.push(path.substring(start, i));\n\t\t\t}\n\t\t\tstart = i + 1;\n\t\t}\n\t}\n\n\t// Add the last segment if it exists\n\tif (start < path.length) {\n\t\tsegments.push(path.substring(start));\n\t}\n\n\t// Add empty segment for trailing slash\n\tif (path.endsWith(\"/\")) {\n\t\tsegments.push(\"\");\n\t}\n\n\treturn segments;\n}\n", "import { parseSegments } from \"./parse_segments.ts\";\n\nexport type Params = Record<string, string>;\nexport type SegType = \"splat\" | \"static\" | \"dynamic\" | \"index\";\n\nexport type Segment = {\n\tnormalizedVal: string;\n\tsegType: SegType;\n};\n\nexport type RegisteredPattern = {\n\toriginalPattern: string;\n\tnormalizedPattern: string;\n\tnormalizedSegments: Segment[];\n\tlastSegType: SegType;\n\tlastSegIsNonRootSplat: boolean;\n\tlastSegIsIndex: boolean;\n\tnumberOfDynamicParamSegs: number;\n};\n\nexport type SegmentNode = {\n\tpattern: string;\n\tnodeType: number;\n\tchildren: Map<string, SegmentNode> | null;\n\tdynChildren: SegmentNode[];\n\tparamName: string;\n\tfinalScore: number;\n};\n\nexport type RegistrationOptions = {\n\tdynamicParamPrefixRune?: string;\n\tsplatSegmentRune?: string;\n\texplicitIndexSegment?: string;\n};\n\nexport type PatternRegistry = {\n\tstaticPatterns: Map<string, RegisteredPattern>;\n\tdynamicPatterns: Map<string, RegisteredPattern>;\n\trootNode: SegmentNode;\n\tconfig: {\n\t\tdynamicParamPrefixRune: string;\n\t\tsplatSegmentRune: string;\n\t\texplicitIndexSegment: string;\n\t\tslashIndexSegment: string;\n\t\tusingExplicitIndexSegment: boolean;\n\t};\n};\n\n/////////////////////////////////////////////////////////////////////\n/////// CONSTANTS\n/////////////////////////////////////////////////////////////////////\n\nexport const NODE_STATIC = 0;\nexport const NODE_DYNAMIC = 1;\nexport const NODE_SPLAT = 2;\nexport const SCORE_STATIC_MATCH = 2;\nexport const SCORE_DYNAMIC = 1;\n\nexport const SEG_TYPES = {\n\tsplat: \"splat\" as SegType,\n\tstatic: \"static\" as SegType,\n\tdynamic: \"dynamic\" as SegType,\n\tindex: \"index\" as SegType,\n};\n\n/////////////////////////////////////////////////////////////////////\n/////// REGISTRATION\n/////////////////////////////////////////////////////////////////////\n\nfunction createSegmentNode(): SegmentNode {\n\treturn {\n\t\tpattern: \"\",\n\t\tnodeType: NODE_STATIC,\n\t\tchildren: null,\n\t\tdynChildren: [],\n\t\tparamName: \"\",\n\t\tfinalScore: 0,\n\t};\n}\n\nfunction findOrCreateChild(node: SegmentNode, segment: string): SegmentNode {\n\tif (segment === \"*\" || (segment.length > 0 && segment[0] === \":\")) {\n\t\tfor (const child of node.dynChildren) {\n\t\t\tif (child.paramName === segment.substring(1)) return child;\n\t\t}\n\t\treturn addDynamicChild(node, segment);\n\t}\n\n\tif (node.children === null) node.children = new Map<string, SegmentNode>();\n\n\tlet child = node.children.get(segment);\n\tif (child) return child;\n\n\tchild = createSegmentNode();\n\tchild.nodeType = NODE_STATIC;\n\tnode.children.set(segment, child);\n\treturn child;\n}\n\nfunction addDynamicChild(node: SegmentNode, segment: string): SegmentNode {\n\tconst child = createSegmentNode();\n\tif (segment === \"*\") {\n\t\tchild.nodeType = NODE_SPLAT;\n\t} else {\n\t\tchild.nodeType = NODE_DYNAMIC;\n\t\tchild.paramName = segment.substring(1);\n\t}\n\tnode.dynChildren.push(child);\n\treturn child;\n}\n\nfunction getSegmentType(props: {\n\tsegment: string;\n\tdynamicPrefix: string;\n\tsplatRune: string;\n}): SegType {\n\tconst { segment, dynamicPrefix, splatRune } = props;\n\tif (segment === \"\") return SEG_TYPES.index;\n\tif (segment.length === 1 && segment === splatRune) return SEG_TYPES.splat;\n\tif (segment.length > 0 && segment[0] === dynamicPrefix)\n\t\treturn SEG_TYPES.dynamic;\n\treturn SEG_TYPES.static;\n}\n\nfunction isStatic(segments: Segment[]): boolean {\n\tfor (const segment of segments) {\n\t\tif (\n\t\t\tsegment.segType === SEG_TYPES.splat ||\n\t\t\tsegment.segType === SEG_TYPES.dynamic\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction normalizePattern(\n\toriginalPattern: string,\n\tconfig: PatternRegistry[\"config\"],\n): RegisteredPattern {\n\tlet normalizedPattern = originalPattern;\n\n\tif (config.usingExplicitIndexSegment) {\n\t\tif (normalizedPattern.endsWith(\"/\")) {\n\t\t\tif (normalizedPattern !== \"/\") {\n\t\t\t\tthrow new Error(`bad trailing slash: ${originalPattern}`);\n\t\t\t}\n\t\t\tnormalizedPattern = normalizedPattern.replace(/\\/+$/, \"\");\n\t\t}\n\t\tif (normalizedPattern.endsWith(config.slashIndexSegment)) {\n\t\t\tnormalizedPattern = normalizedPattern.slice(\n\t\t\t\t0,\n\t\t\t\t-config.explicitIndexSegment.length,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst rawSegments = parseSegments(normalizedPattern);\n\tconst segments: Segment[] = [];\n\tlet numberOfDynamicParamSegs = 0;\n\n\tfor (const seg of rawSegments) {\n\t\tlet normalizedVal = seg;\n\t\tconst segType = getSegmentType({\n\t\t\tsegment: seg,\n\t\t\tdynamicPrefix: config.dynamicParamPrefixRune,\n\t\t\tsplatRune: config.splatSegmentRune,\n\t\t});\n\n\t\tif (segType === SEG_TYPES.dynamic) {\n\t\t\tnumberOfDynamicParamSegs++;\n\t\t\tnormalizedVal = \":\" + seg.substring(1);\n\t\t}\n\t\tif (segType === SEG_TYPES.splat) {\n\t\t\tnormalizedVal = \"*\";\n\t\t}\n\n\t\tsegments.push({ normalizedVal, segType });\n\t}\n\n\tconst segLen = segments.length;\n\tlet lastType: SegType =\n\t\tsegLen > 0 ? segments[segLen - 1]!.segType : SEG_TYPES.static;\n\n\tlet finalNormalizedPattern = \"/\";\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tfinalNormalizedPattern += segments[i]!.normalizedVal;\n\t\tif (i < segLen - 1) finalNormalizedPattern += \"/\";\n\t}\n\n\tif (finalNormalizedPattern.endsWith(\"/\") && lastType !== SEG_TYPES.index) {\n\t\tfinalNormalizedPattern = finalNormalizedPattern.replace(/\\/+$/, \"\");\n\t}\n\n\treturn {\n\t\toriginalPattern,\n\t\tnormalizedPattern: finalNormalizedPattern,\n\t\tnormalizedSegments: segments,\n\t\tlastSegType: lastType,\n\t\tlastSegIsNonRootSplat: lastType === SEG_TYPES.splat && segLen > 1,\n\t\tlastSegIsIndex: lastType === SEG_TYPES.index,\n\t\tnumberOfDynamicParamSegs,\n\t};\n}\n\nexport function createPatternRegistry(\n\topts?: RegistrationOptions,\n): PatternRegistry {\n\tconst config = {\n\t\tdynamicParamPrefixRune: opts?.dynamicParamPrefixRune ?? \":\",\n\t\tsplatSegmentRune: opts?.splatSegmentRune ?? \"*\",\n\t\texplicitIndexSegment: opts?.explicitIndexSegment ?? \"\",\n\t\tslashIndexSegment: \"/\" + (opts?.explicitIndexSegment ?? \"\"),\n\t\tusingExplicitIndexSegment: (opts?.explicitIndexSegment ?? \"\") !== \"\",\n\t};\n\n\tif (config.explicitIndexSegment.includes(\"/\")) {\n\t\tthrow new Error(\"explicit index segment cannot contain /\");\n\t}\n\n\treturn {\n\t\tstaticPatterns: new Map(),\n\t\tdynamicPatterns: new Map(),\n\t\trootNode: createSegmentNode(),\n\t\tconfig,\n\t};\n}\n\nexport function registerPattern(\n\tregistry: PatternRegistry,\n\toriginalPattern: string,\n): RegisteredPattern {\n\tconst normalized = normalizePattern(originalPattern, registry.config);\n\n\tif (\n\t\t!(globalThis.window && globalThis.document) &&\n\t\t(registry.staticPatterns.has(normalized.normalizedPattern) ||\n\t\t\tregistry.dynamicPatterns.has(normalized.normalizedPattern))\n\t) {\n\t\tconsole.warn(`already registered: ${originalPattern}`);\n\t}\n\n\tif (isStatic(normalized.normalizedSegments)) {\n\t\tregistry.staticPatterns.set(normalized.normalizedPattern, normalized);\n\t\treturn normalized;\n\t}\n\n\tregistry.dynamicPatterns.set(normalized.normalizedPattern, normalized);\n\n\tlet current = registry.rootNode;\n\tlet nodeScore = 0;\n\n\tfor (let i = 0; i < normalized.normalizedSegments.length; i++) {\n\t\tconst segment = normalized.normalizedSegments[i]!;\n\t\tconst child = findOrCreateChild(current, segment.normalizedVal);\n\n\t\tif (segment.segType === SEG_TYPES.dynamic) {\n\t\t\tnodeScore += SCORE_DYNAMIC;\n\t\t} else if (segment.segType !== SEG_TYPES.splat) {\n\t\t\tnodeScore += SCORE_STATIC_MATCH;\n\t\t}\n\n\t\tif (i === normalized.normalizedSegments.length - 1) {\n\t\t\tchild.finalScore = nodeScore;\n\t\t\tchild.pattern = normalized.normalizedPattern;\n\t\t}\n\n\t\tcurrent = child;\n\t}\n\n\treturn normalized;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["child"]
7
+ }