intor 2.3.3 → 2.3.5

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 (422) hide show
  1. package/README.md +79 -0
  2. package/dist/core/export/config/index.js +1 -0
  3. package/dist/core/export/index.js +4 -0
  4. package/dist/core/export/server/index.js +7 -0
  5. package/dist/{src → core/src}/config/constants/cookie.constants.js +2 -2
  6. package/dist/{src → core/src}/config/constants/routing.constants.js +6 -0
  7. package/dist/{src → core/src}/config/define-intor-config.js +18 -4
  8. package/dist/core/src/config/resolvers/resolve-cookie-options.js +10 -0
  9. package/dist/{src → core/src}/config/resolvers/resolve-fallback-locales.js +17 -0
  10. package/dist/core/src/config/resolvers/resolve-routing-options.js +20 -0
  11. package/dist/{src → core/src}/config/validators/validate-default-locale.js +9 -0
  12. package/dist/{src → core/src}/config/validators/validate-supported-locales.js +8 -3
  13. package/dist/core/src/server/helpers/local-messages-from-url.js +48 -0
  14. package/dist/core/src/server/intor/intor.js +49 -0
  15. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +93 -0
  16. package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +12 -29
  17. package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +8 -5
  18. package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +3 -3
  19. package/dist/{src → core/src}/server/messages/load-messages.js +21 -21
  20. package/dist/{src → core/src}/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +6 -1
  21. package/dist/core/src/server/messages/load-remote-messages/load-remote-messages.js +110 -0
  22. package/dist/{src → core/src}/server/shared/logger/get-logger.js +10 -5
  23. package/dist/core/src/server/shared/logger/global-logger-pool.js +16 -0
  24. package/dist/core/src/server/shared/messages/global-messages-pool.js +27 -0
  25. package/dist/{src → core/src}/server/translator/get-translator.js +6 -10
  26. package/dist/core/src/shared/utils/deep-merge.js +36 -0
  27. package/dist/{src/shared/utils → core/src/shared/utils/normalizers}/normalize-cache-key.js +17 -1
  28. package/dist/{src/shared/utils/pathname → core/src/shared/utils/normalizers}/normalize-pathname.js +1 -1
  29. package/dist/core/src/shared/utils/pathname/get-unprefixed-pathname.js +39 -0
  30. package/dist/{src/adapters/next/shared/utils → core/src/shared/utils/pathname}/locale-prefix-pathname.js +17 -12
  31. package/dist/core/src/shared/utils/pathname/localize-pathname.js +36 -0
  32. package/dist/{src → core/src}/shared/utils/pathname/standardize-pathname.js +8 -8
  33. package/dist/next/export/next/index.js +4 -0
  34. package/dist/{exports → next/export}/next/proxy/index.js +0 -1
  35. package/dist/next/export/next/server/index.js +2 -0
  36. package/dist/next/src/adapters/next/navigation/link.js +54 -0
  37. package/dist/next/src/adapters/next/navigation/redirect.js +37 -0
  38. package/dist/next/src/adapters/next/navigation/use-pathname.js +31 -0
  39. package/dist/next/src/adapters/next/navigation/use-router.js +68 -0
  40. package/dist/next/src/adapters/next/proxy/intor-proxy.js +44 -0
  41. package/dist/{src → next/src}/adapters/next/proxy/utils/set-locale-cookie-edge.js +2 -7
  42. package/dist/next/src/adapters/next/server/get-locale.js +25 -0
  43. package/dist/{src → next/src}/adapters/next/server/get-translator.js +4 -4
  44. package/dist/next/src/client/react/contexts/config/context.js +3 -0
  45. package/dist/next/src/client/react/contexts/locale/context.js +3 -0
  46. package/dist/next/src/client/react/contexts/messages/context.js +3 -0
  47. package/dist/next/src/client/react/contexts/translator/context.js +3 -0
  48. package/dist/next/src/client/react/contexts/translator-runtime/context.js +3 -0
  49. package/dist/next/src/client/react/navigation/use-navigation-strategy.js +32 -0
  50. package/dist/next/src/client/react/navigation/use-navigation-target.js +20 -0
  51. package/dist/next/src/client/shared/utils/build-cookie-string.js +30 -0
  52. package/dist/next/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
  53. package/dist/next/src/config/constants/cache.constants.js +7 -0
  54. package/dist/next/src/routing/locale/resolve-locale.js +32 -0
  55. package/dist/next/src/routing/pathname/resolve-pathname.js +53 -0
  56. package/dist/next/src/routing/pathname/strategies/all.js +23 -0
  57. package/dist/next/src/routing/pathname/strategies/except-default.js +33 -0
  58. package/dist/next/src/routing/pathname/strategies/none.js +14 -0
  59. package/dist/next/src/routing/resolve-navigation-target.js +28 -0
  60. package/dist/next/src/routing/resolve-routing.js +38 -0
  61. package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +93 -0
  62. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +78 -0
  63. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +88 -0
  64. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +12 -0
  65. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +21 -0
  66. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +31 -0
  67. package/dist/next/src/server/messages/load-messages.js +77 -0
  68. package/dist/next/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
  69. package/dist/next/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  70. package/dist/next/src/server/messages/load-remote-messages/load-remote-messages.js +110 -0
  71. package/dist/next/src/server/messages/shared/utils/is-valid-messages.js +36 -0
  72. package/dist/next/src/server/shared/logger/get-logger.js +39 -0
  73. package/dist/next/src/server/translator/get-translator.js +35 -0
  74. package/dist/next/src/shared/constants/prefix-placeholder.js +4 -0
  75. package/dist/next/src/shared/utils/deep-merge.js +36 -0
  76. package/dist/next/src/shared/utils/is-external-destination.js +11 -0
  77. package/dist/next/src/shared/utils/locale/get-locale-from-accept-language.js +45 -0
  78. package/dist/next/src/shared/utils/locale/get-locale-from-host.js +31 -0
  79. package/dist/next/src/shared/utils/locale/get-locale-from-pathname.js +52 -0
  80. package/dist/next/src/shared/utils/locale/get-locale-from-query.js +33 -0
  81. package/dist/next/src/shared/utils/normalizers/normalize-cache-key.js +45 -0
  82. package/dist/{src/shared/utils/locale → next/src/shared/utils/normalizers}/normalize-locale.js +21 -4
  83. package/dist/next/src/shared/utils/normalizers/normalize-pathname.js +43 -0
  84. package/dist/next/src/shared/utils/pathname/get-unprefixed-pathname.js +39 -0
  85. package/dist/next/src/shared/utils/pathname/locale-prefix-pathname.js +38 -0
  86. package/dist/next/src/shared/utils/pathname/localize-pathname.js +36 -0
  87. package/dist/next/src/shared/utils/pathname/standardize-pathname.js +30 -0
  88. package/dist/react/export/react/index.js +18 -0
  89. package/dist/react/src/client/helpers/get-client-locale.js +24 -0
  90. package/dist/{src → react/src}/client/react/contexts/config/context.js +0 -1
  91. package/dist/{src → react/src}/client/react/contexts/config/hook.js +0 -1
  92. package/dist/{src → react/src}/client/react/contexts/config/provider.js +5 -2
  93. package/dist/{src → react/src}/client/react/contexts/intor-provider/intor-provider.js +3 -3
  94. package/dist/{src → react/src}/client/react/contexts/locale/context.js +0 -1
  95. package/dist/{src → react/src}/client/react/contexts/locale/hook.js +0 -1
  96. package/dist/react/src/client/react/contexts/locale/provider.js +38 -0
  97. package/dist/react/src/client/react/contexts/locale/utils/change-locale.js +26 -0
  98. package/dist/{src → react/src}/client/react/contexts/messages/context.js +0 -1
  99. package/dist/{src → react/src}/client/react/contexts/messages/hook.js +0 -1
  100. package/dist/{src → react/src}/client/react/contexts/messages/provider.js +18 -11
  101. package/dist/react/src/client/react/contexts/messages/utils/use-refetch-messages.js +70 -0
  102. package/dist/{src → react/src}/client/react/contexts/translator/context.js +0 -1
  103. package/dist/{src → react/src}/client/react/contexts/translator/hook.js +0 -1
  104. package/dist/{src → react/src}/client/react/contexts/translator/provider.js +23 -26
  105. package/dist/react/src/client/react/contexts/translator-runtime/context.js +5 -0
  106. package/dist/react/src/client/react/contexts/translator-runtime/hook.js +9 -0
  107. package/dist/react/src/client/react/contexts/translator-runtime/provider.js +15 -0
  108. package/dist/react/src/client/react/render/create-react-renderer.js +36 -0
  109. package/dist/react/src/client/react/render/render-rich-message-react.js +22 -0
  110. package/dist/react/src/client/react/translator/create-t-rich.js +23 -0
  111. package/dist/react/src/client/react/translator/t.js +15 -0
  112. package/dist/{src/client/react/hooks → react/src/client/react/translator}/use-translator.js +7 -10
  113. package/dist/react/src/client/shared/utils/build-cookie-string.js +30 -0
  114. package/dist/react/src/client/shared/utils/locale/detect-browser-locale.js +12 -0
  115. package/dist/react/src/client/shared/utils/locale/get-locale-cookie-browser.js +16 -0
  116. package/dist/react/src/client/shared/utils/locale/set-document-locale.js +12 -0
  117. package/dist/react/src/client/shared/utils/locale/set-locale-cookie-browser.js +18 -0
  118. package/dist/react/src/config/constants/cache.constants.js +7 -0
  119. package/dist/react/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
  120. package/dist/react/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  121. package/dist/react/src/server/messages/load-remote-messages/load-remote-messages.js +110 -0
  122. package/dist/react/src/server/messages/shared/utils/is-valid-messages.js +36 -0
  123. package/dist/react/src/server/shared/logger/get-logger.js +39 -0
  124. package/dist/react/src/server/shared/logger/global-logger-pool.js +8 -0
  125. package/dist/react/src/server/shared/messages/global-messages-pool.js +10 -0
  126. package/dist/react/src/shared/utils/deep-merge.js +36 -0
  127. package/dist/react/src/shared/utils/normalizers/normalize-cache-key.js +45 -0
  128. package/dist/react/src/shared/utils/normalizers/normalize-locale.js +59 -0
  129. package/dist/types/export/config/index.d.ts +1 -0
  130. package/dist/types/export/index.d.ts +4 -0
  131. package/dist/types/export/internal/index.d.ts +1 -0
  132. package/dist/types/export/next/index.d.ts +1 -0
  133. package/dist/types/export/next/proxy/index.d.ts +1 -0
  134. package/dist/types/export/next/server/index.d.ts +1 -0
  135. package/dist/types/export/react/index.d.ts +1 -0
  136. package/dist/types/export/server/index.d.ts +1 -0
  137. package/dist/types/src/adapters/next/navigation/link.d.ts +26 -0
  138. package/dist/types/src/adapters/next/navigation/redirect.d.ts +18 -0
  139. package/dist/{src → types/src}/adapters/next/navigation/use-pathname.d.ts +5 -5
  140. package/dist/types/src/adapters/next/navigation/use-router.d.ts +25 -0
  141. package/dist/types/src/adapters/next/proxy/index.d.ts +1 -0
  142. package/dist/types/src/adapters/next/proxy/intor-proxy.d.ts +13 -0
  143. package/dist/{src → types/src}/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +2 -4
  144. package/dist/types/src/adapters/next/server/get-locale.d.ts +6 -0
  145. package/dist/{src → types/src}/adapters/next/server/get-translator.d.ts +7 -8
  146. package/dist/types/src/adapters/next/server/index.d.ts +2 -0
  147. package/dist/types/src/client/helpers/get-client-locale.d.ts +11 -0
  148. package/dist/types/src/client/helpers/index.d.ts +1 -0
  149. package/dist/types/src/client/react/contexts/config/provider.d.ts +2 -0
  150. package/dist/{src → types/src}/client/react/contexts/config/types.d.ts +6 -5
  151. package/dist/types/src/client/react/contexts/index.d.ts +6 -0
  152. package/dist/types/src/client/react/contexts/intor-provider/intor-provider.d.ts +2 -0
  153. package/dist/{src → types/src}/client/react/contexts/intor-provider/types.d.ts +1 -2
  154. package/dist/types/src/client/react/contexts/locale/utils/change-locale.d.ts +20 -0
  155. package/dist/{src → types/src}/client/react/contexts/messages/types.d.ts +4 -7
  156. package/dist/types/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +20 -0
  157. package/dist/types/src/client/react/contexts/translator/hook.d.ts +2 -0
  158. package/dist/types/src/client/react/contexts/translator/types.d.ts +11 -0
  159. package/dist/types/src/client/react/contexts/translator-runtime/context.d.ts +3 -0
  160. package/dist/types/src/client/react/contexts/translator-runtime/hook.d.ts +2 -0
  161. package/dist/types/src/client/react/contexts/translator-runtime/index.d.ts +3 -0
  162. package/dist/types/src/client/react/contexts/translator-runtime/provider.d.ts +2 -0
  163. package/dist/types/src/client/react/contexts/translator-runtime/types.d.ts +13 -0
  164. package/dist/types/src/client/react/index.d.ts +4 -0
  165. package/dist/types/src/client/react/navigation/index.d.ts +2 -0
  166. package/dist/types/src/client/react/navigation/use-navigation-strategy.d.ts +22 -0
  167. package/dist/types/src/client/react/navigation/use-navigation-target.d.ts +12 -0
  168. package/dist/types/src/client/react/render/create-react-renderer.d.ts +17 -0
  169. package/dist/types/src/client/react/render/index.d.ts +2 -0
  170. package/dist/types/src/client/react/render/render-rich-message-react.d.ts +13 -0
  171. package/dist/types/src/client/react/render/types.d.ts +17 -0
  172. package/dist/types/src/client/react/translator/create-t-rich.d.ts +15 -0
  173. package/dist/types/src/client/react/translator/index.d.ts +2 -0
  174. package/dist/types/src/client/react/translator/t.d.ts +27 -0
  175. package/dist/types/src/client/react/translator/translator-instance.d.ts +12 -0
  176. package/dist/types/src/client/react/translator/use-translator.d.ts +8 -0
  177. package/dist/types/src/client/shared/types/index.d.ts +1 -0
  178. package/dist/types/src/client/shared/types/translator-instance.d.ts +11 -0
  179. package/dist/types/src/client/shared/utils/build-cookie-string.d.ts +5 -0
  180. package/dist/types/src/client/shared/utils/index.d.ts +1 -0
  181. package/dist/types/src/client/shared/utils/locale/detect-browser-locale.d.ts +6 -0
  182. package/dist/types/src/client/shared/utils/locale/get-locale-cookie-browser.d.ts +6 -0
  183. package/dist/types/src/client/shared/utils/locale/index.d.ts +4 -0
  184. package/dist/types/src/client/shared/utils/locale/set-document-locale.d.ts +6 -0
  185. package/dist/types/src/client/shared/utils/locale/set-locale-cookie-browser.d.ts +7 -0
  186. package/dist/types/src/config/define-intor-config.d.ts +18 -0
  187. package/dist/types/src/config/index.d.ts +2 -0
  188. package/dist/types/src/config/resolvers/resolve-cookie-options.d.ts +2 -0
  189. package/dist/types/src/config/resolvers/resolve-fallback-locales.d.ts +20 -0
  190. package/dist/types/src/config/resolvers/resolve-routing-options.d.ts +2 -0
  191. package/dist/{src → types/src}/config/types/cache.types.d.ts +2 -2
  192. package/dist/types/src/config/types/cookie.types.d.ts +23 -0
  193. package/dist/{src → types/src}/config/types/intor-config.types.d.ts +2 -0
  194. package/dist/types/src/config/types/loader.types.d.ts +34 -0
  195. package/dist/types/src/config/types/logger.types.d.ts +9 -0
  196. package/dist/types/src/config/types/routing.types.d.ts +39 -0
  197. package/dist/types/src/config/types/translator.types.d.ts +7 -0
  198. package/dist/types/src/config/validators/validate-default-locale.d.ts +12 -0
  199. package/dist/types/src/config/validators/validate-supported-locales.d.ts +12 -0
  200. package/dist/types/src/routing/index.d.ts +1 -0
  201. package/dist/types/src/routing/locale/index.d.ts +1 -0
  202. package/dist/types/src/routing/locale/resolve-locale.d.ts +16 -0
  203. package/dist/types/src/routing/locale/types.d.ts +36 -0
  204. package/dist/types/src/routing/pathname/index.d.ts +1 -0
  205. package/dist/types/src/routing/pathname/resolve-pathname.d.ts +19 -0
  206. package/dist/types/src/routing/pathname/strategies/all.d.ts +6 -0
  207. package/dist/types/src/routing/pathname/strategies/except-default.d.ts +6 -0
  208. package/dist/types/src/routing/pathname/strategies/index.d.ts +3 -0
  209. package/dist/types/src/routing/pathname/strategies/none.d.ts +5 -0
  210. package/dist/types/src/routing/pathname/types.d.ts +28 -0
  211. package/dist/types/src/routing/resolve-navigation-target.d.ts +20 -0
  212. package/dist/types/src/routing/resolve-routing.d.ts +30 -0
  213. package/dist/types/src/server/helpers/index.d.ts +1 -0
  214. package/dist/types/src/server/helpers/local-messages-from-url.d.ts +21 -0
  215. package/dist/types/src/server/index.d.ts +6 -0
  216. package/dist/types/src/server/intor/index.d.ts +2 -0
  217. package/dist/types/src/server/intor/intor.d.ts +20 -0
  218. package/dist/types/src/server/intor/types.d.ts +9 -0
  219. package/dist/types/src/server/messages/index.d.ts +3 -0
  220. package/dist/types/src/server/messages/load-local-messages/index.d.ts +2 -0
  221. package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +15 -0
  222. package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +5 -14
  223. package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +1 -1
  224. package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +2 -2
  225. package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +1 -1
  226. package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +2 -2
  227. package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/types.d.ts +1 -1
  228. package/dist/types/src/server/messages/load-local-messages/types.d.ts +22 -0
  229. package/dist/types/src/server/messages/load-messages.d.ts +14 -0
  230. package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +1 -1
  231. package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +1 -0
  232. package/dist/types/src/server/messages/load-remote-messages/index.d.ts +2 -0
  233. package/dist/types/src/server/messages/load-remote-messages/load-remote-messages.d.ts +15 -0
  234. package/dist/{src → types/src}/server/messages/load-remote-messages/types.d.ts +4 -3
  235. package/dist/{src → types/src}/server/messages/types.d.ts +2 -3
  236. package/dist/{src → types/src}/server/shared/logger/get-logger.d.ts +1 -1
  237. package/dist/{src/server/messages/shared → types/src/server/shared/messages}/global-messages-pool.d.ts +8 -1
  238. package/dist/{src → types/src}/server/translator/get-translator.d.ts +8 -12
  239. package/dist/types/src/shared/constants/index.d.ts +1 -0
  240. package/dist/{src → types/src}/shared/error/intor-error.d.ts +4 -4
  241. package/dist/types/src/shared/types/generated.d.ts +53 -0
  242. package/dist/types/src/shared/types/index.d.ts +2 -0
  243. package/dist/types/src/shared/types/routing.d.ts +6 -0
  244. package/dist/types/src/shared/types/translator-instance.d.ts +27 -0
  245. package/dist/types/src/shared/utils/deep-merge.d.ts +8 -0
  246. package/dist/types/src/shared/utils/index.d.ts +4 -0
  247. package/dist/types/src/shared/utils/is-external-destination.d.ts +7 -0
  248. package/dist/types/src/shared/utils/locale/get-locale-from-accept-language.d.ts +19 -0
  249. package/dist/types/src/shared/utils/locale/get-locale-from-host.d.ts +17 -0
  250. package/dist/types/src/shared/utils/locale/get-locale-from-pathname.d.ts +31 -0
  251. package/dist/types/src/shared/utils/locale/get-locale-from-query.d.ts +20 -0
  252. package/dist/types/src/shared/utils/locale/index.d.ts +4 -0
  253. package/dist/types/src/shared/utils/normalizers/index.d.ts +3 -0
  254. package/dist/types/src/shared/utils/normalizers/normalize-cache-key.d.ts +14 -0
  255. package/dist/types/src/shared/utils/normalizers/normalize-locale.d.ts +22 -0
  256. package/dist/{src/shared/utils/pathname → types/src/shared/utils/normalizers}/normalize-pathname.d.ts +1 -1
  257. package/dist/types/src/shared/utils/pathname/get-unprefixed-pathname.d.ts +14 -0
  258. package/dist/types/src/shared/utils/pathname/index.d.ts +1 -0
  259. package/dist/types/src/shared/utils/pathname/locale-prefix-pathname.d.ts +16 -0
  260. package/dist/types/src/shared/utils/pathname/localize-pathname.d.ts +23 -0
  261. package/dist/types/src/shared/utils/pathname/standardize-pathname.d.ts +13 -0
  262. package/package.json +76 -65
  263. package/dist/exports/config/index.d.ts +0 -2
  264. package/dist/exports/config/index.js +0 -4
  265. package/dist/exports/index.d.ts +0 -5
  266. package/dist/exports/index.js +0 -11
  267. package/dist/exports/next/index.d.ts +0 -3
  268. package/dist/exports/next/index.js +0 -9
  269. package/dist/exports/next/proxy/index.d.ts +0 -2
  270. package/dist/exports/next/server/index.d.ts +0 -2
  271. package/dist/exports/next/server/index.js +0 -2
  272. package/dist/exports/react/index.d.ts +0 -2
  273. package/dist/exports/react/index.js +0 -6
  274. package/dist/exports/server/index.d.ts +0 -2
  275. package/dist/exports/server/index.js +0 -6
  276. package/dist/src/adapters/next/navigation/link.d.ts +0 -16
  277. package/dist/src/adapters/next/navigation/link.js +0 -25
  278. package/dist/src/adapters/next/navigation/redirect.d.ts +0 -16
  279. package/dist/src/adapters/next/navigation/redirect.js +0 -36
  280. package/dist/src/adapters/next/navigation/use-pathname.js +0 -49
  281. package/dist/src/adapters/next/navigation/use-router.d.ts +0 -20
  282. package/dist/src/adapters/next/navigation/use-router.js +0 -31
  283. package/dist/src/adapters/next/navigation/utils/should-full-reload.d.ts +0 -7
  284. package/dist/src/adapters/next/navigation/utils/should-full-reload.js +0 -19
  285. package/dist/src/adapters/next/navigation/utils/use-locale-switch.d.ts +0 -16
  286. package/dist/src/adapters/next/navigation/utils/use-locale-switch.js +0 -58
  287. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-all.d.ts +0 -12
  288. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-all.js +0 -60
  289. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-except-default.d.ts +0 -16
  290. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-except-default.js +0 -81
  291. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-none.d.ts +0 -10
  292. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-none.js +0 -22
  293. package/dist/src/adapters/next/proxy/index.d.ts +0 -2
  294. package/dist/src/adapters/next/proxy/intor-proxy.d.ts +0 -6
  295. package/dist/src/adapters/next/proxy/intor-proxy.js +0 -22
  296. package/dist/src/adapters/next/proxy/utils/create-response.d.ts +0 -17
  297. package/dist/src/adapters/next/proxy/utils/create-response.js +0 -42
  298. package/dist/src/adapters/next/proxy/utils/determine-initial-locale.d.ts +0 -8
  299. package/dist/src/adapters/next/proxy/utils/determine-initial-locale.js +0 -28
  300. package/dist/src/adapters/next/proxy/utils/set-pathname-header.d.ts +0 -12
  301. package/dist/src/adapters/next/proxy/utils/set-pathname-header.js +0 -13
  302. package/dist/src/adapters/next/server/get-i18n-context.d.ts +0 -9
  303. package/dist/src/adapters/next/server/get-i18n-context.js +0 -47
  304. package/dist/src/adapters/next/server/index.d.ts +0 -2
  305. package/dist/src/adapters/next/shared/constants/pathname-header-name.d.ts +0 -1
  306. package/dist/src/adapters/next/shared/constants/pathname-header-name.js +0 -4
  307. package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.d.ts +0 -16
  308. package/dist/src/adapters/next/shared/utils/localize-pathname.d.ts +0 -18
  309. package/dist/src/adapters/next/shared/utils/localize-pathname.js +0 -36
  310. package/dist/src/client/react/contexts/config/provider.d.ts +0 -2
  311. package/dist/src/client/react/contexts/intor-provider/intor-provider.d.ts +0 -2
  312. package/dist/src/client/react/contexts/locale/provider.js +0 -48
  313. package/dist/src/client/react/contexts/locale/utils/change-locale.d.ts +0 -22
  314. package/dist/src/client/react/contexts/locale/utils/change-locale.js +0 -35
  315. package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.d.ts +0 -8
  316. package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.js +0 -28
  317. package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +0 -16
  318. package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.js +0 -57
  319. package/dist/src/client/react/contexts/translate-handlers/context.d.ts +0 -2
  320. package/dist/src/client/react/contexts/translate-handlers/context.js +0 -6
  321. package/dist/src/client/react/contexts/translate-handlers/hook.d.ts +0 -2
  322. package/dist/src/client/react/contexts/translate-handlers/hook.js +0 -10
  323. package/dist/src/client/react/contexts/translate-handlers/index.d.ts +0 -3
  324. package/dist/src/client/react/contexts/translate-handlers/provider.d.ts +0 -2
  325. package/dist/src/client/react/contexts/translate-handlers/provider.js +0 -11
  326. package/dist/src/client/react/contexts/translate-handlers/types.d.ts +0 -7
  327. package/dist/src/client/react/contexts/translator/hook.d.ts +0 -3
  328. package/dist/src/client/react/contexts/translator/types.d.ts +0 -11
  329. package/dist/src/client/react/hooks/use-translator.d.ts +0 -12
  330. package/dist/src/client/react/index.d.ts +0 -4
  331. package/dist/src/client/shared/utils/get-initial-locale.d.ts +0 -11
  332. package/dist/src/client/shared/utils/get-initial-locale.js +0 -21
  333. package/dist/src/config/define-intor-config.d.ts +0 -2
  334. package/dist/src/config/index.d.ts +0 -5
  335. package/dist/src/config/resolvers/resolve-cookie-options.d.ts +0 -11
  336. package/dist/src/config/resolvers/resolve-cookie-options.js +0 -19
  337. package/dist/src/config/resolvers/resolve-fallback-locales.d.ts +0 -3
  338. package/dist/src/config/resolvers/resolve-routing-options.d.ts +0 -13
  339. package/dist/src/config/resolvers/resolve-routing-options.js +0 -28
  340. package/dist/src/config/types/cookie.types.d.ts +0 -23
  341. package/dist/src/config/types/loader.types.d.ts +0 -38
  342. package/dist/src/config/types/logger.types.d.ts +0 -7
  343. package/dist/src/config/types/routing.types.d.ts +0 -15
  344. package/dist/src/config/types/translator.types.d.ts +0 -4
  345. package/dist/src/config/validators/validate-default-locale.d.ts +0 -3
  346. package/dist/src/config/validators/validate-supported-locales.d.ts +0 -7
  347. package/dist/src/server/index.d.ts +0 -4
  348. package/dist/src/server/intor/index.d.ts +0 -2
  349. package/dist/src/server/intor/intor.d.ts +0 -14
  350. package/dist/src/server/intor/intor.js +0 -67
  351. package/dist/src/server/intor/types.d.ts +0 -14
  352. package/dist/src/server/messages/index.d.ts +0 -7
  353. package/dist/src/server/messages/load-local-messages/index.d.ts +0 -2
  354. package/dist/src/server/messages/load-local-messages/load-local-messages.d.ts +0 -11
  355. package/dist/src/server/messages/load-local-messages/load-local-messages.js +0 -85
  356. package/dist/src/server/messages/load-local-messages/types.d.ts +0 -21
  357. package/dist/src/server/messages/load-messages.d.ts +0 -11
  358. package/dist/src/server/messages/load-remote-messages/index.d.ts +0 -2
  359. package/dist/src/server/messages/load-remote-messages/load-remote-messages.d.ts +0 -9
  360. package/dist/src/server/messages/load-remote-messages/load-remote-messages.js +0 -79
  361. package/dist/src/shared/types/generated.types.d.ts +0 -30
  362. package/dist/src/shared/types/translator-instance.types.d.ts +0 -33
  363. package/dist/src/shared/utils/client/build-cookie-string.d.ts +0 -9
  364. package/dist/src/shared/utils/client/build-cookie-string.js +0 -33
  365. package/dist/src/shared/utils/client/set-locale-cookie-browser.d.ts +0 -13
  366. package/dist/src/shared/utils/client/set-locale-cookie-browser.js +0 -21
  367. package/dist/src/shared/utils/index.d.ts +0 -8
  368. package/dist/src/shared/utils/locale/normalize-locale.d.ts +0 -4
  369. package/dist/src/shared/utils/locale/resolve-preferred-locale.d.ts +0 -5
  370. package/dist/src/shared/utils/locale/resolve-preferred-locale.js +0 -26
  371. package/dist/src/shared/utils/merge-messages.d.ts +0 -6
  372. package/dist/src/shared/utils/merge-messages.js +0 -13
  373. package/dist/src/shared/utils/normalize-cache-key.d.ts +0 -3
  374. package/dist/src/shared/utils/pathname/extract-pathname.d.ts +0 -28
  375. package/dist/src/shared/utils/pathname/extract-pathname.js +0 -58
  376. package/dist/src/shared/utils/pathname/standardize-pathname.d.ts +0 -18
  377. package/dist/src/shared/utils/resolve-namespaces.d.ts +0 -10
  378. package/dist/src/shared/utils/resolve-namespaces.js +0 -33
  379. package/dist/{src → core/src}/config/constants/cache.constants.js +0 -0
  380. package/dist/{src → core/src}/config/resolvers/resolve-cache-options.js +0 -0
  381. package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +0 -0
  382. package/dist/{src → core/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +0 -0
  383. package/dist/{src → core/src}/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +0 -0
  384. package/dist/{src → core/src}/server/messages/shared/utils/is-valid-messages.js +0 -0
  385. package/dist/{src → core/src}/shared/constants/prefix-placeholder.js +0 -0
  386. package/dist/{src → core/src}/shared/error/intor-error.js +0 -0
  387. package/dist/{src → next/src}/server/shared/logger/global-logger-pool.js +0 -0
  388. package/dist/{src/server/messages/shared → next/src/server/shared/messages}/global-messages-pool.js +0 -0
  389. package/dist/{src → types/src}/adapters/next/navigation/index.d.ts +0 -0
  390. package/dist/{src → types/src}/client/react/contexts/config/context.d.ts +0 -0
  391. package/dist/{src → types/src}/client/react/contexts/config/hook.d.ts +0 -0
  392. package/dist/{src → types/src}/client/react/contexts/config/index.d.ts +0 -0
  393. package/dist/{src → types/src}/client/react/contexts/intor-provider/index.d.ts +0 -0
  394. package/dist/{src → types/src}/client/react/contexts/locale/context.d.ts +0 -0
  395. package/dist/{src → types/src}/client/react/contexts/locale/hook.d.ts +0 -0
  396. package/dist/{src → types/src}/client/react/contexts/locale/index.d.ts +0 -0
  397. package/dist/{src → types/src}/client/react/contexts/locale/provider.d.ts +0 -0
  398. package/dist/{src → types/src}/client/react/contexts/locale/types.d.ts +4 -4
  399. /package/dist/{src → types/src}/client/react/contexts/messages/context.d.ts +0 -0
  400. /package/dist/{src → types/src}/client/react/contexts/messages/hook.d.ts +0 -0
  401. /package/dist/{src → types/src}/client/react/contexts/messages/index.d.ts +0 -0
  402. /package/dist/{src → types/src}/client/react/contexts/messages/provider.d.ts +0 -0
  403. /package/dist/{src → types/src}/client/react/contexts/translator/context.d.ts +0 -0
  404. /package/dist/{src → types/src}/client/react/contexts/translator/index.d.ts +0 -0
  405. /package/dist/{src → types/src}/client/react/contexts/translator/provider.d.ts +0 -0
  406. /package/dist/{src → types/src}/config/constants/cache.constants.d.ts +0 -0
  407. /package/dist/{src → types/src}/config/constants/cookie.constants.d.ts +0 -0
  408. /package/dist/{src → types/src}/config/constants/routing.constants.d.ts +0 -0
  409. /package/dist/{src → types/src}/config/resolvers/resolve-cache-options.d.ts +0 -0
  410. /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/collect-file-entries/index.d.ts +0 -0
  411. /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/index.d.ts +0 -0
  412. /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/index.d.ts +0 -0
  413. /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +0 -0
  414. /package/dist/{src → types/src}/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +0 -0
  415. /package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/index.d.ts +0 -0
  416. /package/dist/{src → types/src}/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +0 -0
  417. /package/dist/{src → types/src}/server/messages/shared/types.d.ts +0 -0
  418. /package/dist/{src → types/src}/server/messages/shared/utils/is-valid-messages.d.ts +0 -0
  419. /package/dist/{src → types/src}/server/shared/logger/global-logger-pool.d.ts +0 -0
  420. /package/dist/{src → types/src}/server/translator/index.d.ts +0 -0
  421. /package/dist/{src → types/src}/shared/constants/prefix-placeholder.d.ts +0 -0
  422. /package/dist/{src → types/src}/shared/error/index.d.ts +0 -0
package/README.md CHANGED
@@ -21,3 +21,82 @@ Fast to start, easy to extend, and free from the usual i18n heaviness.
21
21
  #### 🍳 Cooking the Intor v2 docs, crafting them to perfection...
22
22
 
23
23
  </div>
24
+
25
+ ---
26
+
27
+ Intor separates language translation from semantic rendering.
28
+ ICU operates at the text-translation layer, while semantic tags
29
+ are parsed and rendered in a dedicated AST-based rendering phase.
30
+
31
+ ```
32
+ ┌──────────────────────────────────────────────┐
33
+ │ Application │
34
+ │ │
35
+ │ t() / tRich() / <T /> │
36
+ └───────────────────────────┬──────────────────┘
37
+
38
+
39
+ ┌──────────────────────────────────────────────┐
40
+ │ Translator (Language / Semantic) │
41
+ │ intor-translator │
42
+ │ │
43
+ │ Responsibilities: │
44
+ │ - Resolve message key │
45
+ │ - Locale resolution & fallback │
46
+ │ - Message loading │
47
+ │ - Text-level interpolation │
48
+ │ • {name}, {count} │
49
+ │ • plural / select │
50
+ │ • ICU MessageFormat (optional) │
51
+ │ (ignoreTag: true) │
52
+ │ │
53
+ │ Output: │
54
+ │ - Translated string │
55
+ │ - May still contain <semantic tags> │
56
+ └───────────────────────────┬──────────────────┘
57
+
58
+
59
+ ┌──────────────────────────────────────────────┐
60
+ │ Semantic Parsing & AST Construction │
61
+ │ │
62
+ │ Responsibilities: │
63
+ │ - Tokenize semantic tags │
64
+ │ • <b>, <link>, <Component> │
65
+ │ - Build semantic AST │
66
+ │ • TextNode │
67
+ │ • TagNode │
68
+ │ │
69
+ │ Note: │
70
+ │ - Independent from ICU / formatter │
71
+ │ - Pure semantic structure │
72
+ └───────────────────────────┬──────────────────┘
73
+
74
+
75
+ ┌──────────────────────────────────────────────┐
76
+ │ Semantic Rendering (Renderer) │
77
+ │ │
78
+ │ Responsibilities: │
79
+ │ - Traverse semantic AST │
80
+ │ - Render TextNode │
81
+ │ - Render TagNode │
82
+ │ │
83
+ │ Renderer decides output type: │
84
+ │ - string │
85
+ │ - ReactNode │
86
+ │ - Vue / Svelte nodes │
87
+ │ - Markdown / CLI output │
88
+ │ │
89
+ │ Optional extensions: │
90
+ │ - Custom tag renderers │
91
+ │ - Rich components │
92
+ └───────────────────────────┬──────────────────┘
93
+
94
+
95
+ ┌──────────────────────────────────────────────┐
96
+ │ Final Output │
97
+ │ │
98
+ │ - Rendered rich content │
99
+ │ - Framework-specific result │
100
+ │ │
101
+ └──────────────────────────────────────────────┘
102
+ ```
@@ -0,0 +1 @@
1
+ export { defineIntorConfig } from '../../src/config/define-intor-config.js';
@@ -0,0 +1,4 @@
1
+ export { PREFIX_PLACEHOLDER } from '../src/shared/constants/prefix-placeholder.js';
2
+ export { localizePathname } from '../src/shared/utils/pathname/localize-pathname.js';
3
+ export { IntorError, IntorErrorCode } from '../src/shared/error/intor-error.js';
4
+ import 'intor-translator';
@@ -0,0 +1,7 @@
1
+ export { intor } from '../../src/server/intor/intor.js';
2
+ export { loadMessages } from '../../src/server/messages/load-messages.js';
3
+ export { isValidMessages } from '../../src/server/messages/shared/utils/is-valid-messages.js';
4
+ export { getTranslator } from '../../src/server/translator/get-translator.js';
5
+ export { clearLoggerPool } from '../../src/server/shared/logger/global-logger-pool.js';
6
+ export { clearMessagesPool, setGlobalMessagesPool } from '../../src/server/shared/messages/global-messages-pool.js';
7
+ export { loadLocalMessagesFromUrl } from '../../src/server/helpers/local-messages-from-url.js';
@@ -1,8 +1,8 @@
1
1
  // Default cookie options
2
2
  const DEFAULT_COOKIE_OPTIONS = {
3
3
  enabled: true,
4
- autoSetCookie: true,
5
- name: "intor.i18n.locale",
4
+ persist: true,
5
+ name: "intor.locale",
6
6
  domain: null,
7
7
  path: "/",
8
8
  maxAge: 60 * 60 * 24 * 365, // 365 days
@@ -1,11 +1,17 @@
1
1
  // Default routing options
2
2
  const DEFAULT_ROUTING_OPTIONS = {
3
+ locale: {
4
+ sources: ["path", "query", "cookie", "detected"],
5
+ queryKey: "locale",
6
+ },
3
7
  prefix: "none",
4
8
  firstVisit: {
5
9
  localeSource: "browser",
6
10
  redirect: true,
11
+ persist: true,
7
12
  },
8
13
  basePath: "/",
14
+ forceFullReload: false,
9
15
  };
10
16
 
11
17
  export { DEFAULT_ROUTING_OPTIONS };
@@ -5,10 +5,24 @@ import { resolveRoutingOptions } from './resolvers/resolve-routing-options.js';
5
5
  import { validateDefaultLocale } from './validators/validate-default-locale.js';
6
6
  import { validateSupportedLocales } from './validators/validate-supported-locales.js';
7
7
 
8
+ /**
9
+ * Defines and resolves an Intor configuration.
10
+ *
11
+ * This is the canonical entry point for transforming a raw configuration
12
+ * into a fully validated and resolved Intor config.
13
+ *
14
+ * Responsibilities:
15
+ * - Validate required invariants
16
+ * - Resolve and normalize derived options
17
+ * - Apply stable defaults
18
+ *
19
+ * This function is purely declarative and side-effect free.
20
+ * It does not create runtime instances or attach dynamic behavior.
21
+ *
22
+ * Intended to run once during application initialization.
23
+ */
8
24
  const defineIntorConfig = (config) => {
9
- // Generate a random id if config.id is not defined
10
- const id = config.id || `ID${Math.random().toString(36).slice(2, 6)}`;
11
- // Validaters
25
+ // Validators
12
26
  const supportedLocales = validateSupportedLocales(config);
13
27
  const defaultLocale = validateDefaultLocale(config, supportedLocales);
14
28
  // Resolvers
@@ -17,7 +31,7 @@ const defineIntorConfig = (config) => {
17
31
  const routing = resolveRoutingOptions(config.routing);
18
32
  const cache = resolveCacheOptions(config.cache);
19
33
  return {
20
- id,
34
+ id: config.id ?? "default",
21
35
  messages: config.messages,
22
36
  loader: config.loader,
23
37
  defaultLocale,
@@ -0,0 +1,10 @@
1
+ import { DEFAULT_COOKIE_OPTIONS } from '../constants/cookie.constants.js';
2
+
3
+ const resolveCookieOptions = (cookie = {}) => {
4
+ return {
5
+ ...DEFAULT_COOKIE_OPTIONS,
6
+ ...cookie,
7
+ };
8
+ };
9
+
10
+ export { resolveCookieOptions };
@@ -1,3 +1,20 @@
1
+ /**
2
+ * Resolves and normalizes fallback locale mappings.
3
+ *
4
+ * This utility validates the user-defined `fallbackLocales` configuration
5
+ * against the provided `supportedLocales` list and the configured `defaultLocale`.
6
+ *
7
+ * Resolution rules:
8
+ * - Only locales listed in `supportedLocales` are considered valid fallbacks.
9
+ * - The literal value `"default"` is always allowed and represents the configured default locale.
10
+ * - Fallback entries matching `defaultLocale` are treated as valid.
11
+ * - Invalid fallback locales are ignored and reported via warnings.
12
+ *
13
+ * Notes:
14
+ * - This function is purely defensive and does not throw on invalid input.
15
+ * - Only validated fallback mappings are included in the returned result.
16
+ * - Logging is used for diagnostics only and does not affect the output.
17
+ */
1
18
  const resolveFallbackLocales = (config, supportedLocales) => {
2
19
  const { defaultLocale, fallbackLocales } = config;
3
20
  if (!fallbackLocales || typeof fallbackLocales !== "object") {
@@ -0,0 +1,20 @@
1
+ import { DEFAULT_ROUTING_OPTIONS } from '../constants/routing.constants.js';
2
+ import { normalizePathname } from '../../shared/utils/normalizers/normalize-pathname.js';
3
+
4
+ const resolveRoutingOptions = (routing = {}) => {
5
+ return {
6
+ ...DEFAULT_ROUTING_OPTIONS,
7
+ ...routing,
8
+ locale: {
9
+ ...DEFAULT_ROUTING_OPTIONS.locale,
10
+ ...routing.locale,
11
+ },
12
+ firstVisit: {
13
+ ...DEFAULT_ROUTING_OPTIONS.firstVisit,
14
+ ...routing.firstVisit,
15
+ },
16
+ basePath: normalizePathname(routing?.basePath || ""),
17
+ };
18
+ };
19
+
20
+ export { resolveRoutingOptions };
@@ -1,5 +1,14 @@
1
1
  import { IntorError, IntorErrorCode } from '../../shared/error/intor-error.js';
2
2
 
3
+ /**
4
+ * Validates the configured default locale.
5
+ *
6
+ * - Ensures that `defaultLocale` is explicitly defined.
7
+ * - Ensures that `defaultLocale` is included in `supportedLocales`.
8
+ *
9
+ * This validation is part of the configuration initialization phase
10
+ * and is expected to fail fast when misconfigured.
11
+ */
3
12
  const validateDefaultLocale = (config, supportedLocales) => {
4
13
  const { id, defaultLocale } = config;
5
14
  // Throw error if defaultLocale is undefined
@@ -1,9 +1,14 @@
1
1
  import { IntorError, IntorErrorCode } from '../../shared/error/intor-error.js';
2
2
 
3
3
  /**
4
- * Validate and resolve supported locales.
5
- * Throws error if loader is used without supportedLocales.
6
- * Falls back to message keys if supportedLocales is undefined.
4
+ * Validates and resolves the list of supported locales.
5
+ *
6
+ * - Ensures `supportedLocales` is explicitly provided when a loader is used.
7
+ * - Falls back to inferring locales from static message keys when no loader
8
+ * is configured.
9
+ *
10
+ * This validation runs during configuration initialization and is expected
11
+ * to fail fast when required inputs are missing.
7
12
  */
8
13
  const validateSupportedLocales = (config) => {
9
14
  const { id, loader, supportedLocales } = config;
@@ -0,0 +1,48 @@
1
+ import { loadLocalMessages } from '../messages/load-local-messages/load-local-messages.js';
2
+
3
+ /** Parse a multi-value query parameter into a normalized string array. */
4
+ function parseMultiValueParam(values) {
5
+ if (!values || values.length === 0)
6
+ return undefined;
7
+ const result = values.flatMap((value) => value
8
+ .split(",")
9
+ .map((v) => v.trim())
10
+ .filter(Boolean));
11
+ return result.length > 0 ? result : undefined;
12
+ }
13
+ /**
14
+ * Load local locale messages from a URL-based query protocol.
15
+ *
16
+ * - A convenience helper for exposing local messages through a URL-accessible interface.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const url = new URL(
21
+ * "https://example.com/messages" +
22
+ * "?locale=en-US" +
23
+ * "&rootDir=./messages" +
24
+ * "&namespaces=common" +
25
+ * "&namespaces=homepage" +
26
+ * "&fallbackLocales=zh-TW"
27
+ * );
28
+ *
29
+ * const messages = await loadLocalMessagesFromUrl(url);
30
+ * ```
31
+ */
32
+ async function loadLocalMessagesFromUrl(url, extraOptions) {
33
+ // Parse query parameters
34
+ const rootDir = url.searchParams.get("rootDir") ?? "";
35
+ const locale = url.searchParams.get("locale") ?? "en-US";
36
+ const namespaces = parseMultiValueParam(url.searchParams.getAll("namespaces"));
37
+ const fallbackLocales = parseMultiValueParam(url.searchParams.getAll("fallbackLocales"));
38
+ // Load local messages
39
+ return loadLocalMessages({
40
+ rootDir,
41
+ locale,
42
+ namespaces,
43
+ fallbackLocales,
44
+ extraOptions,
45
+ });
46
+ }
47
+
48
+ export { loadLocalMessagesFromUrl };
@@ -0,0 +1,49 @@
1
+ import { loadMessages } from '../messages/load-messages.js';
2
+ import { getLogger } from '../shared/logger/get-logger.js';
3
+ import { deepMerge } from '../../shared/utils/deep-merge.js';
4
+
5
+ /**
6
+ * Entry point for initializing Intor.
7
+ *
8
+ * This function orchestrates the initialization flow:
9
+ *
10
+ * - Resolves the initial locale using a provided locale resolver
11
+ * - Loads locale messages if the message loader is enabled
12
+ * - Returns a fully-initialized Intor result
13
+ *
14
+ * This function does not perform routing decisions itself.
15
+ * Locale resolution is delegated to the provided `getLocale` implementation.
16
+ */
17
+ const intor = async (config, getLocale, loadMessagesOptions = {}) => {
18
+ const baseLogger = getLogger({ id: config.id, ...config.logger });
19
+ const logger = baseLogger.child({ scope: "intor" });
20
+ logger.info("Start Intor initialization.");
21
+ // Resolve initial locale
22
+ const isLocaleFunction = typeof getLocale === "function";
23
+ const locale = isLocaleFunction
24
+ ? await getLocale(config)
25
+ : getLocale || config.defaultLocale;
26
+ const source = typeof getLocale === "function" ? "resolver" : "static";
27
+ logger.debug(`Initial locale resolved as "${locale}" via "${source}".`);
28
+ // Load messages (if enabled)
29
+ let loadedMessages;
30
+ if (config.loader) {
31
+ loadedMessages = await loadMessages({
32
+ config,
33
+ locale,
34
+ extraOptions: {
35
+ exts: loadMessagesOptions.exts,
36
+ messagesReader: loadMessagesOptions.messagesReader,
37
+ },
38
+ allowCacheWrite: true,
39
+ });
40
+ }
41
+ logger.info("Intor initialized.");
42
+ return {
43
+ config,
44
+ initialLocale: locale,
45
+ messages: deepMerge(config.messages, loadedMessages) || {},
46
+ };
47
+ };
48
+
49
+ export { intor };
@@ -0,0 +1,93 @@
1
+ import path from 'node:path';
2
+ import pLimit from 'p-limit';
3
+ import { DEFAULT_CACHE_OPTIONS } from '../../../config/constants/cache.constants.js';
4
+ import { readLocaleMessages } from './read-locale-messages/read-locale-messages.js';
5
+ import { getLogger } from '../../shared/logger/get-logger.js';
6
+ import { getGlobalMessagesPool } from '../../shared/messages/global-messages-pool.js';
7
+ import { normalizeCacheKey } from '../../../shared/utils/normalizers/normalize-cache-key.js';
8
+
9
+ /**
10
+ * Load locale messages from the local file system.
11
+ *
12
+ * This function acts as the orchestration layer for local message loading.
13
+ * It is responsible for:
14
+ *
15
+ * - Resolving fallback locales in order
16
+ * - Coordinating cache read / write behavior
17
+ * - Limiting concurrent file reads for performance
18
+ *
19
+ * File system traversal, parsing, and message validation are delegated to lower-level utilities.
20
+ */
21
+ const loadLocalMessages = async ({ pool = getGlobalMessagesPool(), rootDir = "messages", locale, fallbackLocales, namespaces, extraOptions: { concurrency = 10, cacheOptions = DEFAULT_CACHE_OPTIONS, loggerOptions = { id: "default" }, exts, messagesReader, } = {}, allowCacheWrite = false, }) => {
22
+ const baseLogger = getLogger({ ...loggerOptions });
23
+ const logger = baseLogger.child({ scope: "load-local-messages" });
24
+ const start = performance.now();
25
+ logger.debug("Loading local messages.", {
26
+ rootDir,
27
+ resolvedRootDir: path.resolve(process.cwd(), rootDir),
28
+ });
29
+ // --- Cache key
30
+ const cacheKey = normalizeCacheKey([
31
+ loggerOptions.id,
32
+ "loaderType:local",
33
+ rootDir,
34
+ locale,
35
+ (fallbackLocales || []).toSorted().join(","),
36
+ (namespaces || []).toSorted().join(","),
37
+ ]);
38
+ // --- Cache read --------------------------------------------------
39
+ if (cacheOptions.enabled && cacheKey) {
40
+ const cached = await pool?.get(cacheKey);
41
+ if (cached) {
42
+ logger.debug("Messages cache hit.", { key: cacheKey });
43
+ return cached;
44
+ }
45
+ }
46
+ const limit = pLimit(concurrency);
47
+ const candidateLocales = [locale, ...(fallbackLocales || [])];
48
+ let messages;
49
+ // Try each candidate locale in order and stop at the first successful result
50
+ for (let i = 0; i < candidateLocales.length; i++) {
51
+ const candidateLocale = candidateLocales[i];
52
+ const isLast = i === candidateLocales.length - 1;
53
+ try {
54
+ const readed = await readLocaleMessages({
55
+ limit,
56
+ rootDir,
57
+ locale: candidateLocale,
58
+ namespaces,
59
+ extraOptions: { loggerOptions, exts, messagesReader },
60
+ });
61
+ // Stop at the first locale that yields non-empty messages
62
+ if (Object.values(readed[candidateLocale] || {}).length > 0) {
63
+ messages = readed;
64
+ break;
65
+ }
66
+ }
67
+ catch {
68
+ if (isLast) {
69
+ logger.warn("Failed to load messages for all candidate locales.", {
70
+ locale,
71
+ fallbackLocales,
72
+ });
73
+ }
74
+ else {
75
+ logger.warn(`Failed to load locale messages for "${candidateLocale}", trying next fallback.`);
76
+ }
77
+ }
78
+ }
79
+ // --- Cache write --------------------------------------------------
80
+ if (allowCacheWrite && cacheOptions.enabled && cacheKey && messages) {
81
+ await pool?.set(cacheKey, messages, cacheOptions.ttl);
82
+ }
83
+ // Final success log with resolved locale and timing
84
+ if (messages) {
85
+ logger.trace("Finished loading local messages.", {
86
+ loadedLocale: Object.keys(messages)[0],
87
+ duration: `${Math.round(performance.now() - start)} ms`,
88
+ });
89
+ }
90
+ return messages;
91
+ };
92
+
93
+ export { loadLocalMessages };
@@ -10,36 +10,29 @@ import { getLogger } from '../../../../shared/logger/get-logger.js';
10
10
  *
11
11
  * @example
12
12
  * ```ts
13
- * [
14
- * {
15
- * namespace: "index", // "index" = messages under locale root (no namespace)
16
- * fullPath: "/Users/john/my-app/messages/en-US/index.json",
17
- * relativePath: "index.json",
18
- * segments: ["index"],
19
- * basename: "index",
20
- * },
21
- * {
22
- * namespace: "auth",
13
+ * [{
14
+ * namespace: "auth", // If messages under locale root (no namespace) -> "index"
23
15
  * fullPath: "/Users/john/my-app/messages/en-US/auth/login.json",
24
16
  * relativePath: "auth/login.json",
25
17
  * segments: ["auth", "login"],
26
18
  * basename: "login",
27
- * },
28
- * ];
19
+ * }, ... ];
29
20
  * ```
30
21
  */
31
22
  async function collectFileEntries({ readdir = fs.readdir, limit, rootDir, namespaces, extraOptions: { exts = [".json"], loggerOptions } = {}, }) {
32
23
  const baseLogger = getLogger({ ...loggerOptions });
33
24
  const logger = baseLogger.child({ scope: "collect-file-entries" });
34
- const results = [];
25
+ const fileEntries = [];
35
26
  const walk = async (currentDir) => {
36
27
  // Read current directory entries
37
28
  let entries = [];
38
29
  try {
39
30
  entries = await readdir(currentDir, { withFileTypes: true });
40
31
  }
41
- catch (error) {
42
- logger.error(`Error reading directory: ${currentDir}`, { error });
32
+ catch {
33
+ logger.debug("Locale directory not found, skipping locale.", {
34
+ localeDir: currentDir,
35
+ });
43
36
  return;
44
37
  }
45
38
  // Process each directory entry and collect valid files
@@ -65,7 +58,7 @@ async function collectFileEntries({ readdir = fs.readdir, limit, rootDir, namesp
65
58
  if (!namespaces.includes(namespace))
66
59
  return;
67
60
  }
68
- results.push({
61
+ fileEntries.push({
69
62
  namespace,
70
63
  fullPath,
71
64
  relativePath,
@@ -76,20 +69,10 @@ async function collectFileEntries({ readdir = fs.readdir, limit, rootDir, namesp
76
69
  await Promise.all(tasks);
77
70
  };
78
71
  await walk(rootDir);
79
- // Logs
80
- if (logger.core.level === "debug") {
81
- logger.debug("Local message files collected.", {
82
- count: results.length,
83
- });
72
+ if (fileEntries.length > 0) {
73
+ logger.trace(`Collected ${fileEntries.length} local message files for locale "${path.basename(rootDir)}".`);
84
74
  }
85
- logger.trace("Local message files collected.", {
86
- count: results.length,
87
- fileEntries: results.map(({ namespace, relativePath }) => ({
88
- namespace: namespace === "index" ? null : namespace,
89
- relativePath,
90
- })),
91
- });
92
- return results;
75
+ return fileEntries;
93
76
  }
94
77
 
95
78
  export { collectFileEntries };
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path';
2
- import merge from 'lodash.merge';
3
2
  import { isValidMessages } from '../../../shared/utils/is-valid-messages.js';
4
3
  import { getLogger } from '../../../../shared/logger/get-logger.js';
4
+ import { deepMerge } from '../../../../../shared/utils/deep-merge.js';
5
5
  import { jsonReader } from './utils/json-reader.js';
6
6
  import { nestObjectFromPath } from './utils/nest-object-from-path.js';
7
7
 
@@ -41,7 +41,7 @@ async function parseFileEntries({ fileEntries, limit, extraOptions: { messagesRe
41
41
  const logger = baseLogger.child({ scope: "parse-file-entries" });
42
42
  // Read and parse all file entries
43
43
  const parsedFileEntries = [];
44
- const tasks = fileEntries.map(({ namespace, segments, basename, fullPath }) => limit(async () => {
44
+ const tasks = fileEntries.map(({ namespace, segments, basename, fullPath, relativePath }) => limit(async () => {
45
45
  try {
46
46
  const segsWithoutNs = segments.slice(1);
47
47
  const ext = path.extname(fullPath);
@@ -58,7 +58,7 @@ async function parseFileEntries({ fileEntries, limit, extraOptions: { messagesRe
58
58
  // Nest the parsed content based on the path segments
59
59
  const nested = nestObjectFromPath(keyPath, json);
60
60
  parsedFileEntries.push({ namespace, messages: nested });
61
- logger.trace("Parsed file.", { path: fullPath });
61
+ logger.trace(`Parsed message file: ${relativePath}`);
62
62
  }
63
63
  catch (error) {
64
64
  logger.error("Failed to read or parse file.", {
@@ -73,10 +73,13 @@ async function parseFileEntries({ fileEntries, limit, extraOptions: { messagesRe
73
73
  for (const { namespace, messages } of parsedFileEntries) {
74
74
  // Handle root-level namespace (i.e., [rootDir]/index.json)
75
75
  if (namespace === "index") {
76
- merge(result, messages);
76
+ const merged = deepMerge(result, messages);
77
+ if (merged)
78
+ Object.assign(result, merged);
77
79
  }
78
80
  else {
79
- result[namespace] = merge(result[namespace] ?? {}, messages);
81
+ result[namespace] =
82
+ deepMerge(result[namespace] ?? {}, messages) || {};
80
83
  }
81
84
  }
82
85
  return result;
@@ -18,13 +18,13 @@ const readLocaleMessages = async ({ limit, rootDir = "messages", locale, namespa
18
18
  extraOptions: { exts, loggerOptions },
19
19
  });
20
20
  // 2. Parse file entries
21
- const namespaceMessages = await parseFileEntries({
21
+ const messages = await parseFileEntries({
22
22
  fileEntries,
23
23
  limit,
24
24
  extraOptions: { messagesReader, loggerOptions },
25
25
  });
26
- // 3. Wrap the parsed namespace messages under the locale key
27
- const localeMessages = { [locale]: namespaceMessages };
26
+ // 3. Wrap the parsed messages under the locale key
27
+ const localeMessages = { [locale]: messages };
28
28
  return localeMessages;
29
29
  };
30
30