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
@@ -1,29 +1,16 @@
1
- /**
2
- * Resolve pathname decision for routing prefix strategy: "except-default".
3
- */
4
1
  function exceptDefault(config, context) {
5
- const { hasPathLocale, hasPersisted} = context;
6
- const { redirect } = config.routing.inbound.firstVisit;
7
- const isFirstVisit = !hasPersisted;
8
- const isDefaultLocale = context.locale === config.defaultLocale;
9
- // ----------------------------------------------------------
10
- // URL already canonical
11
- // ----------------------------------------------------------
12
- if (hasPathLocale) {
13
- return { type: "pass" };
14
- }
15
- // ----------------------------------------------------------
16
- // Apply first-visit redirect policy
17
- // ----------------------------------------------------------
18
- if (isFirstVisit) {
19
- if (!redirect)
20
- return { type: "pass" };
21
- return isDefaultLocale ? { type: "pass" } : { type: "redirect" };
22
- }
23
- // ----------------------------------------------------------
24
- // Redirect non-default locale to the locale-prefixed URL
25
- // ----------------------------------------------------------
2
+ const { hasPathLocale, hasPersisted} = context;
3
+ const { redirect } = config.routing.inbound.firstVisit;
4
+ const isFirstVisit = !hasPersisted;
5
+ const isDefaultLocale = context.locale === config.defaultLocale;
6
+ if (hasPathLocale) {
7
+ return { type: "pass" };
8
+ }
9
+ if (isFirstVisit) {
10
+ if (!redirect) return { type: "pass" };
26
11
  return isDefaultLocale ? { type: "pass" } : { type: "redirect" };
12
+ }
13
+ return isDefaultLocale ? { type: "pass" } : { type: "redirect" };
27
14
  }
28
15
 
29
16
  export { exceptDefault };
@@ -1,8 +1,5 @@
1
- /**
2
- * Resolve pathname decision for routing prefix strategy: "none".
3
- */
4
1
  function none() {
5
- return { type: "pass" };
2
+ return { type: "pass" };
6
3
  }
7
4
 
8
5
  export { none };
@@ -1,40 +1,25 @@
1
- /**
2
- * Get locale candidate from the `Accept-Language` header.
3
- *
4
- * Parses language priorities and returns the highest-priority
5
- * language present in `supportedLocales`, without normalization.
6
- *
7
- * @example
8
- * ```ts
9
- * getLocaleFromAcceptLanguage("en-US,en;q=0.8,zh-TW;q=0.9", ["en-US", "zh-TW"])
10
- * // => "en-US"
11
- *
12
- * getLocaleFromAcceptLanguage("fr,ja;q=0.9", ["en", "zh-TW"])
13
- * // => undefined
14
- * ```
15
- */
16
1
  const getLocaleFromAcceptLanguage = (acceptLanguageHeader, supportedLocales) => {
17
- if (!acceptLanguageHeader || supportedLocales.length === 0) {
18
- return;
19
- }
20
- const supportedLocalesSet = new Set(supportedLocales);
21
- // 1. Parse Accept-Language header into language + priority pairs
22
- const parsedLanguages = acceptLanguageHeader.split(",").map((part) => {
23
- const segments = part.split(";");
24
- const rawLang = segments[0];
25
- const rawQ = segments[1];
26
- const lang = rawLang.trim();
27
- const q = rawQ !== undefined ? Number.parseFloat(rawQ.split("=")[1] ?? "") : 1;
28
- return {
29
- lang,
30
- q: Number.isNaN(q) ? 0 : q, // Invalid q values have lowest priority
31
- };
32
- });
33
- // 2. Sort by priority (highest first)
34
- const sortedByPriority = parsedLanguages.sort((a, b) => b.q - a.q);
35
- // 3. Pick the first language explicitly supported
36
- const preferred = sortedByPriority.find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
37
- return preferred;
2
+ if (!acceptLanguageHeader || supportedLocales.length === 0) {
3
+ return;
4
+ }
5
+ const supportedLocalesSet = new Set(supportedLocales);
6
+ const parsedLanguages = acceptLanguageHeader.split(",").map((part) => {
7
+ const segments = part.split(";");
8
+ const rawLang = segments[0];
9
+ const rawQ = segments[1];
10
+ const lang = rawLang.trim();
11
+ const q = rawQ !== void 0 ? Number.parseFloat(rawQ.split("=")[1] ?? "") : 1;
12
+ return {
13
+ lang,
14
+ q: Number.isNaN(q) ? 0 : q
15
+ // Invalid q values have lowest priority
16
+ };
17
+ });
18
+ const sortedByPriority = parsedLanguages.sort((a, b) => b.q - a.q);
19
+ const preferred = sortedByPriority.find(
20
+ ({ lang }) => supportedLocalesSet.has(lang)
21
+ )?.lang;
22
+ return preferred;
38
23
  };
39
24
 
40
25
  export { getLocaleFromAcceptLanguage };
@@ -1,32 +1,9 @@
1
- /**
2
- * Get locale candidate from hostname.
3
- *
4
- * Returns the left-most hostname label, without validation or normalization.
5
- *
6
- * @example
7
- * ```ts
8
- * getLocaleFromHost("en.example.com")
9
- * // => "en"
10
- *
11
- * getLocaleFromHost("example.com")
12
- * // => "example"
13
- *
14
- * getLocaleFromHost("api.jp.example.com")
15
- * // => "api"
16
- *
17
- * getLocaleFromHost("localhost")
18
- * // => undefined
19
- * ```
20
- */
21
1
  function getLocaleFromHost(host) {
22
- if (!host)
23
- return;
24
- // Remove port (e.g. localhost:3000)
25
- const hostname = host.split(":")[0];
26
- const parts = hostname.split(".");
27
- if (parts.length < 2)
28
- return;
29
- return parts[0];
2
+ if (!host) return;
3
+ const hostname = host.split(":")[0];
4
+ const parts = hostname.split(".");
5
+ if (parts.length < 2) return;
6
+ return parts[0];
30
7
  }
31
8
 
32
9
  export { getLocaleFromHost };
@@ -3,44 +3,18 @@ import 'logry';
3
3
  import 'p-limit';
4
4
  import 'intor-translator';
5
5
 
6
- /**
7
- * Get locale from pathname.
8
- *
9
- * Extracts the first pathname segment (after basePath) as a locale
10
- * if it exactly matches one of the supported locales.
11
- *
12
- * @example
13
- * ```ts
14
- * getLocaleFromPathname(config, "/en/about")
15
- * // => "en"
16
- * getLocaleFromPathname(config, "/zh-TW")
17
- * // => "zh-TW"
18
- * getLocaleFromPathname(config, "/about")
19
- * // => undefined
20
- *
21
- * // config.routing.basePath: "/app"
22
- * getLocaleFromPathname(config, "/app/en/dashboard")
23
- * // => "en"
24
- * ```
25
- */
26
6
  function getLocaleFromPathname(pathname, config) {
27
- const { routing, supportedLocales } = config;
28
- const { basePath } = routing;
29
- // 1. Normalize pathname
30
- const normalizedPathname = normalizePathname(pathname);
31
- // 2. Strip basePath
32
- let prefixedPathname = normalizedPathname;
33
- if (basePath && normalizedPathname === basePath) {
34
- prefixedPathname = "/";
35
- }
36
- else if (basePath && normalizedPathname.startsWith(basePath + "/")) {
37
- prefixedPathname = normalizedPathname.slice(basePath.length);
38
- }
39
- // 3. Detect locale segment
40
- const firstSegment = prefixedPathname.split("/").find(Boolean);
41
- return firstSegment && supportedLocales.includes(firstSegment)
42
- ? firstSegment
43
- : undefined;
7
+ const { routing, supportedLocales } = config;
8
+ const { basePath } = routing;
9
+ const normalizedPathname = normalizePathname(pathname);
10
+ let prefixedPathname = normalizedPathname;
11
+ if (basePath && normalizedPathname === basePath) {
12
+ prefixedPathname = "/";
13
+ } else if (basePath && normalizedPathname.startsWith(basePath + "/")) {
14
+ prefixedPathname = normalizedPathname.slice(basePath.length);
15
+ }
16
+ const firstSegment = prefixedPathname.split("/").find(Boolean);
17
+ return firstSegment && supportedLocales.includes(firstSegment) ? firstSegment : void 0;
44
18
  }
45
19
 
46
20
  export { getLocaleFromPathname };
@@ -1,21 +1,6 @@
1
- /**
2
- * Get locale candidate from URL query parameters.
3
- *
4
- * Extracts the value of the configured query key, without
5
- * validation or normalization.
6
- *
7
- * @example
8
- * ```ts
9
- * getLocaleFromQuery({ locale: "en" }, "locale")
10
- * // => "en"
11
- *
12
- * getLocaleFromQuery({}, "locale")
13
- * // => undefined
14
- */
15
1
  function getLocaleFromQuery(query, queryKey) {
16
- if (!query)
17
- return;
18
- return query[queryKey];
2
+ if (!query) return;
3
+ return query[queryKey];
19
4
  }
20
5
 
21
6
  export { getLocaleFromQuery };
@@ -1,14 +1,14 @@
1
1
  import { shouldFullReload } from '../../policies/shoud-full-reload.js';
2
2
 
3
- /**
4
- * Decide how a resolved navigation target should be executed.
5
- */
6
- function decideStrategy(config, target) {
7
- // External destinations are always handled by the browser
8
- if (target.isExternal) {
9
- return "external";
10
- }
11
- return shouldFullReload(config) ? "reload" : "client";
3
+ function decideStrategy(config, target, currentLocale) {
4
+ if (target.isExternal) {
5
+ return "external";
6
+ }
7
+ const isLocaleChange = target.locale !== currentLocale;
8
+ if (isLocaleChange && shouldFullReload(config)) {
9
+ return "reload";
10
+ }
11
+ return "client";
12
12
  }
13
13
 
14
14
  export { decideStrategy };
@@ -4,52 +4,36 @@ import { deriveHostDestination } from './utils/derive-host-destination.js';
4
4
  import { deriveQueryDestination } from './utils/derive-query-destination.js';
5
5
  import { isExternalDestination } from './utils/is-external-destination.js';
6
6
 
7
- /**
8
- * Determines the outbound routing target.
9
- */
10
7
  function determineTarget(config, currentLocale, currentPathname, intent) {
11
- const { supportedLocales, routing } = config;
12
- // ----------------------------------------------------------------
13
- // Resolve effective locale
14
- // ----------------------------------------------------------------
15
- const locale = intent?.locale && supportedLocales.includes(intent?.locale)
16
- ? intent?.locale
17
- : currentLocale;
18
- // ----------------------------------------------------------------
19
- // Resolve raw destination and external flag
20
- // ----------------------------------------------------------------
21
- // Use the unprefixed logical path as the navigation base.
22
- // Locale prefixes are applied later by inbound canonicalization.
23
- const rawDestination = intent?.destination ?? canonicalizePathname(currentPathname, config);
24
- const isExternal = isExternalDestination(rawDestination);
25
- // ----------------------------------------------------------------
26
- // Project destination by navigation carrier
27
- // ----------------------------------------------------------------
28
- let destination = rawDestination;
29
- if (!isExternal) {
30
- switch (routing.outbound.localeCarrier) {
31
- case "path": {
32
- destination = localizePathname(rawDestination, config, locale).pathname;
33
- break;
34
- }
35
- case "host": {
36
- destination = deriveHostDestination(rawDestination, config, locale);
37
- break;
38
- }
39
- case "query": {
40
- destination = deriveQueryDestination(rawDestination, config, locale);
41
- break;
42
- }
43
- default: {
44
- destination = rawDestination;
45
- }
46
- }
8
+ const { supportedLocales, routing } = config;
9
+ const locale = intent?.locale && supportedLocales.includes(intent?.locale) ? intent?.locale : currentLocale;
10
+ const rawDestination = intent?.destination ?? canonicalizePathname(currentPathname, config);
11
+ const isExternal = isExternalDestination(rawDestination);
12
+ let destination = rawDestination;
13
+ if (!isExternal) {
14
+ switch (routing.outbound.localeCarrier) {
15
+ case "path": {
16
+ destination = localizePathname(rawDestination, config, locale).pathname;
17
+ break;
18
+ }
19
+ case "host": {
20
+ destination = deriveHostDestination(rawDestination, config, locale);
21
+ break;
22
+ }
23
+ case "query": {
24
+ destination = deriveQueryDestination(rawDestination, config, locale);
25
+ break;
26
+ }
27
+ default: {
28
+ destination = rawDestination;
29
+ }
47
30
  }
48
- return {
49
- locale,
50
- destination,
51
- isExternal,
52
- };
31
+ }
32
+ return {
33
+ locale,
34
+ destination,
35
+ isExternal
36
+ };
53
37
  }
54
38
 
55
39
  export { determineTarget };
@@ -1,23 +1,19 @@
1
1
  import { decideStrategy } from './decide-strategy.js';
2
2
  import { determineTarget } from './determine-target.js';
3
3
 
4
- /**
5
- * Resolve an outbound routing attempt into an executable result.
6
- */
7
4
  function resolveOutbound(config, currentLocale, currentPathname, intent) {
8
- // --------------------------------------------------
9
- // Determine outbound target
10
- // --------------------------------------------------
11
- const target = determineTarget(config, currentLocale, currentPathname, intent);
12
- // --------------------------------------------------
13
- // Decide outbound strategy
14
- // --------------------------------------------------
15
- const strategy = decideStrategy(config, target);
16
- return {
17
- locale: target.locale,
18
- destination: target.destination,
19
- kind: strategy,
20
- };
5
+ const target = determineTarget(
6
+ config,
7
+ currentLocale,
8
+ currentPathname,
9
+ intent
10
+ );
11
+ const strategy = decideStrategy(config, target, currentLocale);
12
+ return {
13
+ locale: target.locale,
14
+ destination: target.destination,
15
+ kind: strategy
16
+ };
21
17
  }
22
18
 
23
19
  export { resolveOutbound };
@@ -1,13 +1,9 @@
1
- /**
2
- * Derives a locale-specific destination using host-based navigation.
3
- */
4
1
  const deriveHostDestination = (rawDestination, config, locale) => {
5
- const { host } = config.routing.outbound;
6
- const resolvedHost = host.map[locale] ?? host.default;
7
- if (!resolvedHost)
8
- return rawDestination;
9
- const url = new URL(rawDestination, "http://localhost");
10
- return `${url.protocol}//${resolvedHost}${url.pathname}${url.search}`;
2
+ const { host } = config.routing.outbound;
3
+ const resolvedHost = host.map[locale] ?? host.default;
4
+ if (!resolvedHost) return rawDestination;
5
+ const url = new URL(rawDestination, "http://localhost");
6
+ return `${url.protocol}//${resolvedHost}${url.pathname}${url.search}`;
11
7
  };
12
8
 
13
9
  export { deriveHostDestination };
@@ -1,11 +1,8 @@
1
- /**
2
- * Derives a locale-specific destination using query-based navigation.
3
- */
4
1
  const deriveQueryDestination = (rawDestination, config, locale) => {
5
- const { queryKey } = config.routing.outbound;
6
- const url = new URL(rawDestination, "http://localhost");
7
- url.searchParams.set(queryKey, locale);
8
- return `${url.pathname}${url.search}`;
2
+ const { queryKey } = config.routing.outbound;
3
+ const url = new URL(rawDestination, "http://localhost");
4
+ url.searchParams.set(queryKey, locale);
5
+ return `${url.pathname}${url.search}`;
9
6
  };
10
7
 
11
8
  export { deriveQueryDestination };
@@ -1,11 +1,5 @@
1
- /**
2
- * Determines whether a navigation target should bypass app routing.
3
- *
4
- * Any value with an explicit scheme (e.g. http:, https:, mailto:)
5
- * is treated as external navigation.
6
- */
7
1
  const isExternalDestination = (destination) => {
8
- return /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(destination);
2
+ return /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(destination);
9
3
  };
10
4
 
11
5
  export { isExternalDestination };
@@ -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 };