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,26 @@
1
+ /**
2
+ * Resolves the preferred locale based on the Accept-Language header and supported locales.
3
+ */
4
+ const resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
5
+ if (!acceptLanguageHeader ||
6
+ !supportedLocales ||
7
+ supportedLocales.length === 0) {
8
+ return;
9
+ }
10
+ const supportedLocalesSet = new Set(supportedLocales);
11
+ const preferred = acceptLanguageHeader
12
+ .split(",")
13
+ .map((part) => {
14
+ const [lang, qValue] = part.split(";");
15
+ const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
16
+ if (Number.isNaN(q)) {
17
+ return { lang: lang.trim(), q: 0 }; // Treat invalid q values as having 0 priority
18
+ }
19
+ return { lang: lang.trim(), q };
20
+ })
21
+ .toSorted((a, b) => b.q - a.q)
22
+ .find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
23
+ return preferred;
24
+ };
25
+
26
+ export { resolvePreferredLocale };
@@ -0,0 +1,6 @@
1
+ import type { LocaleMessages } from "intor-translator";
2
+ /**
3
+ * Deeply merges loaded messages into static messages by locale.
4
+ * - Loaded messages override static ones on conflict.
5
+ */
6
+ export declare const mergeMessages: (staticMessages?: LocaleMessages, loadedMessages?: LocaleMessages | undefined) => LocaleMessages;
@@ -0,0 +1,13 @@
1
+ import merge from 'lodash.merge';
2
+
3
+ /**
4
+ * Deeply merges loaded messages into static messages by locale.
5
+ * - Loaded messages override static ones on conflict.
6
+ */
7
+ const mergeMessages = (staticMessages = {}, loadedMessages = {}) => {
8
+ if (!loadedMessages)
9
+ return { ...staticMessages };
10
+ return merge({}, staticMessages, loadedMessages);
11
+ };
12
+
13
+ export { mergeMessages };
@@ -0,0 +1,3 @@
1
+ type RawCacheKey = string | boolean | Array<string | number | boolean | undefined | null>;
2
+ export declare const normalizeCacheKey: (key?: RawCacheKey, delimiter?: string) => string | null;
3
+ export {};
@@ -0,0 +1,29 @@
1
+ const CACHE_KEY_DELIMITER = "|";
2
+ // Helper FC
3
+ const sanitize = (k) => k
4
+ .replaceAll(/[\u200B-\u200D\uFEFF]/g, "")
5
+ .replaceAll(/[\r\n]/g, "")
6
+ .trim();
7
+ const normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
8
+ if (key === null || key === undefined)
9
+ return null;
10
+ if (Array.isArray(key)) {
11
+ if (key.length === 0)
12
+ return null;
13
+ const normalized = key.map((k) => {
14
+ if (k === null)
15
+ return "__null";
16
+ if (k === undefined)
17
+ return "__undefined";
18
+ if (typeof k === "boolean")
19
+ return k ? "__true" : "__false";
20
+ return sanitize(String(k));
21
+ });
22
+ return normalized.join(delimiter);
23
+ }
24
+ if (typeof key === "boolean")
25
+ return key ? "__true" : "__false";
26
+ return String(key);
27
+ };
28
+
29
+ export { normalizeCacheKey };
@@ -0,0 +1,28 @@
1
+ import type { IntorResolvedConfig } from "../../../config/types/intor-config.types";
2
+ interface ExtractPathnameOptions {
3
+ config: IntorResolvedConfig;
4
+ pathname: string;
5
+ }
6
+ interface ExtractPathnameResult {
7
+ basePath: string;
8
+ prefixedPathname: string;
9
+ unprefixedPathname: string;
10
+ maybeLocale: string;
11
+ isLocalePrefixed: boolean;
12
+ }
13
+ /**
14
+ * Extracts basePath and locale info from a raw pathname.
15
+ *
16
+ * ```ts
17
+ * extractPathname({ config, pathname: '/app/en/about' });
18
+ * => {
19
+ * basePath: '/app',
20
+ * prefixedPathname: '/en/about',
21
+ * unprefixedPathname: '/about',
22
+ * maybeLocale: 'en',
23
+ * isLocalePrefixed: true
24
+ * }
25
+ * ```
26
+ */
27
+ export declare const extractPathname: ({ config, pathname: rawPathname, }: ExtractPathnameOptions) => ExtractPathnameResult;
28
+ export {};
@@ -0,0 +1,58 @@
1
+ import { normalizePathname } from './normalize-pathname.js';
2
+
3
+ /**
4
+ * Extracts basePath and locale info from a raw pathname.
5
+ *
6
+ * ```ts
7
+ * extractPathname({ config, pathname: '/app/en/about' });
8
+ * => {
9
+ * basePath: '/app',
10
+ * prefixedPathname: '/en/about',
11
+ * unprefixedPathname: '/about',
12
+ * maybeLocale: 'en',
13
+ * isLocalePrefixed: true
14
+ * }
15
+ * ```
16
+ */
17
+ const extractPathname = ({ config, pathname: rawPathname, }) => {
18
+ const { routing, defaultLocale } = config;
19
+ const { basePath, prefix } = routing;
20
+ const normalizedPathname = normalizePathname(rawPathname);
21
+ let prefixedPathname = normalizedPathname;
22
+ // Remove basePath if exists
23
+ if (basePath && normalizedPathname.startsWith(basePath + "/")) {
24
+ prefixedPathname = normalizedPathname.slice(basePath.length) || "/";
25
+ }
26
+ else if (basePath && normalizedPathname === basePath) {
27
+ prefixedPathname = "/";
28
+ }
29
+ // Extract potential locale from pathname
30
+ const pathPart = prefixedPathname.split("/").find(Boolean);
31
+ const maybeLocale = pathPart || "";
32
+ const isLocalePrefixed = config.supportedLocales?.includes(maybeLocale); // Check by supportedLocales
33
+ // prefix: "none"
34
+ let unprefixedPathname = prefixedPathname;
35
+ // prefix: "all"
36
+ if (prefix === "all") {
37
+ if (isLocalePrefixed) {
38
+ unprefixedPathname =
39
+ prefixedPathname.slice(maybeLocale.length + 1) || "/";
40
+ }
41
+ }
42
+ // prefix: "except-default",
43
+ else if (prefix === "except-default") {
44
+ if (maybeLocale && maybeLocale !== defaultLocale && isLocalePrefixed) {
45
+ unprefixedPathname =
46
+ prefixedPathname.slice(maybeLocale.length + 1) || "/";
47
+ }
48
+ }
49
+ return {
50
+ basePath,
51
+ prefixedPathname,
52
+ unprefixedPathname,
53
+ maybeLocale,
54
+ isLocalePrefixed: Boolean(isLocalePrefixed),
55
+ };
56
+ };
57
+
58
+ export { extractPathname };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Normalize a raw pathname string to ensure consistent formatting.
3
+ *
4
+ * - Trims leading and trailing whitespace (code points ≤ 32).
5
+ * - Collapses consecutive slashes into a single slash.
6
+ * - Ensures a leading slash and removes trailing slashes.
7
+ * - Optionally removes the leading slash.
8
+ * - Avoids intermediate array allocations for performance.
9
+ */
10
+ export declare const normalizePathname: (rawPathname: string, options?: {
11
+ removeLeadingSlash?: boolean;
12
+ }) => string;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Normalize a raw pathname string to ensure consistent formatting.
3
+ *
4
+ * - Trims leading and trailing whitespace (code points ≤ 32).
5
+ * - Collapses consecutive slashes into a single slash.
6
+ * - Ensures a leading slash and removes trailing slashes.
7
+ * - Optionally removes the leading slash.
8
+ * - Avoids intermediate array allocations for performance.
9
+ */
10
+ const normalizePathname = (rawPathname, options = {}) => {
11
+ const length = rawPathname.length;
12
+ let start = 0;
13
+ let end = length - 1;
14
+ // Trim leading whitespace
15
+ while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32)
16
+ start++;
17
+ // Trim trailing whitespace
18
+ while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32)
19
+ end--;
20
+ if (start > end)
21
+ return "/"; // Only whitespace
22
+ let result = "";
23
+ let hasSlash = false;
24
+ for (let i = start; i <= end; i++) {
25
+ const char = rawPathname[i];
26
+ if (char === "/") {
27
+ if (!hasSlash) {
28
+ hasSlash = true;
29
+ }
30
+ }
31
+ else {
32
+ result += hasSlash || result === "" ? "/" + char : char;
33
+ hasSlash = false;
34
+ }
35
+ }
36
+ // If the result has a leading slash and we want to remove it, do so
37
+ if (options.removeLeadingSlash && result.startsWith("/")) {
38
+ result = result.slice(1);
39
+ }
40
+ return result || "/";
41
+ };
42
+
43
+ export { normalizePathname };
@@ -0,0 +1,18 @@
1
+ import type { IntorResolvedConfig } from "../../../config/types/intor-config.types";
2
+ interface StandardizePathnameOptions {
3
+ config: IntorResolvedConfig;
4
+ pathname: string;
5
+ }
6
+ /**
7
+ * Standardize a pathname by prepending the base path and prefix placeholder,
8
+ * then normalize the result to remove redundant slashes.
9
+ *
10
+ * ```ts
11
+ * standardizePathname({ config, pathname: "/cms" });
12
+ * // basePath: "/asd/qwe"
13
+ * // prefixPlaceHolder: "{locale}"
14
+ * => "/asd/qwe/{locale}/cms"
15
+ * ```
16
+ */
17
+ export declare const standardizePathname: ({ config, pathname, }: StandardizePathnameOptions) => string;
18
+ export {};
@@ -0,0 +1,30 @@
1
+ import { PREFIX_PLACEHOLDER } from '../../constants/prefix-placeholder.js';
2
+ import { normalizePathname } from './normalize-pathname.js';
3
+
4
+ /**
5
+ * Standardize a pathname by prepending the base path and prefix placeholder,
6
+ * then normalize the result to remove redundant slashes.
7
+ *
8
+ * ```ts
9
+ * standardizePathname({ config, pathname: "/cms" });
10
+ * // basePath: "/asd/qwe"
11
+ * // prefixPlaceHolder: "{locale}"
12
+ * => "/asd/qwe/{locale}/cms"
13
+ * ```
14
+ */
15
+ const standardizePathname = ({ config, pathname, }) => {
16
+ const { routing } = config;
17
+ const { basePath } = routing;
18
+ // Normalize each segment before join to avoid redundant slashes
19
+ const parts = [
20
+ normalizePathname(basePath),
21
+ PREFIX_PLACEHOLDER,
22
+ normalizePathname(pathname),
23
+ ];
24
+ // Avoid double slashes between segments
25
+ const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
26
+ // Final normalization to ensure leading slash, no trailing
27
+ return normalizePathname(standardizedPathname);
28
+ };
29
+
30
+ export { standardizePathname };
@@ -0,0 +1,10 @@
1
+ import type { IntorResolvedConfig } from "../../config/types/intor-config.types";
2
+ interface ResolveNamespacesOptions {
3
+ config: IntorResolvedConfig;
4
+ pathname: string;
5
+ }
6
+ /**
7
+ * Resolves namespaces based on pathname.
8
+ */
9
+ export declare const resolveNamespaces: ({ config, pathname, }: ResolveNamespacesOptions) => string[] | undefined;
10
+ export {};
@@ -0,0 +1,33 @@
1
+ import { PREFIX_PLACEHOLDER } from '../constants/prefix-placeholder.js';
2
+ import { standardizePathname } from './pathname/standardize-pathname.js';
3
+
4
+ /**
5
+ * Resolves namespaces based on pathname.
6
+ */
7
+ const resolveNamespaces = ({ config, pathname, }) => {
8
+ const { loader } = config;
9
+ const { routeNamespaces = {}, namespaces } = loader || {};
10
+ if (Object.keys(routeNamespaces).length === 0 && !namespaces)
11
+ return undefined;
12
+ // "/{locale}/...", "__basePath__/{locale}/...""
13
+ const standardizedPathname = standardizePathname({ config, pathname });
14
+ // "/...", "__basePath__/...""
15
+ const placeholderRemovedPathname = standardizedPathname.replace(`/${PREFIX_PLACEHOLDER}`, "");
16
+ const collected = [
17
+ ...(routeNamespaces.default || []), // default
18
+ ...(namespaces || []), // default
19
+ ...(routeNamespaces[standardizedPathname] || []), // exact match
20
+ ...(routeNamespaces[placeholderRemovedPathname] || []), // exact match
21
+ ];
22
+ const prefixPatterns = Object.keys(routeNamespaces).filter((pattern) => pattern.endsWith("/*"));
23
+ for (const pattern of prefixPatterns) {
24
+ const basePath = pattern.replace(/\/\*$/, "");
25
+ if (standardizedPathname.startsWith(basePath) ||
26
+ placeholderRemovedPathname.startsWith(basePath)) {
27
+ collected.push(...(routeNamespaces[pattern] || [])); // match pattern
28
+ }
29
+ }
30
+ return [...new Set(collected)];
31
+ };
32
+
33
+ export { resolveNamespaces };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intor",
3
- "version": "2.2.14",
3
+ "version": "2.2.15",
4
4
  "description": "A modular and extensible i18n core designed for TypeScript and JavaScript projects. Intor enables custom translation logic with support for both frontend and backend environments, featuring runtime configuration, caching, adapters, and message loaders.",
5
5
  "author": "Yiming Liao",
6
6
  "license": "MIT",
@@ -26,44 +26,34 @@
26
26
  ],
27
27
  "exports": {
28
28
  ".": {
29
- "types": "./dist/index.d.ts",
30
- "import": "./dist/index.js",
31
- "require": "./dist/index.cjs"
29
+ "types": "./dist/exports/index.d.ts",
30
+ "import": "./dist/exports/index.js"
32
31
  },
33
32
  "./config": {
34
- "types": "./dist/config/index.d.ts",
35
- "import": "./dist/config/index.js",
36
- "require": "./dist/config/index.cjs"
33
+ "types": "./dist/exports/config/index.d.ts",
34
+ "import": "./dist/exports/config/index.js"
37
35
  },
38
36
  "./server": {
39
- "types": "./dist/server/index.d.ts",
40
- "import": "./dist/server/index.js",
41
- "require": "./dist/server/index.cjs"
37
+ "types": "./dist/exports/server/index.d.ts",
38
+ "import": "./dist/exports/server/index.js"
42
39
  },
43
40
  "./react": {
44
- "types": "./dist/react/index.d.ts",
45
- "import": "./dist/react/index.js",
46
- "require": "./dist/react/index.cjs"
41
+ "types": "./dist/exports/react/index.d.ts",
42
+ "import": "./dist/exports/react/index.js"
47
43
  },
48
44
  "./next": {
49
- "types": "./dist/next/index.d.ts",
50
- "import": "./dist/next/index.js",
51
- "require": "./dist/next/index.cjs"
45
+ "types": "./dist/exports/next/index.d.ts",
46
+ "import": "./dist/exports/next/index.js"
52
47
  },
53
48
  "./next/middleware": {
54
- "types": "./dist/next/middleware/index.d.ts",
55
- "import": "./dist/next/middleware/index.js",
56
- "require": "./dist/next/middleware/index.cjs"
49
+ "types": "./dist/exports/next/middleware/index.d.ts",
50
+ "import": "./dist/exports/next/middleware/index.js"
57
51
  },
58
52
  "./next/server": {
59
- "types": "./dist/next/server/index.d.ts",
60
- "import": "./dist/next/server/index.js",
61
- "require": "./dist/next/server/index.cjs"
53
+ "types": "./dist/exports/next/server/index.d.ts",
54
+ "import": "./dist/exports/next/server/index.js"
62
55
  }
63
56
  },
64
- "main": "./dist/index.cjs",
65
- "module": "./dist/index.js",
66
- "types": "./dist/index.d.ts",
67
57
  "files": [
68
58
  "dist",
69
59
  "README.md",
@@ -71,13 +61,18 @@
71
61
  ],
72
62
  "type": "module",
73
63
  "scripts": {
74
- "build": "tsup",
75
- "prepublishOnly": "yarn build",
76
64
  "type": "tsc --noEmit",
77
65
  "lint": "eslint",
78
66
  "lint:debug": "eslint --debug",
79
67
  "test": "vitest",
80
- "knip": "knip --config .config/knip.config.ts"
68
+ "knip": "knip --config .config/knip.config.ts",
69
+ "clean": "rm -rf dist",
70
+ "build:core": "rollup -c .config/rollup/core.js",
71
+ "build:react": "rollup -c .config/rollup/react.js",
72
+ "build:next": "rollup -c .config/rollup/next.js",
73
+ "build:dts": "rollup -c .config/rollup/dts.js",
74
+ "build": "yarn clean && yarn build:core && yarn build:react && yarn build:next && yarn tsc -p tsconfig.build.json && yarn tsc-alias tsconfig.build.json --outDir dist",
75
+ "prepublishOnly": "yarn build"
81
76
  },
82
77
  "dependencies": {
83
78
  "intor-translator": "^1.1.5",
@@ -88,11 +83,12 @@
88
83
  },
89
84
  "devDependencies": {
90
85
  "@intor/cli": "^0.1.2",
86
+ "@rollup/plugin-typescript": "^12.3.0",
91
87
  "@types/lodash.merge": "^4.6.9",
92
88
  "@types/node": "^24.10.1",
93
89
  "@types/react": "^19.0.0",
94
90
  "@types/react-dom": "^19.0.0",
95
- "@vitest/coverage-v8": "4.0.9",
91
+ "@vitest/coverage-v8": "4.0.13",
96
92
  "eslint": "^9.27.0",
97
93
  "eslint-config-prettier": "^10.1.8",
98
94
  "eslint-import-resolver-typescript": "^4.4.4",
@@ -108,7 +104,9 @@
108
104
  "react-dom": "^19.0.0",
109
105
  "remark": "^15.0.1",
110
106
  "remark-gfm": "^4.0.1",
111
- "tsup": "^8.5.1",
107
+ "rollup": "^4.53.3",
108
+ "rollup-plugin-preserve-directives": "^0.4.0",
109
+ "tsc-alias": "^1.8.16",
112
110
  "typescript": "^5.8.3",
113
111
  "typescript-eslint": "^8.32.1",
114
112
  "vitest": "^4.0.9"
@@ -1,198 +0,0 @@
1
- 'use strict';
2
-
3
- // src/config/constants/cache.constants.ts
4
- var DEFAULT_CACHE_OPTIONS = {
5
- enabled: process.env.NODE_ENV === "production",
6
- ttl: 60 * 60 * 1e3
7
- // 1 hour
8
- };
9
-
10
- // src/config/resolvers/resolve-cache-options.ts
11
- var resolveCacheOptions = (cache) => {
12
- return {
13
- ...DEFAULT_CACHE_OPTIONS,
14
- ...cache
15
- };
16
- };
17
-
18
- // src/config/constants/cookie.constants.ts
19
- var DEFAULT_COOKIE_OPTIONS = {
20
- enabled: true,
21
- autoSetCookie: true,
22
- name: "intor.i18n.locale",
23
- domain: null,
24
- path: "/",
25
- maxAge: 60 * 60 * 24 * 365,
26
- // 365 days
27
- httpOnly: false,
28
- secure: process.env.NODE_ENV !== "development",
29
- sameSite: "lax"
30
- };
31
-
32
- // src/config/resolvers/resolve-cookie-options.ts
33
- var resolveCookieOptions = (cookie = {}) => {
34
- return {
35
- ...DEFAULT_COOKIE_OPTIONS,
36
- ...cookie
37
- };
38
- };
39
-
40
- // src/config/resolvers/resolve-fallback-locales.ts
41
- var resolveFallbackLocales = (config, supportedLocales) => {
42
- const { defaultLocale, fallbackLocales } = config;
43
- if (!fallbackLocales || typeof fallbackLocales !== "object") {
44
- return {};
45
- }
46
- const supportedSet = new Set(supportedLocales);
47
- const validMap = {};
48
- const invalidFallbackMap = /* @__PURE__ */ new Map();
49
- for (const [locale, fallbacks] of Object.entries(fallbackLocales)) {
50
- const fallbackArray = Array.isArray(fallbacks) ? fallbacks : [];
51
- const validFallbacks = fallbackArray.filter(
52
- (fallback) => fallback === "default" || supportedSet.has(fallback) || fallback === defaultLocale
53
- );
54
- const invalidFallbacks = fallbackArray.filter(
55
- (fallback) => fallback !== "default" && !supportedSet.has(fallback) && fallback !== defaultLocale
56
- );
57
- if (invalidFallbacks.length > 0) {
58
- invalidFallbackMap.set(locale, invalidFallbacks);
59
- }
60
- if (validFallbacks.length > 0) {
61
- validMap[locale] = validFallbacks;
62
- }
63
- }
64
- for (const [locale, invalids] of invalidFallbackMap.entries()) {
65
- console.warn(
66
- `Invalid fallback locales for "${locale}"`,
67
- { invalids: [...invalids] },
68
- { scope: "resolveFallbackLocales" }
69
- );
70
- }
71
- return validMap;
72
- };
73
-
74
- // src/config/constants/routing.constants.ts
75
- var DEFAULT_ROUTING_OPTIONS = {
76
- prefix: "none",
77
- firstVisit: {
78
- localeSource: "browser",
79
- redirect: true
80
- },
81
- basePath: "/"
82
- };
83
-
84
- // src/shared/utils/pathname/normalize-pathname.ts
85
- var normalizePathname = (rawPathname, options = {}) => {
86
- const length = rawPathname.length;
87
- let start = 0;
88
- let end = length - 1;
89
- while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
90
- while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
91
- if (start > end) return "/";
92
- let result = "";
93
- let hasSlash = false;
94
- for (let i = start; i <= end; i++) {
95
- const char = rawPathname[i];
96
- if (char === "/") {
97
- if (!hasSlash) {
98
- hasSlash = true;
99
- }
100
- } else {
101
- result += hasSlash || result === "" ? "/" + char : char;
102
- hasSlash = false;
103
- }
104
- }
105
- if (options.removeLeadingSlash && result.startsWith("/")) {
106
- result = result.slice(1);
107
- }
108
- return result || "/";
109
- };
110
-
111
- // src/config/resolvers/resolve-routing-options.ts
112
- var resolveRoutingOptions = (routing = {}) => {
113
- return {
114
- ...DEFAULT_ROUTING_OPTIONS,
115
- ...routing,
116
- firstVisit: {
117
- ...DEFAULT_ROUTING_OPTIONS.firstVisit,
118
- ...routing.firstVisit
119
- },
120
- basePath: normalizePathname(routing?.basePath || "")
121
- };
122
- };
123
-
124
- // src/shared/error/intor-error.ts
125
- var IntorError = class extends Error {
126
- code;
127
- id;
128
- constructor({ message, code, id }) {
129
- const fullMessage = id ? `[${id}] ${message}` : message;
130
- super(fullMessage);
131
- this.name = "IntorError";
132
- this.id = id;
133
- this.code = code;
134
- Object.setPrototypeOf(this, new.target.prototype);
135
- }
136
- };
137
-
138
- // src/config/validators/validate-default-locale.ts
139
- var validateDefaultLocale = (config, supportedLocales) => {
140
- const { id, defaultLocale } = config;
141
- if (!defaultLocale) {
142
- throw new IntorError({
143
- id,
144
- code: "INTOR_MISSING_DEFAULT_LOCALE" /* MISSING_DEFAULT_LOCALE */,
145
- message: `The defaultLocale is undefined`
146
- });
147
- }
148
- if (!supportedLocales.includes(defaultLocale)) {
149
- throw new IntorError({
150
- id,
151
- code: "INTOR_UNSUPPORTED_DEFAULT_LOCALE" /* UNSUPPORTED_DEFAULT_LOCALE */,
152
- message: `The defaultLocale "${defaultLocale}" is not included in the supportedLocales.`
153
- });
154
- }
155
- return defaultLocale;
156
- };
157
-
158
- // src/config/validators/validate-supported-locales.ts
159
- var validateSupportedLocales = (config) => {
160
- const { id, loader, supportedLocales } = config;
161
- if (loader && !supportedLocales) {
162
- throw new IntorError({
163
- id,
164
- code: "INTOR_MISSING_SUPPORTED_LOCALES" /* MISSING_SUPPORTED_LOCALES */,
165
- message: `"supportedLocales" is required when using loader, but it is missing.`
166
- });
167
- }
168
- return supportedLocales || Object.keys(config.messages || {});
169
- };
170
-
171
- // src/config/define-intor-config.ts
172
- var defineIntorConfig = (config) => {
173
- const id = config.id || `ID${Math.random().toString(36).slice(2, 6)}`;
174
- const supportedLocales = validateSupportedLocales(config);
175
- const defaultLocale = validateDefaultLocale(config, supportedLocales);
176
- const fallbackLocales = resolveFallbackLocales(config, supportedLocales);
177
- const cookie = resolveCookieOptions(config.cookie);
178
- const routing = resolveRoutingOptions(config.routing);
179
- const cache = resolveCacheOptions(config.cache);
180
- return {
181
- id,
182
- messages: config.messages,
183
- loader: config.loader,
184
- defaultLocale,
185
- supportedLocales,
186
- fallbackLocales,
187
- translator: config.translator,
188
- cookie,
189
- routing,
190
- logger: config.logger,
191
- cache
192
- };
193
- };
194
-
195
- exports.DEFAULT_CACHE_OPTIONS = DEFAULT_CACHE_OPTIONS;
196
- exports.DEFAULT_COOKIE_OPTIONS = DEFAULT_COOKIE_OPTIONS;
197
- exports.DEFAULT_ROUTING_OPTIONS = DEFAULT_ROUTING_OPTIONS;
198
- exports.defineIntorConfig = defineIntorConfig;