intor 2.2.14 → 2.2.15

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/middleware/index.d.ts +2 -0
  8. package/dist/exports/next/middleware/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/middleware/handle-prefix/handle-prefix-all.d.ts +12 -0
  16. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-all.js +60 -0
  17. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-except-default.d.ts +16 -0
  18. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-except-default.js +81 -0
  19. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-none.d.ts +10 -0
  20. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-none.js +22 -0
  21. package/dist/src/adapters/next/middleware/index.d.ts +2 -0
  22. package/dist/src/adapters/next/middleware/intor-middleware.d.ts +6 -0
  23. package/dist/src/adapters/next/middleware/intor-middleware.js +22 -0
  24. package/dist/src/adapters/next/middleware/utils/create-response.d.ts +17 -0
  25. package/dist/src/adapters/next/middleware/utils/create-response.js +42 -0
  26. package/dist/src/adapters/next/middleware/utils/determine-initial-locale.d.ts +8 -0
  27. package/dist/src/adapters/next/middleware/utils/determine-initial-locale.js +28 -0
  28. package/dist/src/adapters/next/middleware/utils/set-locale-cookie-edge.d.ts +15 -0
  29. package/dist/src/adapters/next/middleware/utils/set-locale-cookie-edge.js +24 -0
  30. package/dist/src/adapters/next/middleware/utils/set-pathname-header.d.ts +12 -0
  31. package/dist/src/adapters/next/middleware/utils/set-pathname-header.js +13 -0
  32. package/dist/src/adapters/next/navigation/index.d.ts +4 -0
  33. package/dist/src/adapters/next/navigation/link.d.ts +16 -0
  34. package/dist/src/adapters/next/navigation/link.js +25 -0
  35. package/dist/src/adapters/next/navigation/redirect.d.ts +16 -0
  36. package/dist/src/adapters/next/navigation/redirect.js +36 -0
  37. package/dist/src/adapters/next/navigation/use-pathname.d.ts +17 -0
  38. package/dist/src/adapters/next/navigation/use-pathname.js +49 -0
  39. package/dist/src/adapters/next/navigation/use-router.d.ts +20 -0
  40. package/dist/src/adapters/next/navigation/use-router.js +31 -0
  41. package/dist/src/adapters/next/navigation/utils/should-full-reload.d.ts +7 -0
  42. package/dist/src/adapters/next/navigation/utils/should-full-reload.js +19 -0
  43. package/dist/src/adapters/next/navigation/utils/use-locale-switch.d.ts +16 -0
  44. package/dist/src/adapters/next/navigation/utils/use-locale-switch.js +58 -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 +28 -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,940 +0,0 @@
1
- 'use strict';
2
-
3
- var formatUrl = require('next/dist/shared/lib/router/utils/format-url');
4
- var NextLink = require('next/link');
5
- var React7 = require('react');
6
- var navigation = require('next/navigation');
7
- var merge = require('lodash.merge');
8
- var jsxRuntime = require('react/jsx-runtime');
9
- var logry = require('logry');
10
- var Keyv = require('keyv');
11
- var headers = require('next/headers');
12
- var intorTranslator = require('intor-translator');
13
-
14
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
-
16
- function _interopNamespace(e) {
17
- if (e && e.__esModule) return e;
18
- var n = Object.create(null);
19
- if (e) {
20
- Object.keys(e).forEach(function (k) {
21
- if (k !== 'default') {
22
- var d = Object.getOwnPropertyDescriptor(e, k);
23
- Object.defineProperty(n, k, d.get ? d : {
24
- enumerable: true,
25
- get: function () { return e[k]; }
26
- });
27
- }
28
- });
29
- }
30
- n.default = e;
31
- return Object.freeze(n);
32
- }
33
-
34
- var NextLink__default = /*#__PURE__*/_interopDefault(NextLink);
35
- var React7__namespace = /*#__PURE__*/_interopNamespace(React7);
36
- var merge__default = /*#__PURE__*/_interopDefault(merge);
37
- var Keyv__default = /*#__PURE__*/_interopDefault(Keyv);
38
-
39
- // src/adapters/next/navigation/link.tsx
40
-
41
- // src/shared/constants/prefix-placeholder.ts
42
- var PREFIX_PLACEHOLDER = "{locale}";
43
- var mergeMessages = (staticMessages = {}, loadedMessages = {}) => {
44
- if (!loadedMessages) return { ...staticMessages };
45
- return merge__default.default({}, staticMessages, loadedMessages);
46
- };
47
-
48
- // src/shared/utils/normalize-cache-key.ts
49
- var CACHE_KEY_DELIMITER = "|";
50
- var sanitize = (k) => k.replaceAll(/[\u200B-\u200D\uFEFF]/g, "").replaceAll(/[\r\n]/g, "").trim();
51
- var normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
52
- if (key === null || key === void 0) return null;
53
- if (Array.isArray(key)) {
54
- if (key.length === 0) return null;
55
- const normalized = key.map((k) => {
56
- if (k === null) return "__null";
57
- if (k === void 0) return "__undefined";
58
- if (typeof k === "boolean") return k ? "__true" : "__false";
59
- return sanitize(String(k));
60
- });
61
- return normalized.join(delimiter);
62
- }
63
- if (typeof key === "boolean") return key ? "__true" : "__false";
64
- return String(key);
65
- };
66
-
67
- // src/shared/utils/resolve-namespaces.ts
68
- var resolveNamespaces = ({
69
- config,
70
- pathname
71
- }) => {
72
- const { loader } = config;
73
- const { routeNamespaces = {}, namespaces } = loader || {};
74
- if (Object.keys(routeNamespaces).length === 0 && !namespaces)
75
- return void 0;
76
- const standardizedPathname = standardizePathname({ config, pathname });
77
- const placeholderRemovedPathname = standardizedPathname.replace(
78
- `/${PREFIX_PLACEHOLDER}`,
79
- ""
80
- );
81
- const collected = [
82
- ...routeNamespaces.default || [],
83
- // default
84
- ...namespaces || [],
85
- // default
86
- ...routeNamespaces[standardizedPathname] || [],
87
- // exact match
88
- ...routeNamespaces[placeholderRemovedPathname] || []
89
- // exact match
90
- ];
91
- const prefixPatterns = Object.keys(routeNamespaces).filter(
92
- (pattern) => pattern.endsWith("/*")
93
- );
94
- for (const pattern of prefixPatterns) {
95
- const basePath = pattern.replace(/\/\*$/, "");
96
- if (standardizedPathname.startsWith(basePath) || placeholderRemovedPathname.startsWith(basePath)) {
97
- collected.push(...routeNamespaces[pattern] || []);
98
- }
99
- }
100
- return [...new Set(collected)];
101
- };
102
-
103
- // src/shared/utils/locale/normalize-locale.ts
104
- var toCanonical = (input) => {
105
- try {
106
- return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
107
- } catch {
108
- return;
109
- }
110
- };
111
- var normalizeLocale = (locale = "", supportedLocales = []) => {
112
- if (!locale || supportedLocales.length === 0) return;
113
- const canonicalLocale = toCanonical(locale);
114
- if (!canonicalLocale) return;
115
- const supportedCanonicalMap = /* @__PURE__ */ new Map();
116
- for (const l of supportedLocales) {
117
- const normalized = toCanonical(l);
118
- if (normalized) {
119
- supportedCanonicalMap.set(normalized, l);
120
- }
121
- }
122
- if (supportedCanonicalMap.has(canonicalLocale)) {
123
- return supportedCanonicalMap.get(canonicalLocale);
124
- }
125
- const baseLang = canonicalLocale.split("-")[0];
126
- for (const [key, original] of supportedCanonicalMap) {
127
- const supportedBase = key.split("-")[0];
128
- if (supportedBase === baseLang) {
129
- return original;
130
- }
131
- }
132
- return;
133
- };
134
-
135
- // src/shared/utils/locale/resolve-preferred-locale.ts
136
- var resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
137
- if (!acceptLanguageHeader || !supportedLocales || supportedLocales.length === 0) {
138
- return;
139
- }
140
- const supportedLocalesSet = new Set(supportedLocales);
141
- const preferred = acceptLanguageHeader.split(",").map((part) => {
142
- const [lang, qValue] = part.split(";");
143
- const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
144
- if (Number.isNaN(q)) {
145
- return { lang: lang.trim(), q: 0 };
146
- }
147
- return { lang: lang.trim(), q };
148
- }).toSorted((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
149
- return preferred;
150
- };
151
-
152
- // src/shared/utils/pathname/normalize-pathname.ts
153
- var normalizePathname = (rawPathname, options = {}) => {
154
- const length = rawPathname.length;
155
- let start = 0;
156
- let end = length - 1;
157
- while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
158
- while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
159
- if (start > end) return "/";
160
- let result = "";
161
- let hasSlash = false;
162
- for (let i = start; i <= end; i++) {
163
- const char = rawPathname[i];
164
- if (char === "/") {
165
- if (!hasSlash) {
166
- hasSlash = true;
167
- }
168
- } else {
169
- result += hasSlash || result === "" ? "/" + char : char;
170
- hasSlash = false;
171
- }
172
- }
173
- if (options.removeLeadingSlash && result.startsWith("/")) {
174
- result = result.slice(1);
175
- }
176
- return result || "/";
177
- };
178
-
179
- // src/shared/utils/pathname/extract-pathname.ts
180
- var extractPathname = ({
181
- config,
182
- pathname: rawPathname
183
- }) => {
184
- const { routing, defaultLocale } = config;
185
- const { basePath, prefix } = routing;
186
- const normalizedPathname = normalizePathname(rawPathname);
187
- let prefixedPathname = normalizedPathname;
188
- if (basePath && normalizedPathname.startsWith(basePath + "/")) {
189
- prefixedPathname = normalizedPathname.slice(basePath.length) || "/";
190
- } else if (basePath && normalizedPathname === basePath) {
191
- prefixedPathname = "/";
192
- }
193
- const pathPart = prefixedPathname.split("/").find(Boolean);
194
- const maybeLocale = pathPart || "";
195
- const isLocalePrefixed = config.supportedLocales?.includes(maybeLocale);
196
- let unprefixedPathname = prefixedPathname;
197
- if (prefix === "all") {
198
- if (isLocalePrefixed) {
199
- unprefixedPathname = prefixedPathname.slice(maybeLocale.length + 1) || "/";
200
- }
201
- } else if (prefix === "except-default") {
202
- if (maybeLocale && maybeLocale !== defaultLocale && isLocalePrefixed) {
203
- unprefixedPathname = prefixedPathname.slice(maybeLocale.length + 1) || "/";
204
- }
205
- }
206
- return {
207
- basePath,
208
- prefixedPathname,
209
- unprefixedPathname,
210
- maybeLocale,
211
- isLocalePrefixed: Boolean(isLocalePrefixed)
212
- };
213
- };
214
-
215
- // src/shared/utils/pathname/standardize-pathname.ts
216
- var standardizePathname = ({
217
- config,
218
- pathname
219
- }) => {
220
- const { routing } = config;
221
- const { basePath } = routing;
222
- const parts = [
223
- normalizePathname(basePath),
224
- PREFIX_PLACEHOLDER,
225
- normalizePathname(pathname)
226
- ];
227
- const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
228
- return normalizePathname(standardizedPathname);
229
- };
230
-
231
- // src/adapters/next/shared/utils/locale-prefix-pathname.ts
232
- var localePrefixPathname = ({
233
- config,
234
- pathname: standardizedPathname,
235
- locale
236
- }) => {
237
- const { routing } = config;
238
- const { prefix } = routing;
239
- if (prefix !== "none" && !locale) {
240
- throw new Error('No locale when using prefix "all", "except-default"');
241
- }
242
- if (prefix === "all") {
243
- return normalizePathname(
244
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
245
- );
246
- }
247
- if (prefix === "except-default") {
248
- return locale === config.defaultLocale ? normalizePathname(
249
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
250
- ) : normalizePathname(
251
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
252
- );
253
- }
254
- return normalizePathname(
255
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
256
- );
257
- };
258
-
259
- // src/adapters/next/shared/utils/localize-pathname.ts
260
- var localizePathname = ({
261
- config,
262
- pathname: rawPathname,
263
- locale
264
- }) => {
265
- const { unprefixedPathname } = extractPathname({
266
- config,
267
- pathname: rawPathname
268
- });
269
- const standardizedPathname = standardizePathname({
270
- config,
271
- pathname: unprefixedPathname
272
- });
273
- const localePrefixedPathname = localePrefixPathname({
274
- config,
275
- pathname: standardizedPathname,
276
- locale
277
- });
278
- return {
279
- unprefixedPathname,
280
- standardizedPathname,
281
- localePrefixedPathname
282
- };
283
- };
284
- var ConfigContext = React7__namespace.createContext(void 0);
285
- function ConfigProvider({
286
- value: { config, pathname },
287
- children
288
- }) {
289
- const value = React7__namespace.useMemo(() => ({ config, pathname }), [config, pathname]);
290
- return /* @__PURE__ */ jsxRuntime.jsx(ConfigContext.Provider, { value, children });
291
- }
292
- function useConfig() {
293
- const context = React7__namespace.useContext(ConfigContext);
294
- if (!context) throw new Error("useConfig must be used within ConfigProvider");
295
- return context;
296
- }
297
-
298
- // src/shared/utils/client/build-cookie-string.ts
299
- var buildCookieString = (cookie, locale) => {
300
- const parts = [`${cookie.name}=${encodeURIComponent(locale)}`];
301
- if (cookie.maxAge) {
302
- const expires = new Date(Date.now() + cookie.maxAge * 1e3).toUTCString();
303
- parts.push(`expires=${expires}`, `max-age=${cookie.maxAge}`);
304
- }
305
- parts.push(`path=${cookie.path ?? "/"}`);
306
- if (cookie.domain) {
307
- parts.push(`domain=${cookie.domain}`);
308
- }
309
- if (cookie.sameSite) {
310
- parts.push(
311
- `SameSite=${cookie.sameSite[0].toUpperCase()}${cookie.sameSite.slice(1).toLowerCase()}`
312
- );
313
- }
314
- if (cookie.secure !== false) {
315
- parts.push(`Secure`);
316
- }
317
- return parts.join("; ");
318
- };
319
-
320
- // src/shared/utils/client/set-locale-cookie-browser.ts
321
- var setLocaleCookieBrowser = ({
322
- cookie,
323
- locale
324
- }) => {
325
- if (typeof document === "undefined") return;
326
- if (!cookie.enabled || !cookie.autoSetCookie) return;
327
- const cookieString = buildCookieString(cookie, locale);
328
- document.cookie = cookieString;
329
- };
330
-
331
- // src/client/react/contexts/locale/utils/use-init-locale-cookie.ts
332
- var useInitLocaleCookie = ({
333
- config,
334
- locale
335
- }) => {
336
- React7__namespace.useEffect(() => {
337
- if (typeof document === "undefined") return;
338
- const { cookie, routing } = config;
339
- const { firstVisit } = routing;
340
- const cookies2 = document.cookie.split(";").map((c) => c.trim());
341
- const isCookieExists = cookies2.some((c) => c.startsWith(`${cookie.name}=`));
342
- if (isCookieExists) return;
343
- if (!firstVisit.redirect) return;
344
- if (!cookie.enabled || !cookie.autoSetCookie) return;
345
- setLocaleCookieBrowser({ cookie, locale });
346
- }, []);
347
- };
348
-
349
- // src/config/constants/cache.constants.ts
350
- var DEFAULT_CACHE_OPTIONS = {
351
- enabled: process.env.NODE_ENV === "production",
352
- ttl: 60 * 60 * 1e3
353
- // 1 hour
354
- };
355
-
356
- // src/server/shared/logger/global-logger-pool.ts
357
- function getGlobalLoggerPool() {
358
- if (!globalThis.__INTOR_LOGGER_POOL__) {
359
- globalThis.__INTOR_LOGGER_POOL__ = /* @__PURE__ */ new Map();
360
- }
361
- return globalThis.__INTOR_LOGGER_POOL__;
362
- }
363
-
364
- // src/server/shared/logger/get-logger.ts
365
- var DEFAULT_FORMATTER_CONFIG = {
366
- node: { meta: { compact: true }, lineBreaksAfter: 1 }
367
- };
368
- function getLogger({
369
- id = "default",
370
- formatterConfig,
371
- preset,
372
- ...options
373
- }) {
374
- const pool = getGlobalLoggerPool();
375
- let logger = pool.get(id);
376
- const useDefault = !formatterConfig && !preset;
377
- if (!logger) {
378
- logger = logry.logry({
379
- id,
380
- formatterConfig: useDefault ? DEFAULT_FORMATTER_CONFIG : formatterConfig,
381
- preset,
382
- ...options
383
- });
384
- pool.set(id, logger);
385
- if (pool.size > 1e3) {
386
- const keys = [...pool.keys()];
387
- for (const key of keys.slice(0, 200)) pool.delete(key);
388
- }
389
- }
390
- return logger;
391
- }
392
-
393
- // src/server/messages/shared/utils/is-valid-messages.ts
394
- function isPlainObject(value) {
395
- return typeof value === "object" && value !== null && !Array.isArray(value);
396
- }
397
- function isValidMessages(value) {
398
- if (!isPlainObject(value)) return false;
399
- const stack = [value];
400
- while (stack.length > 0) {
401
- const current = stack.pop();
402
- for (const v of Object.values(current)) {
403
- if (typeof v === "string") continue;
404
- if (isPlainObject(v)) {
405
- stack.push(v);
406
- } else {
407
- return false;
408
- }
409
- }
410
- }
411
- return true;
412
- }
413
- function getGlobalMessagesPool() {
414
- if (!globalThis.__INTOR_MESSAGES_POOL__) {
415
- globalThis.__INTOR_MESSAGES_POOL__ = new Keyv__default.default();
416
- }
417
- return globalThis.__INTOR_MESSAGES_POOL__;
418
- }
419
-
420
- // src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.ts
421
- var fetchLocaleMessages = async ({
422
- remoteUrl,
423
- remoteHeaders,
424
- searchParams,
425
- locale,
426
- extraOptions: { loggerOptions } = {}
427
- }) => {
428
- const baseLogger = getLogger({ ...loggerOptions });
429
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
430
- try {
431
- const params = new URLSearchParams(searchParams);
432
- params.append("locale", locale);
433
- const url = `${remoteUrl}?${params.toString()}`;
434
- const headers2 = {
435
- "Content-Type": "application/json",
436
- ...remoteHeaders
437
- };
438
- const response = await fetch(url, {
439
- method: "GET",
440
- headers: headers2,
441
- cache: "no-store"
442
- });
443
- if (!response.ok) {
444
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
445
- }
446
- const data = await response.json();
447
- if (!isValidMessages(data[locale])) {
448
- throw new Error("JSON file does not match NamespaceMessages structure");
449
- }
450
- return data;
451
- } catch (error) {
452
- logger.warn("Fetching locale messages failed.", {
453
- locale,
454
- remoteUrl,
455
- searchParams: decodeURIComponent(searchParams.toString()),
456
- error
457
- });
458
- return;
459
- }
460
- };
461
-
462
- // src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.ts
463
- var buildSearchParams = (params) => {
464
- const searchParams = new URLSearchParams();
465
- const appendParam = (key, value) => {
466
- if (value === void 0 || value === null) return;
467
- if (Array.isArray(value) && value.length === 0) return;
468
- if (Array.isArray(value)) {
469
- value.forEach((v) => v && searchParams.append(key, v));
470
- } else {
471
- searchParams.append(key, value);
472
- }
473
- };
474
- Object.entries(params).forEach(([key, value]) => {
475
- appendParam(key, value);
476
- });
477
- return searchParams;
478
- };
479
-
480
- // src/server/messages/load-remote-messages/load-remote-messages.ts
481
- var loadRemoteMessages = async ({
482
- pool = getGlobalMessagesPool(),
483
- rootDir,
484
- remoteUrl,
485
- remoteHeaders,
486
- locale,
487
- fallbackLocales = [],
488
- namespaces = [],
489
- extraOptions: {
490
- cacheOptions = DEFAULT_CACHE_OPTIONS,
491
- loggerOptions = { id: "default" }
492
- } = {},
493
- allowCacheWrite
494
- }) => {
495
- const baseLogger = getLogger({ ...loggerOptions });
496
- const logger = baseLogger.child({ scope: "load-remote-messages" });
497
- const start = performance.now();
498
- logger.debug("Loading remote messages from api.", { remoteUrl });
499
- const key = normalizeCacheKey([
500
- loggerOptions.id,
501
- "loaderType:remote",
502
- rootDir,
503
- locale,
504
- (fallbackLocales ?? []).toSorted().join(","),
505
- (namespaces ?? []).toSorted().join(",")
506
- ]);
507
- if (cacheOptions.enabled && key) {
508
- const cached = await pool?.get(key);
509
- if (cached) {
510
- logger.debug("Messages cache hit.", { key });
511
- return cached;
512
- }
513
- }
514
- const searchParams = buildSearchParams({ rootDir, namespaces });
515
- const candidateLocales = [locale, ...fallbackLocales || []];
516
- let messages;
517
- for (const candidateLocale of candidateLocales) {
518
- try {
519
- const result = await fetchLocaleMessages({
520
- remoteUrl,
521
- remoteHeaders,
522
- searchParams,
523
- locale: candidateLocale,
524
- extraOptions: { loggerOptions }
525
- });
526
- if (result && Object.values(result[candidateLocale] || {}).length > 0) {
527
- messages = result;
528
- break;
529
- }
530
- } catch (error) {
531
- logger.error("Failed to fetch locale messages.", {
532
- locale: candidateLocale,
533
- error
534
- });
535
- }
536
- }
537
- if (allowCacheWrite && cacheOptions.enabled && key && messages) {
538
- await pool?.set(key, messages, cacheOptions.ttl);
539
- }
540
- const end = performance.now();
541
- const duration = Math.round(end - start);
542
- logger.trace("Finished loading remote messages.", {
543
- loadedLocale: messages ? Object.keys(messages)[0] : void 0,
544
- duration: `${duration} ms`
545
- });
546
- return messages;
547
- };
548
-
549
- // src/client/react/contexts/messages/utils/use-refetch-messages.ts
550
- var useRefetchMessages = ({
551
- config,
552
- pathname,
553
- setLoadedMessages,
554
- setIsLoadingMessages
555
- }) => {
556
- const { messages: staticMessages, loader } = config;
557
- const namespaces = React7__namespace.useMemo(() => {
558
- if (!loader) return [];
559
- return resolveNamespaces({ config, pathname });
560
- }, [config, pathname]);
561
- const refetchMessages = React7__namespace.useCallback(
562
- async (newLocale) => {
563
- if (loader?.type === "remote") {
564
- setIsLoadingMessages(true);
565
- const loadedMessages = await loadRemoteMessages({
566
- rootDir: loader.rootDir,
567
- remoteUrl: loader.remoteUrl,
568
- remoteHeaders: loader.remoteHeaders,
569
- locale: newLocale,
570
- fallbackLocales: config.fallbackLocales[newLocale] || [],
571
- namespaces,
572
- extraOptions: {
573
- cacheOptions: config.cache,
574
- loggerOptions: { id: config.id }
575
- }
576
- });
577
- const messages = mergeMessages(staticMessages, loadedMessages);
578
- setLoadedMessages(messages);
579
- setIsLoadingMessages(false);
580
- }
581
- },
582
- [
583
- loader,
584
- config.fallbackLocales,
585
- config.cache,
586
- config.id,
587
- setIsLoadingMessages,
588
- namespaces,
589
- staticMessages,
590
- setLoadedMessages
591
- ]
592
- );
593
- return { refetchMessages };
594
- };
595
- var MessagesContext = React7__namespace.createContext(void 0);
596
- function MessagesProvider({
597
- value: { messages = {} },
598
- children
599
- }) {
600
- const { config, pathname } = useConfig();
601
- const [loadedMessages, setLoadedMessages] = React7__namespace.useState(null);
602
- const [isLoadingMessages, setIsLoadingMessages] = React7__namespace.useState(false);
603
- const { refetchMessages } = useRefetchMessages({
604
- config,
605
- pathname,
606
- setLoadedMessages,
607
- setIsLoadingMessages
608
- });
609
- const value = React7__namespace.useMemo(
610
- () => ({
611
- messages: loadedMessages || messages,
612
- isLoading: isLoadingMessages,
613
- setLoadedMessages,
614
- setIsLoadingMessages,
615
- refetchMessages
616
- }),
617
- [loadedMessages, messages, isLoadingMessages, refetchMessages]
618
- );
619
- return /* @__PURE__ */ jsxRuntime.jsx(MessagesContext.Provider, { value, children });
620
- }
621
- function useMessages() {
622
- const context = React7__namespace.useContext(MessagesContext);
623
- if (!context)
624
- throw new Error("useMessages must be used within a MessagesProvider");
625
- return context;
626
- }
627
- var LocaleContext = React7__namespace.createContext(void 0);
628
-
629
- // src/client/react/contexts/locale/utils/change-locale.ts
630
- var changeLocale = ({
631
- currentLocale,
632
- newLocale,
633
- loader,
634
- cookie,
635
- setLocale,
636
- refetchMessages
637
- }) => {
638
- if (typeof document === "undefined") return;
639
- const { type } = loader || {};
640
- if (newLocale === currentLocale) return;
641
- if (type === "local") {
642
- console.warn(
643
- `[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.`
644
- );
645
- }
646
- setLocale(newLocale);
647
- setLocaleCookieBrowser({ cookie, locale: newLocale });
648
- document.documentElement.lang = newLocale;
649
- if (type === "remote" && refetchMessages) {
650
- void refetchMessages(newLocale);
651
- }
652
- };
653
- function LocaleProvider({
654
- value: { initialLocale, onLocaleChange },
655
- children
656
- }) {
657
- const { config } = useConfig();
658
- const { refetchMessages } = useMessages();
659
- const { loader, cookie } = config;
660
- const [currentLocale, setCurrentLocale] = React7__namespace.useState(initialLocale);
661
- useInitLocaleCookie({ config, locale: initialLocale });
662
- const setLocale = React7__namespace.useCallback(
663
- async (newLocale) => {
664
- changeLocale({
665
- currentLocale,
666
- newLocale,
667
- loader,
668
- cookie,
669
- setLocale: setCurrentLocale,
670
- refetchMessages
671
- });
672
- onLocaleChange?.(newLocale);
673
- },
674
- [currentLocale, loader, cookie, refetchMessages, onLocaleChange]
675
- );
676
- const value = React7__namespace.useMemo(
677
- () => ({
678
- locale: currentLocale,
679
- setLocale
680
- }),
681
- [currentLocale, setLocale]
682
- );
683
- return /* @__PURE__ */ jsxRuntime.jsx(LocaleContext.Provider, { value, children });
684
- }
685
- function useLocale() {
686
- const context = React7__namespace.useContext(LocaleContext);
687
- if (!context)
688
- throw new Error("useLocale must be used within a LocaleProvider");
689
- return context;
690
- }
691
-
692
- // src/adapters/next/navigation/use-pathname.ts
693
- var usePathname = () => {
694
- const { config } = useConfig();
695
- const { locale } = useLocale();
696
- const rawPathname = navigation.usePathname();
697
- const { localePrefixedPathname, standardizedPathname, unprefixedPathname } = localizePathname({
698
- config,
699
- pathname: rawPathname,
700
- locale
701
- });
702
- return {
703
- localizedPathname: localePrefixedPathname,
704
- standardizedPathname,
705
- unprefixedPathname
706
- };
707
- };
708
-
709
- // src/adapters/next/navigation/utils/should-full-reload.ts
710
- var shouldFullReload = ({
711
- config,
712
- targetPathname,
713
- locale,
714
- currentLocale
715
- }) => {
716
- const loader = config.loader;
717
- if (!loader || !loader.type) return false;
718
- if (loader.type === "remote" && !loader.fullReload) return false;
719
- const { maybeLocale, isLocalePrefixed } = extractPathname({
720
- config,
721
- pathname: targetPathname
722
- });
723
- const isDifferentLocale = locale && locale !== currentLocale || isLocalePrefixed && maybeLocale !== currentLocale;
724
- return isDifferentLocale ? true : false;
725
- };
726
-
727
- // src/adapters/next/navigation/utils/use-locale-switch.ts
728
- var useLocaleSwitch = () => {
729
- const { config } = useConfig();
730
- const { locale: currentLocale, setLocale } = useLocale();
731
- const { localizedPathname } = usePathname();
732
- const resolveHref = ({
733
- href,
734
- locale
735
- }) => {
736
- const isLocaleValid = locale && config.supportedLocales?.includes(locale);
737
- const targetLocale = isLocaleValid ? locale : currentLocale;
738
- const targetPathname = href ?? localizedPathname;
739
- const isExternal = targetPathname.startsWith("http");
740
- const resolvedHref = !isExternal ? localizePathname({
741
- config,
742
- pathname: targetPathname,
743
- locale: targetLocale
744
- }).localePrefixedPathname : targetPathname;
745
- return { resolvedHref, isExternal, targetLocale, targetPathname };
746
- };
747
- const switchLocale = ({
748
- href,
749
- locale
750
- }) => {
751
- const { resolvedHref, isExternal, targetLocale, targetPathname } = resolveHref({ href, locale });
752
- if (isExternal) return;
753
- if (shouldFullReload({ config, targetPathname, locale, currentLocale })) {
754
- setLocaleCookieBrowser({ cookie: config.cookie, locale: targetLocale });
755
- globalThis.location.href = resolvedHref;
756
- return;
757
- } else {
758
- setLocale(targetLocale);
759
- }
760
- return resolvedHref;
761
- };
762
- return { resolveHref, switchLocale };
763
- };
764
- var Link = ({
765
- href,
766
- locale,
767
- children,
768
- onClick,
769
- ...props
770
- }) => {
771
- const formatted = typeof href === "string" ? href : href ? formatUrl.formatUrl(href) : void 0;
772
- const { resolveHref, switchLocale } = useLocaleSwitch();
773
- const { resolvedHref } = resolveHref({ href: formatted, locale });
774
- const handleClick = (e) => {
775
- onClick?.(e);
776
- switchLocale({ href: formatted, locale });
777
- };
778
- return /* @__PURE__ */ jsxRuntime.jsx(NextLink__default.default, { href: resolvedHref, onClick: handleClick, ...props, children });
779
- };
780
- var useRouter = () => {
781
- const { push, replace, ...rest } = navigation.useRouter();
782
- const { switchLocale } = useLocaleSwitch();
783
- const pushWithLocale = (href, options) => {
784
- const resolvedHref = switchLocale({ href, locale: options?.locale });
785
- if (resolvedHref) push(resolvedHref, options);
786
- };
787
- const replaceWithLocale = (href, options) => {
788
- const resolvedHref = switchLocale({ href, locale: options?.locale });
789
- if (resolvedHref) replace(resolvedHref, options);
790
- };
791
- return {
792
- push: pushWithLocale,
793
- replace: replaceWithLocale,
794
- ...rest
795
- };
796
- };
797
-
798
- // src/adapters/next/shared/constants/pathname-header-name.ts
799
- var PATHNAME_HEADER_NAME = "x-intor-pathname";
800
-
801
- // src/adapters/next/server/get-i18n-context.ts
802
- var getI18nContext = async (config) => {
803
- const baseLogger = getLogger({ id: config.id, ...config.logger });
804
- const logger = baseLogger.child({ scope: "next-adapter" });
805
- const cookiesStore = await headers.cookies();
806
- const headersStore = await headers.headers();
807
- const { defaultLocale, supportedLocales = [], cookie, routing } = config;
808
- let locale;
809
- if (cookie.enabled) {
810
- const localeFromCookie = cookiesStore.get(cookie.name)?.value;
811
- locale = normalizeLocale(localeFromCookie, supportedLocales);
812
- if (locale) {
813
- logger.trace("Locale retrieved from cookie.", { locale });
814
- }
815
- }
816
- if (!locale && routing.firstVisit.localeSource === "browser") {
817
- const aLHeader = headersStore.get("accept-language") || void 0;
818
- const preferredLocale = resolvePreferredLocale(aLHeader, supportedLocales);
819
- locale = normalizeLocale(preferredLocale, supportedLocales);
820
- logger.trace("Locale retrieved from header.", { locale });
821
- }
822
- const pathname = headersStore.get(PATHNAME_HEADER_NAME);
823
- if (pathname) {
824
- logger.trace("Pathname retrieved from header.", { pathname });
825
- }
826
- return {
827
- locale: locale || defaultLocale,
828
- pathname: pathname || ""
829
- };
830
- };
831
-
832
- // src/adapters/next/navigation/redirect.ts
833
- var redirect = async ({
834
- config,
835
- locale,
836
- url,
837
- type
838
- }) => {
839
- if (url.startsWith("http")) {
840
- navigation.redirect(url);
841
- }
842
- const isLocaleValid = locale && config.supportedLocales?.includes(locale);
843
- const { locale: detectedLocale } = await getI18nContext(config);
844
- const { localePrefixedPathname } = localizePathname({
845
- config,
846
- pathname: url,
847
- locale: isLocaleValid ? locale : detectedLocale
848
- });
849
- navigation.redirect(localePrefixedPathname, type);
850
- };
851
- var TranslateHandlersContext = React7__namespace.createContext(void 0);
852
- var TranslateHandlersProvider = ({
853
- handlers,
854
- children
855
- }) => {
856
- return /* @__PURE__ */ jsxRuntime.jsx(TranslateHandlersContext.Provider, { value: handlers, children });
857
- };
858
- function useTranslateHandlers() {
859
- const context = React7__namespace.useContext(TranslateHandlersContext);
860
- return context;
861
- }
862
- var TranslatorContext = React7__namespace.createContext(void 0);
863
- function TranslatorProvider({
864
- value: { isLoading: externalIsLoading },
865
- children
866
- }) {
867
- const { config } = useConfig();
868
- const { messages, isLoading: internalIsLoading } = useMessages();
869
- const { locale } = useLocale();
870
- const translateHandlers = useTranslateHandlers();
871
- const { fallbackLocales, translator: translatorOptions } = config;
872
- const isLoading = Boolean(externalIsLoading ?? internalIsLoading);
873
- const translator = React7__namespace.useMemo(() => {
874
- return new intorTranslator.Translator({
875
- messages,
876
- locale,
877
- isLoading,
878
- fallbackLocales,
879
- loadingMessage: translatorOptions?.loadingMessage,
880
- placeholder: translatorOptions?.placeholder,
881
- handlers: translateHandlers
882
- });
883
- }, [
884
- messages,
885
- locale,
886
- isLoading,
887
- fallbackLocales,
888
- translateHandlers,
889
- translatorOptions?.loadingMessage,
890
- translatorOptions?.placeholder
891
- ]);
892
- return /* @__PURE__ */ jsxRuntime.jsx(TranslatorContext.Provider, { value: { translator }, children });
893
- }
894
- function useTranslator() {
895
- const context = React7__namespace.useContext(TranslatorContext);
896
- if (!context)
897
- throw new Error(
898
- "useTranslator must be used within IntorTranslatorProvider"
899
- );
900
- return context;
901
- }
902
- var IntorProvider = ({
903
- value: {
904
- config,
905
- pathname = "",
906
- initialLocale,
907
- messages = config.messages,
908
- onLocaleChange,
909
- isLoading
910
- },
911
- children
912
- }) => {
913
- return /* @__PURE__ */ jsxRuntime.jsx(ConfigProvider, { value: { config, pathname }, children: /* @__PURE__ */ jsxRuntime.jsx(MessagesProvider, { value: { messages }, children: /* @__PURE__ */ jsxRuntime.jsx(LocaleProvider, { value: { initialLocale, onLocaleChange }, children: /* @__PURE__ */ jsxRuntime.jsx(TranslatorProvider, { value: { isLoading }, children }) }) }) });
914
- };
915
-
916
- // src/client/react/hooks/use-translator.ts
917
- function useTranslator2(preKey) {
918
- const { translator } = useTranslator();
919
- const { setLocale } = useLocale();
920
- const props = {
921
- messages: translator.messages,
922
- locale: translator.locale,
923
- isLoading: translator.isLoading,
924
- setLocale
925
- };
926
- const scoped = translator.scoped(preKey);
927
- return {
928
- ...props,
929
- hasKey: preKey ? scoped.hasKey : translator.hasKey,
930
- t: preKey ? scoped.t : translator.t
931
- };
932
- }
933
-
934
- exports.IntorProvider = IntorProvider;
935
- exports.Link = Link;
936
- exports.TranslateHandlersProvider = TranslateHandlersProvider;
937
- exports.redirect = redirect;
938
- exports.usePathname = usePathname;
939
- exports.useRouter = useRouter;
940
- exports.useTranslator = useTranslator2;