intor 2.5.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/dist/core/src/client/shared/helpers/get-client-locale.js +5 -20
  2. package/dist/core/src/client/shared/utils/locale/detect-browser-locale.js +2 -8
  3. package/dist/core/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  4. package/dist/core/src/config/constants/cookie.js +9 -9
  5. package/dist/core/src/config/constants/routing.js +13 -14
  6. package/dist/core/src/config/define-intor-config.js +28 -44
  7. package/dist/core/src/config/resolvers/resolve-cookie-options.js +4 -4
  8. package/dist/core/src/config/resolvers/resolve-fallback-locales.js +33 -50
  9. package/dist/core/src/config/resolvers/resolve-routing-options.js +32 -61
  10. package/dist/core/src/config/validators/validate-default-locale.js +8 -13
  11. package/dist/core/src/config/validators/validate-id.js +8 -13
  12. package/dist/core/src/config/validators/validate-supported-locales.js +8 -13
  13. package/dist/core/src/core/constants/locale-placeholder.js +0 -1
  14. package/dist/core/src/core/error/intor-error.js +14 -29
  15. package/dist/core/src/core/locale/canonicalize-locale.js +7 -18
  16. package/dist/core/src/core/locale/match-locale.js +24 -50
  17. package/dist/core/src/core/locale/parse-locale.js +12 -22
  18. package/dist/core/src/core/logger/get-logger.js +26 -31
  19. package/dist/core/src/core/logger/global-logger-pool.js +4 -4
  20. package/dist/core/src/core/messages/internal-metadata.js +1 -1
  21. package/dist/core/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  22. package/dist/core/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  23. package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  24. package/dist/core/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  25. package/dist/core/src/core/messages/merge-messages.js +17 -28
  26. package/dist/core/src/core/messages/utils/is-valid-messages.js +22 -37
  27. package/dist/core/src/core/messages/utils/nest-object-from-path.js +5 -17
  28. package/dist/core/src/core/render/create-html-renderer.js +29 -37
  29. package/dist/core/src/core/render/utils/escape-html.js +1 -6
  30. package/dist/core/src/core/render/utils/render-attributes.js +6 -11
  31. package/dist/core/src/core/translator/create-t-rich.js +6 -15
  32. package/dist/core/src/core/translator/create-translator.js +16 -24
  33. package/dist/core/src/core/utils/deep-merge.js +24 -42
  34. package/dist/core/src/core/utils/normalizers/normalize-cache-key.js +14 -40
  35. package/dist/core/src/core/utils/normalizers/normalize-pathname.js +19 -37
  36. package/dist/core/src/core/utils/normalizers/normalize-query.js +6 -20
  37. package/dist/core/src/core/utils/parse-cookie-header.js +11 -18
  38. package/dist/core/src/core/utils/resolve-loader-options.js +6 -32
  39. package/dist/core/src/edge/helpers/get-translator.js +14 -20
  40. package/dist/core/src/edge/translator/init-translator.js +23 -31
  41. package/dist/core/src/routing/inbound/helpers/resolve-inbound-from-request.js +21 -28
  42. package/dist/core/src/routing/inbound/resolve-inbound.js +22 -37
  43. package/dist/core/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  44. package/dist/core/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  45. package/dist/core/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  46. package/dist/core/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  47. package/dist/core/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  48. package/dist/core/src/routing/locale/get-locale-from-accept-language.js +21 -36
  49. package/dist/core/src/routing/locale/get-locale-from-host.js +5 -28
  50. package/dist/core/src/routing/locale/get-locale-from-pathname.js +11 -37
  51. package/dist/core/src/routing/locale/get-locale-from-query.js +2 -17
  52. package/dist/core/src/routing/pathname/canonicalize-pathname.js +25 -67
  53. package/dist/core/src/routing/pathname/localize-pathname.js +12 -30
  54. package/dist/core/src/routing/pathname/materialize-pathname.js +9 -44
  55. package/dist/core/src/routing/pathname/standardize-pathname.js +6 -30
  56. package/dist/core/src/server/helpers/get-translator.js +26 -23
  57. package/dist/core/src/server/intor/intor.js +20 -25
  58. package/dist/core/src/server/messages/load-local-messages/cache/messages-pool.js +4 -7
  59. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +76 -92
  60. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +59 -80
  61. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +53 -87
  62. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +3 -6
  63. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +23 -35
  64. package/dist/core/src/server/messages/load-messages.js +56 -69
  65. package/dist/core/src/server/translator/init-translator.js +28 -30
  66. package/dist/express/src/adapters/express/create-intor-handler.js +35 -46
  67. package/dist/express/src/adapters/express/get-translator.js +2 -9
  68. package/dist/express/src/core/constants/locale-placeholder.js +0 -1
  69. package/dist/express/src/core/locale/canonicalize-locale.js +7 -18
  70. package/dist/express/src/core/locale/match-locale.js +24 -50
  71. package/dist/express/src/core/locale/parse-locale.js +12 -22
  72. package/dist/express/src/core/utils/normalizers/normalize-pathname.js +19 -37
  73. package/dist/express/src/core/utils/normalizers/normalize-query.js +6 -20
  74. package/dist/express/src/core/utils/parse-cookie-header.js +11 -18
  75. package/dist/express/src/routing/inbound/resolve-inbound.js +22 -37
  76. package/dist/express/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  77. package/dist/express/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  78. package/dist/express/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  79. package/dist/express/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  80. package/dist/express/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  81. package/dist/express/src/routing/locale/get-locale-from-accept-language.js +21 -36
  82. package/dist/express/src/routing/locale/get-locale-from-host.js +5 -28
  83. package/dist/express/src/routing/locale/get-locale-from-pathname.js +11 -37
  84. package/dist/express/src/routing/locale/get-locale-from-query.js +2 -17
  85. package/dist/express/src/routing/pathname/canonicalize-pathname.js +25 -67
  86. package/dist/express/src/routing/pathname/localize-pathname.js +12 -30
  87. package/dist/express/src/routing/pathname/materialize-pathname.js +9 -44
  88. package/dist/express/src/routing/pathname/standardize-pathname.js +6 -30
  89. package/dist/fastify/src/adapters/fastify/create-intor-handler.js +35 -47
  90. package/dist/fastify/src/adapters/fastify/get-translator.js +2 -9
  91. package/dist/fastify/src/adapters/fastify/intor-fastify-plugin.js +29 -38
  92. package/dist/fastify/src/core/constants/locale-placeholder.js +0 -1
  93. package/dist/fastify/src/core/locale/canonicalize-locale.js +7 -18
  94. package/dist/fastify/src/core/locale/match-locale.js +24 -50
  95. package/dist/fastify/src/core/locale/parse-locale.js +12 -22
  96. package/dist/fastify/src/core/utils/normalizers/normalize-pathname.js +19 -37
  97. package/dist/fastify/src/core/utils/normalizers/normalize-query.js +6 -20
  98. package/dist/fastify/src/core/utils/parse-cookie-header.js +11 -18
  99. package/dist/fastify/src/routing/inbound/resolve-inbound.js +22 -37
  100. package/dist/fastify/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  101. package/dist/fastify/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  102. package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  103. package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  104. package/dist/fastify/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  105. package/dist/fastify/src/routing/locale/get-locale-from-accept-language.js +21 -36
  106. package/dist/fastify/src/routing/locale/get-locale-from-host.js +5 -28
  107. package/dist/fastify/src/routing/locale/get-locale-from-pathname.js +11 -37
  108. package/dist/fastify/src/routing/locale/get-locale-from-query.js +2 -17
  109. package/dist/fastify/src/routing/pathname/canonicalize-pathname.js +25 -67
  110. package/dist/fastify/src/routing/pathname/localize-pathname.js +12 -30
  111. package/dist/fastify/src/routing/pathname/materialize-pathname.js +9 -44
  112. package/dist/fastify/src/routing/pathname/standardize-pathname.js +6 -30
  113. package/dist/hono/src/adapters/hono/create-intor-handler.js +33 -44
  114. package/dist/hono/src/adapters/hono/get-translator.js +2 -9
  115. package/dist/hono/src/core/constants/locale-placeholder.js +0 -1
  116. package/dist/hono/src/core/locale/canonicalize-locale.js +7 -18
  117. package/dist/hono/src/core/locale/match-locale.js +24 -50
  118. package/dist/hono/src/core/locale/parse-locale.js +12 -22
  119. package/dist/hono/src/core/utils/normalizers/normalize-pathname.js +19 -37
  120. package/dist/hono/src/core/utils/normalizers/normalize-query.js +6 -20
  121. package/dist/hono/src/core/utils/parse-cookie-header.js +11 -18
  122. package/dist/hono/src/routing/inbound/resolve-inbound.js +22 -37
  123. package/dist/hono/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  124. package/dist/hono/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  125. package/dist/hono/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  126. package/dist/hono/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  127. package/dist/hono/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  128. package/dist/hono/src/routing/locale/get-locale-from-accept-language.js +21 -36
  129. package/dist/hono/src/routing/locale/get-locale-from-host.js +5 -28
  130. package/dist/hono/src/routing/locale/get-locale-from-pathname.js +11 -37
  131. package/dist/hono/src/routing/locale/get-locale-from-query.js +2 -17
  132. package/dist/hono/src/routing/pathname/canonicalize-pathname.js +25 -67
  133. package/dist/hono/src/routing/pathname/localize-pathname.js +12 -30
  134. package/dist/hono/src/routing/pathname/materialize-pathname.js +9 -44
  135. package/dist/hono/src/routing/pathname/standardize-pathname.js +6 -30
  136. package/dist/next/src/adapters/next/create-intor-handler.js +29 -47
  137. package/dist/next/src/adapters/next/link.js +33 -28
  138. package/dist/next/src/adapters/next/redirect.js +12 -15
  139. package/dist/next/src/adapters/next/server/get-locale.js +12 -23
  140. package/dist/next/src/adapters/next/server/get-translator.js +2 -9
  141. package/dist/next/src/adapters/next/server/intor.js +5 -13
  142. package/dist/next/src/adapters/next/use-router.js +47 -66
  143. package/dist/next/src/client/shared/navigation/execute-navigation.js +20 -38
  144. package/dist/next/src/client/shared/utils/build-cookie-string.js +18 -27
  145. package/dist/next/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  146. package/dist/next/src/core/constants/headers.js +4 -4
  147. package/dist/next/src/core/constants/locale-placeholder.js +0 -1
  148. package/dist/next/src/core/locale/canonicalize-locale.js +7 -18
  149. package/dist/next/src/core/locale/match-locale.js +24 -50
  150. package/dist/next/src/core/locale/parse-locale.js +12 -22
  151. package/dist/next/src/core/utils/normalizers/normalize-pathname.js +19 -37
  152. package/dist/next/src/core/utils/normalizers/normalize-query.js +6 -20
  153. package/dist/next/src/core/utils/resolve-loader-options.js +6 -29
  154. package/dist/next/src/policies/shoud-full-reload.js +2 -5
  155. package/dist/next/src/policies/should-sync-locale.js +1 -4
  156. package/dist/next/src/routing/inbound/resolve-inbound.js +24 -39
  157. package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  158. package/dist/next/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  159. package/dist/next/src/routing/inbound/resolve-pathname/strategies/all.js +13 -29
  160. package/dist/next/src/routing/inbound/resolve-pathname/strategies/except-default.js +14 -30
  161. package/dist/next/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  162. package/dist/next/src/routing/locale/get-locale-from-accept-language.js +21 -36
  163. package/dist/next/src/routing/locale/get-locale-from-host.js +5 -28
  164. package/dist/next/src/routing/locale/get-locale-from-pathname.js +11 -37
  165. package/dist/next/src/routing/locale/get-locale-from-query.js +2 -17
  166. package/dist/next/src/routing/outbound/decide-strategy.js +9 -9
  167. package/dist/next/src/routing/outbound/determine-target.js +28 -44
  168. package/dist/next/src/routing/outbound/resolve-outbound.js +12 -16
  169. package/dist/next/src/routing/outbound/utils/derive-host-destination.js +5 -9
  170. package/dist/next/src/routing/outbound/utils/derive-query-destination.js +4 -7
  171. package/dist/next/src/routing/outbound/utils/is-external-destination.js +1 -7
  172. package/dist/next/src/routing/pathname/canonicalize-pathname.js +25 -67
  173. package/dist/next/src/routing/pathname/localize-pathname.js +12 -30
  174. package/dist/next/src/routing/pathname/materialize-pathname.js +9 -44
  175. package/dist/next/src/routing/pathname/standardize-pathname.js +6 -30
  176. package/dist/react/src/client/react/helpers/use-intor.js +25 -44
  177. package/dist/react/src/client/react/provider/effects/use-locale-effects.js +20 -25
  178. package/dist/react/src/client/react/provider/effects/use-messages-effects.js +17 -16
  179. package/dist/react/src/client/react/provider/intor-provider.js +63 -66
  180. package/dist/react/src/client/react/provider/use-intor-context.js +4 -4
  181. package/dist/react/src/client/react/render/create-react-renderer.js +18 -24
  182. package/dist/react/src/client/react/translator/create-t-rich.js +9 -22
  183. package/dist/react/src/client/react/translator/use-translator.js +11 -16
  184. package/dist/react/src/client/shared/messages/create-refetch-messages.js +41 -51
  185. package/dist/react/src/client/shared/provider/effective-state.js +2 -6
  186. package/dist/react/src/client/shared/utils/build-cookie-string.js +18 -27
  187. package/dist/react/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  188. package/dist/react/src/client/shared/utils/locale/set-document-locale.js +2 -8
  189. package/dist/react/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  190. package/dist/react/src/core/logger/get-logger.js +26 -31
  191. package/dist/react/src/core/logger/global-logger-pool.js +4 -4
  192. package/dist/react/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  193. package/dist/react/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  194. package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  195. package/dist/react/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  196. package/dist/react/src/core/messages/merge-messages.js +17 -28
  197. package/dist/react/src/core/messages/utils/is-valid-messages.js +22 -37
  198. package/dist/react/src/core/messages/utils/nest-object-from-path.js +5 -17
  199. package/dist/react/src/core/utils/deep-merge.js +24 -42
  200. package/dist/react/src/core/utils/resolve-loader-options.js +6 -29
  201. package/dist/react/src/policies/should-persist-on-first-visit.js +1 -4
  202. package/dist/svelte/export/svelte/index.js +0 -6
  203. package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +41 -51
  204. package/dist/svelte/src/client/shared/provider/effective-state.js +2 -6
  205. package/dist/svelte/src/client/shared/utils/build-cookie-string.js +18 -27
  206. package/dist/svelte/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  207. package/dist/svelte/src/client/shared/utils/locale/set-document-locale.js +2 -8
  208. package/dist/svelte/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  209. package/dist/svelte/src/client/svelte/provider/create-intor-store.js +59 -63
  210. package/dist/svelte/src/client/svelte/provider/effects/attach-locale-effects.js +20 -25
  211. package/dist/svelte/src/client/svelte/provider/effects/attach-messages-effects.js +21 -18
  212. package/dist/svelte/src/client/svelte/provider/get-intor-context.js +4 -4
  213. package/dist/svelte/src/client/svelte/translator/use-translator.js +11 -16
  214. package/dist/svelte/src/core/logger/get-logger.js +26 -31
  215. package/dist/svelte/src/core/logger/global-logger-pool.js +4 -4
  216. package/dist/svelte/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  217. package/dist/svelte/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  218. package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  219. package/dist/svelte/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  220. package/dist/svelte/src/core/messages/merge-messages.js +17 -28
  221. package/dist/svelte/src/core/messages/utils/is-valid-messages.js +22 -37
  222. package/dist/svelte/src/core/messages/utils/nest-object-from-path.js +5 -17
  223. package/dist/svelte/src/core/render/create-html-renderer.js +29 -37
  224. package/dist/svelte/src/core/render/utils/escape-html.js +1 -6
  225. package/dist/svelte/src/core/render/utils/render-attributes.js +6 -11
  226. package/dist/svelte/src/core/translator/create-t-rich.js +6 -15
  227. package/dist/svelte/src/core/utils/deep-merge.js +24 -42
  228. package/dist/svelte/src/core/utils/resolve-loader-options.js +6 -29
  229. package/dist/svelte/src/policies/should-persist-on-first-visit.js +1 -4
  230. package/dist/svelte-kit/src/adapters/svelte-kit/create-intor-handler.js +37 -57
  231. package/dist/svelte-kit/src/adapters/svelte-kit/use-navigation.js +29 -27
  232. package/dist/svelte-kit/src/adapters/svelte-kit/utils/is-svelte-kit-ssg.js +4 -11
  233. package/dist/svelte-kit/src/client/shared/navigation/execute-navigation.js +19 -37
  234. package/dist/svelte-kit/src/client/shared/utils/build-cookie-string.js +18 -27
  235. package/dist/svelte-kit/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  236. package/dist/svelte-kit/src/core/constants/locale-placeholder.js +0 -1
  237. package/dist/svelte-kit/src/core/locale/canonicalize-locale.js +7 -18
  238. package/dist/svelte-kit/src/core/locale/match-locale.js +24 -50
  239. package/dist/svelte-kit/src/core/locale/parse-locale.js +12 -22
  240. package/dist/svelte-kit/src/core/utils/normalizers/normalize-pathname.js +19 -37
  241. package/dist/svelte-kit/src/core/utils/normalizers/normalize-query.js +6 -20
  242. package/dist/svelte-kit/src/core/utils/resolve-loader-options.js +6 -29
  243. package/dist/svelte-kit/src/policies/shoud-full-reload.js +2 -5
  244. package/dist/svelte-kit/src/policies/should-sync-locale.js +1 -4
  245. package/dist/svelte-kit/src/routing/inbound/resolve-inbound.js +22 -37
  246. package/dist/svelte-kit/src/routing/inbound/resolve-locale/resolve-locale.js +22 -39
  247. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/resolve-pathname.js +24 -30
  248. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/all.js +10 -23
  249. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/except-default.js +11 -24
  250. package/dist/svelte-kit/src/routing/inbound/resolve-pathname/strategies/none.js +1 -4
  251. package/dist/svelte-kit/src/routing/locale/get-locale-from-accept-language.js +21 -36
  252. package/dist/svelte-kit/src/routing/locale/get-locale-from-host.js +5 -28
  253. package/dist/svelte-kit/src/routing/locale/get-locale-from-pathname.js +11 -37
  254. package/dist/svelte-kit/src/routing/locale/get-locale-from-query.js +2 -17
  255. package/dist/svelte-kit/src/routing/outbound/decide-strategy.js +9 -9
  256. package/dist/svelte-kit/src/routing/outbound/determine-target.js +28 -44
  257. package/dist/svelte-kit/src/routing/outbound/resolve-outbound.js +12 -16
  258. package/dist/svelte-kit/src/routing/outbound/utils/derive-host-destination.js +5 -9
  259. package/dist/svelte-kit/src/routing/outbound/utils/derive-query-destination.js +4 -7
  260. package/dist/svelte-kit/src/routing/outbound/utils/is-external-destination.js +1 -7
  261. package/dist/svelte-kit/src/routing/pathname/canonicalize-pathname.js +25 -67
  262. package/dist/svelte-kit/src/routing/pathname/localize-pathname.js +12 -30
  263. package/dist/svelte-kit/src/routing/pathname/materialize-pathname.js +9 -44
  264. package/dist/svelte-kit/src/routing/pathname/standardize-pathname.js +6 -30
  265. package/dist/types/src/routing/outbound/decide-strategy.d.ts +1 -1
  266. package/dist/types/src/routing/outbound/decide-strategy.d.ts.map +1 -1
  267. package/dist/vue/src/client/shared/messages/create-refetch-messages.js +41 -51
  268. package/dist/vue/src/client/shared/provider/effective-state.js +2 -6
  269. package/dist/vue/src/client/shared/utils/build-cookie-string.js +18 -27
  270. package/dist/vue/src/client/shared/utils/locale/get-locale-from-cookie.js +5 -12
  271. package/dist/vue/src/client/shared/utils/locale/set-document-locale.js +2 -8
  272. package/dist/vue/src/client/shared/utils/locale/set-locale-cookie.js +2 -9
  273. package/dist/vue/src/client/vue/helpers/use-intor.js +20 -42
  274. package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +23 -24
  275. package/dist/vue/src/client/vue/provider/effects/use-messages-effects.js +15 -24
  276. package/dist/vue/src/client/vue/provider/inject-intor-context.js +4 -4
  277. package/dist/vue/src/client/vue/provider/intor-provider.js +61 -66
  278. package/dist/vue/src/client/vue/render/create-vue-renderer.js +18 -24
  279. package/dist/vue/src/client/vue/translator/create-t-rich.js +5 -17
  280. package/dist/vue/src/client/vue/translator/trans.js +24 -31
  281. package/dist/vue/src/client/vue/translator/use-translator.js +12 -17
  282. package/dist/vue/src/core/logger/get-logger.js +26 -31
  283. package/dist/vue/src/core/logger/global-logger-pool.js +4 -4
  284. package/dist/vue/src/core/messages/load-remote-messages/collect-remote-resources.js +13 -22
  285. package/dist/vue/src/core/messages/load-remote-messages/fetch-remote-resource.js +30 -39
  286. package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +72 -89
  287. package/dist/vue/src/core/messages/load-remote-messages/resolve-remote-resources.js +7 -17
  288. package/dist/vue/src/core/messages/merge-messages.js +17 -28
  289. package/dist/vue/src/core/messages/utils/is-valid-messages.js +22 -37
  290. package/dist/vue/src/core/messages/utils/nest-object-from-path.js +5 -17
  291. package/dist/vue/src/core/utils/deep-merge.js +24 -42
  292. package/dist/vue/src/core/utils/resolve-loader-options.js +6 -29
  293. package/dist/vue/src/policies/should-persist-on-first-visit.js +1 -4
  294. package/package.json +2 -2
@@ -1,30 +1,24 @@
1
1
  import { h } from 'vue';
2
2
 
3
- /**
4
- * Create a Vue renderer for semantic rich messages.
5
- */
6
3
  const createVueRenderer = (tagRenderers) => {
7
- return {
8
- /** Render plain text nodes */
9
- text(value) {
10
- return value;
11
- },
12
- /** Render semantic tag nodes */
13
- tag(name, _attributes, children) {
14
- const tagRenderer = tagRenderers?.[name];
15
- if (tagRenderer) {
16
- return typeof tagRenderer === "function"
17
- ? tagRenderer(children)
18
- : tagRenderer;
19
- }
20
- // Default behavior: render as a native Vue element
21
- return h(name, null, children);
22
- },
23
- /** Render raw (non-tokenized) message values */
24
- raw(value) {
25
- return value;
26
- },
27
- };
4
+ return {
5
+ /** Render plain text nodes */
6
+ text(value) {
7
+ return value;
8
+ },
9
+ /** Render semantic tag nodes */
10
+ tag(name, _attributes, children) {
11
+ const tagRenderer = tagRenderers?.[name];
12
+ if (tagRenderer) {
13
+ return typeof tagRenderer === "function" ? tagRenderer(children) : tagRenderer;
14
+ }
15
+ return h(name, null, children);
16
+ },
17
+ /** Render raw (non-tokenized) message values */
18
+ raw(value) {
19
+ return value;
20
+ }
21
+ };
28
22
  };
29
23
 
30
24
  export { createVueRenderer };
@@ -1,24 +1,12 @@
1
1
  import { renderRichMessage } from 'intor-translator';
2
2
  import { createVueRenderer } from '../render/create-vue-renderer.js';
3
3
 
4
- /**
5
- * Create a Vue-specific rich translation function.
6
- *
7
- * This adapter bridges the core Translator with the Vue rich
8
- * message rendering flow.
9
- *
10
- * - Resolves translated messages via `translator.t`
11
- * - Renders semantic tags using Vue renderers
12
- * - Supports optional scoped keys via `preKey`
13
- *
14
- * Intended for Vue client usage only.
15
- */
16
4
  const createTRich = (t) => {
17
- return (key, tagRenderers, replacements) => {
18
- const message = t(key, replacements);
19
- const vueRenderer = createVueRenderer(tagRenderers);
20
- return renderRichMessage(message, vueRenderer);
21
- };
5
+ return (key, tagRenderers, replacements) => {
6
+ const message = t(key, replacements);
7
+ const vueRenderer = createVueRenderer(tagRenderers);
8
+ return renderRichMessage(message, vueRenderer);
9
+ };
22
10
  };
23
11
 
24
12
  export { createTRich };
@@ -1,40 +1,33 @@
1
1
  import { defineComponent, h, Fragment } from 'vue';
2
2
  import { useTranslator } from './use-translator.js';
3
3
 
4
- /**
5
- * Vue component for rendering rich translations.
6
- *
7
- * A thin wrapper around `tRich`.
8
- *
9
- * @public
10
- */
11
4
  const Trans = defineComponent({
12
- name: "Trans",
13
- props: {
14
- /** The message key to translate. */
15
- i18nKey: {
16
- type: String,
17
- required: true,
18
- },
19
- /** Optional Vue renderers for semantic tags. */
20
- components: {
21
- type: Object,
22
- required: false,
23
- },
24
- /** Optional replacement values for interpolation. */
25
- values: {
26
- type: Object,
27
- required: false,
28
- },
5
+ name: "Trans",
6
+ props: {
7
+ /** The message key to translate. */
8
+ i18nKey: {
9
+ type: String,
10
+ required: true
29
11
  },
30
- setup(props) {
31
- const { tRich } = useTranslator();
32
- return () => {
33
- const { i18nKey, components, values } = props;
34
- const nodes = tRich(i18nKey, components, values);
35
- return h(Fragment, null, nodes);
36
- };
12
+ /** Optional Vue renderers for semantic tags. */
13
+ components: {
14
+ type: Object,
15
+ required: false
37
16
  },
17
+ /** Optional replacement values for interpolation. */
18
+ values: {
19
+ type: Object,
20
+ required: false
21
+ }
22
+ },
23
+ setup(props) {
24
+ const { tRich } = useTranslator();
25
+ return () => {
26
+ const { i18nKey, components, values } = props;
27
+ const nodes = tRich(i18nKey, components, values);
28
+ return h(Fragment, null, nodes);
29
+ };
30
+ }
38
31
  });
39
32
 
40
33
  export { Trans };
@@ -3,24 +3,19 @@ import '../provider/intor-provider.js';
3
3
  import { injectIntorContext } from '../provider/inject-intor-context.js';
4
4
  import { createTRich } from './create-t-rich.js';
5
5
 
6
- /**
7
- * Vue composable for accessing the active, scope-aware translator instance.
8
- *
9
- * @public
10
- */
11
6
  function useTranslator(preKey) {
12
- const intor = injectIntorContext();
13
- const translator = intor.value.translator;
14
- const scoped = computed(() => translator.value.scoped(preKey));
15
- return {
16
- messages: computed(() => translator.value.messages),
17
- locale: computed(() => translator.value.locale),
18
- isLoading: computed(() => translator.value.isLoading),
19
- setLocale: intor.value.setLocale,
20
- hasKey: (...args) => scoped.value.hasKey(...args),
21
- t: (...args) => scoped.value.t(...args),
22
- tRich: (...args) => createTRich(scoped.value.t)(...args),
23
- };
7
+ const intor = injectIntorContext();
8
+ const translator = intor.value.translator;
9
+ const scoped = computed(() => translator.value.scoped(preKey));
10
+ return {
11
+ messages: computed(() => translator.value.messages),
12
+ locale: computed(() => translator.value.locale),
13
+ isLoading: computed(() => translator.value.isLoading),
14
+ setLocale: intor.value.setLocale,
15
+ hasKey: (...args) => scoped.value.hasKey(...args),
16
+ t: (...args) => scoped.value.t(...args),
17
+ tRich: (...args) => createTRich(scoped.value.t)(...args)
18
+ };
24
19
  }
25
20
 
26
21
  export { useTranslator };
@@ -2,41 +2,36 @@ import { logry } from 'logry';
2
2
  import { getGlobalLoggerPool } from './global-logger-pool.js';
3
3
 
4
4
  const DEFAULT_FORMAT_CONFIG = {
5
- timestamp: { withDate: false },
5
+ timestamp: { withDate: false }
6
6
  };
7
7
  const DEFAULT_RENDER_CONFIG = {
8
- id: { visible: true, prefix: "<", suffix: ">" },
9
- meta: { lineBreaksAfter: 1 },
8
+ id: { visible: true, prefix: "<", suffix: ">" },
9
+ meta: { lineBreaksAfter: 1 }
10
10
  };
11
- /**
12
- * Get a shared logger instance by id.
13
- * - Safe across hot reloads
14
- * - Prevents unbounded memory usage via soft LRU
15
- */
16
- function getLogger({ id = "default", preset, ...options }) {
17
- const pool = getGlobalLoggerPool();
18
- const existing = pool.get(id);
19
- if (existing)
20
- return existing;
21
- const baseConfig = preset === undefined
22
- ? {
23
- formatConfig: DEFAULT_FORMAT_CONFIG,
24
- renderConfig: DEFAULT_RENDER_CONFIG,
25
- }
26
- : { preset };
27
- const logger = logry({
28
- id,
29
- ...baseConfig,
30
- ...options,
31
- });
32
- pool.set(id, logger);
33
- // Soft LRU: keep pool size under control
34
- if (pool.size > 1000) {
35
- for (const key of [...pool.keys()].slice(0, 200)) {
36
- pool.delete(key);
37
- }
11
+ function getLogger({
12
+ id = "default",
13
+ preset,
14
+ ...options
15
+ }) {
16
+ const pool = getGlobalLoggerPool();
17
+ const existing = pool.get(id);
18
+ if (existing) return existing;
19
+ const baseConfig = preset === void 0 ? {
20
+ formatConfig: DEFAULT_FORMAT_CONFIG,
21
+ renderConfig: DEFAULT_RENDER_CONFIG
22
+ } : { preset };
23
+ const logger = logry({
24
+ id,
25
+ ...baseConfig,
26
+ ...options
27
+ });
28
+ pool.set(id, logger);
29
+ if (pool.size > 1e3) {
30
+ for (const key of [...pool.keys()].slice(0, 200)) {
31
+ pool.delete(key);
38
32
  }
39
- return logger;
33
+ }
34
+ return logger;
40
35
  }
41
36
 
42
37
  export { getLogger };
@@ -1,8 +1,8 @@
1
1
  function getGlobalLoggerPool() {
2
- if (!globalThis.__INTOR_LOGGER_POOL__) {
3
- globalThis.__INTOR_LOGGER_POOL__ = new Map();
4
- }
5
- return globalThis.__INTOR_LOGGER_POOL__;
2
+ if (!globalThis.__INTOR_LOGGER_POOL__) {
3
+ globalThis.__INTOR_LOGGER_POOL__ = /* @__PURE__ */ new Map();
4
+ }
5
+ return globalThis.__INTOR_LOGGER_POOL__;
6
6
  }
7
7
 
8
8
  export { getGlobalLoggerPool };
@@ -1,25 +1,16 @@
1
- /**
2
- * Collect remote message resources for a given locale.
3
- *
4
- * - Always includes the root `index.json`
5
- * - Optionally includes namespace-specific resources
6
- * - Produces semantic paths for later message nesting
7
- *
8
- * This function performs no I/O and does not validate resource existence.
9
- */
10
- function collectRemoteResources({ locale, baseUrl, namespaces, }) {
11
- const basePath = `${baseUrl}/${locale}`;
12
- // Root translation resource (always loaded)
13
- const indexResource = { url: `${basePath}/index.json`, path: [] };
14
- // When no namespaces are provided, the locale domain consists of index only
15
- if (!namespaces || namespaces.length === 0)
16
- return [indexResource];
17
- // Namespace-specific resources are nested under their namespace key
18
- const nsResources = namespaces.map((ns) => ({
19
- url: `${basePath}/${ns}.json`,
20
- path: [ns],
21
- }));
22
- return [indexResource, ...nsResources];
1
+ function collectRemoteResources({
2
+ locale,
3
+ baseUrl,
4
+ namespaces
5
+ }) {
6
+ const basePath = `${baseUrl}/${locale}`;
7
+ const indexResource = { url: `${basePath}/index.json`, path: [] };
8
+ if (!namespaces || namespaces.length === 0) return [indexResource];
9
+ const nsResources = namespaces.map((ns) => ({
10
+ url: `${basePath}/${ns}.json`,
11
+ path: [ns]
12
+ }));
13
+ return [indexResource, ...nsResources];
23
14
  }
24
15
 
25
16
  export { collectRemoteResources };
@@ -1,47 +1,38 @@
1
1
  import { getLogger } from '../../logger/get-logger.js';
2
2
  import { isValidMessages } from '../utils/is-valid-messages.js';
3
3
 
4
- /**
5
- * Fetch a single remote messages resource.
6
- *
7
- * This function performs a single HTTP request to retrieve
8
- * a remote translation messages payload.
9
- *
10
- * It is responsible for:
11
- * - Issuing the network request
12
- * - Validating the returned message structure
13
- * - Handling abort and network errors
14
- */
15
- async function fetchRemoteResource({ fetch, url, headers, signal, loggerOptions, }) {
16
- const baseLogger = getLogger(loggerOptions);
17
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
18
- try {
19
- // Fetch
20
- const response = await fetch(url, {
21
- method: "GET",
22
- headers: { "Content-Type": "application/json", ...headers },
23
- cache: "no-store",
24
- ...(signal !== undefined ? { signal } : {}),
25
- });
26
- if (!response.ok) {
27
- throw new Error(`HTTP ${response.status} ${response.statusText}`);
28
- }
29
- // Parse JSON body
30
- const data = (await response.json());
31
- // Validate messages structure
32
- if (!isValidMessages(data)) {
33
- throw new Error("Invalid messages structure");
34
- }
35
- return data;
4
+ async function fetchRemoteResource({
5
+ fetch,
6
+ url,
7
+ headers,
8
+ signal,
9
+ loggerOptions
10
+ }) {
11
+ const baseLogger = getLogger(loggerOptions);
12
+ const logger = baseLogger.child({ scope: "fetch-locale-messages" });
13
+ try {
14
+ const response = await fetch(url, {
15
+ method: "GET",
16
+ headers: { "Content-Type": "application/json", ...headers },
17
+ cache: "no-store",
18
+ ...signal !== void 0 ? { signal } : {}
19
+ });
20
+ if (!response.ok) {
21
+ throw new Error(`HTTP ${response.status} ${response.statusText}`);
36
22
  }
37
- catch (error) {
38
- if (error instanceof Error && error.name === "AbortError") {
39
- logger.debug("Remote fetch aborted.", { url });
40
- return;
41
- }
42
- logger.warn("Failed to fetch remote messages.", { url, error });
43
- return;
23
+ const data = await response.json();
24
+ if (!isValidMessages(data)) {
25
+ throw new Error("Invalid messages structure");
44
26
  }
27
+ return data;
28
+ } catch (error) {
29
+ if (error instanceof Error && error.name === "AbortError") {
30
+ logger.debug("Remote fetch aborted.", { url });
31
+ return;
32
+ }
33
+ logger.warn("Failed to fetch remote messages.", { url, error });
34
+ return;
35
+ }
45
36
  }
46
37
 
47
38
  export { fetchRemoteResource };
@@ -4,98 +4,81 @@ import { collectRemoteResources } from './collect-remote-resources.js';
4
4
  import { fetchRemoteResource } from './fetch-remote-resource.js';
5
5
  import { resolveRemoteResources } from './resolve-remote-resources.js';
6
6
 
7
- /**
8
- * Load locale messages from a remote source.
9
- *
10
- * This function serves as the orchestration layer for remote message loading.
11
- * It coordinates:
12
- *
13
- * - Locale resolution with fallbacks
14
- * - Concurrency control for network requests
15
- * - Remote resource fetching and message merging
16
- *
17
- * Remote messages are fetched on demand and are not memoized at the process level.
18
- *
19
- * Network requests and response validation are delegated to lower-level utilities.
20
- */
21
- const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, concurrency, fetch, url: baseUrl, headers, signal, loggerOptions, }) => {
22
- const baseLogger = getLogger(loggerOptions);
23
- const logger = baseLogger.child({ scope: "load-remote-messages" });
24
- // Abort early if the request has already been cancelled
25
- if (signal?.aborted) {
26
- logger.debug("Remote message loading aborted before fetch.");
7
+ const loadRemoteMessages = async ({
8
+ locale,
9
+ fallbackLocales,
10
+ namespaces,
11
+ concurrency,
12
+ fetch,
13
+ url: baseUrl,
14
+ headers,
15
+ signal,
16
+ loggerOptions
17
+ }) => {
18
+ const baseLogger = getLogger(loggerOptions);
19
+ const logger = baseLogger.child({ scope: "load-remote-messages" });
20
+ if (signal?.aborted) {
21
+ logger.debug("Remote message loading aborted before fetch.");
22
+ return;
23
+ }
24
+ const start = performance.now();
25
+ logger.debug("Loading remote messages.", { baseUrl });
26
+ const limit = concurrency ? pLimit(concurrency) : void 0;
27
+ const candidateLocales = [locale, ...fallbackLocales || []];
28
+ let messages;
29
+ for (const candidateLocale of candidateLocales) {
30
+ const isLast = candidateLocale === candidateLocales[candidateLocales.length - 1];
31
+ try {
32
+ const resources = collectRemoteResources({
33
+ locale: candidateLocale,
34
+ baseUrl,
35
+ ...namespaces !== void 0 ? { namespaces } : {}
36
+ });
37
+ const fetchUrl = (url) => fetchRemoteResource({
38
+ url,
39
+ ...headers !== void 0 ? { headers } : {},
40
+ ...signal !== void 0 ? { signal } : {},
41
+ loggerOptions,
42
+ fetch
43
+ });
44
+ const results = await Promise.all(
45
+ resources.map(
46
+ ({ url }) => limit ? limit(() => fetchUrl(url)) : fetchUrl(url)
47
+ )
48
+ );
49
+ if (!results.some(Boolean)) continue;
50
+ const resolved = resolveRemoteResources(
51
+ resources.map((res, i) => {
52
+ const data = results[i];
53
+ return { path: res.path, ...data !== void 0 ? { data } : {} };
54
+ })
55
+ );
56
+ messages = { [candidateLocale]: resolved };
57
+ break;
58
+ } catch {
59
+ if (signal?.aborted) {
60
+ logger.debug("Remote message loading aborted.");
27
61
  return;
28
- }
29
- const start = performance.now();
30
- logger.debug("Loading remote messages.", { baseUrl });
31
- // ----------------------------------------------------------------
32
- // Resolve locale messages with ordered fallback strategy
33
- // ----------------------------------------------------------------
34
- const limit = concurrency ? pLimit(concurrency) : undefined;
35
- const candidateLocales = [locale, ...(fallbackLocales || [])];
36
- let messages;
37
- for (const candidateLocale of candidateLocales) {
38
- const isLast = candidateLocale === candidateLocales[candidateLocales.length - 1];
39
- try {
40
- // -----------------------------------------------------------------
41
- // Collect remote message resources for the locale
42
- // -----------------------------------------------------------------
43
- const resources = collectRemoteResources({
44
- locale: candidateLocale,
45
- baseUrl,
46
- ...(namespaces !== undefined ? { namespaces } : {}),
47
- });
48
- // -----------------------------------------------------------------
49
- // Fetch all message chunks in parallel
50
- // -----------------------------------------------------------------
51
- const fetchUrl = (url) => fetchRemoteResource({
52
- url,
53
- ...(headers !== undefined ? { headers } : {}),
54
- ...(signal !== undefined ? { signal } : {}),
55
- loggerOptions,
56
- fetch,
57
- });
58
- const results = await Promise.all(resources.map(({ url }) => limit ? limit(() => fetchUrl(url)) : fetchUrl(url)));
59
- // Guard: no valid remote resources
60
- if (!results.some(Boolean))
61
- continue;
62
- // -----------------------------------------------------------------
63
- // Resolve and merge remote message resources
64
- // -----------------------------------------------------------------
65
- const resolved = resolveRemoteResources(resources.map((res, i) => {
66
- const data = results[i];
67
- return { path: res.path, ...(data !== undefined ? { data } : {}) };
68
- }));
69
- // -----------------------------------------------------------------
70
- // Wrap resolved messages into locale-scoped LocaleMessages
71
- // -----------------------------------------------------------------
72
- messages = { [candidateLocale]: resolved };
73
- break;
74
- }
75
- catch {
76
- if (signal?.aborted) {
77
- logger.debug("Remote message loading aborted.");
78
- return;
79
- }
80
- if (isLast) {
81
- logger.warn("Failed to load messages for all candidate locales.", {
82
- locale,
83
- fallbackLocales,
84
- });
85
- }
86
- else {
87
- logger.warn(`Failed to load locale messages for "${candidateLocale}", trying next fallback.`);
88
- }
89
- }
90
- }
91
- // Final success log with resolved locale and timing
92
- if (messages) {
93
- logger.trace("Finished loading remote messages.", {
94
- loadedLocale: Object.keys(messages)[0],
95
- duration: `${Math.round(performance.now() - start)} ms`,
62
+ }
63
+ if (isLast) {
64
+ logger.warn("Failed to load messages for all candidate locales.", {
65
+ locale,
66
+ fallbackLocales
96
67
  });
68
+ } else {
69
+ logger.warn(
70
+ `Failed to load locale messages for "${candidateLocale}", trying next fallback.`
71
+ );
72
+ }
97
73
  }
98
- return messages;
74
+ }
75
+ if (messages) {
76
+ logger.trace("Finished loading remote messages.", {
77
+ loadedLocale: Object.keys(messages)[0],
78
+ duration: `${Math.round(performance.now() - start)} ms`
79
+ });
80
+ }
81
+ return messages;
99
82
  };
100
83
 
101
84
  export { loadRemoteMessages };
@@ -1,24 +1,14 @@
1
1
  import { deepMerge } from '../../utils/deep-merge.js';
2
2
  import { nestObjectFromPath } from '../utils/nest-object-from-path.js';
3
3
 
4
- /**
5
- * Resolve remote message resources into a single MessageObject.
6
- *
7
- * - Applies semantic nesting based on resource path
8
- * - Merges all resolved message chunks
9
- *
10
- * Always returns a MessageObject.
11
- * An empty object represents an empty translation domain.
12
- */
13
4
  function resolveRemoteResources(resources) {
14
- let result = {};
15
- for (const { path, data } of resources) {
16
- if (!data)
17
- continue;
18
- const resolved = path.length > 0 ? nestObjectFromPath(path, data) : data;
19
- result = deepMerge(result, resolved);
20
- }
21
- return result;
5
+ let result = {};
6
+ for (const { path, data } of resources) {
7
+ if (!data) continue;
8
+ const resolved = path.length > 0 ? nestObjectFromPath(path, data) : data;
9
+ result = deepMerge(result, resolved);
10
+ }
11
+ return result;
22
12
  }
23
13
 
24
14
  export { resolveRemoteResources };
@@ -1,35 +1,24 @@
1
1
  import { getLogger } from '../logger/get-logger.js';
2
2
  import { deepMerge } from '../utils/deep-merge.js';
3
3
 
4
- /**
5
- * Merge locale-specific messages with runtime overrides.
6
- *
7
- * - Only merges messages under the given locale
8
- * - Emits debug logs for add / override events
9
- *
10
- * @public
11
- */
12
4
  function mergeMessages(a, b, { config, locale, onEvent }) {
13
- const baseLogger = getLogger({ ...config.logger, id: config.id });
14
- const logger = baseLogger.child({ scope: "merge-messages" });
15
- // Merge messages for the active locale only
16
- const merged = deepMerge(a?.[locale] ?? {}, b?.[locale] ?? {}, {
17
- onOverride: (event) => {
18
- if (onEvent) {
19
- onEvent(event);
20
- return;
21
- }
22
- const { kind, path, next, prev } = event;
23
- if (kind === "add")
24
- return;
25
- logger.debug(`Override | ${locale}: "${path}"`, { prev, next });
26
- },
27
- });
28
- // Preserve other locales, update only the target one
29
- return {
30
- ...a,
31
- [locale]: merged,
32
- };
5
+ const baseLogger = getLogger({ ...config.logger, id: config.id });
6
+ const logger = baseLogger.child({ scope: "merge-messages" });
7
+ const merged = deepMerge(a?.[locale] ?? {}, b?.[locale] ?? {}, {
8
+ onOverride: (event) => {
9
+ if (onEvent) {
10
+ onEvent(event);
11
+ return;
12
+ }
13
+ const { kind, path, next, prev } = event;
14
+ if (kind === "add") return;
15
+ logger.debug(`Override | ${locale}: "${path}"`, { prev, next });
16
+ }
17
+ });
18
+ return {
19
+ ...a,
20
+ [locale]: merged
21
+ };
33
22
  }
34
23
 
35
24
  export { mergeMessages };