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,723 +0,0 @@
1
- import { cookies, headers } from 'next/headers';
2
- import { logry } from 'logry';
3
- import { Translator } from 'intor-translator';
4
- import path from 'path';
5
- import { performance as performance$1 } from 'perf_hooks';
6
- import pLimit from 'p-limit';
7
- import fs from 'fs/promises';
8
- import merge from 'lodash.merge';
9
- import Keyv from 'keyv';
10
-
11
- // src/adapters/next/server/get-i18n-context.ts
12
-
13
- // src/adapters/next/shared/constants/pathname-header-name.ts
14
- var PATHNAME_HEADER_NAME = "x-intor-pathname";
15
-
16
- // src/server/shared/logger/global-logger-pool.ts
17
- function getGlobalLoggerPool() {
18
- if (!globalThis.__INTOR_LOGGER_POOL__) {
19
- globalThis.__INTOR_LOGGER_POOL__ = /* @__PURE__ */ new Map();
20
- }
21
- return globalThis.__INTOR_LOGGER_POOL__;
22
- }
23
-
24
- // src/server/shared/logger/get-logger.ts
25
- var DEFAULT_FORMATTER_CONFIG = {
26
- node: { meta: { compact: true }, lineBreaksAfter: 1 }
27
- };
28
- function getLogger({
29
- id = "default",
30
- formatterConfig,
31
- preset,
32
- ...options
33
- }) {
34
- const pool = getGlobalLoggerPool();
35
- let logger = pool.get(id);
36
- const useDefault = !formatterConfig && !preset;
37
- if (!logger) {
38
- logger = logry({
39
- id,
40
- formatterConfig: useDefault ? DEFAULT_FORMATTER_CONFIG : formatterConfig,
41
- preset,
42
- ...options
43
- });
44
- pool.set(id, logger);
45
- if (pool.size > 1e3) {
46
- const keys = [...pool.keys()];
47
- for (const key of keys.slice(0, 200)) pool.delete(key);
48
- }
49
- }
50
- return logger;
51
- }
52
-
53
- // src/shared/utils/normalize-cache-key.ts
54
- var CACHE_KEY_DELIMITER = "|";
55
- var sanitize = (k) => k.replaceAll(/[\u200B-\u200D\uFEFF]/g, "").replaceAll(/[\r\n]/g, "").trim();
56
- var normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
57
- if (key === null || key === void 0) return null;
58
- if (Array.isArray(key)) {
59
- if (key.length === 0) return null;
60
- const normalized = key.map((k) => {
61
- if (k === null) return "__null";
62
- if (k === void 0) return "__undefined";
63
- if (typeof k === "boolean") return k ? "__true" : "__false";
64
- return sanitize(String(k));
65
- });
66
- return normalized.join(delimiter);
67
- }
68
- if (typeof key === "boolean") return key ? "__true" : "__false";
69
- return String(key);
70
- };
71
-
72
- // src/shared/constants/prefix-placeholder.ts
73
- var PREFIX_PLACEHOLDER = "{locale}";
74
-
75
- // src/shared/utils/resolve-namespaces.ts
76
- var resolveNamespaces = ({
77
- config,
78
- pathname
79
- }) => {
80
- const { loader } = config;
81
- const { routeNamespaces = {}, namespaces } = loader || {};
82
- if (Object.keys(routeNamespaces).length === 0 && !namespaces)
83
- return void 0;
84
- const standardizedPathname = standardizePathname({ config, pathname });
85
- const placeholderRemovedPathname = standardizedPathname.replace(
86
- `/${PREFIX_PLACEHOLDER}`,
87
- ""
88
- );
89
- const collected = [
90
- ...routeNamespaces.default || [],
91
- // default
92
- ...namespaces || [],
93
- // default
94
- ...routeNamespaces[standardizedPathname] || [],
95
- // exact match
96
- ...routeNamespaces[placeholderRemovedPathname] || []
97
- // exact match
98
- ];
99
- const prefixPatterns = Object.keys(routeNamespaces).filter(
100
- (pattern) => pattern.endsWith("/*")
101
- );
102
- for (const pattern of prefixPatterns) {
103
- const basePath = pattern.replace(/\/\*$/, "");
104
- if (standardizedPathname.startsWith(basePath) || placeholderRemovedPathname.startsWith(basePath)) {
105
- collected.push(...routeNamespaces[pattern] || []);
106
- }
107
- }
108
- return [...new Set(collected)];
109
- };
110
-
111
- // src/shared/utils/locale/normalize-locale.ts
112
- var toCanonical = (input) => {
113
- try {
114
- return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
115
- } catch {
116
- return;
117
- }
118
- };
119
- var normalizeLocale = (locale = "", supportedLocales = []) => {
120
- if (!locale || supportedLocales.length === 0) return;
121
- const canonicalLocale = toCanonical(locale);
122
- if (!canonicalLocale) return;
123
- const supportedCanonicalMap = /* @__PURE__ */ new Map();
124
- for (const l of supportedLocales) {
125
- const normalized = toCanonical(l);
126
- if (normalized) {
127
- supportedCanonicalMap.set(normalized, l);
128
- }
129
- }
130
- if (supportedCanonicalMap.has(canonicalLocale)) {
131
- return supportedCanonicalMap.get(canonicalLocale);
132
- }
133
- const baseLang = canonicalLocale.split("-")[0];
134
- for (const [key, original] of supportedCanonicalMap) {
135
- const supportedBase = key.split("-")[0];
136
- if (supportedBase === baseLang) {
137
- return original;
138
- }
139
- }
140
- return;
141
- };
142
-
143
- // src/shared/utils/locale/resolve-preferred-locale.ts
144
- var resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
145
- if (!acceptLanguageHeader || !supportedLocales || supportedLocales.length === 0) {
146
- return;
147
- }
148
- const supportedLocalesSet = new Set(supportedLocales);
149
- const preferred = acceptLanguageHeader.split(",").map((part) => {
150
- const [lang, qValue] = part.split(";");
151
- const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
152
- if (Number.isNaN(q)) {
153
- return { lang: lang.trim(), q: 0 };
154
- }
155
- return { lang: lang.trim(), q };
156
- }).toSorted((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
157
- return preferred;
158
- };
159
-
160
- // src/shared/utils/pathname/normalize-pathname.ts
161
- var normalizePathname = (rawPathname, options = {}) => {
162
- const length = rawPathname.length;
163
- let start = 0;
164
- let end = length - 1;
165
- while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
166
- while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
167
- if (start > end) return "/";
168
- let result = "";
169
- let hasSlash = false;
170
- for (let i = start; i <= end; i++) {
171
- const char = rawPathname[i];
172
- if (char === "/") {
173
- if (!hasSlash) {
174
- hasSlash = true;
175
- }
176
- } else {
177
- result += hasSlash || result === "" ? "/" + char : char;
178
- hasSlash = false;
179
- }
180
- }
181
- if (options.removeLeadingSlash && result.startsWith("/")) {
182
- result = result.slice(1);
183
- }
184
- return result || "/";
185
- };
186
-
187
- // src/shared/utils/pathname/standardize-pathname.ts
188
- var standardizePathname = ({
189
- config,
190
- pathname
191
- }) => {
192
- const { routing } = config;
193
- const { basePath } = routing;
194
- const parts = [
195
- normalizePathname(basePath),
196
- PREFIX_PLACEHOLDER,
197
- normalizePathname(pathname)
198
- ];
199
- const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
200
- return normalizePathname(standardizedPathname);
201
- };
202
-
203
- // src/adapters/next/server/get-i18n-context.ts
204
- var getI18nContext = async (config) => {
205
- const baseLogger = getLogger({ id: config.id, ...config.logger });
206
- const logger = baseLogger.child({ scope: "next-adapter" });
207
- const cookiesStore = await cookies();
208
- const headersStore = await headers();
209
- const { defaultLocale, supportedLocales = [], cookie, routing } = config;
210
- let locale;
211
- if (cookie.enabled) {
212
- const localeFromCookie = cookiesStore.get(cookie.name)?.value;
213
- locale = normalizeLocale(localeFromCookie, supportedLocales);
214
- if (locale) {
215
- logger.trace("Locale retrieved from cookie.", { locale });
216
- }
217
- }
218
- if (!locale && routing.firstVisit.localeSource === "browser") {
219
- const aLHeader = headersStore.get("accept-language") || void 0;
220
- const preferredLocale = resolvePreferredLocale(aLHeader, supportedLocales);
221
- locale = normalizeLocale(preferredLocale, supportedLocales);
222
- logger.trace("Locale retrieved from header.", { locale });
223
- }
224
- const pathname = headersStore.get(PATHNAME_HEADER_NAME);
225
- if (pathname) {
226
- logger.trace("Pathname retrieved from header.", { pathname });
227
- }
228
- return {
229
- locale: locale || defaultLocale,
230
- pathname: pathname || ""
231
- };
232
- };
233
-
234
- // src/config/constants/cache.constants.ts
235
- var DEFAULT_CACHE_OPTIONS = {
236
- enabled: process.env.NODE_ENV === "production",
237
- ttl: 60 * 60 * 1e3
238
- // 1 hour
239
- };
240
- async function collectFileEntries({
241
- readdir = fs.readdir,
242
- limit,
243
- rootDir,
244
- namespaces,
245
- extraOptions: { exts = [".json"], loggerOptions } = {}
246
- }) {
247
- const baseLogger = getLogger({ ...loggerOptions });
248
- const logger = baseLogger.child({ scope: "collect-file-entries" });
249
- const results = [];
250
- const walk = async (currentDir) => {
251
- let entries = [];
252
- try {
253
- entries = await readdir(currentDir, { withFileTypes: true });
254
- } catch (error) {
255
- logger.error(`Error reading directory: ${currentDir}`, { error });
256
- return;
257
- }
258
- const tasks = entries.map(
259
- (entry) => limit(async () => {
260
- const fullPath = path.join(currentDir, entry.name);
261
- if (entry.isDirectory()) {
262
- await walk(fullPath);
263
- return;
264
- }
265
- if (!exts.some((ext2) => entry.name.endsWith(ext2))) return;
266
- const relativePath = path.relative(rootDir, fullPath);
267
- const ext = path.extname(relativePath);
268
- const withoutExt = relativePath.slice(0, -ext.length);
269
- const segments = withoutExt.split(path.sep).filter(Boolean);
270
- const namespace = segments.at(0);
271
- if (!namespace) return;
272
- if (namespaces && namespace !== "index") {
273
- if (!namespaces.includes(namespace)) return;
274
- }
275
- results.push({
276
- namespace,
277
- fullPath,
278
- relativePath,
279
- segments,
280
- basename: path.basename(entry.name, ext)
281
- });
282
- })
283
- );
284
- await Promise.all(tasks);
285
- };
286
- await walk(rootDir);
287
- if (logger.core.level === "debug") {
288
- logger.debug("Local message files collected.", {
289
- count: results.length
290
- });
291
- }
292
- logger.trace("Local message files collected.", {
293
- count: results.length,
294
- fileEntries: results.map(({ namespace, relativePath }) => ({
295
- namespace: namespace === "index" ? null : namespace,
296
- relativePath
297
- }))
298
- });
299
- return results;
300
- }
301
-
302
- // src/server/messages/shared/utils/is-valid-messages.ts
303
- function isPlainObject(value) {
304
- return typeof value === "object" && value !== null && !Array.isArray(value);
305
- }
306
- function isValidMessages(value) {
307
- if (!isPlainObject(value)) return false;
308
- const stack = [value];
309
- while (stack.length > 0) {
310
- const current = stack.pop();
311
- for (const v of Object.values(current)) {
312
- if (typeof v === "string") continue;
313
- if (isPlainObject(v)) {
314
- stack.push(v);
315
- } else {
316
- return false;
317
- }
318
- }
319
- }
320
- return true;
321
- }
322
- async function jsonReader(filePath, readFile = fs.readFile) {
323
- const raw = await readFile(filePath, "utf8");
324
- const parsed = JSON.parse(raw);
325
- return parsed;
326
- }
327
-
328
- // src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.ts
329
- function nestObjectFromPath(path5, value) {
330
- let obj = value;
331
- for (let i = path5.length - 1; i >= 0; i--) {
332
- obj = { [path5[i]]: obj };
333
- }
334
- return obj;
335
- }
336
-
337
- // src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.ts
338
- async function parseFileEntries({
339
- fileEntries,
340
- limit,
341
- extraOptions: { messagesReader, loggerOptions } = {}
342
- }) {
343
- const baseLogger = getLogger({ ...loggerOptions });
344
- const logger = baseLogger.child({ scope: "parse-file-entries" });
345
- const parsedFileEntries = [];
346
- const tasks = fileEntries.map(
347
- ({ namespace, segments, basename, fullPath }) => limit(async () => {
348
- try {
349
- const segsWithoutNs = segments.slice(1);
350
- const ext = path.extname(fullPath);
351
- const json = ext !== ".json" && messagesReader ? await messagesReader(fullPath) : await jsonReader(fullPath);
352
- if (!isValidMessages(json)) {
353
- throw new Error(
354
- "JSON file does not match NamespaceMessages structure"
355
- );
356
- }
357
- const isIndex = basename === "index";
358
- const keyPath = isIndex ? segsWithoutNs.slice(0, -1) : segsWithoutNs;
359
- const nested = nestObjectFromPath(keyPath, json);
360
- parsedFileEntries.push({ namespace, messages: nested });
361
- logger.trace("Parsed file.", { path: fullPath });
362
- } catch (error) {
363
- logger.error("Failed to read or parse file.", {
364
- path: fullPath,
365
- error
366
- });
367
- }
368
- })
369
- );
370
- await Promise.all(tasks);
371
- const result = {};
372
- for (const { namespace, messages } of parsedFileEntries) {
373
- if (namespace === "index") {
374
- merge(result, messages);
375
- } else {
376
- result[namespace] = merge(
377
- result[namespace] ?? {},
378
- messages
379
- );
380
- }
381
- }
382
- return result;
383
- }
384
-
385
- // src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.ts
386
- var readLocaleMessages = async ({
387
- limit,
388
- rootDir = "messages",
389
- locale,
390
- namespaces,
391
- extraOptions: { exts, messagesReader, loggerOptions } = {}
392
- }) => {
393
- const fileEntries = await collectFileEntries({
394
- rootDir: path.resolve(process.cwd(), rootDir, locale),
395
- namespaces,
396
- limit,
397
- extraOptions: { exts, loggerOptions }
398
- });
399
- const namespaceMessages = await parseFileEntries({
400
- fileEntries,
401
- limit,
402
- extraOptions: { messagesReader, loggerOptions }
403
- });
404
- const localeMessages = { [locale]: namespaceMessages };
405
- return localeMessages;
406
- };
407
- function getGlobalMessagesPool() {
408
- if (!globalThis.__INTOR_MESSAGES_POOL__) {
409
- globalThis.__INTOR_MESSAGES_POOL__ = new Keyv();
410
- }
411
- return globalThis.__INTOR_MESSAGES_POOL__;
412
- }
413
-
414
- // src/server/messages/load-local-messages/load-local-messages.ts
415
- var loadLocalMessages = async ({
416
- pool = getGlobalMessagesPool(),
417
- rootDir = "messages",
418
- locale,
419
- fallbackLocales,
420
- namespaces,
421
- extraOptions: {
422
- concurrency = 10,
423
- cacheOptions = DEFAULT_CACHE_OPTIONS,
424
- loggerOptions = { id: "default" },
425
- exts,
426
- messagesReader
427
- } = {},
428
- allowCacheWrite = false
429
- }) => {
430
- const baseLogger = getLogger({ ...loggerOptions });
431
- const logger = baseLogger.child({ scope: "load-local-messages" });
432
- const start = performance$1.now();
433
- logger.debug("Loading local messages from directory.", {
434
- rootDir,
435
- resolvedRootDir: path.resolve(process.cwd(), rootDir)
436
- });
437
- const key = normalizeCacheKey([
438
- loggerOptions.id,
439
- "loaderType:local",
440
- rootDir,
441
- locale,
442
- (fallbackLocales || []).toSorted().join(","),
443
- (namespaces || []).toSorted().join(",")
444
- ]);
445
- if (cacheOptions.enabled && key) {
446
- const cached = await pool?.get(key);
447
- if (cached) {
448
- logger.debug("Messages cache hit.", { key });
449
- return cached;
450
- }
451
- }
452
- const limit = pLimit(concurrency);
453
- const candidateLocales = [locale, ...fallbackLocales || []];
454
- let messages;
455
- for (const candidateLocale of candidateLocales) {
456
- try {
457
- const result = await readLocaleMessages({
458
- limit,
459
- rootDir,
460
- locale: candidateLocale,
461
- namespaces,
462
- extraOptions: { loggerOptions, exts, messagesReader }
463
- });
464
- if (result && Object.values(result[candidateLocale] || {}).length > 0) {
465
- messages = result;
466
- break;
467
- }
468
- } catch (error) {
469
- logger.error("Failed to read locale messages", {
470
- locale: candidateLocale,
471
- error
472
- });
473
- }
474
- }
475
- if (allowCacheWrite && cacheOptions.enabled && key && messages) {
476
- await pool?.set(key, messages, cacheOptions.ttl);
477
- }
478
- const end = performance$1.now();
479
- const duration = Math.round(end - start);
480
- logger.trace("Finished loading local messages.", {
481
- loadedLocale: messages ? Object.keys(messages)[0] : void 0,
482
- duration: `${duration} ms`
483
- });
484
- return messages;
485
- };
486
-
487
- // src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.ts
488
- var fetchLocaleMessages = async ({
489
- remoteUrl,
490
- remoteHeaders,
491
- searchParams,
492
- locale,
493
- extraOptions: { loggerOptions } = {}
494
- }) => {
495
- const baseLogger = getLogger({ ...loggerOptions });
496
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
497
- try {
498
- const params = new URLSearchParams(searchParams);
499
- params.append("locale", locale);
500
- const url = `${remoteUrl}?${params.toString()}`;
501
- const headers2 = {
502
- "Content-Type": "application/json",
503
- ...remoteHeaders
504
- };
505
- const response = await fetch(url, {
506
- method: "GET",
507
- headers: headers2,
508
- cache: "no-store"
509
- });
510
- if (!response.ok) {
511
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
512
- }
513
- const data = await response.json();
514
- if (!isValidMessages(data[locale])) {
515
- throw new Error("JSON file does not match NamespaceMessages structure");
516
- }
517
- return data;
518
- } catch (error) {
519
- logger.warn("Fetching locale messages failed.", {
520
- locale,
521
- remoteUrl,
522
- searchParams: decodeURIComponent(searchParams.toString()),
523
- error
524
- });
525
- return;
526
- }
527
- };
528
-
529
- // src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.ts
530
- var buildSearchParams = (params) => {
531
- const searchParams = new URLSearchParams();
532
- const appendParam = (key, value) => {
533
- if (value === void 0 || value === null) return;
534
- if (Array.isArray(value) && value.length === 0) return;
535
- if (Array.isArray(value)) {
536
- value.forEach((v) => v && searchParams.append(key, v));
537
- } else {
538
- searchParams.append(key, value);
539
- }
540
- };
541
- Object.entries(params).forEach(([key, value]) => {
542
- appendParam(key, value);
543
- });
544
- return searchParams;
545
- };
546
-
547
- // src/server/messages/load-remote-messages/load-remote-messages.ts
548
- var loadRemoteMessages = async ({
549
- pool = getGlobalMessagesPool(),
550
- rootDir,
551
- remoteUrl,
552
- remoteHeaders,
553
- locale,
554
- fallbackLocales = [],
555
- namespaces = [],
556
- extraOptions: {
557
- cacheOptions = DEFAULT_CACHE_OPTIONS,
558
- loggerOptions = { id: "default" }
559
- } = {},
560
- allowCacheWrite
561
- }) => {
562
- const baseLogger = getLogger({ ...loggerOptions });
563
- const logger = baseLogger.child({ scope: "load-remote-messages" });
564
- const start = performance.now();
565
- logger.debug("Loading remote messages from api.", { remoteUrl });
566
- const key = normalizeCacheKey([
567
- loggerOptions.id,
568
- "loaderType:remote",
569
- rootDir,
570
- locale,
571
- (fallbackLocales ?? []).toSorted().join(","),
572
- (namespaces ?? []).toSorted().join(",")
573
- ]);
574
- if (cacheOptions.enabled && key) {
575
- const cached = await pool?.get(key);
576
- if (cached) {
577
- logger.debug("Messages cache hit.", { key });
578
- return cached;
579
- }
580
- }
581
- const searchParams = buildSearchParams({ rootDir, namespaces });
582
- const candidateLocales = [locale, ...fallbackLocales || []];
583
- let messages;
584
- for (const candidateLocale of candidateLocales) {
585
- try {
586
- const result = await fetchLocaleMessages({
587
- remoteUrl,
588
- remoteHeaders,
589
- searchParams,
590
- locale: candidateLocale,
591
- extraOptions: { loggerOptions }
592
- });
593
- if (result && Object.values(result[candidateLocale] || {}).length > 0) {
594
- messages = result;
595
- break;
596
- }
597
- } catch (error) {
598
- logger.error("Failed to fetch locale messages.", {
599
- locale: candidateLocale,
600
- error
601
- });
602
- }
603
- }
604
- if (allowCacheWrite && cacheOptions.enabled && key && messages) {
605
- await pool?.set(key, messages, cacheOptions.ttl);
606
- }
607
- const end = performance.now();
608
- const duration = Math.round(end - start);
609
- logger.trace("Finished loading remote messages.", {
610
- loadedLocale: messages ? Object.keys(messages)[0] : void 0,
611
- duration: `${duration} ms`
612
- });
613
- return messages;
614
- };
615
-
616
- // src/server/messages/load-messages.ts
617
- var loadMessages = async ({
618
- config,
619
- locale,
620
- pathname = "",
621
- extraOptions: { exts, messagesReader } = {},
622
- allowCacheWrite = false
623
- }) => {
624
- const baseLogger = getLogger({ id: config.id, ...config.logger });
625
- const logger = baseLogger.child({ scope: "load-messages" });
626
- if (!config.loader) {
627
- logger.warn(
628
- "No loader options have been configured in the current config."
629
- );
630
- return;
631
- }
632
- const { type, concurrency, rootDir } = config.loader;
633
- const fallbackLocales = config.fallbackLocales[locale] || [];
634
- const namespaces = resolveNamespaces({ config, pathname });
635
- if (logger.core.level === "debug") {
636
- logger.debug("Starting to load messages.", { locale });
637
- }
638
- logger.trace("Starting to load messages with runtime context.", {
639
- loaderType: type,
640
- locale,
641
- fallbackLocales,
642
- namespaces: namespaces && namespaces.length > 0 ? [...namespaces] : "[ALL]",
643
- cache: config.cache,
644
- concurrency: concurrency ?? 10
645
- });
646
- let loadedMessages;
647
- if (type === "local") {
648
- loadedMessages = await loadLocalMessages({
649
- rootDir,
650
- locale,
651
- fallbackLocales,
652
- namespaces,
653
- extraOptions: {
654
- concurrency,
655
- cacheOptions: config.cache,
656
- loggerOptions: { id: config.id, ...config.logger },
657
- exts,
658
- messagesReader
659
- },
660
- allowCacheWrite
661
- });
662
- } else if (type === "remote") {
663
- loadedMessages = await loadRemoteMessages({
664
- rootDir,
665
- remoteUrl: config.loader.remoteUrl,
666
- remoteHeaders: config.loader.remoteHeaders,
667
- locale,
668
- fallbackLocales,
669
- namespaces,
670
- extraOptions: {
671
- cacheOptions: config.cache,
672
- loggerOptions: { id: config.id, ...config.logger }
673
- }
674
- });
675
- }
676
- if (!loadedMessages || Object.keys(loadedMessages).length === 0) {
677
- logger.warn("No messages found.", { locale, namespaces });
678
- }
679
- return loadedMessages;
680
- };
681
-
682
- // src/server/translator/get-translator.ts
683
- async function getTranslator(options) {
684
- const { config, locale, pathname = "", preKey } = options;
685
- const messages = await loadMessages({
686
- config,
687
- locale,
688
- pathname,
689
- extraOptions: options.extraOptions
690
- });
691
- const translator = new Translator({
692
- locale,
693
- messages,
694
- fallbackLocales: config.fallbackLocales,
695
- loadingMessage: config.translator?.loadingMessage,
696
- placeholder: config.translator?.placeholder,
697
- handlers: options.handlers
698
- });
699
- const props = { messages, locale };
700
- const scoped = translator.scoped(preKey);
701
- return {
702
- ...props,
703
- hasKey: preKey ? scoped.hasKey : translator.hasKey,
704
- t: preKey ? scoped.t : translator.t
705
- };
706
- }
707
-
708
- // src/adapters/next/server/get-translator.ts
709
- async function getTranslator2(options) {
710
- const { config, preKey, handlers, extraOptions } = options;
711
- const { locale, pathname } = await getI18nContext(config);
712
- const translatorInstance = getTranslator({
713
- config,
714
- locale,
715
- pathname,
716
- handlers,
717
- extraOptions,
718
- preKey
719
- });
720
- return translatorInstance;
721
- }
722
-
723
- export { getI18nContext, getTranslator2 as getTranslator };