intor 2.5.0 → 2.6.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 (322) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/dist/core/export/index.js +1 -0
  4. package/dist/core/src/client/shared/helpers/get-client-locale.js +5 -20
  5. package/dist/core/src/client/shared/utils/locale/detect-browser-locale.js +2 -8
  6. package/dist/core/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  7. package/dist/core/src/config/constants/cookie.js +9 -9
  8. package/dist/core/src/config/constants/routing.js +13 -14
  9. package/dist/core/src/config/define-intor-config.js +28 -44
  10. package/dist/core/src/config/resolvers/resolve-cookie-options.js +4 -4
  11. package/dist/core/src/config/resolvers/resolve-fallback-locales.js +33 -50
  12. package/dist/core/src/config/resolvers/resolve-routing-options.js +32 -61
  13. package/dist/core/src/config/validators/validate-default-locale.js +8 -13
  14. package/dist/core/src/config/validators/validate-id.js +8 -13
  15. package/dist/core/src/config/validators/validate-supported-locales.js +8 -13
  16. package/dist/core/src/core/constants/locale-placeholder.js +0 -1
  17. package/dist/core/src/core/error/intor-error.js +14 -29
  18. package/dist/core/src/core/locale/canonicalize-locale.js +7 -18
  19. package/dist/core/src/core/locale/match-locale.js +24 -50
  20. package/dist/core/src/core/locale/parse-locale.js +12 -22
  21. package/dist/core/src/core/logger/get-logger.js +26 -31
  22. package/dist/core/src/core/logger/global-logger-pool.js +4 -4
  23. package/dist/core/src/core/messages/internal-metadata.js +1 -1
  24. package/dist/core/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  25. package/dist/core/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  26. package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  27. package/dist/core/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  28. package/dist/core/src/core/messages/merge-messages.js +17 -28
  29. package/dist/core/src/core/messages/utils/is-valid-messages.js +22 -37
  30. package/dist/core/src/core/messages/utils/nest-object-from-path.js +5 -17
  31. package/dist/core/src/core/render/create-html-renderer.js +29 -37
  32. package/dist/core/src/core/render/utils/escape-html.js +1 -6
  33. package/dist/core/src/core/render/utils/render-attributes.js +6 -11
  34. package/dist/core/src/core/translator/create-t-rich.js +6 -15
  35. package/dist/core/src/core/translator/create-translator.js +16 -24
  36. package/dist/core/src/core/utils/deep-merge.js +24 -42
  37. package/dist/core/src/core/utils/normalizers/normalize-cache-key.js +14 -40
  38. package/dist/core/src/core/utils/normalizers/normalize-pathname.js +19 -37
  39. package/dist/core/src/core/utils/normalizers/normalize-query.js +6 -20
  40. package/dist/core/src/core/utils/parse-cookie-header.js +11 -18
  41. package/dist/core/src/core/utils/resolve-loader-options.js +6 -32
  42. package/dist/core/src/edge/helpers/get-translator.js +14 -20
  43. package/dist/core/src/edge/translator/init-translator.js +23 -31
  44. package/dist/core/src/routing/inbound/helpers/resolve-inbound-from-request.js +21 -28
  45. package/dist/core/src/routing/inbound/resolve-inbound.js +22 -37
  46. package/dist/core/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  47. package/dist/core/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  48. package/dist/core/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  49. package/dist/core/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  50. package/dist/core/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  51. package/dist/core/src/routing/locale/get-locale-from-accept-language.js +21 -36
  52. package/dist/core/src/routing/locale/get-locale-from-host.js +5 -28
  53. package/dist/core/src/routing/locale/get-locale-from-pathname.js +11 -37
  54. package/dist/core/src/routing/locale/get-locale-from-query.js +2 -17
  55. package/dist/core/src/routing/pathname/canonicalize-pathname.js +25 -67
  56. package/dist/core/src/routing/pathname/localize-pathname.js +12 -30
  57. package/dist/core/src/routing/pathname/materialize-pathname.js +9 -44
  58. package/dist/core/src/routing/pathname/standardize-pathname.js +6 -30
  59. package/dist/core/src/server/helpers/get-translator.js +26 -23
  60. package/dist/core/src/server/intor/intor.js +20 -25
  61. package/dist/core/src/server/messages/load-local-messages/cache/messages-pool.js +4 -7
  62. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +76 -92
  63. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +59 -80
  64. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +53 -87
  65. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +3 -6
  66. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +23 -35
  67. package/dist/core/src/server/messages/load-messages.js +56 -69
  68. package/dist/core/src/server/translator/init-translator.js +28 -30
  69. package/dist/express/src/adapters/express/create-intor-handler.js +35 -46
  70. package/dist/express/src/adapters/express/get-translator.js +2 -9
  71. package/dist/express/src/core/constants/locale-placeholder.js +0 -1
  72. package/dist/express/src/core/locale/canonicalize-locale.js +7 -18
  73. package/dist/express/src/core/locale/match-locale.js +24 -50
  74. package/dist/express/src/core/locale/parse-locale.js +12 -22
  75. package/dist/express/src/core/utils/normalizers/normalize-pathname.js +19 -37
  76. package/dist/express/src/core/utils/normalizers/normalize-query.js +6 -20
  77. package/dist/express/src/core/utils/parse-cookie-header.js +11 -18
  78. package/dist/express/src/routing/inbound/resolve-inbound.js +22 -37
  79. package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  80. package/dist/express/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  81. package/dist/express/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  82. package/dist/express/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  83. package/dist/express/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  84. package/dist/express/src/routing/locale/get-locale-from-accept-language.js +21 -36
  85. package/dist/express/src/routing/locale/get-locale-from-host.js +5 -28
  86. package/dist/express/src/routing/locale/get-locale-from-pathname.js +11 -37
  87. package/dist/express/src/routing/locale/get-locale-from-query.js +2 -17
  88. package/dist/express/src/routing/pathname/canonicalize-pathname.js +25 -67
  89. package/dist/express/src/routing/pathname/localize-pathname.js +12 -30
  90. package/dist/express/src/routing/pathname/materialize-pathname.js +9 -44
  91. package/dist/express/src/routing/pathname/standardize-pathname.js +6 -30
  92. package/dist/fastify/src/adapters/fastify/create-intor-handler.js +35 -47
  93. package/dist/fastify/src/adapters/fastify/get-translator.js +2 -9
  94. package/dist/fastify/src/adapters/fastify/intor-fastify-plugin.js +29 -38
  95. package/dist/fastify/src/core/constants/locale-placeholder.js +0 -1
  96. package/dist/fastify/src/core/locale/canonicalize-locale.js +7 -18
  97. package/dist/fastify/src/core/locale/match-locale.js +24 -50
  98. package/dist/fastify/src/core/locale/parse-locale.js +12 -22
  99. package/dist/fastify/src/core/utils/normalizers/normalize-pathname.js +19 -37
  100. package/dist/fastify/src/core/utils/normalizers/normalize-query.js +6 -20
  101. package/dist/fastify/src/core/utils/parse-cookie-header.js +11 -18
  102. package/dist/fastify/src/routing/inbound/resolve-inbound.js +22 -37
  103. package/dist/fastify/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  104. package/dist/fastify/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  105. package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  106. package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  107. package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  108. package/dist/fastify/src/routing/locale/get-locale-from-accept-language.js +21 -36
  109. package/dist/fastify/src/routing/locale/get-locale-from-host.js +5 -28
  110. package/dist/fastify/src/routing/locale/get-locale-from-pathname.js +11 -37
  111. package/dist/fastify/src/routing/locale/get-locale-from-query.js +2 -17
  112. package/dist/fastify/src/routing/pathname/canonicalize-pathname.js +25 -67
  113. package/dist/fastify/src/routing/pathname/localize-pathname.js +12 -30
  114. package/dist/fastify/src/routing/pathname/materialize-pathname.js +9 -44
  115. package/dist/fastify/src/routing/pathname/standardize-pathname.js +6 -30
  116. package/dist/hono/src/adapters/hono/create-intor-handler.js +33 -44
  117. package/dist/hono/src/adapters/hono/get-translator.js +2 -9
  118. package/dist/hono/src/core/constants/locale-placeholder.js +0 -1
  119. package/dist/hono/src/core/locale/canonicalize-locale.js +7 -18
  120. package/dist/hono/src/core/locale/match-locale.js +24 -50
  121. package/dist/hono/src/core/locale/parse-locale.js +12 -22
  122. package/dist/hono/src/core/utils/normalizers/normalize-pathname.js +19 -37
  123. package/dist/hono/src/core/utils/normalizers/normalize-query.js +6 -20
  124. package/dist/hono/src/core/utils/parse-cookie-header.js +11 -18
  125. package/dist/hono/src/routing/inbound/resolve-inbound.js +22 -37
  126. package/dist/hono/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  127. package/dist/hono/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  128. package/dist/hono/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  129. package/dist/hono/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  130. package/dist/hono/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  131. package/dist/hono/src/routing/locale/get-locale-from-accept-language.js +21 -36
  132. package/dist/hono/src/routing/locale/get-locale-from-host.js +5 -28
  133. package/dist/hono/src/routing/locale/get-locale-from-pathname.js +11 -37
  134. package/dist/hono/src/routing/locale/get-locale-from-query.js +2 -17
  135. package/dist/hono/src/routing/pathname/canonicalize-pathname.js +25 -67
  136. package/dist/hono/src/routing/pathname/localize-pathname.js +12 -30
  137. package/dist/hono/src/routing/pathname/materialize-pathname.js +9 -44
  138. package/dist/hono/src/routing/pathname/standardize-pathname.js +6 -30
  139. package/dist/next/export/next/server/index.js +1 -0
  140. package/dist/next/src/adapters/next/create-intor-handler.js +39 -48
  141. package/dist/next/src/adapters/next/header-keys.js +9 -0
  142. package/dist/next/src/adapters/next/link.js +33 -28
  143. package/dist/next/src/adapters/next/redirect.js +12 -15
  144. package/dist/next/src/adapters/next/server/get-locale.js +13 -24
  145. package/dist/next/src/adapters/next/server/get-translator.js +2 -9
  146. package/dist/next/src/adapters/next/server/intor.js +5 -13
  147. package/dist/next/src/adapters/next/server/read-intor-url-state.js +13 -0
  148. package/dist/next/src/adapters/next/use-router.js +47 -66
  149. package/dist/next/src/client/shared/navigation/execute-navigation.js +20 -38
  150. package/dist/next/src/client/shared/utils/build-cookie-string.js +18 -27
  151. package/dist/next/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  152. package/dist/next/src/core/constants/locale-placeholder.js +0 -1
  153. package/dist/next/src/core/locale/canonicalize-locale.js +7 -18
  154. package/dist/next/src/core/locale/match-locale.js +24 -50
  155. package/dist/next/src/core/locale/parse-locale.js +12 -22
  156. package/dist/next/src/core/utils/normalizers/normalize-pathname.js +19 -37
  157. package/dist/next/src/core/utils/normalizers/normalize-query.js +6 -20
  158. package/dist/next/src/core/utils/resolve-loader-options.js +6 -29
  159. package/dist/next/src/policies/shoud-full-reload.js +2 -5
  160. package/dist/next/src/policies/should-sync-locale.js +1 -4
  161. package/dist/next/src/routing/inbound/resolve-inbound.js +24 -39
  162. package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  163. package/dist/next/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  164. package/dist/next/src/routing/inbound/resolve-pathname/strategies/all.js +13 -29
  165. package/dist/next/src/routing/inbound/resolve-pathname/strategies/except-default.js +14 -30
  166. package/dist/next/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  167. package/dist/next/src/routing/locale/get-locale-from-accept-language.js +21 -36
  168. package/dist/next/src/routing/locale/get-locale-from-host.js +5 -28
  169. package/dist/next/src/routing/locale/get-locale-from-pathname.js +11 -37
  170. package/dist/next/src/routing/locale/get-locale-from-query.js +2 -17
  171. package/dist/next/src/routing/outbound/decide-strategy.js +9 -9
  172. package/dist/next/src/routing/outbound/determine-target.js +28 -44
  173. package/dist/next/src/routing/outbound/resolve-outbound.js +12 -16
  174. package/dist/next/src/routing/outbound/utils/derive-host-destination.js +5 -9
  175. package/dist/next/src/routing/outbound/utils/derive-query-destination.js +4 -7
  176. package/dist/next/src/routing/outbound/utils/is-external-destination.js +1 -7
  177. package/dist/next/src/routing/pathname/canonicalize-pathname.js +25 -67
  178. package/dist/next/src/routing/pathname/localize-pathname.js +12 -30
  179. package/dist/next/src/routing/pathname/materialize-pathname.js +9 -44
  180. package/dist/next/src/routing/pathname/standardize-pathname.js +6 -30
  181. package/dist/react/src/client/react/helpers/use-intor.js +25 -44
  182. package/dist/react/src/client/react/provider/effects/use-locale-effects.js +20 -25
  183. package/dist/react/src/client/react/provider/effects/use-messages-effects.js +17 -16
  184. package/dist/react/src/client/react/provider/intor-provider.js +63 -66
  185. package/dist/react/src/client/react/provider/use-intor-context.js +4 -4
  186. package/dist/react/src/client/react/render/create-react-renderer.js +18 -24
  187. package/dist/react/src/client/react/translator/create-t-rich.js +9 -22
  188. package/dist/react/src/client/react/translator/use-translator.js +11 -16
  189. package/dist/react/src/client/shared/messages/create-refetch-messages.js +41 -51
  190. package/dist/react/src/client/shared/provider/effective-state.js +2 -6
  191. package/dist/react/src/client/shared/utils/build-cookie-string.js +18 -27
  192. package/dist/react/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  193. package/dist/react/src/client/shared/utils/locale/set-document-locale.js +2 -8
  194. package/dist/react/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  195. package/dist/react/src/core/logger/get-logger.js +26 -31
  196. package/dist/react/src/core/logger/global-logger-pool.js +4 -4
  197. package/dist/react/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  198. package/dist/react/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  199. package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  200. package/dist/react/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  201. package/dist/react/src/core/messages/merge-messages.js +17 -28
  202. package/dist/react/src/core/messages/utils/is-valid-messages.js +22 -37
  203. package/dist/react/src/core/messages/utils/nest-object-from-path.js +5 -17
  204. package/dist/react/src/core/utils/deep-merge.js +24 -42
  205. package/dist/react/src/core/utils/resolve-loader-options.js +6 -29
  206. package/dist/react/src/policies/should-persist-on-first-visit.js +1 -4
  207. package/dist/svelte/export/svelte/index.js +0 -6
  208. package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +41 -51
  209. package/dist/svelte/src/client/shared/provider/effective-state.js +2 -6
  210. package/dist/svelte/src/client/shared/utils/build-cookie-string.js +18 -27
  211. package/dist/svelte/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  212. package/dist/svelte/src/client/shared/utils/locale/set-document-locale.js +2 -8
  213. package/dist/svelte/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  214. package/dist/svelte/src/client/svelte/provider/create-intor-store.js +59 -63
  215. package/dist/svelte/src/client/svelte/provider/effects/attach-locale-effects.js +20 -25
  216. package/dist/svelte/src/client/svelte/provider/effects/attach-messages-effects.js +21 -18
  217. package/dist/svelte/src/client/svelte/provider/get-intor-context.js +4 -4
  218. package/dist/svelte/src/client/svelte/translator/use-translator.js +11 -16
  219. package/dist/svelte/src/core/logger/get-logger.js +26 -31
  220. package/dist/svelte/src/core/logger/global-logger-pool.js +4 -4
  221. package/dist/svelte/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  222. package/dist/svelte/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  223. package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  224. package/dist/svelte/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  225. package/dist/svelte/src/core/messages/merge-messages.js +17 -28
  226. package/dist/svelte/src/core/messages/utils/is-valid-messages.js +22 -37
  227. package/dist/svelte/src/core/messages/utils/nest-object-from-path.js +5 -17
  228. package/dist/svelte/src/core/render/create-html-renderer.js +29 -37
  229. package/dist/svelte/src/core/render/utils/escape-html.js +1 -6
  230. package/dist/svelte/src/core/render/utils/render-attributes.js +6 -11
  231. package/dist/svelte/src/core/translator/create-t-rich.js +6 -15
  232. package/dist/svelte/src/core/utils/deep-merge.js +24 -42
  233. package/dist/svelte/src/core/utils/resolve-loader-options.js +6 -29
  234. package/dist/svelte/src/policies/should-persist-on-first-visit.js +1 -4
  235. package/dist/svelte-kit/src/adapters/svelte-kit/create-intor-handler.js +37 -57
  236. package/dist/svelte-kit/src/adapters/svelte-kit/use-navigation.js +29 -27
  237. package/dist/svelte-kit/src/adapters/svelte-kit/utils/is-svelte-kit-ssg.js +4 -11
  238. package/dist/svelte-kit/src/client/shared/navigation/execute-navigation.js +19 -37
  239. package/dist/svelte-kit/src/client/shared/utils/build-cookie-string.js +18 -27
  240. package/dist/svelte-kit/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  241. package/dist/svelte-kit/src/core/constants/locale-placeholder.js +0 -1
  242. package/dist/svelte-kit/src/core/locale/canonicalize-locale.js +7 -18
  243. package/dist/svelte-kit/src/core/locale/match-locale.js +24 -50
  244. package/dist/svelte-kit/src/core/locale/parse-locale.js +12 -22
  245. package/dist/svelte-kit/src/core/utils/normalizers/normalize-pathname.js +19 -37
  246. package/dist/svelte-kit/src/core/utils/normalizers/normalize-query.js +6 -20
  247. package/dist/svelte-kit/src/core/utils/resolve-loader-options.js +6 -29
  248. package/dist/svelte-kit/src/policies/shoud-full-reload.js +2 -5
  249. package/dist/svelte-kit/src/policies/should-sync-locale.js +1 -4
  250. package/dist/svelte-kit/src/routing/inbound/resolve-inbound.js +22 -37
  251. package/dist/svelte-kit/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  252. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  253. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  254. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  255. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  256. package/dist/svelte-kit/src/routing/locale/get-locale-from-accept-language.js +21 -36
  257. package/dist/svelte-kit/src/routing/locale/get-locale-from-host.js +5 -28
  258. package/dist/svelte-kit/src/routing/locale/get-locale-from-pathname.js +11 -37
  259. package/dist/svelte-kit/src/routing/locale/get-locale-from-query.js +2 -17
  260. package/dist/svelte-kit/src/routing/outbound/decide-strategy.js +9 -9
  261. package/dist/svelte-kit/src/routing/outbound/determine-target.js +28 -44
  262. package/dist/svelte-kit/src/routing/outbound/resolve-outbound.js +12 -16
  263. package/dist/svelte-kit/src/routing/outbound/utils/derive-host-destination.js +5 -9
  264. package/dist/svelte-kit/src/routing/outbound/utils/derive-query-destination.js +4 -7
  265. package/dist/svelte-kit/src/routing/outbound/utils/is-external-destination.js +1 -7
  266. package/dist/svelte-kit/src/routing/pathname/canonicalize-pathname.js +25 -67
  267. package/dist/svelte-kit/src/routing/pathname/localize-pathname.js +12 -30
  268. package/dist/svelte-kit/src/routing/pathname/materialize-pathname.js +9 -44
  269. package/dist/svelte-kit/src/routing/pathname/standardize-pathname.js +6 -30
  270. package/dist/types/export/index.d.ts +1 -1
  271. package/dist/types/export/index.d.ts.map +1 -1
  272. package/dist/types/export/next/server/index.d.ts +1 -1
  273. package/dist/types/export/next/server/index.d.ts.map +1 -1
  274. package/dist/types/src/adapters/fastify/intor-fastify-plugin.d.ts.map +1 -1
  275. package/dist/types/src/adapters/next/create-intor-handler.d.ts.map +1 -1
  276. package/dist/types/src/{core/constants/headers.d.ts → adapters/next/header-keys.d.ts} +3 -2
  277. package/dist/types/src/adapters/next/header-keys.d.ts.map +1 -0
  278. package/dist/types/src/adapters/next/server/get-locale.d.ts.map +1 -1
  279. package/dist/types/src/adapters/next/server/index.d.ts +1 -0
  280. package/dist/types/src/adapters/next/server/index.d.ts.map +1 -1
  281. package/dist/types/src/adapters/next/server/read-intor-url-state.d.ts +13 -0
  282. package/dist/types/src/adapters/next/server/read-intor-url-state.d.ts.map +1 -0
  283. package/dist/types/src/core/constants/index.d.ts +0 -1
  284. package/dist/types/src/core/constants/index.d.ts.map +1 -1
  285. package/dist/types/src/core/constants/locale-placeholder.d.ts +5 -0
  286. package/dist/types/src/core/constants/locale-placeholder.d.ts.map +1 -1
  287. package/dist/types/src/core/index.d.ts +1 -1
  288. package/dist/types/src/core/index.d.ts.map +1 -1
  289. package/dist/types/src/edge/translator/init-translator.d.ts.map +1 -1
  290. package/dist/types/src/routing/outbound/decide-strategy.d.ts +1 -1
  291. package/dist/types/src/routing/outbound/decide-strategy.d.ts.map +1 -1
  292. package/dist/types/src/server/translator/init-translator.d.ts.map +1 -1
  293. package/dist/vue/src/client/shared/messages/create-refetch-messages.js +41 -51
  294. package/dist/vue/src/client/shared/provider/effective-state.js +2 -6
  295. package/dist/vue/src/client/shared/utils/build-cookie-string.js +18 -27
  296. package/dist/vue/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  297. package/dist/vue/src/client/shared/utils/locale/set-document-locale.js +2 -8
  298. package/dist/vue/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  299. package/dist/vue/src/client/vue/helpers/use-intor.js +20 -42
  300. package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +23 -24
  301. package/dist/vue/src/client/vue/provider/effects/use-messages-effects.js +15 -24
  302. package/dist/vue/src/client/vue/provider/inject-intor-context.js +4 -4
  303. package/dist/vue/src/client/vue/provider/intor-provider.js +61 -66
  304. package/dist/vue/src/client/vue/render/create-vue-renderer.js +18 -24
  305. package/dist/vue/src/client/vue/translator/create-t-rich.js +5 -17
  306. package/dist/vue/src/client/vue/translator/trans.js +24 -31
  307. package/dist/vue/src/client/vue/translator/use-translator.js +12 -17
  308. package/dist/vue/src/core/logger/get-logger.js +26 -31
  309. package/dist/vue/src/core/logger/global-logger-pool.js +4 -4
  310. package/dist/vue/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  311. package/dist/vue/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  312. package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  313. package/dist/vue/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  314. package/dist/vue/src/core/messages/merge-messages.js +17 -28
  315. package/dist/vue/src/core/messages/utils/is-valid-messages.js +22 -37
  316. package/dist/vue/src/core/messages/utils/nest-object-from-path.js +5 -17
  317. package/dist/vue/src/core/utils/deep-merge.js +24 -42
  318. package/dist/vue/src/core/utils/resolve-loader-options.js +6 -29
  319. package/dist/vue/src/policies/should-persist-on-first-visit.js +1 -4
  320. package/package.json +53 -65
  321. package/dist/next/src/core/constants/headers.js +0 -8
  322. package/dist/types/src/core/constants/headers.d.ts.map +0 -1
@@ -4,75 +4,33 @@ import 'logry';
4
4
  import 'p-limit';
5
5
  import 'intor-translator';
6
6
 
7
- /**
8
- * Returns the internal canonical pathname.
9
- *
10
- * Canonical representation is the locale-neutral and deployment-neutral
11
- * internal routing form used for identity and routing computation.
12
- *
13
- * Guarantees:
14
- * - Pathname is normalized
15
- * - Deployment prefix (`basePath`) is removed
16
- * - Leading locale segment or `{locale}` placeholder is removed
17
- * - Only the first path segment is evaluated for locale stripping
18
- * - Result always starts with "/"
19
- * - Root is represented as "/"
20
- *
21
- * Accepts `{locale}` as a locale placeholder segment.
22
- *
23
- * @example
24
- * ```ts
25
- * // config.supportedLocales: ["en"]
26
- * // config.routing.basePath: "/app"
27
- * // config.routing.prefix: "all"
28
- * canonicalizePathname("/app/en/about", config);
29
- * // => "/about"
30
- *```
31
- */
32
7
  function canonicalizePathname(rawPathname, config) {
33
- const { routing, supportedLocales } = config;
34
- const normalizedPathname = normalizePathname(rawPathname);
35
- // ---------------------------------------------------------------------------
36
- // Strip basePath (deployment prefix)
37
- // ---------------------------------------------------------------------------
38
- const basePath = routing.basePath === "/" ? "" : routing.basePath;
39
- let path = normalizedPathname;
40
- if (basePath) {
41
- if (path === basePath) {
42
- path = "/";
43
- }
44
- else if (path.startsWith(basePath + "/")) {
45
- path = path.slice(basePath.length);
46
- }
8
+ const { routing, supportedLocales } = config;
9
+ const normalizedPathname = normalizePathname(rawPathname);
10
+ const basePath = routing.basePath === "/" ? "" : routing.basePath;
11
+ let path = normalizedPathname;
12
+ if (basePath) {
13
+ if (path === basePath) {
14
+ path = "/";
15
+ } else if (path.startsWith(basePath + "/")) {
16
+ path = path.slice(basePath.length);
47
17
  }
48
- // ---------------------------------------------------------------------------
49
- // Detect first segment (allocation-minimized)
50
- // ---------------------------------------------------------------------------
51
- if (path === "/")
52
- return "/";
53
- const segmentStart = 1; // skip leading "/"
54
- const nextSlash = path.indexOf("/", segmentStart);
55
- const firstSegment = nextSlash === -1
56
- ? path.slice(segmentStart)
57
- : path.slice(segmentStart, nextSlash);
58
- // ---------------------------------------------------------------------------
59
- // Determine if first segment is locale representation
60
- // ---------------------------------------------------------------------------
61
- let localeLength;
62
- if (firstSegment === LOCALE_PLACEHOLDER) {
63
- localeLength = firstSegment.length;
64
- }
65
- else if (supportedLocales.includes(firstSegment)) {
66
- localeLength = firstSegment.length;
67
- }
68
- // ---------------------------------------------------------------------------
69
- // Strip locale segment (if any)
70
- // ---------------------------------------------------------------------------
71
- if (localeLength !== undefined) {
72
- const stripped = path.slice(localeLength + 1);
73
- return stripped || "/";
74
- }
75
- return path;
18
+ }
19
+ if (path === "/") return "/";
20
+ const segmentStart = 1;
21
+ const nextSlash = path.indexOf("/", segmentStart);
22
+ const firstSegment = nextSlash === -1 ? path.slice(segmentStart) : path.slice(segmentStart, nextSlash);
23
+ let localeLength;
24
+ if (firstSegment === LOCALE_PLACEHOLDER) {
25
+ localeLength = firstSegment.length;
26
+ } else if (supportedLocales.includes(firstSegment)) {
27
+ localeLength = firstSegment.length;
28
+ }
29
+ if (localeLength !== void 0) {
30
+ const stripped = path.slice(localeLength + 1);
31
+ return stripped || "/";
32
+ }
33
+ return path;
76
34
  }
77
35
 
78
36
  export { canonicalizePathname };
@@ -2,37 +2,19 @@ import { canonicalizePathname } from './canonicalize-pathname.js';
2
2
  import { materializePathname } from './materialize-pathname.js';
3
3
  import { standardizePathname } from './standardize-pathname.js';
4
4
 
5
- /**
6
- * Localizes a pathname by composing canonicalization,
7
- * standardization, and locale prefix strategies.
8
- *
9
- * @example
10
- * ```ts
11
- * // config.supportedLocales: ["en-US"]
12
- * // config.routing.basePath: "/app"
13
- * // config.routing.prefix: "all"
14
- * localizePathname("/app/en-US/about", config, "en-US");
15
- * // => {
16
- * // pathname: '/app/en-US/about'
17
- * // canonicalPathname: '/about',
18
- * // templatedPathname: '/app/{locale}/about',
19
- * // }
20
- * ```
21
- *
22
- * @public
23
- */
24
5
  const localizePathname = (rawPathname, config, locale) => {
25
- // 1. Canonicalize: normalize and remove routing-specific prefixes
26
- const canonicalPathname = canonicalizePathname(rawPathname, config);
27
- // 2. Standardize: convert to internal pathname shape with locale placeholder
28
- const standardizedPathname = standardizePathname(canonicalPathname, config);
29
- // 3. Materialize: apply routing rules to produce the final pathname
30
- const materializedPathname = materializePathname(standardizedPathname, config, locale);
31
- return {
32
- canonicalPathname,
33
- templatedPathname: standardizedPathname,
34
- pathname: materializedPathname,
35
- };
6
+ const canonicalPathname = canonicalizePathname(rawPathname, config);
7
+ const standardizedPathname = standardizePathname(canonicalPathname, config);
8
+ const materializedPathname = materializePathname(
9
+ standardizedPathname,
10
+ config,
11
+ locale
12
+ );
13
+ return {
14
+ canonicalPathname,
15
+ templatedPathname: standardizedPathname,
16
+ pathname: materializedPathname
17
+ };
36
18
  };
37
19
 
38
20
  export { localizePathname };
@@ -3,51 +3,16 @@ import 'logry';
3
3
  import 'p-limit';
4
4
  import 'intor-translator';
5
5
 
6
- /**
7
- * Materializes a standardized pathname into a concrete, locale-aware URL.
8
- *
9
- * This function resolves the `{locale}` placeholder according to the
10
- * configured `localePrefix` strategy and produces the final pathname.
11
- *
12
- * Behavior:
13
- * - "all": always injects the locale segment
14
- * - "except-default": injects the locale unless it equals `defaultLocale`
15
- * - "none": removes the locale placeholder entirely
16
- *
17
- * Invariants:
18
- * - `standardizedPathname` must be produced by `standardizePathname`
19
- * - The pathname must contain exactly one `{locale}` placeholder
20
- * - The placeholder must appear as the first path segment
21
- *
22
- * This function performs structural transformation only.
23
- * It does not normalize or sanitize the resulting pathname.
24
- *
25
- * @example
26
- * ```ts
27
- * // config.routing.localePrefix: "all"
28
- * materializePathname("/app/{locale}/about", config, "en");
29
- * // => /app/en/about
30
- *
31
- * // config.routing.localePrefix: "none"
32
- * materializePathname("/app/{locale}/about", config, "en");
33
- * // => /app/about
34
- * ```
35
- */
36
6
  const materializePathname = (standardizedPathname, config, locale) => {
37
- const { localePrefix } = config.routing;
38
- const removeLocale = () => {
39
- const result = standardizedPathname.replace(`/${LOCALE_PLACEHOLDER}`, "");
40
- return result === "" ? "/" : result;
41
- };
42
- const injectLocale = () => standardizedPathname.replace(LOCALE_PLACEHOLDER, locale);
43
- // localePrefix: "none"
44
- if (localePrefix === "none")
45
- return removeLocale();
46
- // localePrefix: "all"
47
- if (localePrefix === "all")
48
- return injectLocale();
49
- // localePrefix: "except-default"
50
- return locale === config.defaultLocale ? removeLocale() : injectLocale();
7
+ const { localePrefix } = config.routing;
8
+ const removeLocale = () => {
9
+ const result = standardizedPathname.replace(`/${LOCALE_PLACEHOLDER}`, "");
10
+ return result === "" ? "/" : result;
11
+ };
12
+ const injectLocale = () => standardizedPathname.replace(LOCALE_PLACEHOLDER, locale);
13
+ if (localePrefix === "none") return removeLocale();
14
+ if (localePrefix === "all") return injectLocale();
15
+ return locale === config.defaultLocale ? removeLocale() : injectLocale();
51
16
  };
52
17
 
53
18
  export { materializePathname };
@@ -3,37 +3,13 @@ import 'logry';
3
3
  import 'p-limit';
4
4
  import 'intor-translator';
5
5
 
6
- /**
7
- * Standardizes a canonical pathname into an internal routing template.
8
- *
9
- * Standardized representation:
10
- * - Prepends the deployment prefix (`basePath`) if defined
11
- * - Injects the `{locale}` placeholder as the first path segment
12
- * - Preserves the canonical pathname structure
13
- *
14
- * Input must be a canonical pathname.
15
- *
16
- * Output is an internal routing template and
17
- * is not a locale-resolved URL.
18
- *
19
- * @example
20
- * ```ts
21
- * // config.routing.basePath: "/app",
22
- * standardizePathname("/about", config);
23
- * // => "/app/{locale}/about"
24
- * ```
25
- */
26
6
  const standardizePathname = (canonicalPathname, config) => {
27
- const { routing } = config;
28
- const basePath = routing.basePath && routing.basePath !== "/" ? routing.basePath : "";
29
- if (canonicalPathname === "/") {
30
- return basePath
31
- ? `${basePath}/${LOCALE_PLACEHOLDER}`
32
- : `/${LOCALE_PLACEHOLDER}`;
33
- }
34
- return basePath
35
- ? `${basePath}/${LOCALE_PLACEHOLDER}${canonicalPathname}`
36
- : `/${LOCALE_PLACEHOLDER}${canonicalPathname}`;
7
+ const { routing } = config;
8
+ const basePath = routing.basePath && routing.basePath !== "/" ? routing.basePath : "";
9
+ if (canonicalPathname === "/") {
10
+ return basePath ? `${basePath}/${LOCALE_PLACEHOLDER}` : `/${LOCALE_PLACEHOLDER}`;
11
+ }
12
+ return basePath ? `${basePath}/${LOCALE_PLACEHOLDER}${canonicalPathname}` : `/${LOCALE_PLACEHOLDER}${canonicalPathname}`;
37
13
  };
38
14
 
39
15
  export { standardizePathname };
@@ -7,51 +7,40 @@ import 'intor-translator';
7
7
  import { resolveInbound } from '../../routing/inbound/resolve-inbound.js';
8
8
  import { getLocaleFromAcceptLanguage } from '../../routing/locale/get-locale-from-accept-language.js';
9
9
 
10
- /**
11
- * Resolves locale-aware routing for the current execution context.
12
- *
13
- * - Binds resolved routing state to the request.
14
- * - Optionally binds convenience routing shortcuts for downstream consumption.
15
- *
16
- * @public
17
- */
18
10
  function createIntorHandler(config, options) {
19
- return async function intorHandler(c, next) {
20
- // Locale from Accept-Language header
21
- const acceptLanguage = c.req.header("accept-language");
22
- const localeFromAcceptLanguage = getLocaleFromAcceptLanguage(acceptLanguage, config.supportedLocales);
23
- // ----------------------------------------------------------
24
- // Resolve inbound routing decision (pure computation)
25
- // ----------------------------------------------------------
26
- const url = new URL(c.req.url);
27
- const cookie = parseCookieHeader(c.req.header("cookie"))[config.cookie.name];
28
- const { locale, localeSource, pathname } = resolveInbound(config, url.pathname, {
29
- host: url.hostname,
30
- query: normalizeQuery(Object.fromEntries(url.searchParams)),
31
- ...(cookie !== undefined ? { cookie } : {}),
32
- ...(localeFromAcceptLanguage !== undefined
33
- ? { detected: localeFromAcceptLanguage }
34
- : {}),
35
- });
36
- // --------------------------------------------------
37
- // Bind inbound routing context
38
- // --------------------------------------------------
39
- c.set("intor", { locale, localeSource, pathname });
40
- const { handlers, hooks } = options ?? {};
41
- const { hasKey, t, tRich } = await getTranslator(config, {
42
- locale,
43
- ...(handlers !== undefined ? { handlers } : {}),
44
- ...(hooks !== undefined ? { hooks } : {}),
45
- });
46
- // DX shortcuts (enabled by default)
47
- if (options?.shortcuts !== false) {
48
- c.set("locale", locale);
49
- c.set("hasKey", hasKey);
50
- c.set("t", t);
51
- c.set("tRich", tRich);
52
- }
53
- await next();
54
- };
11
+ return async function intorHandler(c, next) {
12
+ const acceptLanguage = c.req.header("accept-language");
13
+ const localeFromAcceptLanguage = getLocaleFromAcceptLanguage(
14
+ acceptLanguage,
15
+ config.supportedLocales
16
+ );
17
+ const url = new URL(c.req.url);
18
+ const cookie = parseCookieHeader(c.req.header("cookie"))[config.cookie.name];
19
+ const { locale, localeSource, pathname } = resolveInbound(
20
+ config,
21
+ url.pathname,
22
+ {
23
+ host: url.hostname,
24
+ query: normalizeQuery(Object.fromEntries(url.searchParams)),
25
+ ...cookie !== void 0 ? { cookie } : {},
26
+ ...localeFromAcceptLanguage !== void 0 ? { detected: localeFromAcceptLanguage } : {}
27
+ }
28
+ );
29
+ c.set("intor", { locale, localeSource, pathname });
30
+ const { handlers, hooks } = options ?? {};
31
+ const { hasKey, t, tRich } = await getTranslator(config, {
32
+ locale,
33
+ ...handlers !== void 0 ? { handlers } : {},
34
+ ...hooks !== void 0 ? { hooks } : {}
35
+ });
36
+ if (options?.shortcuts !== false) {
37
+ c.set("locale", locale);
38
+ c.set("hasKey", hasKey);
39
+ c.set("t", t);
40
+ c.set("tRich", tRich);
41
+ }
42
+ await next();
43
+ };
55
44
  }
56
45
 
57
46
  export { createIntorHandler };
@@ -1,15 +1,8 @@
1
1
  import { getTranslator as getTranslator$1 } from 'intor/edge';
2
2
 
3
- /**
4
- * Get a edge-runtime translator for the current execution context.
5
- *
6
- * - Automatically resolves the locale from the framework context.
7
- *
8
- * @public
9
- */
10
3
  async function getTranslator(config, c, params) {
11
- const locale = c.get("intor")?.locale ?? config.defaultLocale;
12
- return getTranslator$1(config, { locale, ...(params ?? {}) });
4
+ const locale = c.get("intor")?.locale ?? config.defaultLocale;
5
+ return getTranslator$1(config, { locale, ...params ?? {} });
13
6
  }
14
7
 
15
8
  export { getTranslator };
@@ -1,4 +1,3 @@
1
- // Default locale placeholder
2
1
  const LOCALE_PLACEHOLDER = "{locale}";
3
2
 
4
3
  export { LOCALE_PLACEHOLDER };
@@ -1,23 +1,12 @@
1
- /**
2
- * Canonicalizes a BCP 47 locale string.
3
- *
4
- * - Uses `Intl.getCanonicalLocales` when available.
5
- * - Returns the original input if `Intl` is unavailable.
6
- * - Returns `undefined` for invalid locale input.
7
- *
8
- * This function performs normalization only.
9
- * It does not perform matching or fallback.
10
- */
11
1
  function canonicalizeLocale(input) {
12
- try {
13
- if (typeof Intl === "undefined" || !Intl.getCanonicalLocales) {
14
- return input;
15
- }
16
- return Intl.getCanonicalLocales(input)[0];
17
- }
18
- catch {
19
- return;
2
+ try {
3
+ if (typeof Intl === "undefined" || !Intl.getCanonicalLocales) {
4
+ return input;
20
5
  }
6
+ return Intl.getCanonicalLocales(input)[0];
7
+ } catch {
8
+ return;
9
+ }
21
10
  }
22
11
 
23
12
  export { canonicalizeLocale };
@@ -1,61 +1,35 @@
1
1
  import { canonicalizeLocale } from './canonicalize-locale.js';
2
2
  import { parseLocale } from './parse-locale.js';
3
3
 
4
- /**
5
- * Matches a locale candidate against a list of supported locales.
6
- *
7
- * Resolution order:
8
- * 1. Exact canonical match
9
- * 2. Same language + same script
10
- * 3. Same language only (only if candidate has no script)
11
- *
12
- * Returns one of the original `supportedLocales` values if matched.
13
- * Returns `undefined` if no match is found.
14
- *
15
- * Notes:
16
- * - Matching is deterministic and order-sensitive.
17
- * - Does not perform automatic fallback to a default locale.
18
- * Consumers are responsible for applying fallback logic.
19
- * - If the candidate includes a script subtag, language-only fallback is skipped.
20
- *
21
- * @public
22
- */
23
4
  function matchLocale(locale, supportedLocales = []) {
24
- if (!locale || supportedLocales.length === 0)
25
- return;
26
- const canonicalCandidate = canonicalizeLocale(locale);
27
- if (!canonicalCandidate)
28
- return;
29
- const candidateParts = parseLocale(canonicalCandidate);
30
- const supportedCanonical = supportedLocales.flatMap((original) => {
31
- const canonical = canonicalizeLocale(original);
32
- if (!canonical)
33
- return [];
34
- return [{ original, canonical, parts: parseLocale(canonical) }];
35
- });
36
- // 1. Exact match
37
- for (const s of supportedCanonical) {
38
- if (s.canonical === canonicalCandidate) {
39
- return s.original;
40
- }
41
- }
42
- // 2. Same language + same script
43
- if (candidateParts.script) {
44
- for (const s of supportedCanonical) {
45
- if (s.parts.language === candidateParts.language &&
46
- s.parts.script === candidateParts.script) {
47
- return s.original;
48
- }
49
- }
50
- return;
5
+ if (!locale || supportedLocales.length === 0) return;
6
+ const canonicalCandidate = canonicalizeLocale(locale);
7
+ if (!canonicalCandidate) return;
8
+ const candidateParts = parseLocale(canonicalCandidate);
9
+ const supportedCanonical = supportedLocales.flatMap((original) => {
10
+ const canonical = canonicalizeLocale(original);
11
+ if (!canonical) return [];
12
+ return [{ original, canonical, parts: parseLocale(canonical) }];
13
+ });
14
+ for (const s of supportedCanonical) {
15
+ if (s.canonical === canonicalCandidate) {
16
+ return s.original;
51
17
  }
52
- // 3. Same language only
18
+ }
19
+ if (candidateParts.script) {
53
20
  for (const s of supportedCanonical) {
54
- if (s.parts.language === candidateParts.language) {
55
- return s.original;
56
- }
21
+ if (s.parts.language === candidateParts.language && s.parts.script === candidateParts.script) {
22
+ return s.original;
23
+ }
57
24
  }
58
25
  return;
26
+ }
27
+ for (const s of supportedCanonical) {
28
+ if (s.parts.language === candidateParts.language) {
29
+ return s.original;
30
+ }
31
+ }
32
+ return;
59
33
  }
60
34
 
61
35
  export { matchLocale };
@@ -1,27 +1,17 @@
1
- /**
2
- * Parses a canonical locale tag into structural components.
3
- *
4
- * - Uses `Intl.Locale` when available.
5
- * - Falls back to minimal parsing (language only) if unavailable.
6
- *
7
- * This function does not validate or match locales.
8
- */
9
1
  function parseLocale(tag) {
10
- try {
11
- if (typeof Intl !== "undefined" && typeof Intl.Locale === "function") {
12
- const locale = new Intl.Locale(tag);
13
- return {
14
- language: locale.language,
15
- ...(locale.script !== undefined ? { script: locale.script } : {}),
16
- ...(locale.region !== undefined ? { region: locale.region } : {}),
17
- };
18
- }
2
+ try {
3
+ if (typeof Intl !== "undefined" && typeof Intl.Locale === "function") {
4
+ const locale = new Intl.Locale(tag);
5
+ return {
6
+ language: locale.language,
7
+ ...locale.script !== void 0 ? { script: locale.script } : {},
8
+ ...locale.region !== void 0 ? { region: locale.region } : {}
9
+ };
19
10
  }
20
- catch {
21
- // fallback below
22
- }
23
- const parts = tag.split("-");
24
- return { language: parts[0].toLowerCase() };
11
+ } catch {
12
+ }
13
+ const parts = tag.split("-");
14
+ return { language: parts[0].toLowerCase() };
25
15
  }
26
16
 
27
17
  export { parseLocale };
@@ -1,42 +1,24 @@
1
- /**
2
- * Normalizes a raw pathname string into a consistent structural form.
3
- *
4
- * Canonical guarantees:
5
- * - Leading and trailing whitespace (code points ≤ 32) are trimmed
6
- * - Consecutive slashes are collapsed into a single slash
7
- * - The result always starts with a single "/"
8
- * - Redundant trailing slashes are removed
9
- * - The root path is represented as "/"
10
- *
11
- * This function is deterministic and allocation-minimized.
12
- */
13
1
  const normalizePathname = (rawPathname) => {
14
- const length = rawPathname.length;
15
- let start = 0;
16
- let end = length - 1;
17
- // Trim leading whitespace
18
- while (start <= end && rawPathname.codePointAt(start) <= 32)
19
- start++;
20
- // Trim trailing whitespace
21
- while (end >= start && rawPathname.codePointAt(end) <= 32)
22
- end--;
23
- if (start > end)
24
- return "/"; // Only whitespace
25
- let result = "";
26
- let hasSlash = false;
27
- for (let i = start; i <= end; i++) {
28
- const char = rawPathname[i];
29
- if (char === "/") {
30
- if (!hasSlash) {
31
- hasSlash = true;
32
- }
33
- }
34
- else {
35
- result += hasSlash || result === "" ? "/" + char : char;
36
- hasSlash = false;
37
- }
2
+ const length = rawPathname.length;
3
+ let start = 0;
4
+ let end = length - 1;
5
+ while (start <= end && rawPathname.codePointAt(start) <= 32) start++;
6
+ while (end >= start && rawPathname.codePointAt(end) <= 32) end--;
7
+ if (start > end) return "/";
8
+ let result = "";
9
+ let hasSlash = false;
10
+ for (let i = start; i <= end; i++) {
11
+ const char = rawPathname[i];
12
+ if (char === "/") {
13
+ if (!hasSlash) {
14
+ hasSlash = true;
15
+ }
16
+ } else {
17
+ result += hasSlash || result === "" ? "/" + char : char;
18
+ hasSlash = false;
38
19
  }
39
- return result || "/";
20
+ }
21
+ return result || "/";
40
22
  };
41
23
 
42
24
  export { normalizePathname };
@@ -1,25 +1,11 @@
1
- /**
2
- * Normalize a raw query object into a string-only map.
3
- *
4
- * This utility is used to sanitize framework-specific query inputs
5
- * into a stable shape that the routing core
6
- * can safely consume.
7
- *
8
- * Behavior:
9
- * - Keeps only entries whose values are strings
10
- * - Ignores arrays, objects, and other non-string values
11
- * - Does not throw or attempt to coerce values
12
- *
13
- * This function is intentionally conservative by design.
14
- */
15
1
  function normalizeQuery(query) {
16
- const normalized = {};
17
- for (const [key, value] of Object.entries(query)) {
18
- if (typeof value === "string") {
19
- normalized[key] = value;
20
- }
2
+ const normalized = {};
3
+ for (const [key, value] of Object.entries(query)) {
4
+ if (typeof value === "string") {
5
+ normalized[key] = value;
21
6
  }
22
- return normalized;
7
+ }
8
+ return normalized;
23
9
  }
24
10
 
25
11
  export { normalizeQuery };