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
@@ -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 };
@@ -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,54 +7,42 @@ 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(request) {
20
- // Locale from Accept-Language header
21
- const acceptLanguage = request.headers["accept-language"];
22
- const localeFromAcceptLanguage = getLocaleFromAcceptLanguage(acceptLanguage, config.supportedLocales);
23
- // ----------------------------------------------------------
24
- // Resolve inbound routing decision (pure computation)
25
- // ----------------------------------------------------------
26
- const cookie = parseCookieHeader(request.headers.cookie)[config.cookie.name];
27
- const rawPathname = new URL(request.raw.url ?? "/", "http://localhost")
28
- .pathname;
29
- const { locale, localeSource, pathname } = resolveInbound(config, rawPathname, {
30
- host: request.hostname,
31
- query: normalizeQuery(request.query),
32
- ...(cookie !== undefined ? { cookie } : {}),
33
- ...(localeFromAcceptLanguage !== undefined
34
- ? { detected: localeFromAcceptLanguage }
35
- : {}),
36
- });
37
- // --------------------------------------------------
38
- // Bind inbound routing context
39
- // --------------------------------------------------
40
- request.intor = { locale, localeSource, pathname };
41
- const { loader, handlers, hooks, readers } = options ?? {};
42
- const { hasKey, t, tRich } = await getTranslator(config, {
43
- locale,
44
- ...(loader !== undefined ? { loader } : {}),
45
- ...(readers !== undefined ? { readers } : {}),
46
- allowCacheWrite: true,
47
- ...(handlers !== undefined ? { handlers } : {}),
48
- ...(hooks !== undefined ? { hooks } : {}),
49
- });
50
- // DX shortcuts (enabled by default)
51
- if (options?.shortcuts !== false) {
52
- request.locale = locale;
53
- request.hasKey = hasKey;
54
- request.t = t;
55
- request.tRich = tRich;
56
- }
57
- };
11
+ return async function intorHandler(request) {
12
+ const acceptLanguage = request.headers["accept-language"];
13
+ const localeFromAcceptLanguage = getLocaleFromAcceptLanguage(
14
+ acceptLanguage,
15
+ config.supportedLocales
16
+ );
17
+ const cookie = parseCookieHeader(request.headers.cookie)[config.cookie.name];
18
+ const rawPathname = new URL(request.raw.url ?? "/", "http://localhost").pathname;
19
+ const { locale, localeSource, pathname } = resolveInbound(
20
+ config,
21
+ rawPathname,
22
+ {
23
+ host: request.hostname,
24
+ query: normalizeQuery(request.query),
25
+ ...cookie !== void 0 ? { cookie } : {},
26
+ ...localeFromAcceptLanguage !== void 0 ? { detected: localeFromAcceptLanguage } : {}
27
+ }
28
+ );
29
+ request.intor = { locale, localeSource, pathname };
30
+ const { loader, handlers, hooks, readers } = options ?? {};
31
+ const { hasKey, t, tRich } = await getTranslator(config, {
32
+ locale,
33
+ ...loader !== void 0 ? { loader } : {},
34
+ ...readers !== void 0 ? { readers } : {},
35
+ allowCacheWrite: true,
36
+ ...handlers !== void 0 ? { handlers } : {},
37
+ ...hooks !== void 0 ? { hooks } : {}
38
+ });
39
+ if (options?.shortcuts !== false) {
40
+ request.locale = locale;
41
+ request.hasKey = hasKey;
42
+ request.t = t;
43
+ request.tRich = tRich;
44
+ }
45
+ };
58
46
  }
59
47
 
60
48
  export { createIntorHandler };
@@ -1,15 +1,8 @@
1
1
  import { getTranslator as getTranslator$1 } from 'intor/server';
2
2
 
3
- /**
4
- * Get a server-side 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, request, params) {
11
- const locale = request.intor?.locale ?? config.defaultLocale;
12
- return getTranslator$1(config, { locale, ...(params ?? {}) });
4
+ const locale = request.intor?.locale ?? config.defaultLocale;
5
+ return getTranslator$1(config, { locale, ...params ?? {} });
13
6
  }
14
7
 
15
8
  export { getTranslator };
@@ -1,49 +1,40 @@
1
1
  import fp from 'fastify-plugin';
2
2
  import { createIntorHandler } from './create-intor-handler.js';
3
3
 
4
- /** Internal helpers */
5
4
  function decorateRequest(fastify, key) {
6
- if (fastify.hasRequestDecorator?.(key))
7
- return;
8
- fastify.decorateRequest(key, null);
5
+ if (fastify.hasRequestDecorator?.(key)) return;
6
+ fastify.decorateRequest(key, null);
9
7
  }
10
- /**
11
- * Internal plugin implementation
12
- */
13
8
  const intorFastifyPluginImpl = (fastify, options, done) => {
14
- const { config, loader, readers, handlers, hooks, shortcuts = true, } = options;
15
- // --------------------------------------------------
16
- // Declare request structure (once per instance)
17
- // --------------------------------------------------
18
- decorateRequest(fastify, "intor");
19
- if (shortcuts) {
20
- decorateRequest(fastify, "locale");
21
- decorateRequest(fastify, "hasKey");
22
- decorateRequest(fastify, "t");
23
- decorateRequest(fastify, "tRich");
24
- }
25
- // --------------------------------------------------
26
- // Bind inbound handler
27
- // --------------------------------------------------
28
- fastify.addHook("onRequest", createIntorHandler(config, {
29
- ...(loader !== undefined ? { loader } : {}),
30
- ...(readers !== undefined ? { readers } : {}),
31
- ...(handlers !== undefined ? { handlers } : {}),
32
- ...(hooks !== undefined ? { hooks } : {}),
33
- shortcuts,
34
- }));
35
- done();
9
+ const {
10
+ config,
11
+ loader,
12
+ readers,
13
+ handlers,
14
+ hooks,
15
+ shortcuts = true
16
+ } = options;
17
+ decorateRequest(fastify, "intor");
18
+ if (shortcuts) {
19
+ decorateRequest(fastify, "locale");
20
+ decorateRequest(fastify, "hasKey");
21
+ decorateRequest(fastify, "t");
22
+ decorateRequest(fastify, "tRich");
23
+ }
24
+ fastify.addHook(
25
+ "onRequest",
26
+ createIntorHandler(config, {
27
+ ...loader !== void 0 ? { loader } : {},
28
+ ...readers !== void 0 ? { readers } : {},
29
+ ...handlers !== void 0 ? { handlers } : {},
30
+ ...hooks !== void 0 ? { hooks } : {},
31
+ shortcuts
32
+ })
33
+ );
34
+ done();
36
35
  };
37
- /**
38
- * Fastify plugin for Intor.
39
- *
40
- * Registers inbound routing resolution and binds
41
- * locale-aware translation helpers to each request.
42
- *
43
- * @public
44
- */
45
36
  const intorFastifyPlugin = fp(intorFastifyPluginImpl, {
46
- name: "@intor/fastify",
37
+ name: "@intor/fastify"
47
38
  });
48
39
 
49
40
  export { intorFastifyPlugin };
@@ -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 };