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
@@ -0,0 +1,10 @@
1
+ import { DEFAULT_CACHE_OPTIONS } from '../constants/cache.constants.js';
2
+
3
+ const resolveCacheOptions = (cache) => {
4
+ return {
5
+ ...DEFAULT_CACHE_OPTIONS,
6
+ ...cache,
7
+ };
8
+ };
9
+
10
+ export { resolveCacheOptions };
@@ -0,0 +1,11 @@
1
+ import type { CookieRawOptions, CookieResolvedOptions } from "../../config/types/cookie.types";
2
+ /**
3
+ * Resolves the final cookie options by merging the provided options with the default ones.
4
+ *
5
+ * This function accepts custom cookie options and merges them with the default values. If no custom options
6
+ * are provided, the default options will be used. The function returns the resolved cookie options.
7
+ *
8
+ * @param cookie - The custom cookie options to override the defaults (optional).
9
+ * @returns The resolved cookie options, merging the defaults and the provided options.
10
+ */
11
+ export declare const resolveCookieOptions: (cookie?: CookieRawOptions) => CookieResolvedOptions;
@@ -0,0 +1,19 @@
1
+ import { DEFAULT_COOKIE_OPTIONS } from '../constants/cookie.constants.js';
2
+
3
+ /**
4
+ * Resolves the final cookie options by merging the provided options with the default ones.
5
+ *
6
+ * This function accepts custom cookie options and merges them with the default values. If no custom options
7
+ * are provided, the default options will be used. The function returns the resolved cookie options.
8
+ *
9
+ * @param cookie - The custom cookie options to override the defaults (optional).
10
+ * @returns The resolved cookie options, merging the defaults and the provided options.
11
+ */
12
+ const resolveCookieOptions = (cookie = {}) => {
13
+ return {
14
+ ...DEFAULT_COOKIE_OPTIONS,
15
+ ...cookie,
16
+ };
17
+ };
18
+
19
+ export { resolveCookieOptions };
@@ -0,0 +1,3 @@
1
+ import type { IntorRawConfig } from "../../config/types/intor-config.types";
2
+ import type { FallbackLocalesMap, Locale } from "intor-translator";
3
+ export declare const resolveFallbackLocales: (config: IntorRawConfig, supportedLocales?: readonly Locale[]) => FallbackLocalesMap;
@@ -0,0 +1,33 @@
1
+ const resolveFallbackLocales = (config, supportedLocales) => {
2
+ const { defaultLocale, fallbackLocales } = config;
3
+ if (!fallbackLocales || typeof fallbackLocales !== "object") {
4
+ return {};
5
+ }
6
+ const supportedSet = new Set(supportedLocales);
7
+ const validMap = {}; // Collected valid fallbacks
8
+ const invalidFallbackMap = new Map(); // Track invalid ones
9
+ for (const [locale, fallbacks] of Object.entries(fallbackLocales)) {
10
+ const fallbackArray = Array.isArray(fallbacks) ? fallbacks : [];
11
+ // Valid: in supported list, matches default, or literal "default"
12
+ const validFallbacks = fallbackArray.filter((fallback) => fallback === "default" ||
13
+ supportedSet.has(fallback) ||
14
+ fallback === defaultLocale);
15
+ // Invalid: not "default", not supported, and not defaultLocale
16
+ const invalidFallbacks = fallbackArray.filter((fallback) => fallback !== "default" &&
17
+ !supportedSet.has(fallback) &&
18
+ fallback !== defaultLocale);
19
+ if (invalidFallbacks.length > 0) {
20
+ invalidFallbackMap.set(locale, invalidFallbacks);
21
+ }
22
+ if (validFallbacks.length > 0) {
23
+ validMap[locale] = validFallbacks;
24
+ }
25
+ }
26
+ // Log out invalid fallback locales
27
+ for (const [locale, invalids] of invalidFallbackMap.entries()) {
28
+ console.warn(`Invalid fallback locales for "${locale}"`, { invalids: [...invalids] }, { scope: "resolveFallbackLocales" });
29
+ }
30
+ return validMap;
31
+ };
32
+
33
+ export { resolveFallbackLocales };
@@ -0,0 +1,13 @@
1
+ import type { RoutingRawOptions, RoutingResolvedOptions } from "../../config/types/routing.types";
2
+ /**
3
+ * Resolves routing options by merging default routing options with the provided custom options.
4
+ * If any specific routing options are not provided, the default values will be used.
5
+ * The function also normalizes the basePath if provided.
6
+ *
7
+ * @param {RoutingRawOptions} [routing={}] - The custom routing options to override the defaults.
8
+ * It should be an object that may contain properties like `firstVisit`, `basePath`, etc.
9
+ * If not provided, the default values will be used.
10
+ * @returns {RoutingResolvedOptions} - The resolved routing options, merged from the defaults and provided values.
11
+ * This includes the normalized `basePath` and any customized `firstVisit` settings.
12
+ */
13
+ export declare const resolveRoutingOptions: (routing?: RoutingRawOptions) => RoutingResolvedOptions;
@@ -0,0 +1,28 @@
1
+ import { DEFAULT_ROUTING_OPTIONS } from '../constants/routing.constants.js';
2
+ import 'lodash.merge';
3
+ import { normalizePathname } from '../../shared/utils/pathname/normalize-pathname.js';
4
+
5
+ /**
6
+ * Resolves routing options by merging default routing options with the provided custom options.
7
+ * If any specific routing options are not provided, the default values will be used.
8
+ * The function also normalizes the basePath if provided.
9
+ *
10
+ * @param {RoutingRawOptions} [routing={}] - The custom routing options to override the defaults.
11
+ * It should be an object that may contain properties like `firstVisit`, `basePath`, etc.
12
+ * If not provided, the default values will be used.
13
+ * @returns {RoutingResolvedOptions} - The resolved routing options, merged from the defaults and provided values.
14
+ * This includes the normalized `basePath` and any customized `firstVisit` settings.
15
+ */
16
+ const resolveRoutingOptions = (routing = {}) => {
17
+ return {
18
+ ...DEFAULT_ROUTING_OPTIONS,
19
+ ...routing,
20
+ firstVisit: {
21
+ ...DEFAULT_ROUTING_OPTIONS.firstVisit,
22
+ ...routing.firstVisit,
23
+ },
24
+ basePath: normalizePathname(routing?.basePath || ""),
25
+ };
26
+ };
27
+
28
+ export { resolveRoutingOptions };
@@ -0,0 +1,7 @@
1
+ export type CacheRawOptions = {
2
+ /** default: process.env.NODE_ENV === "production" */
3
+ enabled?: boolean;
4
+ /** default: 60\*60\*1000 (1 hour) */
5
+ ttl?: number;
6
+ };
7
+ export type CacheResolvedOptions = Required<CacheRawOptions>;
@@ -0,0 +1,23 @@
1
+ export type CookieRawOptions = {
2
+ /** Enable cookie usage (read/write) - default: true */
3
+ enabled?: boolean;
4
+ /** Allow the system to automatically set cookies - default: true */
5
+ autoSetCookie?: boolean;
6
+ /** default: "intor.i18n.locale" */
7
+ name?: string;
8
+ /** default: null */
9
+ domain?: string | null;
10
+ /** default: "/" */
11
+ path?: string;
12
+ /** default: 60 * 60 * 24 * 365 (365 days) */
13
+ maxAge?: number;
14
+ /** default: false */
15
+ httpOnly?: boolean;
16
+ /** default: process.env.NODE_ENV !== "development" */
17
+ secure?: boolean;
18
+ /** default: lax */
19
+ sameSite?: "lax" | "strict" | "none";
20
+ };
21
+ export type CookieResolvedOptions = Required<Omit<CookieRawOptions, "domain">> & {
22
+ domain: string | null;
23
+ };
@@ -0,0 +1,41 @@
1
+ import type { CookieRawOptions, CookieResolvedOptions } from "./cookie.types";
2
+ import type { LoaderOptions } from "./loader.types";
3
+ import type { LoggerOptions } from "./logger.types";
4
+ import type { RoutingRawOptions, RoutingResolvedOptions } from "./routing.types";
5
+ import type { CacheRawOptions, CacheResolvedOptions } from "../../config/types/cache.types";
6
+ import type { TranslatorOptions } from "../../config/types/translator.types";
7
+ import type { FallbackLocalesMap, Locale, LocaleMessages } from "intor-translator";
8
+ export type IntorRawConfig = ({
9
+ loader: LoaderOptions;
10
+ supportedLocales: readonly Locale[];
11
+ } | {
12
+ loader?: undefined;
13
+ supportedLocales?: readonly Locale[];
14
+ }) & {
15
+ readonly id?: string;
16
+ readonly messages?: LocaleMessages;
17
+ readonly defaultLocale: Locale;
18
+ readonly fallbackLocales?: FallbackLocalesMap;
19
+ readonly translator?: TranslatorOptions;
20
+ readonly cookie?: CookieRawOptions;
21
+ readonly routing?: RoutingRawOptions;
22
+ readonly logger?: LoggerOptions;
23
+ readonly cache?: CacheRawOptions;
24
+ };
25
+ export type IntorResolvedConfig = ({
26
+ loader: LoaderOptions;
27
+ supportedLocales: readonly Locale[];
28
+ } | {
29
+ loader?: undefined;
30
+ supportedLocales: readonly Locale[];
31
+ }) & {
32
+ readonly id: string;
33
+ readonly messages?: LocaleMessages;
34
+ readonly defaultLocale: Locale;
35
+ readonly fallbackLocales: FallbackLocalesMap;
36
+ readonly translator?: TranslatorOptions;
37
+ readonly cookie: CookieResolvedOptions;
38
+ readonly routing: RoutingResolvedOptions;
39
+ readonly logger?: LoggerOptions;
40
+ readonly cache: CacheResolvedOptions;
41
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ```ts
3
+ * {
4
+ * default: ["ui", "meta"],
5
+ * "/auth": ["auth", "admin"],
6
+ * }
7
+ * // When pathname is "/" => namespaces: ["ui", "meta"]
8
+ * // When pathname is "/auth" => namespaces: ["ui", "meta", "auth", "admin"]
9
+ * ```
10
+ */
11
+ type RouteNamespaces = {
12
+ [key: string]: string[];
13
+ } | {
14
+ [key: string]: string[];
15
+ default: string[];
16
+ };
17
+ export interface RemoteHeaders {
18
+ authorization?: string;
19
+ "x-api-key"?: string;
20
+ [key: string]: string | undefined;
21
+ }
22
+ type BaseLoaderOptions = {
23
+ rootDir?: string;
24
+ namespaces?: string[];
25
+ routeNamespaces?: RouteNamespaces;
26
+ concurrency?: number;
27
+ };
28
+ type LocalLoader = BaseLoaderOptions & {
29
+ type: "local";
30
+ };
31
+ type RemoteLoader = BaseLoaderOptions & {
32
+ type: "remote";
33
+ remoteUrl: string;
34
+ remoteHeaders?: RemoteHeaders;
35
+ fullReload?: boolean;
36
+ };
37
+ export type LoaderOptions = LocalLoader | RemoteLoader;
38
+ export {};
@@ -0,0 +1,7 @@
1
+ import { type FormatterConfig, type Level, type LoggerPreset, type NormalizerConfig } from "logry/edge";
2
+ export type LoggerOptions = {
3
+ level?: Level;
4
+ normalizerConfig?: NormalizerConfig;
5
+ formatterConfig?: FormatterConfig;
6
+ preset?: LoggerPreset;
7
+ };
@@ -0,0 +1,15 @@
1
+ export declare const routingPrefix: readonly ["none", "all", "except-default"];
2
+ export declare const routingFirstVisitLocaleSource: readonly ["default", "browser"];
3
+ export type RoutingRawOptions = {
4
+ /** default: "none" */
5
+ prefix?: (typeof routingPrefix)[number];
6
+ firstVisit?: {
7
+ /** default: "browser" */
8
+ localeSource?: (typeof routingFirstVisitLocaleSource)[number];
9
+ /** default: true */
10
+ redirect?: boolean;
11
+ };
12
+ /** default: "" */
13
+ basePath?: string;
14
+ };
15
+ export type RoutingResolvedOptions = Required<RoutingRawOptions>;
@@ -0,0 +1,4 @@
1
+ export type TranslatorOptions = {
2
+ loadingMessage?: string;
3
+ placeholder?: string;
4
+ };
@@ -0,0 +1,3 @@
1
+ import type { IntorRawConfig } from "../../config/types/intor-config.types";
2
+ import type { Locale } from "intor-translator";
3
+ export declare const validateDefaultLocale: (config: IntorRawConfig, supportedLocales: readonly Locale[]) => string;
@@ -0,0 +1,24 @@
1
+ import { IntorError, IntorErrorCode } from '../../shared/error/intor-error.js';
2
+
3
+ const validateDefaultLocale = (config, supportedLocales) => {
4
+ const { id, defaultLocale } = config;
5
+ // Throw error if defaultLocale is undefined
6
+ if (!defaultLocale) {
7
+ throw new IntorError({
8
+ id,
9
+ code: IntorErrorCode.MISSING_DEFAULT_LOCALE,
10
+ message: `The defaultLocale is undefined`,
11
+ });
12
+ }
13
+ // Throw error if defaultLocale is not listed in supportedLocales
14
+ if (!supportedLocales.includes(defaultLocale)) {
15
+ throw new IntorError({
16
+ id,
17
+ code: IntorErrorCode.UNSUPPORTED_DEFAULT_LOCALE,
18
+ message: `The defaultLocale "${defaultLocale}" is not included in the supportedLocales.`,
19
+ });
20
+ }
21
+ return defaultLocale;
22
+ };
23
+
24
+ export { validateDefaultLocale };
@@ -0,0 +1,7 @@
1
+ import type { IntorRawConfig } from "../../config/types/intor-config.types";
2
+ /**
3
+ * Validate and resolve supported locales.
4
+ * Throws error if loader is used without supportedLocales.
5
+ * Falls back to message keys if supportedLocales is undefined.
6
+ */
7
+ export declare const validateSupportedLocales: (config: IntorRawConfig) => readonly string[];
@@ -0,0 +1,22 @@
1
+ import { IntorError, IntorErrorCode } from '../../shared/error/intor-error.js';
2
+
3
+ /**
4
+ * Validate and resolve supported locales.
5
+ * Throws error if loader is used without supportedLocales.
6
+ * Falls back to message keys if supportedLocales is undefined.
7
+ */
8
+ const validateSupportedLocales = (config) => {
9
+ const { id, loader, supportedLocales } = config;
10
+ // Ensure supportedLocales is set when using loader
11
+ if (loader && !supportedLocales) {
12
+ throw new IntorError({
13
+ id,
14
+ code: IntorErrorCode.MISSING_SUPPORTED_LOCALES,
15
+ message: `"supportedLocales" is required when using loader, but it is missing.`,
16
+ });
17
+ }
18
+ // Return supportedLocales or infer from message keys
19
+ return supportedLocales || Object.keys(config.messages || {});
20
+ };
21
+
22
+ export { validateSupportedLocales };
@@ -0,0 +1,4 @@
1
+ export { intor, type I18nContext, type IntorResult } from "./intor";
2
+ export { loadMessages, loadLocalMessages, type LoadLocalMessagesOptions, loadRemoteMessages, type LoadRemoteMessagesOptions, type Messages, type MessagesReader, clearMessagesPool, } from "./messages";
3
+ export { getTranslator } from "./translator";
4
+ export { clearLoggerPool } from "./shared/logger/global-logger-pool";
@@ -0,0 +1,2 @@
1
+ export { intor } from "./intor";
2
+ export type { I18nContext, IntorResult } from "./types";
@@ -0,0 +1,14 @@
1
+ import type { IntorResolvedConfig } from "../../config";
2
+ import type { I18nContext, GetI18nContext, IntorResult } from "../../server/intor/types";
3
+ import type { MessagesReader } from "../../server/messages";
4
+ /**
5
+ * Entry point for initializing Intor.
6
+ *
7
+ * 1. Resolve context via adapter or fallback values.
8
+ * 2. Load messages if loader is enabled.
9
+ * 3. Merge static messages with loaded messages.
10
+ */
11
+ export declare const intor: (config: IntorResolvedConfig, i18nContext: GetI18nContext | Partial<I18nContext>, loadMessagesOptions?: {
12
+ exts?: string[];
13
+ messagesReader?: MessagesReader;
14
+ }) => Promise<IntorResult>;
@@ -0,0 +1,67 @@
1
+ import { loadMessages } from '../messages/load-messages.js';
2
+ import 'node:path';
3
+ import 'node:perf_hooks';
4
+ import 'p-limit';
5
+ import '../../config/constants/cache.constants.js';
6
+ import 'node:fs/promises';
7
+ import { getLogger } from '../shared/logger/get-logger.js';
8
+ import 'lodash.merge';
9
+ import 'keyv';
10
+ import { mergeMessages } from '../../shared/utils/merge-messages.js';
11
+
12
+ /**
13
+ * Entry point for initializing Intor.
14
+ *
15
+ * 1. Resolve context via adapter or fallback values.
16
+ * 2. Load messages if loader is enabled.
17
+ * 3. Merge static messages with loaded messages.
18
+ */
19
+ const intor = async (config, i18nContext, loadMessagesOptions = {}) => {
20
+ const baseLogger = getLogger({ id: config.id, ...config.logger });
21
+ const logger = baseLogger.child({ scope: "intor" });
22
+ logger.info("Start Intor initialization.");
23
+ const { messages, loader } = config;
24
+ const isI18nContextFunction = typeof i18nContext === "function";
25
+ // 1. Resolve context via adapter or fallback values
26
+ const context = isI18nContextFunction
27
+ ? await i18nContext(config)
28
+ : {
29
+ locale: (i18nContext?.locale || config.defaultLocale),
30
+ pathname: i18nContext?.pathname || "",
31
+ };
32
+ const { locale, pathname } = context;
33
+ const source = isI18nContextFunction ? i18nContext.name : "static fallback";
34
+ logger.debug(`I18n context resolved via ${source}.`, context);
35
+ // 2. Load messages if loader enabled
36
+ let loadedMessages;
37
+ if (loader) {
38
+ loadedMessages = await loadMessages({
39
+ config,
40
+ locale,
41
+ pathname,
42
+ extraOptions: {
43
+ exts: loadMessagesOptions.exts,
44
+ messagesReader: loadMessagesOptions.messagesReader,
45
+ },
46
+ allowCacheWrite: true,
47
+ });
48
+ }
49
+ // 3. Merge static and loaded messages
50
+ const mergedMessages = mergeMessages(messages, loadedMessages);
51
+ logger.info("Messages successfully initialized.", {
52
+ static: { enabled: !!messages },
53
+ loaded: {
54
+ enabled: !!loadedMessages,
55
+ ...(loader ? { loaderType: loader.type } : null),
56
+ },
57
+ merged: mergedMessages,
58
+ });
59
+ return {
60
+ config,
61
+ initialLocale: locale,
62
+ pathname,
63
+ messages: mergedMessages,
64
+ };
65
+ };
66
+
67
+ export { intor };
@@ -0,0 +1,14 @@
1
+ import type { IntorResolvedConfig } from "../../config/types/intor-config.types";
2
+ import type { GenLocale } from "../../shared/types/generated.types";
3
+ import type { Locale, LocaleMessages } from "intor-translator";
4
+ export interface I18nContext {
5
+ locale: GenLocale;
6
+ pathname: string;
7
+ }
8
+ export type GetI18nContext = (config: IntorResolvedConfig) => Promise<I18nContext>;
9
+ export interface IntorResult {
10
+ config: IntorResolvedConfig;
11
+ initialLocale: Locale;
12
+ pathname: string;
13
+ messages: LocaleMessages;
14
+ }
@@ -0,0 +1,7 @@
1
+ export { loadMessages } from "./load-messages";
2
+ export { loadLocalMessages } from "./load-local-messages";
3
+ export type { LoadLocalMessagesOptions } from "./load-local-messages";
4
+ export { loadRemoteMessages } from "./load-remote-messages";
5
+ export type { LoadRemoteMessagesOptions } from "./load-remote-messages";
6
+ export type { Messages, MessagesReader } from "./shared/types";
7
+ export { clearMessagesPool } from "./shared/global-messages-pool";
@@ -0,0 +1,2 @@
1
+ export type { LoadLocalMessagesOptions } from "./types";
2
+ export { loadLocalMessages } from "./load-local-messages";
@@ -0,0 +1,11 @@
1
+ import type { LoadLocalMessagesOptions } from "./types";
2
+ import type { LocaleMessages } from "intor-translator";
3
+ /**
4
+ * Load local messages from the file system.
5
+ *
6
+ * - Load messages for a target locale with optional fallback locales.
7
+ * - Support filtering by specific namespaces.
8
+ * - Cache messages if enabled.
9
+ * - Limit concurrent file reads for performance.
10
+ */
11
+ export declare const loadLocalMessages: ({ pool, rootDir, locale, fallbackLocales, namespaces, extraOptions: { concurrency, cacheOptions, loggerOptions, exts, messagesReader, }, allowCacheWrite, }: LoadLocalMessagesOptions) => Promise<LocaleMessages | undefined>;
@@ -0,0 +1,85 @@
1
+ import path from 'node:path';
2
+ import { performance } from 'node:perf_hooks';
3
+ import pLimit from 'p-limit';
4
+ import { DEFAULT_CACHE_OPTIONS } from '../../../config/constants/cache.constants.js';
5
+ import { readLocaleMessages } from './read-locale-messages/read-locale-messages.js';
6
+ import { getGlobalMessagesPool } from '../shared/global-messages-pool.js';
7
+ import { getLogger } from '../../shared/logger/get-logger.js';
8
+ import 'lodash.merge';
9
+ import { normalizeCacheKey } from '../../../shared/utils/normalize-cache-key.js';
10
+
11
+ /**
12
+ * Load local messages from the file system.
13
+ *
14
+ * - Load messages for a target locale with optional fallback locales.
15
+ * - Support filtering by specific namespaces.
16
+ * - Cache messages if enabled.
17
+ * - Limit concurrent file reads for performance.
18
+ */
19
+ const loadLocalMessages = async ({ pool = getGlobalMessagesPool(), rootDir = "messages", locale, fallbackLocales, namespaces, extraOptions: { concurrency = 10, cacheOptions = DEFAULT_CACHE_OPTIONS, loggerOptions = { id: "default" }, exts, messagesReader, } = {}, allowCacheWrite = false, }) => {
20
+ const baseLogger = getLogger({ ...loggerOptions });
21
+ const logger = baseLogger.child({ scope: "load-local-messages" });
22
+ // Start performance measurement
23
+ const start = performance.now();
24
+ logger.debug("Loading local messages from directory.", {
25
+ rootDir,
26
+ resolvedRootDir: path.resolve(process.cwd(), rootDir),
27
+ });
28
+ //====== Cache lookup ======
29
+ const key = normalizeCacheKey([
30
+ loggerOptions.id,
31
+ "loaderType:local",
32
+ rootDir,
33
+ locale,
34
+ (fallbackLocales || []).toSorted().join(","),
35
+ (namespaces || []).toSorted().join(","),
36
+ ]);
37
+ if (cacheOptions.enabled && key) {
38
+ const cached = await pool?.get(key);
39
+ if (cached) {
40
+ logger.debug("Messages cache hit.", { key });
41
+ return cached;
42
+ }
43
+ }
44
+ //============================================================
45
+ // Read messages
46
+ //============================================================
47
+ const limit = pLimit(concurrency);
48
+ const candidateLocales = [locale, ...(fallbackLocales || [])];
49
+ let messages;
50
+ for (const candidateLocale of candidateLocales) {
51
+ try {
52
+ const result = await readLocaleMessages({
53
+ limit,
54
+ rootDir,
55
+ locale: candidateLocale,
56
+ namespaces,
57
+ extraOptions: { loggerOptions, exts, messagesReader },
58
+ });
59
+ if (result && Object.values(result[candidateLocale] || {}).length > 0) {
60
+ messages = result;
61
+ break;
62
+ }
63
+ }
64
+ catch (error) {
65
+ logger.error("Failed to read locale messages", {
66
+ locale: candidateLocale,
67
+ error,
68
+ });
69
+ }
70
+ }
71
+ //====== Cache storage ======
72
+ if (allowCacheWrite && cacheOptions.enabled && key && messages) {
73
+ await pool?.set(key, messages, cacheOptions.ttl);
74
+ }
75
+ // Log out validnamespaces & performance measurement
76
+ const end = performance.now();
77
+ const duration = Math.round(end - start);
78
+ logger.trace("Finished loading local messages.", {
79
+ loadedLocale: messages ? Object.keys(messages)[0] : undefined,
80
+ duration: `${duration} ms`,
81
+ });
82
+ return messages;
83
+ };
84
+
85
+ export { loadLocalMessages };
@@ -0,0 +1,29 @@
1
+ import type { CollectFileEntriesOptions } from "./types";
2
+ import type { FileEntry } from "../../../../../server/messages/load-local-messages/read-locale-messages";
3
+ /**
4
+ * Recursively collects all message files under a given root directory.
5
+ *
6
+ * - Supports filtering by allowed file extensions and optional namespaces.
7
+ * - Processes directories concurrently using the provided `limit` function.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * [
12
+ * {
13
+ * namespace: "index", // "index" = messages under locale root (no namespace)
14
+ * fullPath: "/Users/john/my-app/messages/en-US/index.json",
15
+ * relativePath: "index.json",
16
+ * segments: ["index"],
17
+ * basename: "index",
18
+ * },
19
+ * {
20
+ * namespace: "auth",
21
+ * fullPath: "/Users/john/my-app/messages/en-US/auth/login.json",
22
+ * relativePath: "auth/login.json",
23
+ * segments: ["auth", "login"],
24
+ * basename: "login",
25
+ * },
26
+ * ];
27
+ * ```
28
+ */
29
+ export declare function collectFileEntries({ readdir, limit, rootDir, namespaces, extraOptions: { exts, loggerOptions }, }: CollectFileEntriesOptions): Promise<FileEntry[]>;