intor 2.3.6 → 2.3.7

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 (373) hide show
  1. package/dist/core/export/config/index.js +2 -0
  2. package/dist/core/export/index.js +8 -4
  3. package/dist/core/export/server/index.js +1 -4
  4. package/dist/core/src/config/define-intor-config.js +5 -2
  5. package/dist/core/src/config/resolvers/resolve-cache-options.js +2 -1
  6. package/dist/core/src/config/resolvers/resolve-cookie-options.js +2 -1
  7. package/dist/core/src/config/resolvers/resolve-routing-options.js +7 -2
  8. package/dist/core/src/config/validators/validate-default-locale.js +3 -1
  9. package/dist/core/src/config/validators/validate-supported-locales.js +8 -4
  10. package/dist/{react/src/server → core/src/core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +11 -11
  11. package/dist/core/src/{server → core}/messages/load-remote-messages/load-remote-messages.js +13 -15
  12. package/dist/core/src/core/utils/resolve-loader-options.js +25 -0
  13. package/dist/core/src/server/helpers/local-messages-from-url.js +12 -6
  14. package/dist/core/src/server/intor/intor.js +11 -7
  15. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +16 -16
  16. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +5 -3
  17. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +7 -5
  18. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +2 -2
  19. package/dist/core/src/server/messages/load-messages.js +28 -22
  20. package/dist/core/src/server/translator/get-translator.js +10 -15
  21. package/dist/next/src/adapters/next/navigation/link.js +1 -12
  22. package/dist/next/src/adapters/next/navigation/redirect.js +6 -6
  23. package/dist/next/src/adapters/next/navigation/use-pathname.js +6 -4
  24. package/dist/next/src/adapters/next/navigation/use-router.js +1 -14
  25. package/dist/next/src/adapters/next/proxy/intor-proxy.js +4 -1
  26. package/dist/next/src/adapters/next/server/get-locale.js +4 -1
  27. package/dist/next/src/adapters/next/server/get-translator.js +8 -2
  28. package/dist/next/src/core/error/intor-error.js +9 -0
  29. package/dist/next/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +11 -11
  30. package/dist/next/src/{server → core}/messages/load-remote-messages/load-remote-messages.js +13 -15
  31. package/dist/next/src/core/utils/resolve-loader-options.js +25 -0
  32. package/dist/next/src/routing/pathname/resolve-pathname.js +4 -1
  33. package/dist/next/src/routing/resolve-routing.js +6 -3
  34. package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +16 -16
  35. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +5 -3
  36. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +7 -5
  37. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +2 -2
  38. package/dist/next/src/server/messages/load-messages.js +28 -22
  39. package/dist/next/src/server/translator/get-translator.js +10 -15
  40. package/dist/react/export/react/index.js +5 -15
  41. package/dist/react/src/client/helpers/get-client-locale.js +4 -1
  42. package/dist/react/src/client/react/helpers/use-load-messages.js +46 -0
  43. package/dist/{next → react}/src/client/react/navigation/use-navigation-strategy.js +11 -7
  44. package/dist/{next → react}/src/client/react/navigation/use-navigation-target.js +6 -3
  45. package/dist/react/src/client/react/provider/effects/use-locale-effects.js +14 -0
  46. package/dist/react/src/client/react/provider/effects/use-messages-effects.js +24 -0
  47. package/dist/react/src/client/react/provider/intor-provider.js +70 -0
  48. package/dist/react/src/client/react/provider/use-intor.js +11 -0
  49. package/dist/react/src/client/react/render/create-react-renderer.js +2 -2
  50. package/dist/react/src/client/react/translator/use-translator.js +9 -20
  51. package/dist/react/src/client/shared/messages/create-refetch-messages.js +61 -0
  52. package/dist/react/src/core/constants/prefix-placeholder.js +4 -0
  53. package/dist/react/src/core/error/intor-error.js +9 -0
  54. package/dist/{core/src/server → react/src/core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +11 -11
  55. package/dist/react/src/{server → core}/messages/load-remote-messages/load-remote-messages.js +13 -15
  56. package/dist/react/src/core/utils/is-external-destination.js +11 -0
  57. package/dist/react/src/core/utils/normalizers/normalize-pathname.js +43 -0
  58. package/dist/react/src/core/utils/pathname/get-unprefixed-pathname.js +39 -0
  59. package/dist/react/src/core/utils/pathname/locale-prefix-pathname.js +38 -0
  60. package/dist/react/src/core/utils/pathname/localize-pathname.js +36 -0
  61. package/dist/react/src/core/utils/pathname/standardize-pathname.js +30 -0
  62. package/dist/react/src/core/utils/resolve-loader-options.js +32 -0
  63. package/dist/{next → react}/src/routing/resolve-navigation-target.js +5 -2
  64. package/dist/svelte/export/svelte/index.js +6 -0
  65. package/dist/svelte/src/client/helpers/get-client-locale.js +27 -0
  66. package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +61 -0
  67. package/dist/svelte/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
  68. package/dist/svelte/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
  69. package/dist/svelte/src/client/shared/utils/locale/set-document-locale.js +12 -0
  70. package/dist/svelte/src/client/svelte/runtime/create-intor.js +70 -0
  71. package/dist/svelte/src/client/svelte/runtime/effects/locale-effects.js +19 -0
  72. package/dist/svelte/src/client/svelte/runtime/effects/messages-effects.js +23 -0
  73. package/dist/svelte/src/core/error/intor-error.js +9 -0
  74. package/dist/svelte/src/core/logger/get-logger.js +39 -0
  75. package/dist/svelte/src/core/logger/global-logger-pool.js +8 -0
  76. package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
  77. package/dist/svelte/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  78. package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +108 -0
  79. package/dist/svelte/src/core/messages/utils/is-valid-messages.js +36 -0
  80. package/dist/svelte/src/core/utils/deep-merge.js +31 -0
  81. package/dist/svelte/src/core/utils/normalizers/normalize-cache-key.js +45 -0
  82. package/dist/svelte/src/core/utils/normalizers/normalize-locale.js +59 -0
  83. package/dist/svelte/src/core/utils/resolve-loader-options.js +32 -0
  84. package/dist/types/export/index.d.ts +1 -3
  85. package/dist/types/export/internal/index.d.ts +1 -1
  86. package/dist/types/export/react/index.d.ts +4 -1
  87. package/dist/types/export/server/index.d.ts +1 -1
  88. package/dist/types/export/svelte/index.d.ts +1 -0
  89. package/dist/types/export/vue/index.d.ts +1 -0
  90. package/dist/types/src/adapters/next/navigation/link.d.ts +1 -1
  91. package/dist/types/src/adapters/next/navigation/redirect.d.ts +1 -1
  92. package/dist/types/src/adapters/next/navigation/use-router.d.ts +1 -1
  93. package/dist/types/src/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +1 -1
  94. package/dist/types/src/adapters/next/server/get-locale.d.ts +2 -2
  95. package/dist/types/src/adapters/next/server/get-translator.d.ts +9 -24
  96. package/dist/types/src/client/react/helpers/index.d.ts +1 -0
  97. package/dist/types/src/client/react/helpers/use-load-messages.d.ts +10 -0
  98. package/dist/types/src/client/react/index.d.ts +2 -1
  99. package/dist/types/src/client/react/navigation/use-navigation-strategy.d.ts +1 -1
  100. package/dist/types/src/client/react/navigation/use-navigation-target.d.ts +1 -1
  101. package/dist/types/src/client/react/provider/effects/use-locale-effects.d.ts +3 -0
  102. package/dist/types/src/client/react/provider/effects/use-messages-effects.d.ts +4 -0
  103. package/dist/types/src/client/react/{contexts/intor-provider → provider}/index.d.ts +1 -0
  104. package/dist/types/src/client/react/provider/intor-provider.d.ts +5 -0
  105. package/dist/types/src/client/react/provider/types.d.ts +22 -0
  106. package/dist/types/src/client/react/provider/use-intor.d.ts +2 -0
  107. package/dist/types/src/client/react/render/create-react-renderer.d.ts +1 -0
  108. package/dist/types/src/client/react/translator/create-t-rich.d.ts +1 -1
  109. package/dist/types/src/client/react/translator/t.d.ts +2 -2
  110. package/dist/types/src/client/react/translator/translator-instance.d.ts +12 -8
  111. package/dist/types/src/client/react/translator/use-translator.d.ts +3 -3
  112. package/dist/types/src/client/shared/messages/create-refetch-messages.d.ts +18 -0
  113. package/dist/types/src/client/shared/messages/index.d.ts +1 -0
  114. package/dist/types/src/client/shared/types/bootstrap.d.ts +16 -0
  115. package/dist/types/src/client/shared/types/index.d.ts +1 -1
  116. package/dist/types/src/client/shared/utils/build-cookie-string.d.ts +1 -1
  117. package/dist/types/src/client/shared/utils/locale/set-locale-cookie-browser.d.ts +1 -1
  118. package/dist/types/src/client/svelte/helpers/create-messages.d.ts +11 -0
  119. package/dist/types/src/client/svelte/helpers/index.d.ts +1 -0
  120. package/dist/types/src/client/svelte/index.d.ts +3 -0
  121. package/dist/types/src/client/svelte/runtime/create-intor.d.ts +13 -0
  122. package/dist/types/src/client/svelte/runtime/effects/locale-effects.d.ts +11 -0
  123. package/dist/types/src/client/svelte/runtime/effects/messages-effects.d.ts +9 -0
  124. package/dist/types/src/client/svelte/runtime/index.d.ts +1 -0
  125. package/dist/types/src/client/svelte/runtime/types.d.ts +9 -0
  126. package/dist/types/src/client/vue/helpers/index.d.ts +1 -0
  127. package/dist/types/src/client/vue/helpers/use-load-messages.d.ts +11 -0
  128. package/dist/types/src/client/vue/index.d.ts +4 -0
  129. package/dist/types/src/client/vue/provider/effects/use-locale-effects.d.ts +4 -0
  130. package/dist/types/src/client/vue/provider/effects/use-messages-effects.d.ts +11 -0
  131. package/dist/types/src/client/vue/provider/index.d.ts +2 -0
  132. package/dist/types/src/client/vue/provider/inject.d.ts +3 -0
  133. package/dist/types/src/client/vue/provider/intor-provider.d.ts +4 -0
  134. package/dist/types/src/client/vue/provider/types.d.ts +18 -0
  135. package/dist/types/src/client/vue/render/create-vue-renderer.d.ts +18 -0
  136. package/dist/types/src/client/vue/render/index.d.ts +2 -0
  137. package/dist/types/src/client/vue/render/render-rich-message-react.d.ts +13 -0
  138. package/dist/types/src/client/vue/render/types.d.ts +15 -0
  139. package/dist/types/src/client/vue/translator/create-t-rich.d.ts +16 -0
  140. package/dist/types/src/client/vue/translator/index.d.ts +2 -0
  141. package/dist/types/src/client/vue/translator/t.d.ts +38 -0
  142. package/dist/types/src/client/vue/translator/translator-instance.d.ts +16 -0
  143. package/dist/types/src/client/vue/translator/use-translator.d.ts +8 -0
  144. package/dist/types/src/config/constants/cache.d.ts +2 -0
  145. package/dist/types/src/config/constants/cookie.d.ts +2 -0
  146. package/dist/types/src/config/constants/index.d.ts +3 -0
  147. package/dist/types/src/config/constants/routing.d.ts +2 -0
  148. package/dist/types/src/config/define-intor-config.d.ts +1 -1
  149. package/dist/types/src/config/index.d.ts +2 -1
  150. package/dist/types/src/config/resolvers/resolve-cache-options.d.ts +1 -1
  151. package/dist/types/src/config/resolvers/resolve-cookie-options.d.ts +1 -1
  152. package/dist/types/src/config/resolvers/resolve-fallback-locales.d.ts +1 -1
  153. package/dist/types/src/config/resolvers/resolve-routing-options.d.ts +1 -1
  154. package/dist/types/src/config/types/index.d.ts +7 -0
  155. package/dist/types/src/config/types/{intor-config.types.d.ts → intor-config.d.ts} +28 -24
  156. package/dist/types/src/config/types/{loader.types.d.ts → loader.d.ts} +15 -12
  157. package/dist/types/src/config/types/{logger.types.d.ts → logger.d.ts} +1 -0
  158. package/dist/types/src/config/types/{routing.types.d.ts → routing.d.ts} +1 -1
  159. package/dist/types/src/config/types/translator.d.ts +7 -0
  160. package/dist/types/src/config/validators/validate-default-locale.d.ts +1 -1
  161. package/dist/types/src/config/validators/validate-supported-locales.d.ts +1 -1
  162. package/dist/types/src/core/index.d.ts +6 -0
  163. package/dist/types/src/{server/shared → core}/logger/get-logger.d.ts +3 -4
  164. package/dist/types/src/core/logger/index.d.ts +2 -0
  165. package/dist/types/src/core/messages/index.d.ts +4 -0
  166. package/dist/types/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +1 -1
  167. package/dist/types/src/core/messages/load-remote-messages/fetch-locale-messages/types.d.ts +12 -0
  168. package/dist/types/src/core/messages/load-remote-messages/index.d.ts +1 -0
  169. package/dist/types/src/{server → core}/messages/load-remote-messages/load-remote-messages.d.ts +1 -1
  170. package/dist/types/src/core/messages/load-remote-messages/types.d.ts +15 -0
  171. package/dist/types/src/{server/messages/shared → core/messages}/types.d.ts +8 -5
  172. package/dist/types/src/{server/messages/shared → core/messages}/utils/is-valid-messages.d.ts +1 -1
  173. package/dist/types/src/{shared → core}/types/generated.d.ts +1 -1
  174. package/dist/types/src/core/types/index.d.ts +3 -0
  175. package/dist/types/src/{shared → core}/types/translator-instance.d.ts +2 -6
  176. package/dist/types/src/{shared → core}/utils/index.d.ts +2 -0
  177. package/dist/types/src/{shared → core}/utils/locale/get-locale-from-pathname.d.ts +1 -1
  178. package/dist/types/src/{shared → core}/utils/locale/get-locale-from-query.d.ts +1 -1
  179. package/dist/types/src/{shared → core}/utils/pathname/get-unprefixed-pathname.d.ts +1 -1
  180. package/dist/types/src/{shared → core}/utils/pathname/locale-prefix-pathname.d.ts +1 -1
  181. package/dist/types/src/{shared → core}/utils/pathname/localize-pathname.d.ts +1 -1
  182. package/dist/types/src/{shared → core}/utils/pathname/standardize-pathname.d.ts +1 -1
  183. package/dist/types/src/core/utils/resolve-loader-options.d.ts +21 -0
  184. package/dist/types/src/routing/index.d.ts +2 -0
  185. package/dist/types/src/routing/locale/resolve-locale.d.ts +1 -1
  186. package/dist/types/src/routing/locale/types.d.ts +1 -1
  187. package/dist/types/src/routing/pathname/resolve-pathname.d.ts +1 -1
  188. package/dist/types/src/routing/pathname/types.d.ts +1 -1
  189. package/dist/types/src/routing/resolve-navigation-target.d.ts +1 -1
  190. package/dist/types/src/routing/resolve-routing.d.ts +1 -1
  191. package/dist/types/src/server/helpers/index.d.ts +1 -1
  192. package/dist/types/src/server/helpers/local-messages-from-url.d.ts +15 -5
  193. package/dist/types/src/server/index.d.ts +3 -5
  194. package/dist/types/src/server/intor/intor.d.ts +4 -4
  195. package/dist/types/src/server/intor/types.d.ts +4 -4
  196. package/dist/types/src/server/messages/index.d.ts +0 -2
  197. package/dist/types/src/server/messages/load-local-messages/index.d.ts +1 -1
  198. package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +1 -1
  199. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +2 -2
  200. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +5 -7
  201. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +1 -1
  202. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +5 -7
  203. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +1 -1
  204. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +1 -1
  205. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +2 -2
  206. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +6 -8
  207. package/dist/types/src/server/messages/load-local-messages/types.d.ts +9 -16
  208. package/dist/types/src/server/messages/load-messages.d.ts +3 -3
  209. package/dist/types/src/server/messages/types.d.ts +11 -5
  210. package/dist/types/src/server/translator/get-translator.d.ts +11 -19
  211. package/dist/types/src/server/translator/index.d.ts +2 -1
  212. package/dist/types/src/server/translator/translator-instance.d.ts +8 -0
  213. package/dist/vue/export/vue/index.js +6 -0
  214. package/dist/vue/src/client/helpers/get-client-locale.js +27 -0
  215. package/dist/vue/src/client/shared/messages/create-refetch-messages.js +61 -0
  216. package/dist/vue/src/client/shared/utils/build-cookie-string.js +30 -0
  217. package/dist/vue/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
  218. package/dist/vue/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
  219. package/dist/vue/src/client/shared/utils/locale/set-document-locale.js +12 -0
  220. package/dist/vue/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
  221. package/dist/vue/src/client/vue/helpers/use-load-messages.js +44 -0
  222. package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +13 -0
  223. package/dist/vue/src/client/vue/provider/effects/use-messages-effects.js +36 -0
  224. package/dist/vue/src/client/vue/provider/inject.js +11 -0
  225. package/dist/vue/src/client/vue/provider/intor-provider.js +79 -0
  226. package/dist/vue/src/client/vue/render/create-vue-renderer.js +36 -0
  227. package/dist/vue/src/client/vue/render/render-rich-message-react.js +19 -0
  228. package/dist/vue/src/client/vue/translator/create-t-rich.js +26 -0
  229. package/dist/vue/src/client/vue/translator/t.js +32 -0
  230. package/dist/vue/src/client/vue/translator/use-translator.js +28 -0
  231. package/dist/vue/src/core/error/intor-error.js +9 -0
  232. package/dist/vue/src/core/logger/get-logger.js +39 -0
  233. package/dist/vue/src/core/logger/global-logger-pool.js +8 -0
  234. package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
  235. package/dist/vue/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  236. package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +108 -0
  237. package/dist/vue/src/core/messages/utils/is-valid-messages.js +36 -0
  238. package/dist/vue/src/core/utils/deep-merge.js +31 -0
  239. package/dist/vue/src/core/utils/normalizers/normalize-cache-key.js +45 -0
  240. package/dist/vue/src/core/utils/normalizers/normalize-locale.js +59 -0
  241. package/dist/vue/src/core/utils/resolve-loader-options.js +32 -0
  242. package/package.json +16 -6
  243. package/dist/next/src/client/react/contexts/config/context.js +0 -3
  244. package/dist/next/src/client/react/contexts/locale/context.js +0 -3
  245. package/dist/next/src/client/react/contexts/messages/context.js +0 -3
  246. package/dist/next/src/client/react/contexts/translator/context.js +0 -3
  247. package/dist/next/src/client/react/contexts/translator-runtime/context.js +0 -3
  248. package/dist/next/src/config/constants/cache.constants.js +0 -7
  249. package/dist/react/src/client/react/contexts/config/context.js +0 -5
  250. package/dist/react/src/client/react/contexts/config/hook.js +0 -11
  251. package/dist/react/src/client/react/contexts/config/provider.js +0 -14
  252. package/dist/react/src/client/react/contexts/intor-provider/intor-provider.js +0 -17
  253. package/dist/react/src/client/react/contexts/locale/context.js +0 -5
  254. package/dist/react/src/client/react/contexts/locale/hook.js +0 -11
  255. package/dist/react/src/client/react/contexts/locale/provider.js +0 -38
  256. package/dist/react/src/client/react/contexts/locale/utils/change-locale.js +0 -26
  257. package/dist/react/src/client/react/contexts/messages/context.js +0 -5
  258. package/dist/react/src/client/react/contexts/messages/hook.js +0 -11
  259. package/dist/react/src/client/react/contexts/messages/provider.js +0 -39
  260. package/dist/react/src/client/react/contexts/messages/utils/use-refetch-messages.js +0 -70
  261. package/dist/react/src/client/react/contexts/translator/context.js +0 -5
  262. package/dist/react/src/client/react/contexts/translator/hook.js +0 -11
  263. package/dist/react/src/client/react/contexts/translator/provider.js +0 -58
  264. package/dist/react/src/client/react/contexts/translator-runtime/context.js +0 -5
  265. package/dist/react/src/client/react/contexts/translator-runtime/hook.js +0 -9
  266. package/dist/react/src/client/react/contexts/translator-runtime/provider.js +0 -15
  267. package/dist/react/src/config/constants/cache.constants.js +0 -7
  268. package/dist/react/src/server/shared/messages/global-messages-pool.js +0 -10
  269. package/dist/types/src/client/react/contexts/config/context.d.ts +0 -3
  270. package/dist/types/src/client/react/contexts/config/hook.d.ts +0 -2
  271. package/dist/types/src/client/react/contexts/config/index.d.ts +0 -2
  272. package/dist/types/src/client/react/contexts/config/provider.d.ts +0 -2
  273. package/dist/types/src/client/react/contexts/config/types.d.ts +0 -11
  274. package/dist/types/src/client/react/contexts/index.d.ts +0 -6
  275. package/dist/types/src/client/react/contexts/intor-provider/intor-provider.d.ts +0 -2
  276. package/dist/types/src/client/react/contexts/intor-provider/types.d.ts +0 -13
  277. package/dist/types/src/client/react/contexts/locale/context.d.ts +0 -3
  278. package/dist/types/src/client/react/contexts/locale/hook.d.ts +0 -1
  279. package/dist/types/src/client/react/contexts/locale/index.d.ts +0 -2
  280. package/dist/types/src/client/react/contexts/locale/provider.d.ts +0 -3
  281. package/dist/types/src/client/react/contexts/locale/types.d.ts +0 -13
  282. package/dist/types/src/client/react/contexts/locale/utils/change-locale.d.ts +0 -20
  283. package/dist/types/src/client/react/contexts/messages/context.d.ts +0 -3
  284. package/dist/types/src/client/react/contexts/messages/hook.d.ts +0 -2
  285. package/dist/types/src/client/react/contexts/messages/index.d.ts +0 -2
  286. package/dist/types/src/client/react/contexts/messages/provider.d.ts +0 -3
  287. package/dist/types/src/client/react/contexts/messages/types.d.ts +0 -12
  288. package/dist/types/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +0 -20
  289. package/dist/types/src/client/react/contexts/translator/context.d.ts +0 -3
  290. package/dist/types/src/client/react/contexts/translator/hook.d.ts +0 -2
  291. package/dist/types/src/client/react/contexts/translator/index.d.ts +0 -2
  292. package/dist/types/src/client/react/contexts/translator/provider.d.ts +0 -2
  293. package/dist/types/src/client/react/contexts/translator/types.d.ts +0 -11
  294. package/dist/types/src/client/react/contexts/translator-runtime/context.d.ts +0 -3
  295. package/dist/types/src/client/react/contexts/translator-runtime/hook.d.ts +0 -2
  296. package/dist/types/src/client/react/contexts/translator-runtime/index.d.ts +0 -3
  297. package/dist/types/src/client/react/contexts/translator-runtime/provider.d.ts +0 -2
  298. package/dist/types/src/client/react/contexts/translator-runtime/types.d.ts +0 -13
  299. package/dist/types/src/client/shared/types/translator-instance.d.ts +0 -11
  300. package/dist/types/src/config/constants/cache.constants.d.ts +0 -2
  301. package/dist/types/src/config/constants/cookie.constants.d.ts +0 -2
  302. package/dist/types/src/config/constants/routing.constants.d.ts +0 -2
  303. package/dist/types/src/config/types/translator.types.d.ts +0 -7
  304. package/dist/types/src/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +0 -14
  305. package/dist/types/src/server/messages/load-remote-messages/index.d.ts +0 -2
  306. package/dist/types/src/server/messages/load-remote-messages/types.d.ts +0 -21
  307. package/dist/types/src/shared/types/index.d.ts +0 -2
  308. /package/dist/core/src/config/constants/{cache.constants.js → cache.js} +0 -0
  309. /package/dist/core/src/config/constants/{cookie.constants.js → cookie.js} +0 -0
  310. /package/dist/core/src/config/constants/{routing.constants.js → routing.js} +0 -0
  311. /package/dist/core/src/{shared → core}/constants/prefix-placeholder.js +0 -0
  312. /package/dist/core/src/{shared → core}/error/intor-error.js +0 -0
  313. /package/dist/core/src/{server/shared → core}/logger/get-logger.js +0 -0
  314. /package/dist/core/src/{server/shared → core}/logger/global-logger-pool.js +0 -0
  315. /package/dist/core/src/{server/shared → core}/messages/global-messages-pool.js +0 -0
  316. /package/dist/core/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
  317. /package/dist/core/src/{server/messages/shared → core/messages}/utils/is-valid-messages.js +0 -0
  318. /package/dist/core/src/{shared → core}/utils/deep-merge.js +0 -0
  319. /package/dist/core/src/{shared → core}/utils/normalizers/normalize-cache-key.js +0 -0
  320. /package/dist/core/src/{shared → core}/utils/normalizers/normalize-pathname.js +0 -0
  321. /package/dist/core/src/{shared → core}/utils/pathname/get-unprefixed-pathname.js +0 -0
  322. /package/dist/core/src/{shared → core}/utils/pathname/locale-prefix-pathname.js +0 -0
  323. /package/dist/core/src/{shared → core}/utils/pathname/localize-pathname.js +0 -0
  324. /package/dist/core/src/{shared → core}/utils/pathname/standardize-pathname.js +0 -0
  325. /package/dist/next/src/{shared → core}/constants/prefix-placeholder.js +0 -0
  326. /package/dist/next/src/{server/shared → core}/logger/get-logger.js +0 -0
  327. /package/dist/next/src/{server/shared → core}/logger/global-logger-pool.js +0 -0
  328. /package/dist/next/src/{server/shared → core}/messages/global-messages-pool.js +0 -0
  329. /package/dist/next/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
  330. /package/dist/next/src/{server/messages/shared → core/messages}/utils/is-valid-messages.js +0 -0
  331. /package/dist/next/src/{shared → core}/utils/deep-merge.js +0 -0
  332. /package/dist/next/src/{shared → core}/utils/is-external-destination.js +0 -0
  333. /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-accept-language.js +0 -0
  334. /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-host.js +0 -0
  335. /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-pathname.js +0 -0
  336. /package/dist/next/src/{shared → core}/utils/locale/get-locale-from-query.js +0 -0
  337. /package/dist/next/src/{shared → core}/utils/normalizers/normalize-cache-key.js +0 -0
  338. /package/dist/next/src/{shared → core}/utils/normalizers/normalize-locale.js +0 -0
  339. /package/dist/next/src/{shared → core}/utils/normalizers/normalize-pathname.js +0 -0
  340. /package/dist/next/src/{shared → core}/utils/pathname/get-unprefixed-pathname.js +0 -0
  341. /package/dist/next/src/{shared → core}/utils/pathname/locale-prefix-pathname.js +0 -0
  342. /package/dist/next/src/{shared → core}/utils/pathname/localize-pathname.js +0 -0
  343. /package/dist/next/src/{shared → core}/utils/pathname/standardize-pathname.js +0 -0
  344. /package/dist/react/src/{server/shared → core}/logger/get-logger.js +0 -0
  345. /package/dist/react/src/{server/shared → core}/logger/global-logger-pool.js +0 -0
  346. /package/dist/react/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
  347. /package/dist/react/src/{server/messages/shared → core/messages}/utils/is-valid-messages.js +0 -0
  348. /package/dist/react/src/{shared → core}/utils/deep-merge.js +0 -0
  349. /package/dist/react/src/{shared → core}/utils/normalizers/normalize-cache-key.js +0 -0
  350. /package/dist/react/src/{shared → core}/utils/normalizers/normalize-locale.js +0 -0
  351. /package/dist/{next → svelte}/src/client/shared/utils/build-cookie-string.js +0 -0
  352. /package/dist/{next → svelte}/src/client/shared/utils/locale/set-locale-cookie-browser.js +0 -0
  353. /package/dist/types/src/config/types/{cache.types.d.ts → cache.d.ts} +0 -0
  354. /package/dist/types/src/config/types/{cookie.types.d.ts → cookie.d.ts} +0 -0
  355. /package/dist/types/src/{shared → core}/constants/index.d.ts +0 -0
  356. /package/dist/types/src/{shared → core}/constants/prefix-placeholder.d.ts +0 -0
  357. /package/dist/types/src/{shared → core}/error/index.d.ts +0 -0
  358. /package/dist/types/src/{shared → core}/error/intor-error.d.ts +0 -0
  359. /package/dist/types/src/{server/shared → core}/logger/global-logger-pool.d.ts +0 -0
  360. /package/dist/types/src/{server/shared → core}/messages/global-messages-pool.d.ts +0 -0
  361. /package/dist/types/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/index.d.ts +0 -0
  362. /package/dist/types/src/{server → core}/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +0 -0
  363. /package/dist/types/src/{shared → core}/types/routing.d.ts +0 -0
  364. /package/dist/types/src/{shared → core}/utils/deep-merge.d.ts +0 -0
  365. /package/dist/types/src/{shared → core}/utils/is-external-destination.d.ts +0 -0
  366. /package/dist/types/src/{shared → core}/utils/locale/get-locale-from-accept-language.d.ts +0 -0
  367. /package/dist/types/src/{shared → core}/utils/locale/get-locale-from-host.d.ts +0 -0
  368. /package/dist/types/src/{shared → core}/utils/locale/index.d.ts +0 -0
  369. /package/dist/types/src/{shared → core}/utils/normalizers/index.d.ts +0 -0
  370. /package/dist/types/src/{shared → core}/utils/normalizers/normalize-cache-key.d.ts +0 -0
  371. /package/dist/types/src/{shared → core}/utils/normalizers/normalize-locale.d.ts +0 -0
  372. /package/dist/types/src/{shared → core}/utils/normalizers/normalize-pathname.d.ts +0 -0
  373. /package/dist/types/src/{shared → core}/utils/pathname/index.d.ts +0 -0
@@ -0,0 +1,36 @@
1
+ import { getUnprefixedPathname } from './get-unprefixed-pathname.js';
2
+ import { localePrefixPathname } from './locale-prefix-pathname.js';
3
+ import { standardizePathname } from './standardize-pathname.js';
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
+ * localePrefixPathname({ config, pathname: "/app/en-US/about", locale: "en-US" });
15
+ * // => {
16
+ * // unprefixedPathname: '/about',
17
+ * // standardizedPathname: '/app/{locale}/about',
18
+ * // localizedPathname: '/app/en-US/about'
19
+ * // }
20
+ * ```
21
+ */
22
+ const localizePathname = (config, rawPathname, locale) => {
23
+ // 1. Canonicalize: extract basePath and strip locale
24
+ const unprefixedPathname = getUnprefixedPathname(config, rawPathname);
25
+ // 2. Standardize: build a pathname with locale placeholder
26
+ const standardizedPathname = standardizePathname(config, unprefixedPathname);
27
+ // 3. Apply strategy: resolve locale prefix based on routing rules
28
+ const localizedPathname = localePrefixPathname(config, standardizedPathname, locale);
29
+ return {
30
+ unprefixedPathname,
31
+ standardizedPathname,
32
+ localizedPathname,
33
+ };
34
+ };
35
+
36
+ export { localizePathname };
@@ -0,0 +1,30 @@
1
+ import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
2
+ import { normalizePathname } from '../normalizers/normalize-pathname.js';
3
+
4
+ /**
5
+ * Standardizes a canonical pathname by applying the base path
6
+ * and injecting the locale placeholder.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // routing.basePath: "/app",
11
+ * standardizePathname({ config, pathname: "/cms" });
12
+ * // => "/app/{locale}/cms"
13
+ * ```
14
+ */
15
+ const standardizePathname = (config, unprefixedPathname) => {
16
+ const { routing } = config;
17
+ const { basePath } = routing;
18
+ // Normalize each segment before join to avoid redundant slashes
19
+ const parts = [
20
+ normalizePathname(basePath),
21
+ PREFIX_PLACEHOLDER,
22
+ normalizePathname(unprefixedPathname),
23
+ ];
24
+ // Avoid double slashes between segments
25
+ const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
26
+ // Final normalization to ensure leading slash, no trailing
27
+ return normalizePathname(standardizedPathname);
28
+ };
29
+
30
+ export { standardizePathname };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Resolve the effective message loader for a given runtime.
3
+ *
4
+ * Loader resolution follows an inheritance-based priority model:
5
+ *
6
+ * - client runtime:
7
+ * client.loader → server.loader → root loader
8
+ *
9
+ * - server runtime:
10
+ * server.loader → root loader
11
+ *
12
+ * This allows the client runtime to inherit server behavior
13
+ * when no explicit client loader is provided.
14
+ *
15
+ * Notes:
16
+ * - Static `messages` are intentionally NOT handled here.
17
+ * - Returning `undefined` indicates that no loader is enabled
18
+ * for the given runtime.
19
+ */
20
+ const resolveLoaderOptions = (config, runtime) => {
21
+ // --- runtime: client ---
22
+ {
23
+ const client = config.client?.loader;
24
+ if (client) {
25
+ // Client loader is always remote by design
26
+ return { type: "remote", ...client };
27
+ }
28
+ return config.server?.loader ?? config.loader;
29
+ }
30
+ };
31
+
32
+ export { resolveLoaderOptions };
@@ -1,5 +1,8 @@
1
- import { localizePathname } from '../shared/utils/pathname/localize-pathname.js';
2
- import { isExternalDestination } from '../shared/utils/is-external-destination.js';
1
+ import '../core/error/intor-error.js';
2
+ import { isExternalDestination } from '../core/utils/is-external-destination.js';
3
+ import { localizePathname } from '../core/utils/pathname/localize-pathname.js';
4
+ import 'logry';
5
+ import 'keyv';
3
6
 
4
7
  /**
5
8
  * Resolves the destination of a navigation attempt.
@@ -0,0 +1,6 @@
1
+ export { createIntor } from '../../src/client/svelte/runtime/create-intor.js';
2
+ import 'svelte/store';
3
+ import '../../src/core/error/intor-error.js';
4
+ import 'logry';
5
+ import 'keyv';
6
+ export { getClientLocale } from '../../src/client/helpers/get-client-locale.js';
@@ -0,0 +1,27 @@
1
+ import '../../core/error/intor-error.js';
2
+ import { normalizeLocale } from '../../core/utils/normalizers/normalize-locale.js';
3
+ import 'logry';
4
+ import 'keyv';
5
+ import { detectBrowserLocale } from '../shared/utils/locale/detect-browser-locale.js';
6
+ import { getLocaleCookieBrowser } from '../shared/utils/locale/get-locale-cookie-browser.js';
7
+
8
+ /**
9
+ * Resolve the locale in a client-only environment.
10
+ *
11
+ * This helper is intended for pure CSR setups (e.g. Vite).
12
+ *
13
+ * For framework-based apps, prefer `useTranslator()`.
14
+ *
15
+ * - Client-side only
16
+ */
17
+ function getClientLocale(config) {
18
+ const { defaultLocale, supportedLocales, cookie } = config;
19
+ // Locale from browser cookie
20
+ const cookieLocale = getLocaleCookieBrowser(cookie.name);
21
+ // Locale from browser preference
22
+ const browserLocale = detectBrowserLocale();
23
+ const localeCandidate = cookieLocale || browserLocale;
24
+ return normalizeLocale(localeCandidate, supportedLocales) || defaultLocale;
25
+ }
26
+
27
+ export { getClientLocale };
@@ -0,0 +1,61 @@
1
+ import '../../../core/error/intor-error.js';
2
+ import { deepMerge } from '../../../core/utils/deep-merge.js';
3
+ import { resolveLoaderOptions } from '../../../core/utils/resolve-loader-options.js';
4
+ import 'logry';
5
+ import { loadRemoteMessages } from '../../../core/messages/load-remote-messages/load-remote-messages.js';
6
+ import 'keyv';
7
+
8
+ /**
9
+ * Creates a framework-agnostic message refetcher.
10
+ *
11
+ * - At most one remote request is active at any time
12
+ * - Previous in-flight requests are aborted on subsequent calls
13
+ * - State updates are applied only for the latest, non-aborted request
14
+ */
15
+ const createRefetchMessages = ({ config, onLoadingStart, onLoadingEnd, onMessages, }) => {
16
+ // Tracks the currently active remote request for this refetcher instance
17
+ let controller = null;
18
+ return async function refetchMessages(newLocale) {
19
+ // No-op when remote loading is not enabled
20
+ const loader = resolveLoaderOptions(config);
21
+ if (!loader || loader.type !== "remote")
22
+ return;
23
+ // Abort previous request
24
+ controller?.abort();
25
+ const currentController = new AbortController();
26
+ controller = currentController;
27
+ onLoadingStart?.();
28
+ try {
29
+ const loadedMessages = await loadRemoteMessages({
30
+ // --- Messages Scope ---
31
+ locale: newLocale,
32
+ fallbackLocales: config.fallbackLocales[newLocale] || [],
33
+ namespaces: loader.namespaces,
34
+ rootDir: loader.rootDir,
35
+ // --- Remote Source ---
36
+ url: loader.url,
37
+ headers: loader.headers,
38
+ signal: currentController.signal,
39
+ // --- Caching ---
40
+ cacheOptions: config.cache,
41
+ // --- Observability ---
42
+ loggerOptions: config.logger,
43
+ });
44
+ // Apply state updates only when this request is still the active one
45
+ // and has not been aborted.
46
+ if (controller === currentController &&
47
+ !currentController.signal.aborted) {
48
+ onMessages?.(deepMerge(config.messages, loadedMessages));
49
+ }
50
+ }
51
+ finally {
52
+ // Clear loading state only if this request is still the active one
53
+ if (controller === currentController &&
54
+ !currentController.signal.aborted) {
55
+ onLoadingEnd?.();
56
+ }
57
+ }
58
+ };
59
+ };
60
+
61
+ export { createRefetchMessages };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Detect the preferred locale from the browser.
3
+ *
4
+ * - Client-side only
5
+ */
6
+ function detectBrowserLocale() {
7
+ if (typeof navigator === "undefined")
8
+ return undefined;
9
+ return navigator.languages?.[0] || navigator.language || undefined;
10
+ }
11
+
12
+ export { detectBrowserLocale };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Gets the locale value from the browser cookie.
3
+ *
4
+ * - Client-side only
5
+ */
6
+ function getLocaleCookieBrowser(cookieName) {
7
+ if (typeof document === "undefined")
8
+ return undefined;
9
+ const cookies = document.cookie.split(";").map((c) => c.trim());
10
+ const entry = cookies.find((c) => c.startsWith(`${cookieName}=`));
11
+ if (!entry)
12
+ return undefined;
13
+ return decodeURIComponent(entry.slice(cookieName.length + 1));
14
+ }
15
+
16
+ export { getLocaleCookieBrowser };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Sets the document language attribute.
3
+ *
4
+ * - Client-side only
5
+ */
6
+ function setDocumentLocale(locale) {
7
+ if (typeof document === "undefined")
8
+ return;
9
+ document.documentElement.lang = locale;
10
+ }
11
+
12
+ export { setDocumentLocale };
@@ -0,0 +1,70 @@
1
+ import { Translator } from 'intor-translator';
2
+ import { writable, readable, derived, get } from 'svelte/store';
3
+ import { attachLocaleEffects } from './effects/locale-effects.js';
4
+ import { attachMessagesEffects } from './effects/messages-effects.js';
5
+
6
+ function createIntor({ config, initialLocale, initialMessages, handlers, plugins, onLocaleChange, isLoading: externalIsLoading, }) {
7
+ // ---------------------------------------------------------------------------
8
+ // Internal state
9
+ // ---------------------------------------------------------------------------
10
+ const locale = writable(initialLocale);
11
+ const runtimeMessages = writable(null);
12
+ const internalIsLoading = writable(false);
13
+ // -----------------------------------------------------------------------------
14
+ // Locale transition
15
+ // -----------------------------------------------------------------------------
16
+ /** Request a locale change. */
17
+ async function setLocale(next) {
18
+ const current = get(locale);
19
+ if (next === current)
20
+ return;
21
+ locale.set(next);
22
+ onLocaleChange?.(next); // Notify external listener (fire-and-forget)
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Effective state
26
+ // ---------------------------------------------------------------------------
27
+ const externalIsLoadingStore = externalIsLoading ?? readable(false);
28
+ // external > internal
29
+ const effectiveIsLoading = derived([externalIsLoadingStore, internalIsLoading], ([$external, $internal]) => $external || $internal);
30
+ // runtime (client refetch) > initial > config (static)
31
+ const effectiveMessages = derived([runtimeMessages, initialMessages ?? readable(undefined)], ([$runtime, $initial]) => $runtime || $initial || config.messages || {});
32
+ // ---------------------------------------------------------------------------
33
+ // Translator
34
+ // ---------------------------------------------------------------------------
35
+ const translator = derived([effectiveMessages, locale, effectiveIsLoading], ([$messages, $locale, $isLoading]) => new Translator({
36
+ messages: $messages,
37
+ locale: $locale,
38
+ isLoading: $isLoading,
39
+ fallbackLocales: config.fallbackLocales,
40
+ loadingMessage: config.translator?.loadingMessage,
41
+ missingMessage: config.translator?.missingMessage,
42
+ handlers,
43
+ plugins,
44
+ }));
45
+ // ---------------------------------------------------------------------------
46
+ // Side effects
47
+ // ---------------------------------------------------------------------------
48
+ const detachLocaleEffects = attachLocaleEffects(locale, config);
49
+ const detachMessagesEffects = attachMessagesEffects({
50
+ config,
51
+ locale,
52
+ runtimeMessages,
53
+ internalIsLoading,
54
+ });
55
+ return {
56
+ config,
57
+ locale,
58
+ setLocale,
59
+ messages: effectiveMessages,
60
+ isLoading: effectiveIsLoading,
61
+ translator,
62
+ // optional cleanup
63
+ destroy() {
64
+ detachLocaleEffects();
65
+ detachMessagesEffects();
66
+ },
67
+ };
68
+ }
69
+
70
+ export { createIntor };
@@ -0,0 +1,19 @@
1
+ import { setLocaleCookieBrowser } from '../../../shared/utils/locale/set-locale-cookie-browser.js';
2
+ import { setDocumentLocale } from '../../../shared/utils/locale/set-document-locale.js';
3
+
4
+ /**
5
+ * Attach locale-related browser side effects.
6
+ *
7
+ * - Sync locale cookie
8
+ * - Sync <html lang="">
9
+ *
10
+ * Returns an unsubscribe function.
11
+ */
12
+ function attachLocaleEffects(locale, config) {
13
+ return locale.subscribe((value) => {
14
+ setLocaleCookieBrowser(config.cookie, value);
15
+ setDocumentLocale(value);
16
+ });
17
+ }
18
+
19
+ export { attachLocaleEffects };
@@ -0,0 +1,23 @@
1
+ import { createRefetchMessages } from '../../../shared/messages/create-refetch-messages.js';
2
+
3
+ function attachMessagesEffects({ locale, config, runtimeMessages, internalIsLoading, }) {
4
+ // Prepares message refetch function.
5
+ const refetchMessages = createRefetchMessages({
6
+ config,
7
+ onLoadingStart: () => internalIsLoading.set(true),
8
+ onLoadingEnd: () => internalIsLoading.set(false),
9
+ onMessages: (messages) => runtimeMessages.set(messages),
10
+ });
11
+ // Refetch messages when locale changes (except initial render).
12
+ let isInitial = true;
13
+ const unsubscribe = locale.subscribe((value) => {
14
+ if (isInitial) {
15
+ isInitial = false;
16
+ return;
17
+ }
18
+ refetchMessages(value);
19
+ });
20
+ return unsubscribe;
21
+ }
22
+
23
+ export { attachMessagesEffects };
@@ -0,0 +1,9 @@
1
+ var IntorErrorCode;
2
+ (function (IntorErrorCode) {
3
+ // intor-config
4
+ IntorErrorCode["MISSING_SUPPORTED_LOCALES"] = "INTOR_MISSING_SUPPORTED_LOCALES";
5
+ IntorErrorCode["MISSING_DEFAULT_LOCALE"] = "INTOR_MISSING_DEFAULT_LOCALE";
6
+ IntorErrorCode["UNSUPPORTED_DEFAULT_LOCALE"] = "INTOR_UNSUPPORTED_DEFAULT_LOCALE";
7
+ })(IntorErrorCode || (IntorErrorCode = {}));
8
+
9
+ export { IntorErrorCode };
@@ -0,0 +1,39 @@
1
+ import { logry } from 'logry';
2
+ import { getGlobalLoggerPool } from './global-logger-pool.js';
3
+
4
+ const DEFAULT_FORMAT_CONFIG = {
5
+ timestamp: { withDate: false },
6
+ };
7
+ const DEFAULT_RENDER_CONFIG = {
8
+ timestamp: {},
9
+ id: { visible: true, prefix: "<", suffix: ">" },
10
+ meta: { lineBreaksAfter: 1 },
11
+ };
12
+ /**
13
+ * Get a shared logger instance by id.
14
+ * - Safe across hot reloads
15
+ * - Prevents unbounded memory usage via soft LRU
16
+ */
17
+ function getLogger({ id = "default", formatConfig, renderConfig, preset, ...options }) {
18
+ const pool = getGlobalLoggerPool();
19
+ let logger = pool.get(id);
20
+ if (!logger) {
21
+ logger = logry({
22
+ id,
23
+ formatConfig: !formatConfig && !preset ? DEFAULT_FORMAT_CONFIG : formatConfig,
24
+ renderConfig: !renderConfig && !preset ? DEFAULT_RENDER_CONFIG : renderConfig,
25
+ preset,
26
+ ...options,
27
+ });
28
+ pool.set(id, logger);
29
+ // Soft LRU: keep pool size under control
30
+ if (pool.size > 1000) {
31
+ const keys = [...pool.keys()];
32
+ for (const key of keys.slice(0, 200))
33
+ pool.delete(key);
34
+ }
35
+ }
36
+ return logger;
37
+ }
38
+
39
+ export { getLogger };
@@ -0,0 +1,8 @@
1
+ function getGlobalLoggerPool() {
2
+ if (!globalThis.__INTOR_LOGGER_POOL__) {
3
+ globalThis.__INTOR_LOGGER_POOL__ = new Map();
4
+ }
5
+ return globalThis.__INTOR_LOGGER_POOL__;
6
+ }
7
+
8
+ export { getGlobalLoggerPool };
@@ -0,0 +1,55 @@
1
+ import { getLogger } from '../../../logger/get-logger.js';
2
+ import { isValidMessages } from '../../utils/is-valid-messages.js';
3
+ import { buildSearchParams } from './utils/build-search-params.js';
4
+
5
+ /**
6
+ * Fetches locale messages from a remote API.
7
+ *
8
+ * - Validates that the returned JSON matches the expected `NamespaceMessages` structure.
9
+ * - Uses `fetch` with `no-store` cache to always get fresh data.
10
+ */
11
+ const fetchLocaleMessages = async ({ locale, namespaces, rootDir, url: rawUrl, headers: rawHeaders, signal, extraOptions: { loggerOptions }, }) => {
12
+ const baseLogger = getLogger(loggerOptions);
13
+ const logger = baseLogger.child({ scope: "fetch-locale-messages" });
14
+ const searchParams = buildSearchParams({ locale, rootDir, namespaces });
15
+ const url = `${rawUrl}?${searchParams.toString()}`;
16
+ try {
17
+ // Headers
18
+ const headers = {
19
+ "Content-Type": "application/json",
20
+ ...rawHeaders,
21
+ };
22
+ // Fetch
23
+ const response = await fetch(url, {
24
+ method: "GET",
25
+ headers: headers,
26
+ cache: "no-store",
27
+ signal,
28
+ });
29
+ if (!response.ok) {
30
+ throw new Error(`HTTP error ${response.status} ${response.statusText}`);
31
+ }
32
+ // Parse JSON body
33
+ const data = (await response.json());
34
+ // Validate messages structure
35
+ if (!isValidMessages(data[locale])) {
36
+ throw new Error("JSON file does not match NamespaceMessages structure");
37
+ }
38
+ return data;
39
+ }
40
+ catch (error) {
41
+ if (error instanceof Error && error.name === "AbortError") {
42
+ logger.debug("Fetching locale messages aborted.", { locale, url });
43
+ return;
44
+ }
45
+ logger.warn("Fetching locale messages failed.", {
46
+ locale,
47
+ url,
48
+ searchParams: decodeURIComponent(searchParams.toString()),
49
+ error,
50
+ });
51
+ return;
52
+ }
53
+ };
54
+
55
+ export { fetchLocaleMessages };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Build URLSearchParams from an object.
3
+ * Supports string or string[] values. Ignores undefined/null.
4
+ */
5
+ const buildSearchParams = (params) => {
6
+ const searchParams = new URLSearchParams();
7
+ const appendParam = (key, value) => {
8
+ if (value === undefined || value === null)
9
+ return;
10
+ if (Array.isArray(value) && value.length === 0)
11
+ return;
12
+ if (Array.isArray(value)) {
13
+ value.forEach((v) => v && searchParams.append(key, v));
14
+ }
15
+ else {
16
+ searchParams.append(key, value);
17
+ }
18
+ };
19
+ Object.entries(params).forEach(([key, value]) => {
20
+ appendParam(key, value);
21
+ });
22
+ return searchParams;
23
+ };
24
+
25
+ export { buildSearchParams };
@@ -0,0 +1,108 @@
1
+ import { getLogger } from '../../logger/get-logger.js';
2
+ import { normalizeCacheKey } from '../../utils/normalizers/normalize-cache-key.js';
3
+ import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messages.js';
4
+
5
+ /**
6
+ * Load locale messages from a remote API.
7
+ *
8
+ * This function acts as the orchestration layer for remote message loading.
9
+ * It is responsible for:
10
+ *
11
+ * - Resolving fallback locales in order
12
+ * - Coordinating cache read / write behavior
13
+ * - Respecting abort signals across the entire async flow
14
+ *
15
+ * Network fetching and data validation are delegated to lower-level utilities.
16
+ */
17
+ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir, url, headers, signal, pool, cacheOptions, allowCacheWrite = false, loggerOptions, }) => {
18
+ const baseLogger = getLogger(loggerOptions);
19
+ const logger = baseLogger.child({ scope: "load-remote-messages" });
20
+ // Abort early if the request has already been cancelled
21
+ if (signal?.aborted) {
22
+ logger.debug("Remote message loading aborted before fetch.");
23
+ return;
24
+ }
25
+ const start = performance.now();
26
+ logger.debug("Loading remote messages.", { url });
27
+ // --- Cache key ---
28
+ const cacheKey = normalizeCacheKey([
29
+ loggerOptions.id,
30
+ "loaderType:remote",
31
+ rootDir,
32
+ locale,
33
+ (fallbackLocales ?? []).toSorted().join(","),
34
+ (namespaces ?? []).toSorted().join(","),
35
+ ]);
36
+ // --- Cache read ---
37
+ if (cacheOptions.enabled && cacheKey) {
38
+ const cached = await pool?.get(cacheKey);
39
+ if (signal?.aborted) {
40
+ logger.debug("Remote message loading aborted after cache read.");
41
+ return;
42
+ }
43
+ if (cached) {
44
+ logger.debug("Messages cache hit.", { key: cacheKey });
45
+ return cached;
46
+ }
47
+ }
48
+ const candidateLocales = [locale, ...(fallbackLocales || [])];
49
+ let messages;
50
+ // Try each candidate locale in order and stop at the first successful result
51
+ for (let i = 0; i < candidateLocales.length; i++) {
52
+ const candidateLocale = candidateLocales[i];
53
+ const isLast = i === candidateLocales.length - 1;
54
+ try {
55
+ const fetched = await fetchLocaleMessages({
56
+ locale: candidateLocale,
57
+ namespaces,
58
+ rootDir,
59
+ url,
60
+ headers,
61
+ signal,
62
+ extraOptions: { loggerOptions },
63
+ });
64
+ // Stop at the first locale that yields non-empty messages
65
+ if (fetched && Object.values(fetched[candidateLocale] || {}).length > 0) {
66
+ messages = fetched;
67
+ break;
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error && error.name === "AbortError") {
72
+ logger.debug("Remote message loading aborted.");
73
+ return;
74
+ }
75
+ if (isLast) {
76
+ logger.warn("Failed to load messages for all candidate locales.", {
77
+ locale,
78
+ fallbackLocales,
79
+ });
80
+ }
81
+ else {
82
+ logger.warn(`Failed to fetch locale messages for "${candidateLocale}", trying next fallback.`);
83
+ }
84
+ logger.trace("Remote fetch error detail.", {
85
+ locale: candidateLocale,
86
+ error,
87
+ });
88
+ }
89
+ }
90
+ // --- Cache write ---
91
+ if (cacheOptions.enabled && allowCacheWrite && cacheKey && messages) {
92
+ if (signal?.aborted) {
93
+ logger.debug("Remote message loading aborted before cache write.");
94
+ return;
95
+ }
96
+ await pool?.set(cacheKey, messages, cacheOptions.ttl);
97
+ }
98
+ // Final success log with resolved locale and timing
99
+ if (messages) {
100
+ logger.trace("Finished loading remote messages.", {
101
+ loadedLocale: messages ? Object.keys(messages)[0] : undefined,
102
+ duration: `${Math.round(performance.now() - start)} ms`,
103
+ });
104
+ }
105
+ return messages;
106
+ };
107
+
108
+ export { loadRemoteMessages };
@@ -0,0 +1,36 @@
1
+ /** Check if a value is a plain object (not null, not array) */
2
+ function isPlainObject(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ /**
6
+ * Check if a value is a valid **Messages** object.
7
+ *
8
+ * - Uses an iterative approach to avoid stack overflow with deeply nested objects.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * isValidMessages({ en: { hello: "Hello" } }) // true
13
+ * isValidMessages({ en: { count: 5 } }) // false
14
+ * ```
15
+ */
16
+ function isValidMessages(value) {
17
+ if (!isPlainObject(value))
18
+ return false;
19
+ const stack = [value];
20
+ while (stack.length > 0) {
21
+ const current = stack.pop();
22
+ for (const v of Object.values(current)) {
23
+ if (typeof v === "string")
24
+ continue;
25
+ if (isPlainObject(v)) {
26
+ stack.push(v);
27
+ }
28
+ else {
29
+ return false;
30
+ }
31
+ }
32
+ }
33
+ return true;
34
+ }
35
+
36
+ export { isPlainObject, isValidMessages };