intor 2.2.14 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/dist/exports/config/index.d.ts +2 -0
  2. package/dist/exports/config/index.js +4 -0
  3. package/dist/exports/index.d.ts +5 -0
  4. package/dist/exports/index.js +11 -0
  5. package/dist/exports/next/index.d.ts +3 -0
  6. package/dist/exports/next/index.js +9 -0
  7. package/dist/exports/next/proxy/index.d.ts +2 -0
  8. package/dist/exports/next/proxy/index.js +2 -0
  9. package/dist/exports/next/server/index.d.ts +2 -0
  10. package/dist/exports/next/server/index.js +2 -0
  11. package/dist/exports/react/index.d.ts +2 -0
  12. package/dist/exports/react/index.js +6 -0
  13. package/dist/exports/server/index.d.ts +2 -0
  14. package/dist/exports/server/index.js +7 -0
  15. package/dist/src/adapters/next/navigation/index.d.ts +4 -0
  16. package/dist/src/adapters/next/navigation/link.d.ts +16 -0
  17. package/dist/src/adapters/next/navigation/link.js +25 -0
  18. package/dist/src/adapters/next/navigation/redirect.d.ts +16 -0
  19. package/dist/src/adapters/next/navigation/redirect.js +36 -0
  20. package/dist/src/adapters/next/navigation/use-pathname.d.ts +17 -0
  21. package/dist/src/adapters/next/navigation/use-pathname.js +49 -0
  22. package/dist/src/adapters/next/navigation/use-router.d.ts +20 -0
  23. package/dist/src/adapters/next/navigation/use-router.js +31 -0
  24. package/dist/src/adapters/next/navigation/utils/should-full-reload.d.ts +7 -0
  25. package/dist/src/adapters/next/navigation/utils/should-full-reload.js +19 -0
  26. package/dist/src/adapters/next/navigation/utils/use-locale-switch.d.ts +16 -0
  27. package/dist/src/adapters/next/navigation/utils/use-locale-switch.js +58 -0
  28. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-all.d.ts +12 -0
  29. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-all.js +60 -0
  30. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-except-default.d.ts +16 -0
  31. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-except-default.js +81 -0
  32. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-none.d.ts +10 -0
  33. package/dist/src/adapters/next/proxy/handle-prefix/handle-prefix-none.js +22 -0
  34. package/dist/src/adapters/next/proxy/index.d.ts +2 -0
  35. package/dist/src/adapters/next/proxy/intor-proxy.d.ts +6 -0
  36. package/dist/src/adapters/next/proxy/intor-proxy.js +22 -0
  37. package/dist/src/adapters/next/proxy/utils/create-response.d.ts +17 -0
  38. package/dist/src/adapters/next/proxy/utils/create-response.js +42 -0
  39. package/dist/src/adapters/next/proxy/utils/determine-initial-locale.d.ts +8 -0
  40. package/dist/src/adapters/next/proxy/utils/determine-initial-locale.js +28 -0
  41. package/dist/src/adapters/next/proxy/utils/set-locale-cookie-edge.d.ts +15 -0
  42. package/dist/src/adapters/next/proxy/utils/set-locale-cookie-edge.js +24 -0
  43. package/dist/src/adapters/next/proxy/utils/set-pathname-header.d.ts +12 -0
  44. package/dist/src/adapters/next/proxy/utils/set-pathname-header.js +13 -0
  45. package/dist/src/adapters/next/server/get-i18n-context.d.ts +9 -0
  46. package/dist/src/adapters/next/server/get-i18n-context.js +47 -0
  47. package/dist/src/adapters/next/server/get-translator.d.ts +30 -0
  48. package/dist/src/adapters/next/server/get-translator.js +19 -0
  49. package/dist/src/adapters/next/server/index.d.ts +2 -0
  50. package/dist/src/adapters/next/shared/constants/pathname-header-name.d.ts +1 -0
  51. package/dist/src/adapters/next/shared/constants/pathname-header-name.js +4 -0
  52. package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.d.ts +16 -0
  53. package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.js +33 -0
  54. package/dist/src/adapters/next/shared/utils/localize-pathname.d.ts +18 -0
  55. package/dist/src/adapters/next/shared/utils/localize-pathname.js +36 -0
  56. package/dist/src/client/react/contexts/config/context.d.ts +3 -0
  57. package/dist/src/client/react/contexts/config/context.js +6 -0
  58. package/dist/src/client/react/contexts/config/hook.d.ts +2 -0
  59. package/dist/src/client/react/contexts/config/hook.js +12 -0
  60. package/dist/src/client/react/contexts/config/index.d.ts +2 -0
  61. package/dist/src/client/react/contexts/config/provider.d.ts +2 -0
  62. package/dist/src/client/react/contexts/config/provider.js +11 -0
  63. package/dist/src/client/react/contexts/config/types.d.ts +10 -0
  64. package/dist/src/client/react/contexts/intor-provider/index.d.ts +2 -0
  65. package/dist/src/client/react/contexts/intor-provider/intor-provider.d.ts +2 -0
  66. package/dist/src/client/react/contexts/intor-provider/intor-provider.js +17 -0
  67. package/dist/src/client/react/contexts/intor-provider/types.d.ts +14 -0
  68. package/dist/src/client/react/contexts/locale/context.d.ts +3 -0
  69. package/dist/src/client/react/contexts/locale/context.js +6 -0
  70. package/dist/src/client/react/contexts/locale/hook.d.ts +1 -0
  71. package/dist/src/client/react/contexts/locale/hook.js +12 -0
  72. package/dist/src/client/react/contexts/locale/index.d.ts +2 -0
  73. package/dist/src/client/react/contexts/locale/provider.d.ts +3 -0
  74. package/dist/src/client/react/contexts/locale/provider.js +48 -0
  75. package/dist/src/client/react/contexts/locale/types.d.ts +13 -0
  76. package/dist/src/client/react/contexts/locale/utils/change-locale.d.ts +22 -0
  77. package/dist/src/client/react/contexts/locale/utils/change-locale.js +35 -0
  78. package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.d.ts +8 -0
  79. package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.js +28 -0
  80. package/dist/src/client/react/contexts/messages/context.d.ts +3 -0
  81. package/dist/src/client/react/contexts/messages/context.js +6 -0
  82. package/dist/src/client/react/contexts/messages/hook.d.ts +2 -0
  83. package/dist/src/client/react/contexts/messages/hook.js +12 -0
  84. package/dist/src/client/react/contexts/messages/index.d.ts +2 -0
  85. package/dist/src/client/react/contexts/messages/provider.d.ts +3 -0
  86. package/dist/src/client/react/contexts/messages/provider.js +32 -0
  87. package/dist/src/client/react/contexts/messages/types.d.ts +15 -0
  88. package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +16 -0
  89. package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.js +57 -0
  90. package/dist/src/client/react/contexts/translate-handlers/context.d.ts +2 -0
  91. package/dist/src/client/react/contexts/translate-handlers/context.js +6 -0
  92. package/dist/src/client/react/contexts/translate-handlers/hook.d.ts +2 -0
  93. package/dist/src/client/react/contexts/translate-handlers/hook.js +10 -0
  94. package/dist/src/client/react/contexts/translate-handlers/index.d.ts +3 -0
  95. package/dist/src/client/react/contexts/translate-handlers/provider.d.ts +2 -0
  96. package/dist/src/client/react/contexts/translate-handlers/provider.js +11 -0
  97. package/dist/src/client/react/contexts/translate-handlers/types.d.ts +7 -0
  98. package/dist/src/client/react/contexts/translator/context.d.ts +3 -0
  99. package/dist/src/client/react/contexts/translator/context.js +6 -0
  100. package/dist/src/client/react/contexts/translator/hook.d.ts +2 -0
  101. package/dist/src/client/react/contexts/translator/hook.js +12 -0
  102. package/dist/src/client/react/contexts/translator/index.d.ts +2 -0
  103. package/dist/src/client/react/contexts/translator/provider.d.ts +2 -0
  104. package/dist/src/client/react/contexts/translator/provider.js +53 -0
  105. package/dist/src/client/react/contexts/translator/types.d.ts +11 -0
  106. package/dist/src/client/react/hooks/use-translator.d.ts +12 -0
  107. package/dist/src/client/react/hooks/use-translator.js +38 -0
  108. package/dist/src/client/react/index.d.ts +4 -0
  109. package/dist/src/client/shared/utils/get-initial-locale.d.ts +11 -0
  110. package/dist/src/client/shared/utils/get-initial-locale.js +21 -0
  111. package/dist/src/config/constants/cache.constants.d.ts +2 -0
  112. package/dist/src/config/constants/cache.constants.js +7 -0
  113. package/dist/src/config/constants/cookie.constants.d.ts +2 -0
  114. package/dist/src/config/constants/cookie.constants.js +14 -0
  115. package/dist/src/config/constants/routing.constants.d.ts +2 -0
  116. package/dist/src/config/constants/routing.constants.js +11 -0
  117. package/dist/src/config/define-intor-config.d.ts +2 -0
  118. package/dist/src/config/define-intor-config.js +34 -0
  119. package/dist/src/config/index.d.ts +5 -0
  120. package/dist/src/config/resolvers/resolve-cache-options.d.ts +2 -0
  121. package/dist/src/config/resolvers/resolve-cache-options.js +10 -0
  122. package/dist/src/config/resolvers/resolve-cookie-options.d.ts +11 -0
  123. package/dist/src/config/resolvers/resolve-cookie-options.js +19 -0
  124. package/dist/src/config/resolvers/resolve-fallback-locales.d.ts +3 -0
  125. package/dist/src/config/resolvers/resolve-fallback-locales.js +33 -0
  126. package/dist/src/config/resolvers/resolve-routing-options.d.ts +13 -0
  127. package/dist/src/config/resolvers/resolve-routing-options.js +28 -0
  128. package/dist/src/config/types/cache.types.d.ts +7 -0
  129. package/dist/src/config/types/cookie.types.d.ts +23 -0
  130. package/dist/src/config/types/intor-config.types.d.ts +41 -0
  131. package/dist/src/config/types/loader.types.d.ts +38 -0
  132. package/dist/src/config/types/logger.types.d.ts +7 -0
  133. package/dist/src/config/types/routing.types.d.ts +15 -0
  134. package/dist/src/config/types/translator.types.d.ts +4 -0
  135. package/dist/src/config/validators/validate-default-locale.d.ts +3 -0
  136. package/dist/src/config/validators/validate-default-locale.js +24 -0
  137. package/dist/src/config/validators/validate-supported-locales.d.ts +7 -0
  138. package/dist/src/config/validators/validate-supported-locales.js +22 -0
  139. package/dist/src/server/index.d.ts +4 -0
  140. package/dist/src/server/intor/index.d.ts +2 -0
  141. package/dist/src/server/intor/intor.d.ts +14 -0
  142. package/dist/src/server/intor/intor.js +67 -0
  143. package/dist/src/server/intor/types.d.ts +14 -0
  144. package/dist/src/server/messages/index.d.ts +7 -0
  145. package/dist/src/server/messages/load-local-messages/index.d.ts +2 -0
  146. package/dist/src/server/messages/load-local-messages/load-local-messages.d.ts +11 -0
  147. package/dist/src/server/messages/load-local-messages/load-local-messages.js +85 -0
  148. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +29 -0
  149. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +95 -0
  150. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/index.d.ts +1 -0
  151. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +15 -0
  152. package/dist/src/server/messages/load-local-messages/read-locale-messages/index.d.ts +2 -0
  153. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/index.d.ts +1 -0
  154. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +34 -0
  155. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +85 -0
  156. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +18 -0
  157. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +6 -0
  158. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +12 -0
  159. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +14 -0
  160. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +21 -0
  161. package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +10 -0
  162. package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +31 -0
  163. package/dist/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +23 -0
  164. package/dist/src/server/messages/load-local-messages/types.d.ts +21 -0
  165. package/dist/src/server/messages/load-messages.d.ts +11 -0
  166. package/dist/src/server/messages/load-messages.js +77 -0
  167. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +9 -0
  168. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +50 -0
  169. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/index.d.ts +1 -0
  170. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +13 -0
  171. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +5 -0
  172. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  173. package/dist/src/server/messages/load-remote-messages/index.d.ts +2 -0
  174. package/dist/src/server/messages/load-remote-messages/load-remote-messages.d.ts +9 -0
  175. package/dist/src/server/messages/load-remote-messages/load-remote-messages.js +79 -0
  176. package/dist/src/server/messages/load-remote-messages/types.d.ts +20 -0
  177. package/dist/src/server/messages/shared/global-messages-pool.d.ts +15 -0
  178. package/dist/src/server/messages/shared/global-messages-pool.js +10 -0
  179. package/dist/src/server/messages/shared/types.d.ts +39 -0
  180. package/dist/src/server/messages/shared/utils/is-valid-messages.d.ts +15 -0
  181. package/dist/src/server/messages/shared/utils/is-valid-messages.js +36 -0
  182. package/dist/src/server/messages/types.d.ts +15 -0
  183. package/dist/src/server/shared/logger/get-logger.d.ts +11 -0
  184. package/dist/src/server/shared/logger/get-logger.js +34 -0
  185. package/dist/src/server/shared/logger/global-logger-pool.d.ts +15 -0
  186. package/dist/src/server/shared/logger/global-logger-pool.js +8 -0
  187. package/dist/src/server/translator/get-translator.d.ts +33 -0
  188. package/dist/src/server/translator/get-translator.js +39 -0
  189. package/dist/src/server/translator/index.d.ts +1 -0
  190. package/dist/src/shared/constants/prefix-placeholder.d.ts +1 -0
  191. package/dist/src/shared/constants/prefix-placeholder.js +4 -0
  192. package/dist/src/shared/error/index.d.ts +1 -0
  193. package/dist/src/shared/error/intor-error.d.ts +16 -0
  194. package/dist/src/shared/error/intor-error.js +21 -0
  195. package/dist/src/shared/types/generated.types.d.ts +30 -0
  196. package/dist/src/shared/types/translator-instance.types.d.ts +33 -0
  197. package/dist/src/shared/utils/client/build-cookie-string.d.ts +9 -0
  198. package/dist/src/shared/utils/client/build-cookie-string.js +33 -0
  199. package/dist/src/shared/utils/client/set-locale-cookie-browser.d.ts +13 -0
  200. package/dist/src/shared/utils/client/set-locale-cookie-browser.js +21 -0
  201. package/dist/src/shared/utils/index.d.ts +8 -0
  202. package/dist/src/shared/utils/locale/normalize-locale.d.ts +4 -0
  203. package/dist/src/shared/utils/locale/normalize-locale.js +42 -0
  204. package/dist/src/shared/utils/locale/resolve-preferred-locale.d.ts +5 -0
  205. package/dist/src/shared/utils/locale/resolve-preferred-locale.js +26 -0
  206. package/dist/src/shared/utils/merge-messages.d.ts +6 -0
  207. package/dist/src/shared/utils/merge-messages.js +13 -0
  208. package/dist/src/shared/utils/normalize-cache-key.d.ts +3 -0
  209. package/dist/src/shared/utils/normalize-cache-key.js +29 -0
  210. package/dist/src/shared/utils/pathname/extract-pathname.d.ts +28 -0
  211. package/dist/src/shared/utils/pathname/extract-pathname.js +58 -0
  212. package/dist/src/shared/utils/pathname/normalize-pathname.d.ts +12 -0
  213. package/dist/src/shared/utils/pathname/normalize-pathname.js +43 -0
  214. package/dist/src/shared/utils/pathname/standardize-pathname.d.ts +18 -0
  215. package/dist/src/shared/utils/pathname/standardize-pathname.js +30 -0
  216. package/dist/src/shared/utils/resolve-namespaces.d.ts +10 -0
  217. package/dist/src/shared/utils/resolve-namespaces.js +33 -0
  218. package/package.json +32 -30
  219. package/dist/config/index.cjs +0 -198
  220. package/dist/config/index.d.cts +0 -145
  221. package/dist/config/index.d.ts +0 -145
  222. package/dist/config/index.js +0 -193
  223. package/dist/index.cjs +0 -234
  224. package/dist/index.d.cts +0 -224
  225. package/dist/index.d.ts +0 -224
  226. package/dist/index.js +0 -214
  227. package/dist/next/index.cjs +0 -940
  228. package/dist/next/index.d.cts +0 -282
  229. package/dist/next/index.d.ts +0 -282
  230. package/dist/next/index.js +0 -907
  231. package/dist/next/middleware/index.cjs +0 -387
  232. package/dist/next/middleware/index.d.cts +0 -128
  233. package/dist/next/middleware/index.d.ts +0 -128
  234. package/dist/next/middleware/index.js +0 -384
  235. package/dist/next/server/index.cjs +0 -734
  236. package/dist/next/server/index.d.cts +0 -277
  237. package/dist/next/server/index.d.ts +0 -277
  238. package/dist/next/server/index.js +0 -723
  239. package/dist/react/index.cjs +0 -649
  240. package/dist/react/index.d.cts +0 -224
  241. package/dist/react/index.d.ts +0 -224
  242. package/dist/react/index.js +0 -620
  243. package/dist/server/index.cjs +0 -696
  244. package/dist/server/index.d.cts +0 -377
  245. package/dist/server/index.d.ts +0 -377
  246. package/dist/server/index.js +0 -680
@@ -1,620 +0,0 @@
1
- import * as React7 from 'react';
2
- import { jsx } from 'react/jsx-runtime';
3
- import { logry } from 'logry';
4
- import Keyv from 'keyv';
5
- import merge from 'lodash.merge';
6
- import { Translator } from 'intor-translator';
7
-
8
- // src/client/react/contexts/intor-provider/intor-provider.tsx
9
- var ConfigContext = React7.createContext(void 0);
10
- function ConfigProvider({
11
- value: { config, pathname },
12
- children
13
- }) {
14
- const value = React7.useMemo(() => ({ config, pathname }), [config, pathname]);
15
- return /* @__PURE__ */ jsx(ConfigContext.Provider, { value, children });
16
- }
17
- function useConfig() {
18
- const context = React7.useContext(ConfigContext);
19
- if (!context) throw new Error("useConfig must be used within ConfigProvider");
20
- return context;
21
- }
22
-
23
- // src/shared/utils/client/build-cookie-string.ts
24
- var buildCookieString = (cookie, locale) => {
25
- const parts = [`${cookie.name}=${encodeURIComponent(locale)}`];
26
- if (cookie.maxAge) {
27
- const expires = new Date(Date.now() + cookie.maxAge * 1e3).toUTCString();
28
- parts.push(`expires=${expires}`, `max-age=${cookie.maxAge}`);
29
- }
30
- parts.push(`path=${cookie.path ?? "/"}`);
31
- if (cookie.domain) {
32
- parts.push(`domain=${cookie.domain}`);
33
- }
34
- if (cookie.sameSite) {
35
- parts.push(
36
- `SameSite=${cookie.sameSite[0].toUpperCase()}${cookie.sameSite.slice(1).toLowerCase()}`
37
- );
38
- }
39
- if (cookie.secure !== false) {
40
- parts.push(`Secure`);
41
- }
42
- return parts.join("; ");
43
- };
44
-
45
- // src/shared/utils/client/set-locale-cookie-browser.ts
46
- var setLocaleCookieBrowser = ({
47
- cookie,
48
- locale
49
- }) => {
50
- if (typeof document === "undefined") return;
51
- if (!cookie.enabled || !cookie.autoSetCookie) return;
52
- const cookieString = buildCookieString(cookie, locale);
53
- document.cookie = cookieString;
54
- };
55
-
56
- // src/client/react/contexts/locale/utils/use-init-locale-cookie.ts
57
- var useInitLocaleCookie = ({
58
- config,
59
- locale
60
- }) => {
61
- React7.useEffect(() => {
62
- if (typeof document === "undefined") return;
63
- const { cookie, routing } = config;
64
- const { firstVisit } = routing;
65
- const cookies = document.cookie.split(";").map((c) => c.trim());
66
- const isCookieExists = cookies.some((c) => c.startsWith(`${cookie.name}=`));
67
- if (isCookieExists) return;
68
- if (!firstVisit.redirect) return;
69
- if (!cookie.enabled || !cookie.autoSetCookie) return;
70
- setLocaleCookieBrowser({ cookie, locale });
71
- }, []);
72
- };
73
-
74
- // src/config/constants/cache.constants.ts
75
- var DEFAULT_CACHE_OPTIONS = {
76
- enabled: process.env.NODE_ENV === "production",
77
- ttl: 60 * 60 * 1e3
78
- // 1 hour
79
- };
80
-
81
- // src/server/shared/logger/global-logger-pool.ts
82
- function getGlobalLoggerPool() {
83
- if (!globalThis.__INTOR_LOGGER_POOL__) {
84
- globalThis.__INTOR_LOGGER_POOL__ = /* @__PURE__ */ new Map();
85
- }
86
- return globalThis.__INTOR_LOGGER_POOL__;
87
- }
88
-
89
- // src/server/shared/logger/get-logger.ts
90
- var DEFAULT_FORMATTER_CONFIG = {
91
- node: { meta: { compact: true }, lineBreaksAfter: 1 }
92
- };
93
- function getLogger({
94
- id = "default",
95
- formatterConfig,
96
- preset,
97
- ...options
98
- }) {
99
- const pool = getGlobalLoggerPool();
100
- let logger = pool.get(id);
101
- const useDefault = !formatterConfig && !preset;
102
- if (!logger) {
103
- logger = logry({
104
- id,
105
- formatterConfig: useDefault ? DEFAULT_FORMATTER_CONFIG : formatterConfig,
106
- preset,
107
- ...options
108
- });
109
- pool.set(id, logger);
110
- if (pool.size > 1e3) {
111
- const keys = [...pool.keys()];
112
- for (const key of keys.slice(0, 200)) pool.delete(key);
113
- }
114
- }
115
- return logger;
116
- }
117
-
118
- // src/server/messages/shared/utils/is-valid-messages.ts
119
- function isPlainObject(value) {
120
- return typeof value === "object" && value !== null && !Array.isArray(value);
121
- }
122
- function isValidMessages(value) {
123
- if (!isPlainObject(value)) return false;
124
- const stack = [value];
125
- while (stack.length > 0) {
126
- const current = stack.pop();
127
- for (const v of Object.values(current)) {
128
- if (typeof v === "string") continue;
129
- if (isPlainObject(v)) {
130
- stack.push(v);
131
- } else {
132
- return false;
133
- }
134
- }
135
- }
136
- return true;
137
- }
138
- function getGlobalMessagesPool() {
139
- if (!globalThis.__INTOR_MESSAGES_POOL__) {
140
- globalThis.__INTOR_MESSAGES_POOL__ = new Keyv();
141
- }
142
- return globalThis.__INTOR_MESSAGES_POOL__;
143
- }
144
- var mergeMessages = (staticMessages = {}, loadedMessages = {}) => {
145
- if (!loadedMessages) return { ...staticMessages };
146
- return merge({}, staticMessages, loadedMessages);
147
- };
148
-
149
- // src/shared/utils/normalize-cache-key.ts
150
- var CACHE_KEY_DELIMITER = "|";
151
- var sanitize = (k) => k.replaceAll(/[\u200B-\u200D\uFEFF]/g, "").replaceAll(/[\r\n]/g, "").trim();
152
- var normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
153
- if (key === null || key === void 0) return null;
154
- if (Array.isArray(key)) {
155
- if (key.length === 0) return null;
156
- const normalized = key.map((k) => {
157
- if (k === null) return "__null";
158
- if (k === void 0) return "__undefined";
159
- if (typeof k === "boolean") return k ? "__true" : "__false";
160
- return sanitize(String(k));
161
- });
162
- return normalized.join(delimiter);
163
- }
164
- if (typeof key === "boolean") return key ? "__true" : "__false";
165
- return String(key);
166
- };
167
-
168
- // src/shared/constants/prefix-placeholder.ts
169
- var PREFIX_PLACEHOLDER = "{locale}";
170
-
171
- // src/shared/utils/resolve-namespaces.ts
172
- var resolveNamespaces = ({
173
- config,
174
- pathname
175
- }) => {
176
- const { loader } = config;
177
- const { routeNamespaces = {}, namespaces } = loader || {};
178
- if (Object.keys(routeNamespaces).length === 0 && !namespaces)
179
- return void 0;
180
- const standardizedPathname = standardizePathname({ config, pathname });
181
- const placeholderRemovedPathname = standardizedPathname.replace(
182
- `/${PREFIX_PLACEHOLDER}`,
183
- ""
184
- );
185
- const collected = [
186
- ...routeNamespaces.default || [],
187
- // default
188
- ...namespaces || [],
189
- // default
190
- ...routeNamespaces[standardizedPathname] || [],
191
- // exact match
192
- ...routeNamespaces[placeholderRemovedPathname] || []
193
- // exact match
194
- ];
195
- const prefixPatterns = Object.keys(routeNamespaces).filter(
196
- (pattern) => pattern.endsWith("/*")
197
- );
198
- for (const pattern of prefixPatterns) {
199
- const basePath = pattern.replace(/\/\*$/, "");
200
- if (standardizedPathname.startsWith(basePath) || placeholderRemovedPathname.startsWith(basePath)) {
201
- collected.push(...routeNamespaces[pattern] || []);
202
- }
203
- }
204
- return [...new Set(collected)];
205
- };
206
-
207
- // src/shared/utils/pathname/normalize-pathname.ts
208
- var normalizePathname = (rawPathname, options = {}) => {
209
- const length = rawPathname.length;
210
- let start = 0;
211
- let end = length - 1;
212
- while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
213
- while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
214
- if (start > end) return "/";
215
- let result = "";
216
- let hasSlash = false;
217
- for (let i = start; i <= end; i++) {
218
- const char = rawPathname[i];
219
- if (char === "/") {
220
- if (!hasSlash) {
221
- hasSlash = true;
222
- }
223
- } else {
224
- result += hasSlash || result === "" ? "/" + char : char;
225
- hasSlash = false;
226
- }
227
- }
228
- if (options.removeLeadingSlash && result.startsWith("/")) {
229
- result = result.slice(1);
230
- }
231
- return result || "/";
232
- };
233
-
234
- // src/shared/utils/pathname/standardize-pathname.ts
235
- var standardizePathname = ({
236
- config,
237
- pathname
238
- }) => {
239
- const { routing } = config;
240
- const { basePath } = routing;
241
- const parts = [
242
- normalizePathname(basePath),
243
- PREFIX_PLACEHOLDER,
244
- normalizePathname(pathname)
245
- ];
246
- const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
247
- return normalizePathname(standardizedPathname);
248
- };
249
-
250
- // src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.ts
251
- var fetchLocaleMessages = async ({
252
- remoteUrl,
253
- remoteHeaders,
254
- searchParams,
255
- locale,
256
- extraOptions: { loggerOptions } = {}
257
- }) => {
258
- const baseLogger = getLogger({ ...loggerOptions });
259
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
260
- try {
261
- const params = new URLSearchParams(searchParams);
262
- params.append("locale", locale);
263
- const url = `${remoteUrl}?${params.toString()}`;
264
- const headers = {
265
- "Content-Type": "application/json",
266
- ...remoteHeaders
267
- };
268
- const response = await fetch(url, {
269
- method: "GET",
270
- headers,
271
- cache: "no-store"
272
- });
273
- if (!response.ok) {
274
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
275
- }
276
- const data = await response.json();
277
- if (!isValidMessages(data[locale])) {
278
- throw new Error("JSON file does not match NamespaceMessages structure");
279
- }
280
- return data;
281
- } catch (error) {
282
- logger.warn("Fetching locale messages failed.", {
283
- locale,
284
- remoteUrl,
285
- searchParams: decodeURIComponent(searchParams.toString()),
286
- error
287
- });
288
- return;
289
- }
290
- };
291
-
292
- // src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.ts
293
- var buildSearchParams = (params) => {
294
- const searchParams = new URLSearchParams();
295
- const appendParam = (key, value) => {
296
- if (value === void 0 || value === null) return;
297
- if (Array.isArray(value) && value.length === 0) return;
298
- if (Array.isArray(value)) {
299
- value.forEach((v) => v && searchParams.append(key, v));
300
- } else {
301
- searchParams.append(key, value);
302
- }
303
- };
304
- Object.entries(params).forEach(([key, value]) => {
305
- appendParam(key, value);
306
- });
307
- return searchParams;
308
- };
309
-
310
- // src/server/messages/load-remote-messages/load-remote-messages.ts
311
- var loadRemoteMessages = async ({
312
- pool = getGlobalMessagesPool(),
313
- rootDir,
314
- remoteUrl,
315
- remoteHeaders,
316
- locale,
317
- fallbackLocales = [],
318
- namespaces = [],
319
- extraOptions: {
320
- cacheOptions = DEFAULT_CACHE_OPTIONS,
321
- loggerOptions = { id: "default" }
322
- } = {},
323
- allowCacheWrite
324
- }) => {
325
- const baseLogger = getLogger({ ...loggerOptions });
326
- const logger = baseLogger.child({ scope: "load-remote-messages" });
327
- const start = performance.now();
328
- logger.debug("Loading remote messages from api.", { remoteUrl });
329
- const key = normalizeCacheKey([
330
- loggerOptions.id,
331
- "loaderType:remote",
332
- rootDir,
333
- locale,
334
- (fallbackLocales ?? []).toSorted().join(","),
335
- (namespaces ?? []).toSorted().join(",")
336
- ]);
337
- if (cacheOptions.enabled && key) {
338
- const cached = await pool?.get(key);
339
- if (cached) {
340
- logger.debug("Messages cache hit.", { key });
341
- return cached;
342
- }
343
- }
344
- const searchParams = buildSearchParams({ rootDir, namespaces });
345
- const candidateLocales = [locale, ...fallbackLocales || []];
346
- let messages;
347
- for (const candidateLocale of candidateLocales) {
348
- try {
349
- const result = await fetchLocaleMessages({
350
- remoteUrl,
351
- remoteHeaders,
352
- searchParams,
353
- locale: candidateLocale,
354
- extraOptions: { loggerOptions }
355
- });
356
- if (result && Object.values(result[candidateLocale] || {}).length > 0) {
357
- messages = result;
358
- break;
359
- }
360
- } catch (error) {
361
- logger.error("Failed to fetch locale messages.", {
362
- locale: candidateLocale,
363
- error
364
- });
365
- }
366
- }
367
- if (allowCacheWrite && cacheOptions.enabled && key && messages) {
368
- await pool?.set(key, messages, cacheOptions.ttl);
369
- }
370
- const end = performance.now();
371
- const duration = Math.round(end - start);
372
- logger.trace("Finished loading remote messages.", {
373
- loadedLocale: messages ? Object.keys(messages)[0] : void 0,
374
- duration: `${duration} ms`
375
- });
376
- return messages;
377
- };
378
-
379
- // src/client/react/contexts/messages/utils/use-refetch-messages.ts
380
- var useRefetchMessages = ({
381
- config,
382
- pathname,
383
- setLoadedMessages,
384
- setIsLoadingMessages
385
- }) => {
386
- const { messages: staticMessages, loader } = config;
387
- const namespaces = React7.useMemo(() => {
388
- if (!loader) return [];
389
- return resolveNamespaces({ config, pathname });
390
- }, [config, pathname]);
391
- const refetchMessages = React7.useCallback(
392
- async (newLocale) => {
393
- if (loader?.type === "remote") {
394
- setIsLoadingMessages(true);
395
- const loadedMessages = await loadRemoteMessages({
396
- rootDir: loader.rootDir,
397
- remoteUrl: loader.remoteUrl,
398
- remoteHeaders: loader.remoteHeaders,
399
- locale: newLocale,
400
- fallbackLocales: config.fallbackLocales[newLocale] || [],
401
- namespaces,
402
- extraOptions: {
403
- cacheOptions: config.cache,
404
- loggerOptions: { id: config.id }
405
- }
406
- });
407
- const messages = mergeMessages(staticMessages, loadedMessages);
408
- setLoadedMessages(messages);
409
- setIsLoadingMessages(false);
410
- }
411
- },
412
- [
413
- loader,
414
- config.fallbackLocales,
415
- config.cache,
416
- config.id,
417
- setIsLoadingMessages,
418
- namespaces,
419
- staticMessages,
420
- setLoadedMessages
421
- ]
422
- );
423
- return { refetchMessages };
424
- };
425
- var MessagesContext = React7.createContext(void 0);
426
- function MessagesProvider({
427
- value: { messages = {} },
428
- children
429
- }) {
430
- const { config, pathname } = useConfig();
431
- const [loadedMessages, setLoadedMessages] = React7.useState(null);
432
- const [isLoadingMessages, setIsLoadingMessages] = React7.useState(false);
433
- const { refetchMessages } = useRefetchMessages({
434
- config,
435
- pathname,
436
- setLoadedMessages,
437
- setIsLoadingMessages
438
- });
439
- const value = React7.useMemo(
440
- () => ({
441
- messages: loadedMessages || messages,
442
- isLoading: isLoadingMessages,
443
- setLoadedMessages,
444
- setIsLoadingMessages,
445
- refetchMessages
446
- }),
447
- [loadedMessages, messages, isLoadingMessages, refetchMessages]
448
- );
449
- return /* @__PURE__ */ jsx(MessagesContext.Provider, { value, children });
450
- }
451
- function useMessages() {
452
- const context = React7.useContext(MessagesContext);
453
- if (!context)
454
- throw new Error("useMessages must be used within a MessagesProvider");
455
- return context;
456
- }
457
- var LocaleContext = React7.createContext(void 0);
458
-
459
- // src/client/react/contexts/locale/utils/change-locale.ts
460
- var changeLocale = ({
461
- currentLocale,
462
- newLocale,
463
- loader,
464
- cookie,
465
- setLocale,
466
- refetchMessages
467
- }) => {
468
- if (typeof document === "undefined") return;
469
- const { type } = loader || {};
470
- if (newLocale === currentLocale) return;
471
- if (type === "local") {
472
- console.warn(
473
- `[Intor] You are using "loader type: local" to switch languages. Please make sure to use the wrapped <Link> component to trigger a page reload, ensuring that the translation data is dynamically updated.`
474
- );
475
- }
476
- setLocale(newLocale);
477
- setLocaleCookieBrowser({ cookie, locale: newLocale });
478
- document.documentElement.lang = newLocale;
479
- if (type === "remote" && refetchMessages) {
480
- void refetchMessages(newLocale);
481
- }
482
- };
483
- function LocaleProvider({
484
- value: { initialLocale, onLocaleChange },
485
- children
486
- }) {
487
- const { config } = useConfig();
488
- const { refetchMessages } = useMessages();
489
- const { loader, cookie } = config;
490
- const [currentLocale, setCurrentLocale] = React7.useState(initialLocale);
491
- useInitLocaleCookie({ config, locale: initialLocale });
492
- const setLocale = React7.useCallback(
493
- async (newLocale) => {
494
- changeLocale({
495
- currentLocale,
496
- newLocale,
497
- loader,
498
- cookie,
499
- setLocale: setCurrentLocale,
500
- refetchMessages
501
- });
502
- onLocaleChange?.(newLocale);
503
- },
504
- [currentLocale, loader, cookie, refetchMessages, onLocaleChange]
505
- );
506
- const value = React7.useMemo(
507
- () => ({
508
- locale: currentLocale,
509
- setLocale
510
- }),
511
- [currentLocale, setLocale]
512
- );
513
- return /* @__PURE__ */ jsx(LocaleContext.Provider, { value, children });
514
- }
515
- function useLocale() {
516
- const context = React7.useContext(LocaleContext);
517
- if (!context)
518
- throw new Error("useLocale must be used within a LocaleProvider");
519
- return context;
520
- }
521
- var TranslateHandlersContext = React7.createContext(void 0);
522
- var TranslateHandlersProvider = ({
523
- handlers,
524
- children
525
- }) => {
526
- return /* @__PURE__ */ jsx(TranslateHandlersContext.Provider, { value: handlers, children });
527
- };
528
- function useTranslateHandlers() {
529
- const context = React7.useContext(TranslateHandlersContext);
530
- return context;
531
- }
532
- var TranslatorContext = React7.createContext(void 0);
533
- function TranslatorProvider({
534
- value: { isLoading: externalIsLoading },
535
- children
536
- }) {
537
- const { config } = useConfig();
538
- const { messages, isLoading: internalIsLoading } = useMessages();
539
- const { locale } = useLocale();
540
- const translateHandlers = useTranslateHandlers();
541
- const { fallbackLocales, translator: translatorOptions } = config;
542
- const isLoading = Boolean(externalIsLoading ?? internalIsLoading);
543
- const translator = React7.useMemo(() => {
544
- return new Translator({
545
- messages,
546
- locale,
547
- isLoading,
548
- fallbackLocales,
549
- loadingMessage: translatorOptions?.loadingMessage,
550
- placeholder: translatorOptions?.placeholder,
551
- handlers: translateHandlers
552
- });
553
- }, [
554
- messages,
555
- locale,
556
- isLoading,
557
- fallbackLocales,
558
- translateHandlers,
559
- translatorOptions?.loadingMessage,
560
- translatorOptions?.placeholder
561
- ]);
562
- return /* @__PURE__ */ jsx(TranslatorContext.Provider, { value: { translator }, children });
563
- }
564
- function useTranslator() {
565
- const context = React7.useContext(TranslatorContext);
566
- if (!context)
567
- throw new Error(
568
- "useTranslator must be used within IntorTranslatorProvider"
569
- );
570
- return context;
571
- }
572
- var IntorProvider = ({
573
- value: {
574
- config,
575
- pathname = "",
576
- initialLocale,
577
- messages = config.messages,
578
- onLocaleChange,
579
- isLoading
580
- },
581
- children
582
- }) => {
583
- return /* @__PURE__ */ jsx(ConfigProvider, { value: { config, pathname }, children: /* @__PURE__ */ jsx(MessagesProvider, { value: { messages }, children: /* @__PURE__ */ jsx(LocaleProvider, { value: { initialLocale, onLocaleChange }, children: /* @__PURE__ */ jsx(TranslatorProvider, { value: { isLoading }, children }) }) }) });
584
- };
585
-
586
- // src/client/react/hooks/use-translator.ts
587
- function useTranslator2(preKey) {
588
- const { translator } = useTranslator();
589
- const { setLocale } = useLocale();
590
- const props = {
591
- messages: translator.messages,
592
- locale: translator.locale,
593
- isLoading: translator.isLoading,
594
- setLocale
595
- };
596
- const scoped = translator.scoped(preKey);
597
- return {
598
- ...props,
599
- hasKey: preKey ? scoped.hasKey : translator.hasKey,
600
- t: preKey ? scoped.t : translator.t
601
- };
602
- }
603
-
604
- // src/client/shared/utils/get-initial-locale.ts
605
- function getInitialLocale(config, cookieName = config.cookie.name) {
606
- const { defaultLocale, supportedLocales } = config;
607
- const match = document.cookie.match(
608
- new RegExp(
609
- `(?:^|; )${cookieName.replaceAll(/([.$?*|{}()[\]\\/+^])/g, String.raw`\$1`)}=([^;]*)`
610
- )
611
- );
612
- const cookieLocale = match ? decodeURIComponent(match[1]) : null;
613
- const browserLocale = navigator.languages?.[0] || navigator.language;
614
- const locale = cookieLocale || browserLocale || defaultLocale;
615
- const normalized = locale.toLowerCase();
616
- const matched = supportedLocales.find((l) => l.toLowerCase() === normalized);
617
- return matched ?? defaultLocale;
618
- }
619
-
620
- export { IntorProvider, TranslateHandlersProvider, getInitialLocale, useTranslator2 as useTranslator };