intor 2.3.8 → 2.3.10

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 (332) hide show
  1. package/README.md +0 -85
  2. package/dist/core/export/index.js +7 -2
  3. package/dist/core/export/server/index.js +3 -1
  4. package/dist/core/src/config/constants/cookie.js +1 -1
  5. package/dist/core/src/config/constants/routing.js +7 -2
  6. package/dist/core/src/config/resolvers/resolve-routing-options.js +20 -0
  7. package/dist/core/src/core/error/intor-error.js +3 -1
  8. package/dist/core/src/core/messages/load-remote-messages/load-remote-messages.js +24 -14
  9. package/dist/core/src/core/messages/merge-messages.js +33 -0
  10. package/dist/core/src/core/utils/deep-merge.js +35 -19
  11. package/dist/core/src/core/utils/resolve-loader-options.js +9 -0
  12. package/dist/core/src/{core/utils → routing}/pathname/get-unprefixed-pathname.js +4 -1
  13. package/dist/{react/src/core/utils → core/src/routing}/pathname/locale-prefix-pathname.js +6 -4
  14. package/dist/{react/src/core/utils → core/src/routing}/pathname/localize-pathname.js +2 -2
  15. package/dist/core/src/{core/utils → routing}/pathname/standardize-pathname.js +5 -2
  16. package/dist/core/src/server/helpers/get-translator.js +27 -0
  17. package/dist/core/src/server/helpers/local-messages-from-url.js +2 -2
  18. package/dist/core/src/server/intor/intor.js +18 -35
  19. package/dist/core/src/server/messages/load-local-messages/load-local-messages.js +33 -20
  20. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +17 -9
  21. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +31 -24
  22. package/dist/core/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +21 -10
  23. package/dist/core/src/server/messages/load-messages.js +24 -26
  24. package/dist/core/src/server/runtime/create-intor-runtime.js +52 -0
  25. package/dist/core/src/server/translator/create-translator.js +40 -0
  26. package/dist/express/export/express/index.js +2 -0
  27. package/dist/express/src/adapters/express/helpers/get-translator.js +23 -0
  28. package/dist/express/src/adapters/express/middleware/create-intor.js +60 -0
  29. package/dist/express/src/core/constants/headers.js +7 -0
  30. package/dist/express/src/core/constants/prefix-placeholder.js +4 -0
  31. package/dist/express/src/core/error/intor-error.js +23 -0
  32. package/dist/express/src/core/logger/get-logger.js +39 -0
  33. package/dist/express/src/core/logger/global-logger-pool.js +8 -0
  34. package/dist/express/src/core/messages/global-messages-pool.js +10 -0
  35. package/dist/express/src/core/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +55 -0
  36. package/dist/express/src/core/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  37. package/dist/express/src/core/messages/load-remote-messages/load-remote-messages.js +118 -0
  38. package/dist/express/src/core/messages/merge-messages.js +33 -0
  39. package/dist/express/src/core/messages/utils/is-valid-messages.js +36 -0
  40. package/dist/express/src/core/utils/deep-merge.js +47 -0
  41. package/dist/express/src/core/utils/normalizers/normalize-cache-key.js +45 -0
  42. package/dist/express/src/core/utils/normalizers/normalize-locale.js +59 -0
  43. package/dist/express/src/core/utils/normalizers/normalize-pathname.js +43 -0
  44. package/dist/express/src/core/utils/normalizers/normalize-query.js +25 -0
  45. package/dist/express/src/core/utils/resolve-loader-options.js +25 -0
  46. package/dist/express/src/routing/inbound/resolve-inbound.js +46 -0
  47. package/dist/{next/src/routing/pathname → express/src/routing/inbound/resolve-pathname}/resolve-pathname.js +5 -9
  48. package/dist/{next/src/core/utils → express/src/routing}/locale/get-locale-from-accept-language.js +4 -1
  49. package/dist/{next/src/core/utils → express/src/routing}/locale/get-locale-from-host.js +4 -1
  50. package/dist/{next/src/core/utils → express/src/routing}/locale/get-locale-from-pathname.js +4 -1
  51. package/dist/{next/src/core/utils → express/src/routing}/locale/get-locale-from-query.js +5 -2
  52. package/dist/{next/src/core/utils → express/src/routing}/pathname/get-unprefixed-pathname.js +4 -1
  53. package/dist/{core/src/core/utils → express/src/routing}/pathname/locale-prefix-pathname.js +6 -4
  54. package/dist/{next/src/core/utils → express/src/routing}/pathname/localize-pathname.js +2 -2
  55. package/dist/{next/src/core/utils → express/src/routing}/pathname/standardize-pathname.js +5 -2
  56. package/dist/express/src/server/helpers/get-translator.js +27 -0
  57. package/dist/express/src/server/messages/load-local-messages/load-local-messages.js +106 -0
  58. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +88 -0
  59. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +94 -0
  60. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +12 -0
  61. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +21 -0
  62. package/dist/express/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +42 -0
  63. package/dist/express/src/server/messages/load-messages.js +81 -0
  64. package/dist/express/src/server/runtime/create-intor-runtime.js +52 -0
  65. package/dist/express/src/server/translator/create-translator.js +40 -0
  66. package/dist/next/export/next/proxy/index.js +1 -1
  67. package/dist/next/export/next/server/index.js +2 -0
  68. package/dist/next/src/adapters/next/navigation/link.js +19 -22
  69. package/dist/next/src/adapters/next/navigation/redirect.js +12 -17
  70. package/dist/next/src/adapters/next/navigation/use-pathname.js +8 -15
  71. package/dist/next/src/adapters/next/navigation/use-router.js +34 -32
  72. package/dist/next/src/adapters/next/proxy/intor-proxy.js +16 -20
  73. package/dist/next/src/adapters/next/server/get-locale.js +7 -16
  74. package/dist/next/src/adapters/next/server/get-pathname.js +28 -0
  75. package/dist/next/src/adapters/next/server/get-translator.js +9 -10
  76. package/dist/next/src/adapters/next/server/intor.js +25 -0
  77. package/dist/next/src/core/constants/headers.js +7 -0
  78. package/dist/next/src/core/error/intor-error.js +16 -2
  79. package/dist/next/src/core/messages/load-remote-messages/load-remote-messages.js +24 -14
  80. package/dist/next/src/core/messages/merge-messages.js +33 -0
  81. package/dist/next/src/core/utils/deep-merge.js +35 -19
  82. package/dist/next/src/core/utils/normalizers/normalize-query.js +25 -0
  83. package/dist/next/src/core/utils/resolve-loader-options.js +9 -0
  84. package/dist/next/src/policies/shoud-full-reload.js +14 -0
  85. package/dist/next/src/routing/inbound/resolve-inbound.js +46 -0
  86. package/dist/next/src/routing/inbound/resolve-locale/resolve-locale.js +32 -0
  87. package/dist/next/src/routing/inbound/resolve-pathname/resolve-pathname.js +52 -0
  88. package/dist/next/src/routing/inbound/resolve-pathname/strategies/all.js +23 -0
  89. package/dist/next/src/routing/inbound/resolve-pathname/strategies/except-default.js +33 -0
  90. package/dist/next/src/routing/inbound/resolve-pathname/strategies/none.js +14 -0
  91. package/dist/next/src/routing/locale/get-locale-from-accept-language.js +48 -0
  92. package/dist/next/src/routing/locale/get-locale-from-host.js +34 -0
  93. package/dist/next/src/routing/locale/get-locale-from-pathname.js +55 -0
  94. package/dist/next/src/routing/locale/get-locale-from-query.js +36 -0
  95. package/dist/next/src/routing/navigation/decide-strategy.js +17 -0
  96. package/dist/next/src/routing/navigation/derive-target.js +55 -0
  97. package/dist/next/src/routing/navigation/resolve-navigation.js +26 -0
  98. package/dist/next/src/routing/navigation/utils/derive-host-destination.js +13 -0
  99. package/dist/next/src/routing/navigation/utils/derive-query-destination.js +11 -0
  100. package/dist/{react/src/core/utils → next/src/routing}/pathname/get-unprefixed-pathname.js +4 -1
  101. package/dist/next/src/{core/utils → routing}/pathname/locale-prefix-pathname.js +6 -4
  102. package/dist/{core/src/core/utils → next/src/routing}/pathname/localize-pathname.js +2 -2
  103. package/dist/{react/src/core/utils → next/src/routing}/pathname/standardize-pathname.js +5 -2
  104. package/dist/next/src/server/helpers/get-translator.js +27 -0
  105. package/dist/next/src/server/intor/intor.js +36 -0
  106. package/dist/next/src/server/messages/load-local-messages/load-local-messages.js +33 -20
  107. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +17 -9
  108. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +31 -24
  109. package/dist/next/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +21 -10
  110. package/dist/next/src/server/messages/load-messages.js +24 -26
  111. package/dist/next/src/server/runtime/create-intor-runtime.js +52 -0
  112. package/dist/next/src/server/translator/create-translator.js +40 -0
  113. package/dist/react/export/react/index.js +4 -4
  114. package/dist/react/src/client/react/helpers/{use-load-messages.js → use-runtime-state.js} +12 -11
  115. package/dist/react/src/client/react/navigation/use-execute-navigation.js +29 -0
  116. package/dist/react/src/client/react/navigation/use-resolve-navigation.js +16 -0
  117. package/dist/react/src/client/react/provider/effects/use-locale-effects.js +26 -3
  118. package/dist/react/src/client/react/provider/intor-provider.js +2 -2
  119. package/dist/react/src/client/{helpers → shared/helpers}/get-client-locale.js +4 -4
  120. package/dist/react/src/client/shared/messages/create-refetch-messages.js +6 -6
  121. package/dist/react/src/client/shared/utils/locale/set-locale-cookie-browser.js +0 -3
  122. package/dist/react/src/core/error/intor-error.js +3 -1
  123. package/dist/react/src/core/messages/load-remote-messages/load-remote-messages.js +24 -14
  124. package/dist/react/src/core/messages/merge-messages.js +33 -0
  125. package/dist/react/src/core/utils/deep-merge.js +35 -19
  126. package/dist/react/src/policies/shoud-full-reload.js +14 -0
  127. package/dist/react/src/policies/should-persist-on-first-visit.js +8 -0
  128. package/dist/react/src/policies/should-persist.js +8 -0
  129. package/dist/react/src/routing/navigation/decide-strategy.js +17 -0
  130. package/dist/react/src/routing/navigation/derive-target.js +55 -0
  131. package/dist/react/src/routing/navigation/resolve-navigation.js +26 -0
  132. package/dist/react/src/routing/navigation/utils/derive-host-destination.js +13 -0
  133. package/dist/react/src/routing/navigation/utils/derive-query-destination.js +11 -0
  134. package/dist/react/src/routing/pathname/get-unprefixed-pathname.js +42 -0
  135. package/dist/react/src/routing/pathname/locale-prefix-pathname.js +40 -0
  136. package/dist/react/src/routing/pathname/localize-pathname.js +36 -0
  137. package/dist/react/src/routing/pathname/standardize-pathname.js +33 -0
  138. package/dist/svelte/export/svelte/index.js +2 -5
  139. package/dist/{vue/src/client → svelte/src/client/shared}/helpers/get-client-locale.js +4 -4
  140. package/dist/svelte/src/client/shared/messages/create-refetch-messages.js +6 -6
  141. package/dist/svelte/src/client/shared/utils/locale/set-locale-cookie-browser.js +0 -3
  142. package/dist/svelte/src/client/svelte/helpers/create-runtime-state.js +45 -0
  143. package/dist/svelte/src/client/svelte/render/create-svelte-renderer.js +34 -0
  144. package/dist/svelte/src/client/svelte/render/render-rich-message-svelte.js +20 -0
  145. package/dist/svelte/src/client/svelte/render/utils/escape-html.js +10 -0
  146. package/dist/svelte/src/client/svelte/render/utils/render-attributes.js +15 -0
  147. package/dist/svelte/src/client/svelte/runtime/create-intor-api.js +25 -0
  148. package/dist/svelte/src/client/svelte/runtime/create-intor.js +9 -6
  149. package/dist/svelte/src/client/svelte/runtime/effects/locale-effects.js +27 -11
  150. package/dist/svelte/src/core/error/intor-error.js +3 -1
  151. package/dist/svelte/src/core/messages/load-remote-messages/load-remote-messages.js +24 -14
  152. package/dist/svelte/src/core/messages/merge-messages.js +33 -0
  153. package/dist/svelte/src/core/utils/deep-merge.js +35 -19
  154. package/dist/svelte/src/policies/should-persist-on-first-visit.js +8 -0
  155. package/dist/svelte/src/policies/should-persist.js +8 -0
  156. package/dist/types/export/express/index.d.ts +1 -0
  157. package/dist/types/export/index.d.ts +4 -2
  158. package/dist/types/export/next/proxy/index.d.ts +1 -1
  159. package/dist/types/export/next/server/index.d.ts +1 -1
  160. package/dist/types/export/react/index.d.ts +1 -3
  161. package/dist/types/export/svelte/index.d.ts +1 -1
  162. package/dist/types/export/vue/index.d.ts +1 -1
  163. package/dist/types/src/adapters/express/global.d.ts +20 -0
  164. package/dist/types/src/adapters/express/helpers/get-translator.d.ts +18 -0
  165. package/dist/types/src/adapters/express/helpers/index.d.ts +1 -0
  166. package/dist/types/src/adapters/express/index.d.ts +3 -0
  167. package/dist/types/src/adapters/express/middleware/create-intor.d.ts +14 -0
  168. package/dist/types/src/adapters/express/middleware/index.d.ts +1 -0
  169. package/dist/types/src/adapters/next/navigation/link.d.ts +6 -9
  170. package/dist/types/src/adapters/next/navigation/redirect.d.ts +6 -9
  171. package/dist/types/src/adapters/next/navigation/use-pathname.d.ts +8 -11
  172. package/dist/types/src/adapters/next/navigation/use-router.d.ts +4 -5
  173. package/dist/types/src/adapters/next/proxy/intor-proxy.d.ts +4 -7
  174. package/dist/types/src/adapters/next/server/get-locale.d.ts +4 -1
  175. package/dist/types/src/adapters/next/server/get-pathname.d.ts +16 -0
  176. package/dist/types/src/adapters/next/server/get-translator.d.ts +8 -5
  177. package/dist/types/src/adapters/next/server/index.d.ts +2 -0
  178. package/dist/types/src/adapters/next/server/intor.d.ts +12 -0
  179. package/dist/types/src/client/react/helpers/index.d.ts +1 -1
  180. package/dist/types/src/client/react/helpers/use-runtime-state.d.ts +10 -0
  181. package/dist/types/src/client/react/index.d.ts +3 -3
  182. package/dist/types/src/client/react/navigation/index.d.ts +2 -2
  183. package/dist/types/src/client/react/navigation/use-execute-navigation.d.ts +5 -0
  184. package/dist/types/src/client/react/navigation/use-resolve-navigation.d.ts +5 -0
  185. package/dist/types/src/client/react/provider/intor-provider.d.ts +1 -1
  186. package/dist/types/src/client/react/provider/types.d.ts +11 -9
  187. package/dist/types/src/client/react/provider/use-intor.d.ts +2 -1
  188. package/dist/types/src/client/{helpers → shared/helpers}/get-client-locale.d.ts +1 -1
  189. package/dist/types/src/client/shared/types/index.d.ts +1 -1
  190. package/dist/types/src/client/shared/types/runtime-state.d.ts +13 -0
  191. package/dist/types/src/client/svelte/helpers/create-runtime-state.d.ts +11 -0
  192. package/dist/types/src/client/svelte/helpers/index.d.ts +1 -1
  193. package/dist/types/src/client/svelte/index.d.ts +3 -3
  194. package/dist/types/src/client/svelte/render/create-svelte-renderer.d.ts +14 -0
  195. package/dist/types/src/client/svelte/render/index.d.ts +2 -0
  196. package/dist/types/src/client/svelte/render/render-rich-message-svelte.d.ts +11 -0
  197. package/dist/types/src/client/svelte/render/types.d.ts +14 -0
  198. package/dist/types/src/client/svelte/render/utils/escape-html.d.ts +1 -0
  199. package/dist/types/src/client/svelte/render/utils/render-attributes.d.ts +3 -0
  200. package/dist/types/src/client/svelte/runtime/create-intor-api.d.ts +13 -0
  201. package/dist/types/src/client/svelte/runtime/create-intor.d.ts +2 -12
  202. package/dist/types/src/client/svelte/runtime/effects/locale-effects.d.ts +0 -8
  203. package/dist/types/src/client/svelte/runtime/index.d.ts +1 -0
  204. package/dist/types/src/client/svelte/runtime/types.d.ts +30 -6
  205. package/dist/types/src/client/vue/helpers/index.d.ts +1 -1
  206. package/dist/types/src/client/vue/helpers/use-runtime-state.d.ts +10 -0
  207. package/dist/types/src/client/vue/index.d.ts +2 -2
  208. package/dist/types/src/client/vue/provider/inject.d.ts +3 -2
  209. package/dist/types/src/client/vue/provider/resolver/resolve-runtime.d.ts +10 -0
  210. package/dist/types/src/client/vue/provider/types.d.ts +13 -9
  211. package/dist/types/src/client/vue/render/index.d.ts +1 -1
  212. package/dist/types/src/config/types/cookie.d.ts +3 -3
  213. package/dist/types/src/config/types/routing.d.ts +72 -19
  214. package/dist/types/src/core/constants/headers.d.ts +5 -0
  215. package/dist/types/src/core/constants/index.d.ts +1 -0
  216. package/dist/types/src/core/error/intor-error.d.ts +2 -1
  217. package/dist/types/src/core/index.d.ts +4 -4
  218. package/dist/types/src/core/messages/index.d.ts +2 -1
  219. package/dist/types/src/core/messages/load-remote-messages/load-remote-messages.d.ts +5 -5
  220. package/dist/types/src/core/messages/load-remote-messages/types.d.ts +1 -0
  221. package/dist/types/src/core/messages/merge-messages.d.ts +19 -0
  222. package/dist/types/src/core/messages/types.d.ts +9 -0
  223. package/dist/types/src/core/types/bootstrap.d.ts +13 -0
  224. package/dist/types/src/core/types/index.d.ts +2 -1
  225. package/dist/types/src/core/types/routing.d.ts +40 -3
  226. package/dist/types/src/core/utils/deep-merge.d.ts +20 -6
  227. package/dist/types/src/core/utils/index.d.ts +2 -5
  228. package/dist/types/src/core/utils/normalizers/index.d.ts +1 -0
  229. package/dist/types/src/core/utils/normalizers/normalize-query.d.ts +15 -0
  230. package/dist/types/src/policies/index.d.ts +2 -0
  231. package/dist/types/src/policies/shoud-full-reload.d.ts +5 -0
  232. package/dist/types/src/policies/should-persist-on-first-visit.d.ts +4 -0
  233. package/dist/types/src/policies/should-persist.d.ts +7 -0
  234. package/dist/types/src/routing/inbound/index.d.ts +1 -0
  235. package/dist/types/src/routing/inbound/resolve-inbound.d.ts +28 -0
  236. package/dist/types/src/routing/inbound/resolve-locale/index.d.ts +1 -0
  237. package/dist/types/src/routing/{locale → inbound/resolve-locale}/resolve-locale.d.ts +1 -1
  238. package/dist/types/src/routing/{locale → inbound/resolve-locale}/types.d.ts +1 -5
  239. package/dist/types/src/routing/inbound/resolve-pathname/index.d.ts +1 -0
  240. package/dist/types/src/routing/{pathname → inbound/resolve-pathname}/resolve-pathname.d.ts +2 -2
  241. package/dist/types/src/routing/{pathname → inbound/resolve-pathname}/strategies/all.d.ts +1 -1
  242. package/dist/types/src/routing/{pathname → inbound/resolve-pathname}/strategies/except-default.d.ts +1 -1
  243. package/dist/types/src/routing/{pathname → inbound/resolve-pathname}/types.d.ts +1 -1
  244. package/dist/types/src/routing/index.d.ts +4 -3
  245. package/dist/types/src/{core/utils → routing}/locale/get-locale-from-accept-language.d.ts +2 -2
  246. package/dist/types/src/{core/utils → routing}/locale/get-locale-from-host.d.ts +1 -1
  247. package/dist/types/src/{core/utils → routing}/locale/get-locale-from-pathname.d.ts +1 -1
  248. package/dist/types/src/{core/utils → routing}/locale/get-locale-from-query.d.ts +1 -1
  249. package/dist/types/src/routing/locale/index.d.ts +4 -1
  250. package/dist/types/src/routing/navigation/decide-strategy.d.ts +17 -0
  251. package/dist/types/src/routing/navigation/derive-target.d.ts +17 -0
  252. package/dist/types/src/routing/navigation/index.d.ts +1 -0
  253. package/dist/types/src/routing/navigation/resolve-navigation.d.ts +25 -0
  254. package/dist/types/src/routing/navigation/utils/derive-host-destination.d.ts +6 -0
  255. package/dist/types/src/routing/navigation/utils/derive-query-destination.d.ts +6 -0
  256. package/dist/types/src/{core/utils → routing}/pathname/get-unprefixed-pathname.d.ts +1 -1
  257. package/dist/types/src/routing/pathname/index.d.ts +1 -1
  258. package/dist/types/src/{core/utils → routing}/pathname/locale-prefix-pathname.d.ts +1 -1
  259. package/dist/types/src/routing/pathname/localize-pathname.d.ts +45 -0
  260. package/dist/types/src/{core/utils → routing}/pathname/standardize-pathname.d.ts +1 -1
  261. package/dist/types/src/server/helpers/get-translator.d.ts +19 -0
  262. package/dist/types/src/server/helpers/index.d.ts +1 -0
  263. package/dist/types/src/server/helpers/local-messages-from-url.d.ts +2 -12
  264. package/dist/types/src/server/index.d.ts +2 -2
  265. package/dist/types/src/server/intor/index.d.ts +1 -1
  266. package/dist/types/src/server/intor/intor.d.ts +7 -16
  267. package/dist/types/src/server/intor/types.d.ts +3 -6
  268. package/dist/types/src/server/messages/load-local-messages/load-local-messages.d.ts +7 -7
  269. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +4 -4
  270. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +2 -4
  271. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +11 -13
  272. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +2 -4
  273. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +8 -5
  274. package/dist/types/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +3 -6
  275. package/dist/types/src/server/messages/load-local-messages/types.d.ts +3 -3
  276. package/dist/types/src/server/messages/load-messages.d.ts +9 -7
  277. package/dist/types/src/server/messages/types.d.ts +4 -11
  278. package/dist/types/src/server/runtime/create-intor-runtime.d.ts +13 -0
  279. package/dist/types/src/server/runtime/index.d.ts +2 -0
  280. package/dist/types/src/server/runtime/types.d.ts +27 -0
  281. package/dist/types/src/server/translator/create-translator.d.ts +28 -0
  282. package/dist/types/src/server/translator/index.d.ts +1 -1
  283. package/dist/vue/export/vue/index.js +2 -2
  284. package/dist/{svelte/src/client → vue/src/client/shared}/helpers/get-client-locale.js +4 -4
  285. package/dist/vue/src/client/shared/messages/create-refetch-messages.js +6 -6
  286. package/dist/vue/src/client/shared/utils/locale/set-locale-cookie-browser.js +0 -3
  287. package/dist/vue/src/client/vue/helpers/{use-load-messages.js → use-runtime-state.js} +17 -13
  288. package/dist/vue/src/client/vue/provider/effects/use-locale-effects.js +27 -4
  289. package/dist/vue/src/client/vue/provider/intor-provider.js +11 -11
  290. package/dist/vue/src/client/vue/provider/resolver/resolve-runtime.js +32 -0
  291. package/dist/vue/src/client/vue/translator/create-t-rich.js +1 -1
  292. package/dist/vue/src/core/error/intor-error.js +3 -1
  293. package/dist/vue/src/core/messages/load-remote-messages/load-remote-messages.js +24 -14
  294. package/dist/vue/src/core/messages/merge-messages.js +33 -0
  295. package/dist/vue/src/core/utils/deep-merge.js +35 -19
  296. package/dist/vue/src/policies/should-persist-on-first-visit.js +8 -0
  297. package/dist/vue/src/policies/should-persist.js +8 -0
  298. package/package.json +10 -12
  299. package/dist/core/export/config/index.js +0 -3
  300. package/dist/core/src/server/translator/get-translator.js +0 -30
  301. package/dist/next/src/adapters/next/proxy/utils/set-locale-cookie-edge.js +0 -19
  302. package/dist/next/src/routing/resolve-routing.js +0 -41
  303. package/dist/next/src/server/translator/get-translator.js +0 -30
  304. package/dist/react/src/client/react/navigation/use-navigation-strategy.js +0 -36
  305. package/dist/react/src/client/react/navigation/use-navigation-target.js +0 -23
  306. package/dist/react/src/routing/resolve-navigation-target.js +0 -31
  307. package/dist/types/export/config/index.d.ts +0 -1
  308. package/dist/types/src/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +0 -13
  309. package/dist/types/src/client/react/helpers/use-load-messages.d.ts +0 -10
  310. package/dist/types/src/client/react/navigation/use-navigation-strategy.d.ts +0 -22
  311. package/dist/types/src/client/react/navigation/use-navigation-target.d.ts +0 -12
  312. package/dist/types/src/client/shared/types/bootstrap.d.ts +0 -16
  313. package/dist/types/src/client/svelte/helpers/create-messages.d.ts +0 -11
  314. package/dist/types/src/client/vue/helpers/use-load-messages.d.ts +0 -11
  315. package/dist/types/src/core/utils/locale/index.d.ts +0 -4
  316. package/dist/types/src/core/utils/pathname/index.d.ts +0 -1
  317. package/dist/types/src/core/utils/pathname/localize-pathname.d.ts +0 -23
  318. package/dist/types/src/routing/resolve-navigation-target.d.ts +0 -20
  319. package/dist/types/src/routing/resolve-routing.d.ts +0 -30
  320. package/dist/types/src/server/translator/get-translator.d.ts +0 -21
  321. /package/dist/{next/src/routing/locale → express/src/routing/inbound/resolve-locale}/resolve-locale.js +0 -0
  322. /package/dist/{next/src/routing/pathname → express/src/routing/inbound/resolve-pathname}/strategies/all.js +0 -0
  323. /package/dist/{next/src/routing/pathname → express/src/routing/inbound/resolve-pathname}/strategies/except-default.js +0 -0
  324. /package/dist/{next/src/routing/pathname → express/src/routing/inbound/resolve-pathname}/strategies/none.js +0 -0
  325. /package/dist/next/src/{core → routing/navigation}/utils/is-external-destination.js +0 -0
  326. /package/dist/react/src/{core → routing/navigation}/utils/is-external-destination.js +0 -0
  327. /package/dist/types/src/client/{helpers → shared/helpers}/index.d.ts +0 -0
  328. /package/dist/types/src/client/vue/render/{render-rich-message-react.d.ts → render-rich-message-vue.d.ts} +0 -0
  329. /package/dist/types/src/routing/{pathname → inbound/resolve-pathname}/strategies/index.d.ts +0 -0
  330. /package/dist/types/src/routing/{pathname → inbound/resolve-pathname}/strategies/none.d.ts +0 -0
  331. /package/dist/types/src/{core → routing/navigation}/utils/is-external-destination.d.ts +0 -0
  332. /package/dist/vue/src/client/vue/render/{render-rich-message-react.js → render-rich-message-vue.js} +0 -0
package/README.md CHANGED
@@ -15,88 +15,3 @@ Fast to start, easy to extend, and free from the usual i18n heaviness.
15
15
  [![License](https://img.shields.io/npm/l/intor?style=flat&colorA=000000&colorB=000000)](LICENSE)
16
16
 
17
17
  </div>
18
-
19
- <div align="center">
20
-
21
- #### 🍳 Cooking the Intor v2 docs, crafting them to perfection...
22
-
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
- ```
@@ -1,9 +1,14 @@
1
1
  export { PREFIX_PLACEHOLDER } from '../src/core/constants/prefix-placeholder.js';
2
2
  export { IntorError, IntorErrorCode } from '../src/core/error/intor-error.js';
3
3
  export { deepMerge } from '../src/core/utils/deep-merge.js';
4
- export { localizePathname } from '../src/core/utils/pathname/localize-pathname.js';
4
+ export { resolveLoaderOptions } from '../src/core/utils/resolve-loader-options.js';
5
5
  import 'logry';
6
6
  export { clearLoggerPool } from '../src/core/logger/global-logger-pool.js';
7
7
  export { isValidMessages } from '../src/core/messages/utils/is-valid-messages.js';
8
8
  export { clearMessagesPool, setGlobalMessagesPool } from '../src/core/messages/global-messages-pool.js';
9
- import 'intor-translator';
9
+ export { mergeMessages } from '../src/core/messages/merge-messages.js';
10
+ export { defineIntorConfig } from '../src/config/define-intor-config.js';
11
+ import '../src/config/constants/cookie.js';
12
+ import '../src/config/constants/cache.js';
13
+ export { localizePathname } from '../src/routing/pathname/localize-pathname.js';
14
+ export { Translator } from 'intor-translator';
@@ -1,4 +1,6 @@
1
1
  export { intor } from '../../src/server/intor/intor.js';
2
2
  export { loadMessages } from '../../src/server/messages/load-messages.js';
3
- export { getTranslator } from '../../src/server/translator/get-translator.js';
3
+ import 'intor-translator';
4
+ import 'logry';
5
+ export { getTranslator } from '../../src/server/helpers/get-translator.js';
4
6
  export { loadMessagesFromUrl } from '../../src/server/helpers/local-messages-from-url.js';
@@ -3,7 +3,7 @@ const DEFAULT_COOKIE_OPTIONS = {
3
3
  enabled: true,
4
4
  persist: true,
5
5
  name: "intor.locale",
6
- domain: null,
6
+ domain: undefined,
7
7
  path: "/",
8
8
  maxAge: 60 * 60 * 24 * 365, // 365 days
9
9
  httpOnly: false,
@@ -2,9 +2,14 @@
2
2
  const DEFAULT_ROUTING_OPTIONS = {
3
3
  locale: {
4
4
  sources: ["path", "query", "cookie", "detected"],
5
- queryKey: "locale",
5
+ query: { key: "locale" },
6
+ },
7
+ navigation: {
8
+ carrier: "path",
9
+ path: { prefix: "none" },
10
+ query: { key: "locale" },
11
+ host: { map: {} },
6
12
  },
7
- prefix: "none",
8
13
  firstVisit: {
9
14
  localeSource: "browser",
10
15
  redirect: true,
@@ -13,6 +13,26 @@ const resolveRoutingOptions = (routing = {}) => {
13
13
  locale: {
14
14
  ...DEFAULT_ROUTING_OPTIONS.locale,
15
15
  ...routing.locale,
16
+ query: {
17
+ ...DEFAULT_ROUTING_OPTIONS.locale.query,
18
+ ...routing.locale?.query,
19
+ },
20
+ },
21
+ navigation: {
22
+ ...DEFAULT_ROUTING_OPTIONS.navigation,
23
+ ...routing.navigation,
24
+ path: {
25
+ ...DEFAULT_ROUTING_OPTIONS.navigation.path,
26
+ ...routing.navigation?.path,
27
+ },
28
+ query: {
29
+ ...DEFAULT_ROUTING_OPTIONS.navigation.query,
30
+ ...routing.navigation?.query,
31
+ },
32
+ host: {
33
+ ...DEFAULT_ROUTING_OPTIONS.navigation.host,
34
+ ...routing.navigation?.host,
35
+ },
16
36
  },
17
37
  firstVisit: {
18
38
  ...DEFAULT_ROUTING_OPTIONS.firstVisit,
@@ -12,10 +12,12 @@ class IntorError extends Error {
12
12
  }
13
13
  var IntorErrorCode;
14
14
  (function (IntorErrorCode) {
15
- // intor-config
15
+ // config
16
16
  IntorErrorCode["MISSING_SUPPORTED_LOCALES"] = "INTOR_MISSING_SUPPORTED_LOCALES";
17
17
  IntorErrorCode["MISSING_DEFAULT_LOCALE"] = "INTOR_MISSING_DEFAULT_LOCALE";
18
18
  IntorErrorCode["UNSUPPORTED_DEFAULT_LOCALE"] = "INTOR_UNSUPPORTED_DEFAULT_LOCALE";
19
+ // runtime
20
+ IntorErrorCode["RUNTIME_NOT_INITIALIZED"] = "INTOR_RUNTIME_NOT_INITIALIZED";
19
21
  })(IntorErrorCode || (IntorErrorCode = {}));
20
22
 
21
23
  export { IntorError, IntorErrorCode };
@@ -5,16 +5,16 @@ import { fetchLocaleMessages } from './fetch-locale-messages/fetch-locale-messag
5
5
  /**
6
6
  * Load locale messages from a remote API.
7
7
  *
8
- * This function acts as the orchestration layer for remote message loading.
9
- * It is responsible for:
8
+ * This function serves as the orchestration layer for remote message loading.
9
+ * It coordinates:
10
10
  *
11
- * - Resolving fallback locales in order
12
- * - Coordinating cache read / write behavior
11
+ * - Locale resolution with fallbacks
12
+ * - Cache read / write behavior
13
13
  * - Respecting abort signals across the entire async flow
14
14
  *
15
15
  * Network fetching and data validation are delegated to lower-level utilities.
16
16
  */
17
- const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir, url, headers, signal, pool, cacheOptions, allowCacheWrite = false, loggerOptions, }) => {
17
+ const loadRemoteMessages = async ({ id, locale, fallbackLocales, namespaces, rootDir, url, headers, signal, pool, cacheOptions, allowCacheWrite = false, loggerOptions, }) => {
18
18
  const baseLogger = getLogger(loggerOptions);
19
19
  const logger = baseLogger.child({ scope: "load-remote-messages" });
20
20
  // Abort early if the request has already been cancelled
@@ -24,16 +24,20 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
24
24
  }
25
25
  const start = performance.now();
26
26
  logger.debug("Loading remote messages.", { url });
27
- // --- Cache key ---
27
+ // ---------------------------------------------------------------------------
28
+ // Cache key resolution
29
+ // ---------------------------------------------------------------------------
28
30
  const cacheKey = normalizeCacheKey([
29
- loggerOptions.id,
31
+ id,
30
32
  "loaderType:remote",
31
33
  rootDir,
32
34
  locale,
33
- (fallbackLocales ?? []).toSorted().join(","),
34
- (namespaces ?? []).toSorted().join(","),
35
+ (fallbackLocales || []).toSorted().join(","),
36
+ (namespaces || []).toSorted().join(","),
35
37
  ]);
36
- // --- Cache read ---
38
+ // ---------------------------------------------------------------------------
39
+ // Cache read
40
+ // ---------------------------------------------------------------------------
37
41
  if (cacheOptions.enabled && cacheKey) {
38
42
  const cached = await pool?.get(cacheKey);
39
43
  if (signal?.aborted) {
@@ -45,9 +49,11 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
45
49
  return cached;
46
50
  }
47
51
  }
52
+ // ---------------------------------------------------------------------------
53
+ // Resolve locale messages with ordered fallback strategy
54
+ // ---------------------------------------------------------------------------
48
55
  const candidateLocales = [locale, ...(fallbackLocales || [])];
49
56
  let messages;
50
- // Try each candidate locale in order and stop at the first successful result
51
57
  for (let i = 0; i < candidateLocales.length; i++) {
52
58
  const candidateLocale = candidateLocales[i];
53
59
  const isLast = i === candidateLocales.length - 1;
@@ -87,13 +93,17 @@ const loadRemoteMessages = async ({ locale, fallbackLocales, namespaces, rootDir
87
93
  });
88
94
  }
89
95
  }
90
- // --- Cache write ---
91
- if (cacheOptions.enabled && allowCacheWrite && cacheKey && messages) {
96
+ // ---------------------------------------------------------------------------
97
+ // Cache write (explicitly permitted)
98
+ // ---------------------------------------------------------------------------
99
+ if (cacheOptions.enabled && allowCacheWrite) {
92
100
  if (signal?.aborted) {
93
101
  logger.debug("Remote message loading aborted before cache write.");
94
102
  return;
95
103
  }
96
- await pool?.set(cacheKey, messages, cacheOptions.ttl);
104
+ if (cacheKey && messages) {
105
+ await pool?.set(cacheKey, messages, cacheOptions.ttl);
106
+ }
97
107
  }
98
108
  // Final success log with resolved locale and timing
99
109
  if (messages) {
@@ -0,0 +1,33 @@
1
+ import { getLogger } from '../logger/get-logger.js';
2
+ import { deepMerge } from '../utils/deep-merge.js';
3
+
4
+ /**
5
+ * Merge locale-specific messages with runtime overrides.
6
+ *
7
+ * - Only merges messages under the given locale
8
+ * - Emits debug logs for add / override events
9
+ */
10
+ function mergeMessages(a, b, { config, locale, onEvent }) {
11
+ const baseLogger = getLogger({ ...config.logger, id: config.id });
12
+ const logger = baseLogger.child({ scope: "merge-messages" });
13
+ // Merge messages for the active locale only
14
+ const merged = deepMerge(a?.[locale] ?? {}, b?.[locale] ?? {}, {
15
+ onOverride: (event) => {
16
+ if (onEvent) {
17
+ onEvent(event);
18
+ return;
19
+ }
20
+ const { kind, path, next, prev } = event;
21
+ if (kind === "add")
22
+ return;
23
+ logger.debug(`Override | ${locale}: "${path}"`, { prev, next });
24
+ },
25
+ });
26
+ // Preserve other locales, update only the target one
27
+ return {
28
+ ...a,
29
+ [locale]: merged,
30
+ };
31
+ }
32
+
33
+ export { mergeMessages };
@@ -1,28 +1,44 @@
1
1
  /**
2
- * Deeply merges two objects.
2
+ * Deeply merges two plain objects.
3
3
  *
4
- * - Nested objects → merged recursively
5
- * - Array / primitive → b overwrites a
4
+ * - Nested plain objects → merged recursively
5
+ * - Arrays / primitives`b` overwrites `a`
6
6
  *
7
- * This function always returns a plain object.
7
+ * Debug behavior (optional):
8
+ * - Emits override events via `onOverride`
9
+ * - Zero overhead when no options are provided
10
+ *
11
+ * This function always returns a new plain object.
8
12
  */
9
- const deepMerge = (a = {}, b = {}) => {
13
+ const deepMerge = (a = {}, b = {}, options) => {
10
14
  const result = { ...a };
15
+ const basePath = options?._path ?? [];
16
+ // Iterate only over b's own enumerable properties
11
17
  for (const key in b) {
12
- if (Object.prototype.hasOwnProperty.call(b, key)) {
13
- const av = a[key];
14
- const bv = b[key];
15
- if (av &&
16
- bv &&
17
- typeof av === "object" &&
18
- typeof bv === "object" &&
19
- !Array.isArray(av) &&
20
- !Array.isArray(bv)) {
21
- result[key] = deepMerge(av, bv);
22
- }
23
- else {
24
- result[key] = bv;
25
- }
18
+ if (!Object.prototype.hasOwnProperty.call(b, key))
19
+ continue;
20
+ const aValue = a[key];
21
+ const bValue = b[key];
22
+ const nextPath = [...basePath, key];
23
+ // Recursively merge when both sides are plain objects
24
+ if (aValue &&
25
+ bValue &&
26
+ typeof aValue === "object" &&
27
+ typeof bValue === "object" &&
28
+ !Array.isArray(aValue) &&
29
+ !Array.isArray(bValue)) {
30
+ result[key] = deepMerge(aValue, bValue, options ? { ...options, _path: nextPath } : undefined);
31
+ }
32
+ else {
33
+ // Emit override event only when debugging is enabled
34
+ const isAdd = aValue === undefined;
35
+ options?.onOverride?.({
36
+ path: nextPath.join("."),
37
+ prev: aValue,
38
+ next: bValue,
39
+ kind: isAdd ? "add" : "override",
40
+ });
41
+ result[key] = bValue;
26
42
  }
27
43
  }
28
44
  return result;
@@ -18,6 +18,15 @@
18
18
  * for the given runtime.
19
19
  */
20
20
  const resolveLoaderOptions = (config, runtime) => {
21
+ // --- runtime: client ---
22
+ if (runtime === "client") {
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
+ }
21
30
  // --- runtime: server ---
22
31
  return config.server?.loader ?? config.loader;
23
32
  };
@@ -1,4 +1,7 @@
1
- import { normalizePathname } from '../normalizers/normalize-pathname.js';
1
+ import '../../core/error/intor-error.js';
2
+ import { normalizePathname } from '../../core/utils/normalizers/normalize-pathname.js';
3
+ import 'logry';
4
+ import 'keyv';
2
5
 
3
6
  /**
4
7
  * Returns a canonical, locale-agnostic pathname.
@@ -1,5 +1,8 @@
1
- import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
2
- import { normalizePathname } from '../normalizers/normalize-pathname.js';
1
+ import { PREFIX_PLACEHOLDER } from '../../core/constants/prefix-placeholder.js';
2
+ import '../../core/error/intor-error.js';
3
+ import { normalizePathname } from '../../core/utils/normalizers/normalize-pathname.js';
4
+ import 'logry';
5
+ import 'keyv';
3
6
 
4
7
  /**
5
8
  * Applies routing prefix strategy by resolving the locale placeholder.
@@ -16,8 +19,7 @@ import { normalizePathname } from '../normalizers/normalize-pathname.js';
16
19
  * ```
17
20
  */
18
21
  const localePrefixPathname = (config, standardizedPathname, locale) => {
19
- const { routing } = config;
20
- const { prefix } = routing;
22
+ const { prefix } = config.routing.navigation.path;
21
23
  if (prefix !== "none" && !locale) {
22
24
  throw new Error('No locale when using prefix "all", "except-default"');
23
25
  }
@@ -25,11 +25,11 @@ const localizePathname = (config, rawPathname, locale) => {
25
25
  // 2. Standardize: build a pathname with locale placeholder
26
26
  const standardizedPathname = standardizePathname(config, unprefixedPathname);
27
27
  // 3. Apply strategy: resolve locale prefix based on routing rules
28
- const localizedPathname = localePrefixPathname(config, standardizedPathname, locale);
28
+ const pathname = localePrefixPathname(config, standardizedPathname, locale);
29
29
  return {
30
+ pathname,
30
31
  unprefixedPathname,
31
32
  standardizedPathname,
32
- localizedPathname,
33
33
  };
34
34
  };
35
35
 
@@ -1,5 +1,8 @@
1
- import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
2
- import { normalizePathname } from '../normalizers/normalize-pathname.js';
1
+ import { PREFIX_PLACEHOLDER } from '../../core/constants/prefix-placeholder.js';
2
+ import '../../core/error/intor-error.js';
3
+ import { normalizePathname } from '../../core/utils/normalizers/normalize-pathname.js';
4
+ import 'logry';
5
+ import 'keyv';
3
6
 
4
7
  /**
5
8
  * Standardizes a canonical pathname by applying the base path
@@ -0,0 +1,27 @@
1
+ import { createIntorRuntime } from '../runtime/create-intor-runtime.js';
2
+
3
+ // Implementation
4
+ async function getTranslator(config, params) {
5
+ const { readOptions, allowCacheWrite, preKey, handlers, plugins } = params;
6
+ const locale = params.locale;
7
+ // Create runtime (request-scoped, no cache write)
8
+ const runtime = createIntorRuntime(config, {
9
+ readOptions,
10
+ allowCacheWrite,
11
+ });
12
+ // Ensure messages & create translator snapshot
13
+ await runtime.ensureMessages(locale);
14
+ const translator = runtime.translator(locale, {
15
+ preKey,
16
+ plugins,
17
+ handlers,
18
+ });
19
+ return {
20
+ messages: translator.messages,
21
+ locale,
22
+ hasKey: translator.hasKey,
23
+ t: translator.t,
24
+ };
25
+ }
26
+
27
+ export { getTranslator };
@@ -37,13 +37,13 @@ async function loadMessagesFromUrl(url, options) {
37
37
  const fallbackLocales = parseMultiValueParam(url.searchParams.getAll("fallbackLocales"));
38
38
  // Load local messages
39
39
  return loadLocalMessages({
40
+ id: options?.id || "default",
40
41
  rootDir,
41
42
  locale,
42
43
  namespaces,
43
44
  fallbackLocales,
44
45
  concurrency: options?.concurrency,
45
- exts: options?.exts,
46
- messagesReader: options?.messagesReader,
46
+ readOptions: options?.readOptions,
47
47
  pool: options?.pool,
48
48
  cacheOptions: options?.cacheOptions || { enabled: false, ttl: 0 },
49
49
  allowCacheWrite: options?.allowCacheWrite,
@@ -1,53 +1,36 @@
1
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
2
  import { getLogger } from '../../core/logger/get-logger.js';
5
3
  import 'keyv';
6
- import { loadMessages } from '../messages/load-messages.js';
4
+ import { createIntorRuntime } from '../runtime/create-intor-runtime.js';
7
5
 
8
6
  /**
9
- * Entry point for initializing Intor.
7
+ * Initializes Intor for the current execution context.
10
8
  *
11
- * This function orchestrates the initialization flow:
12
- *
13
- * - Resolves the initial locale using a provided locale resolver
14
- * - Loads locale messages if the message loader is enabled
15
- * - Returns a fully-initialized Intor result
16
- *
17
- * This function does not perform routing decisions itself.
18
- * Locale resolution is delegated to the provided `getLocale` implementation.
9
+ * Provides server-side bootstrap logic for SSR-based
10
+ * full-stack frameworks.
19
11
  */
20
- const intor = async (config, getLocale, loadMessagesOptions = {}) => {
12
+ async function intor(config, localeOrResolver, options) {
21
13
  const baseLogger = getLogger(config.logger);
22
14
  const logger = baseLogger.child({ scope: "intor" });
23
15
  logger.info("Start Intor initialization.");
24
- // Resolve initial locale
25
- const isLocaleFunction = typeof getLocale === "function";
16
+ // Create runtime (request-scoped)
17
+ const runtime = createIntorRuntime(config, options);
18
+ // Resolve locale
19
+ const isLocaleFunction = typeof localeOrResolver === "function";
26
20
  const locale = isLocaleFunction
27
- ? await getLocale(config)
28
- : getLocale || config.defaultLocale;
29
- const source = typeof getLocale === "function" ? "resolver" : "static";
21
+ ? await localeOrResolver(config)
22
+ : localeOrResolver || config.defaultLocale;
23
+ const source = typeof localeOrResolver === "function" ? "resolver" : "static";
30
24
  logger.debug(`Initial locale resolved as "${locale}" via "${source}".`);
31
- // Load messages during initialization when a loader is configured.
32
- let loadedMessages;
33
- const loader = resolveLoaderOptions(config);
34
- if (loader) {
35
- loadedMessages = await loadMessages({
36
- config,
37
- locale,
38
- extraOptions: {
39
- exts: loadMessagesOptions.exts,
40
- messagesReader: loadMessagesOptions.messagesReader,
41
- },
42
- allowCacheWrite: true, // Intor is the primary cache writer during initialization.
43
- });
44
- }
25
+ // Ensure messages & create translator snapshot
26
+ await runtime.ensureMessages(locale);
27
+ const translator = runtime.translator(locale);
45
28
  logger.info("Intor initialized.");
46
29
  return {
47
30
  config,
48
- initialLocale: locale,
49
- initialMessages: deepMerge(config.messages, loadedMessages),
31
+ locale,
32
+ messages: translator.messages,
50
33
  };
51
- };
34
+ }
52
35
 
53
36
  export { intor };