intor 2.1.0 → 2.2.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.
@@ -2,8 +2,8 @@ import * as React7 from 'react';
2
2
  import { logry } from 'logry';
3
3
  import Keyv from 'keyv';
4
4
  import { Translator } from 'intor-translator';
5
- import NextLink from 'next/link';
6
5
  import { formatUrl } from 'next/dist/shared/lib/router/utils/format-url';
6
+ import NextLink from 'next/link';
7
7
  import { usePathname as usePathname$1, useRouter as useRouter$1, redirect as redirect$1 } from 'next/navigation';
8
8
  import { cookies, headers } from 'next/headers';
9
9
 
@@ -22,66 +22,6 @@ function useConfig() {
22
22
  return context;
23
23
  }
24
24
  var LocaleContext = React7.createContext(void 0);
25
-
26
- // src/adapters/next/shared/utils/build-cookie-string.ts
27
- var buildCookieString = (cookie, locale) => {
28
- const parts = [];
29
- parts.push(`${cookie.name}=${encodeURIComponent(locale)}`);
30
- if (cookie.maxAge) {
31
- const expires = new Date(Date.now() + cookie.maxAge * 1e3).toUTCString();
32
- parts.push(`expires=${expires}`);
33
- parts.push(`max-age=${cookie.maxAge}`);
34
- }
35
- parts.push(`path=${cookie.path ?? "/"}`);
36
- if (cookie.domain) {
37
- parts.push(`domain=${cookie.domain}`);
38
- }
39
- if (cookie.sameSite) {
40
- parts.push(
41
- `SameSite=${cookie.sameSite[0].toUpperCase()}${cookie.sameSite.slice(1).toLowerCase()}`
42
- );
43
- }
44
- if (cookie.secure !== false) {
45
- parts.push(`Secure`);
46
- }
47
- return parts.join("; ");
48
- };
49
-
50
- // src/adapters/next/shared/utils/set-locale-cookie-browser.ts
51
- var setLocaleCookieBrowser = ({
52
- cookie,
53
- locale
54
- }) => {
55
- if (typeof window === "undefined") return;
56
- if (cookie.disabled || !cookie.autoSetCookie) return;
57
- const cookieString = buildCookieString(cookie, locale);
58
- document.cookie = cookieString;
59
- };
60
-
61
- // src/adapters/next/contexts/locale/utils/change-locale.ts
62
- var changeLocale = ({
63
- currentLocale,
64
- newLocale,
65
- loaderOptions,
66
- cookie,
67
- setLocale,
68
- refetchMessages
69
- }) => {
70
- if (typeof document === "undefined") return;
71
- const loaderType = loaderOptions?.type;
72
- if (newLocale === currentLocale) return;
73
- if (loaderType === "import") {
74
- console.warn(
75
- `[Intor] You are using dynamic import to switch languages. Please make sure to use the wrapped <Link> component to trigger a page reload, ensuring that the translation data is dynamically updated.`
76
- );
77
- }
78
- setLocale(newLocale);
79
- setLocaleCookieBrowser({ cookie, locale: newLocale });
80
- document.documentElement.lang = newLocale;
81
- if (loaderType === "api" && refetchMessages) {
82
- void refetchMessages(newLocale);
83
- }
84
- };
85
25
  var MessagesContext = React7.createContext(void 0);
86
26
 
87
27
  // src/modules/config/constants/cache.constants.ts
@@ -120,7 +60,7 @@ function getLogger({
120
60
  });
121
61
  pool.set(id, logger);
122
62
  if (pool.size > 1e3) {
123
- const keys = Array.from(pool.keys());
63
+ const keys = [...pool.keys()];
124
64
  for (const key of keys.slice(0, 200)) pool.delete(key);
125
65
  }
126
66
  }
@@ -135,7 +75,7 @@ function getGlobalMessagesPool() {
135
75
 
136
76
  // src/shared/utils/merge-messages.ts
137
77
  var mergeMessages = (staticMessages = {}, loadedMessages = {}) => {
138
- const result = Object.keys(staticMessages).length ? { ...staticMessages } : {};
78
+ const result = Object.keys(staticMessages).length > 0 ? { ...staticMessages } : {};
139
79
  for (const locale in loadedMessages) {
140
80
  const loaded = loadedMessages[locale];
141
81
  if (!result[locale]) {
@@ -154,7 +94,7 @@ var mergeMessages = (staticMessages = {}, loadedMessages = {}) => {
154
94
  var CACHE_KEY_DELIMITER = "|";
155
95
  var sanitize = (k) => k.replaceAll(/[\u200B-\u200D\uFEFF]/g, "").replaceAll(/[\r\n]/g, "").trim();
156
96
  var normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
157
- if (!key) return null;
97
+ if (key === null || key === void 0) return null;
158
98
  if (Array.isArray(key)) {
159
99
  if (key.length === 0) return null;
160
100
  const normalized = key.map((k) => {
@@ -178,56 +118,44 @@ var resolveNamespaces = ({
178
118
  pathname
179
119
  }) => {
180
120
  const { loader } = config;
181
- const {
182
- routeNamespaces = {},
183
- namespaces: fallbackNamespaces
184
- } = loader;
185
- const { unprefixedPathname } = extractPathname({ config, pathname });
186
- const standardizedPathname = standardizePathname({
187
- config,
188
- pathname: unprefixedPathname
189
- });
121
+ const { routeNamespaces = {}, namespaces } = loader || {};
122
+ const standardizedPathname = standardizePathname({ config, pathname });
190
123
  const placeholderRemovedPathname = standardizedPathname.replace(
191
124
  `/${PREFIX_PLACEHOLDER}`,
192
125
  ""
193
126
  );
194
- const defaultNamespaces = routeNamespaces.default ?? [];
195
- const exactMatchNamespaces = routeNamespaces[standardizedPathname] ?? routeNamespaces[placeholderRemovedPathname];
196
- if (exactMatchNamespaces) {
197
- return [...defaultNamespaces, ...exactMatchNamespaces];
198
- }
199
- let bestMatch = "";
200
- let bestNamespaces;
127
+ const collected = [
128
+ ...routeNamespaces.default || [],
129
+ // default
130
+ ...namespaces || [],
131
+ // default
132
+ ...routeNamespaces[standardizedPathname] || [],
133
+ // exact match
134
+ ...routeNamespaces[placeholderRemovedPathname] || []
135
+ // exact match
136
+ ];
201
137
  const prefixPatterns = Object.keys(routeNamespaces).filter(
202
138
  (pattern) => pattern.endsWith("/*")
203
139
  );
204
140
  for (const pattern of prefixPatterns) {
205
141
  const basePath = pattern.replace(/\/\*$/, "");
206
- if (standardizedPathname.startsWith(basePath)) {
207
- if (basePath.length > bestMatch.length) {
208
- bestMatch = basePath;
209
- bestNamespaces = routeNamespaces[pattern];
210
- }
142
+ if (standardizedPathname.startsWith(basePath) || placeholderRemovedPathname.startsWith(basePath)) {
143
+ collected.push(...routeNamespaces[pattern] || []);
211
144
  }
212
145
  }
213
- const matchedNamespaces = bestNamespaces ?? routeNamespaces["/*"] ?? fallbackNamespaces ?? [];
214
- if (matchedNamespaces.length > 0) {
215
- return [...defaultNamespaces, ...matchedNamespaces];
216
- } else {
217
- return [...defaultNamespaces];
218
- }
146
+ return [...new Set(collected)];
219
147
  };
220
148
 
221
149
  // src/shared/utils/locale/normalize-locale.ts
150
+ var toCanonical = (input) => {
151
+ try {
152
+ return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
153
+ } catch {
154
+ return;
155
+ }
156
+ };
222
157
  var normalizeLocale = (locale = "", supportedLocales = []) => {
223
158
  if (!locale || supportedLocales.length === 0) return;
224
- const toCanonical = (input) => {
225
- try {
226
- return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
227
- } catch {
228
- return;
229
- }
230
- };
231
159
  const canonicalLocale = toCanonical(locale);
232
160
  if (!canonicalLocale) return;
233
161
  const supportedCanonicalMap = /* @__PURE__ */ new Map();
@@ -258,12 +186,12 @@ var resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
258
186
  const supportedLocalesSet = new Set(supportedLocales);
259
187
  const preferred = acceptLanguageHeader.split(",").map((part) => {
260
188
  const [lang, qValue] = part.split(";");
261
- const q = qValue ? parseFloat(qValue.split("=")[1]) : 1;
262
- if (isNaN(q)) {
189
+ const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
190
+ if (Number.isNaN(q)) {
263
191
  return { lang: lang.trim(), q: 0 };
264
192
  }
265
193
  return { lang: lang.trim(), q };
266
- }).sort((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
194
+ }).toSorted((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
267
195
  return preferred;
268
196
  };
269
197
 
@@ -272,8 +200,8 @@ var normalizePathname = (rawPathname, options = {}) => {
272
200
  const length = rawPathname.length;
273
201
  let start = 0;
274
202
  let end = length - 1;
275
- while (start <= end && rawPathname.charCodeAt(start) <= 32) start++;
276
- while (end >= start && rawPathname.charCodeAt(end) <= 32) end--;
203
+ while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
204
+ while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
277
205
  if (start > end) return "/";
278
206
  let result = "";
279
207
  let hasSlash = false;
@@ -284,11 +212,7 @@ var normalizePathname = (rawPathname, options = {}) => {
284
212
  hasSlash = true;
285
213
  }
286
214
  } else {
287
- if (hasSlash || result === "") {
288
- result += "/" + char;
289
- } else {
290
- result += char;
291
- }
215
+ result += hasSlash || result === "" ? "/" + char : char;
292
216
  hasSlash = false;
293
217
  }
294
218
  }
@@ -312,8 +236,8 @@ var extractPathname = ({
312
236
  } else if (basePath && normalizedPathname === basePath) {
313
237
  prefixedPathname = "/";
314
238
  }
315
- const pathParts = prefixedPathname.split("/").filter(Boolean);
316
- const maybeLocale = pathParts[0] || "";
239
+ const pathPart = prefixedPathname.split("/").find(Boolean);
240
+ const maybeLocale = pathPart || "";
317
241
  const isLocalePrefixed = config.supportedLocales?.includes(maybeLocale);
318
242
  let unprefixedPathname = prefixedPathname;
319
243
  if (prefix === "all") {
@@ -346,7 +270,7 @@ var standardizePathname = ({
346
270
  PREFIX_PLACEHOLDER,
347
271
  normalizePathname(pathname)
348
272
  ];
349
- const standardizedPathname = parts.join("/").replace(/\/{2,}/g, "/");
273
+ const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
350
274
  return normalizePathname(standardizedPathname);
351
275
  };
352
276
 
@@ -458,8 +382,8 @@ var loadApiMessages = async ({
458
382
  loggerOptions.id,
459
383
  basePath,
460
384
  locale,
461
- [...fallbackLocales ?? []].sort().join(","),
462
- [...namespaces ?? []].sort().join(",")
385
+ (fallbackLocales ?? []).toSorted().join(","),
386
+ (namespaces ?? []).toSorted().join(",")
463
387
  ]);
464
388
  if (cache.enabled && key) {
465
389
  const cached = await pool?.get(key);
@@ -580,6 +504,8 @@ function useMessages() {
580
504
  throw new Error("useMessages must be used within a MessagesProvider");
581
505
  return context;
582
506
  }
507
+
508
+ // src/adapters/next/contexts/locale/utils/use-init-lazy-load.ts
583
509
  var useInitLazyLoad = ({
584
510
  loaderOptions,
585
511
  currentLocale
@@ -594,6 +520,41 @@ var useInitLazyLoad = ({
594
520
  }
595
521
  }, [lazyLoad, currentLocale, refetchMessages, isFirstLoadedRef]);
596
522
  };
523
+
524
+ // src/adapters/next/shared/utils/build-cookie-string.ts
525
+ var buildCookieString = (cookie, locale) => {
526
+ const parts = [`${cookie.name}=${encodeURIComponent(locale)}`];
527
+ if (cookie.maxAge) {
528
+ const expires = new Date(Date.now() + cookie.maxAge * 1e3).toUTCString();
529
+ parts.push(`expires=${expires}`, `max-age=${cookie.maxAge}`);
530
+ }
531
+ parts.push(`path=${cookie.path ?? "/"}`);
532
+ if (cookie.domain) {
533
+ parts.push(`domain=${cookie.domain}`);
534
+ }
535
+ if (cookie.sameSite) {
536
+ parts.push(
537
+ `SameSite=${cookie.sameSite[0].toUpperCase()}${cookie.sameSite.slice(1).toLowerCase()}`
538
+ );
539
+ }
540
+ if (cookie.secure !== false) {
541
+ parts.push(`Secure`);
542
+ }
543
+ return parts.join("; ");
544
+ };
545
+
546
+ // src/adapters/next/shared/utils/set-locale-cookie-browser.ts
547
+ var setLocaleCookieBrowser = ({
548
+ cookie,
549
+ locale
550
+ }) => {
551
+ if (globalThis.window === void 0) return;
552
+ if (cookie.disabled || !cookie.autoSetCookie) return;
553
+ const cookieString = buildCookieString(cookie, locale);
554
+ document.cookie = cookieString;
555
+ };
556
+
557
+ // src/adapters/next/contexts/locale/utils/use-init-locale-cookie.ts
597
558
  var useInitLocaleCookie = ({
598
559
  config,
599
560
  locale
@@ -611,6 +572,31 @@ var useInitLocaleCookie = ({
611
572
  }, []);
612
573
  };
613
574
 
575
+ // src/adapters/next/contexts/locale/utils/change-locale.ts
576
+ var changeLocale = ({
577
+ currentLocale,
578
+ newLocale,
579
+ loaderOptions,
580
+ cookie,
581
+ setLocale,
582
+ refetchMessages
583
+ }) => {
584
+ if (typeof document === "undefined") return;
585
+ const loaderType = loaderOptions?.type;
586
+ if (newLocale === currentLocale) return;
587
+ if (loaderType === "import") {
588
+ console.warn(
589
+ `[Intor] You are using dynamic import to switch languages. Please make sure to use the wrapped <Link> component to trigger a page reload, ensuring that the translation data is dynamically updated.`
590
+ );
591
+ }
592
+ setLocale(newLocale);
593
+ setLocaleCookieBrowser({ cookie, locale: newLocale });
594
+ document.documentElement.lang = newLocale;
595
+ if (loaderType === "api" && refetchMessages) {
596
+ void refetchMessages(newLocale);
597
+ }
598
+ };
599
+
614
600
  // src/adapters/next/contexts/locale/provider.tsx
615
601
  function LocaleProvider({
616
602
  value: { initialLocale },
@@ -709,7 +695,7 @@ function useTranslator() {
709
695
  const context = React7.useContext(TranslatorContext);
710
696
  if (!context)
711
697
  throw new Error(
712
- "useIntorTranslator must be used within IntorTranslatorProvider"
698
+ "useTranslator must be used within IntorTranslatorProvider"
713
699
  );
714
700
  return context;
715
701
  }
@@ -732,13 +718,12 @@ function useTranslator2(preKey) {
732
718
  isLoading: translator.isLoading,
733
719
  setLocale
734
720
  };
735
- if (preKey) {
736
- const { hasKey, t } = translator.scoped(preKey);
737
- return { ...props, hasKey, t };
738
- } else {
739
- const { hasKey, t } = translator;
740
- return { ...props, hasKey, t };
741
- }
721
+ const scoped = translator.scoped(preKey);
722
+ return {
723
+ ...props,
724
+ hasKey: preKey ? scoped.hasKey : translator.hasKey,
725
+ t: preKey ? scoped.t : translator.t
726
+ };
742
727
  }
743
728
 
744
729
  // src/adapters/next/shared/utils/locale-prefix-pathname.ts
@@ -758,15 +743,11 @@ var localePrefixPathname = ({
758
743
  );
759
744
  }
760
745
  if (prefix === "except-default") {
761
- if (locale === config.defaultLocale) {
762
- return normalizePathname(
763
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
764
- );
765
- } else {
766
- return normalizePathname(
767
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
768
- );
769
- }
746
+ return locale === config.defaultLocale ? normalizePathname(
747
+ standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
748
+ ) : normalizePathname(
749
+ standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
750
+ );
770
751
  }
771
752
  return normalizePathname(
772
753
  standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
@@ -858,7 +839,7 @@ var useLocaleSwitch = () => {
858
839
  if (isExternal) return;
859
840
  if (shouldFullReload({ config, targetPathname, locale, currentLocale })) {
860
841
  setLocaleCookieBrowser({ cookie: config.cookie, locale: targetLocale });
861
- window.location.href = resolvedHref;
842
+ globalThis.location.href = resolvedHref;
862
843
  return;
863
844
  } else {
864
845
  setLocale(targetLocale);
@@ -45,15 +45,15 @@ var setPathnameHeader = ({
45
45
  var PREFIX_PLACEHOLDER = "{locale}";
46
46
 
47
47
  // src/shared/utils/locale/normalize-locale.ts
48
+ var toCanonical = (input) => {
49
+ try {
50
+ return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
51
+ } catch {
52
+ return;
53
+ }
54
+ };
48
55
  var normalizeLocale = (locale = "", supportedLocales = []) => {
49
56
  if (!locale || supportedLocales.length === 0) return;
50
- const toCanonical = (input) => {
51
- try {
52
- return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
53
- } catch {
54
- return;
55
- }
56
- };
57
57
  const canonicalLocale = toCanonical(locale);
58
58
  if (!canonicalLocale) return;
59
59
  const supportedCanonicalMap = /* @__PURE__ */ new Map();
@@ -84,12 +84,12 @@ var resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
84
84
  const supportedLocalesSet = new Set(supportedLocales);
85
85
  const preferred = acceptLanguageHeader.split(",").map((part) => {
86
86
  const [lang, qValue] = part.split(";");
87
- const q = qValue ? parseFloat(qValue.split("=")[1]) : 1;
88
- if (isNaN(q)) {
87
+ const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
88
+ if (Number.isNaN(q)) {
89
89
  return { lang: lang.trim(), q: 0 };
90
90
  }
91
91
  return { lang: lang.trim(), q };
92
- }).sort((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
92
+ }).toSorted((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
93
93
  return preferred;
94
94
  };
95
95
 
@@ -98,8 +98,8 @@ var normalizePathname = (rawPathname, options = {}) => {
98
98
  const length = rawPathname.length;
99
99
  let start = 0;
100
100
  let end = length - 1;
101
- while (start <= end && rawPathname.charCodeAt(start) <= 32) start++;
102
- while (end >= start && rawPathname.charCodeAt(end) <= 32) end--;
101
+ while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
102
+ while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
103
103
  if (start > end) return "/";
104
104
  let result = "";
105
105
  let hasSlash = false;
@@ -110,11 +110,7 @@ var normalizePathname = (rawPathname, options = {}) => {
110
110
  hasSlash = true;
111
111
  }
112
112
  } else {
113
- if (hasSlash || result === "") {
114
- result += "/" + char;
115
- } else {
116
- result += char;
117
- }
113
+ result += hasSlash || result === "" ? "/" + char : char;
118
114
  hasSlash = false;
119
115
  }
120
116
  }
@@ -138,8 +134,8 @@ var extractPathname = ({
138
134
  } else if (basePath && normalizedPathname === basePath) {
139
135
  prefixedPathname = "/";
140
136
  }
141
- const pathParts = prefixedPathname.split("/").filter(Boolean);
142
- const maybeLocale = pathParts[0] || "";
137
+ const pathPart = prefixedPathname.split("/").find(Boolean);
138
+ const maybeLocale = pathPart || "";
143
139
  const isLocalePrefixed = config.supportedLocales?.includes(maybeLocale);
144
140
  let unprefixedPathname = prefixedPathname;
145
141
  if (prefix === "all") {
@@ -172,7 +168,7 @@ var standardizePathname = ({
172
168
  PREFIX_PLACEHOLDER,
173
169
  normalizePathname(pathname)
174
170
  ];
175
- const standardizedPathname = parts.join("/").replace(/\/{2,}/g, "/");
171
+ const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
176
172
  return normalizePathname(standardizedPathname);
177
173
  };
178
174
 
@@ -193,15 +189,11 @@ var localePrefixPathname = ({
193
189
  );
194
190
  }
195
191
  if (prefix === "except-default") {
196
- if (locale === config.defaultLocale) {
197
- return normalizePathname(
198
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
199
- );
200
- } else {
201
- return normalizePathname(
202
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
203
- );
204
- }
192
+ return locale === config.defaultLocale ? normalizePathname(
193
+ standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
194
+ ) : normalizePathname(
195
+ standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
196
+ );
205
197
  }
206
198
  return normalizePathname(
207
199
  standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
@@ -251,12 +243,7 @@ var createResponse = ({
251
243
  locale
252
244
  });
253
245
  url.pathname = localePrefixedPathname;
254
- let response;
255
- if (responseType === "redirect") {
256
- response = server.NextResponse.redirect(url);
257
- } else {
258
- response = server.NextResponse.next();
259
- }
246
+ const response = responseType === "redirect" ? server.NextResponse.redirect(url) : server.NextResponse.next();
260
247
  if (locale) {
261
248
  setLocaleCookieEdge({
262
249
  request,
@@ -276,7 +263,8 @@ var determineInitialLocale = async (config) => {
276
263
  const { defaultLocale, supportedLocales, routing } = config;
277
264
  let initialLocale = defaultLocale;
278
265
  if (routing.firstVisit.localeSource === "browser") {
279
- const acceptLanguageHeader = (await headers.headers()).get("accept-language") || void 0;
266
+ const headersStore = await headers.headers();
267
+ const acceptLanguageHeader = headersStore.get("accept-language") || void 0;
280
268
  const preferredLocale = resolvePreferredLocale(
281
269
  acceptLanguageHeader,
282
270
  supportedLocales
@@ -1,6 +1,6 @@
1
- import { NextRequest } from 'next/server';
2
1
  import { Level, NormalizerConfig, FormatterConfig, LoggerPreset } from 'logry/edge';
3
- import { Locale, LocaleNamespaceMessages, FallbackLocalesMap } from 'intor-translator';
2
+ import { Locale, LocaleMessages, FallbackLocalesMap } from 'intor-translator';
3
+ import { NextRequest } from 'next/server';
4
4
 
5
5
  type CookieRawOptions = {
6
6
  /** Completely disable cookie usage (no read, no write, no lookup by name) - default: false */
@@ -110,7 +110,7 @@ type WithLoader = {
110
110
  };
111
111
  type IntorResolvedConfig = (WithLoader | WithoutLoader) & {
112
112
  readonly id: string;
113
- readonly messages?: LocaleNamespaceMessages;
113
+ readonly messages?: LocaleMessages;
114
114
  readonly defaultLocale: Locale;
115
115
  readonly fallbackLocales: FallbackLocalesMap;
116
116
  readonly translator?: TranslatorOptions;
@@ -1,6 +1,6 @@
1
- import { NextRequest } from 'next/server';
2
1
  import { Level, NormalizerConfig, FormatterConfig, LoggerPreset } from 'logry/edge';
3
- import { Locale, LocaleNamespaceMessages, FallbackLocalesMap } from 'intor-translator';
2
+ import { Locale, LocaleMessages, FallbackLocalesMap } from 'intor-translator';
3
+ import { NextRequest } from 'next/server';
4
4
 
5
5
  type CookieRawOptions = {
6
6
  /** Completely disable cookie usage (no read, no write, no lookup by name) - default: false */
@@ -110,7 +110,7 @@ type WithLoader = {
110
110
  };
111
111
  type IntorResolvedConfig = (WithLoader | WithoutLoader) & {
112
112
  readonly id: string;
113
- readonly messages?: LocaleNamespaceMessages;
113
+ readonly messages?: LocaleMessages;
114
114
  readonly defaultLocale: Locale;
115
115
  readonly fallbackLocales: FallbackLocalesMap;
116
116
  readonly translator?: TranslatorOptions;
@@ -43,15 +43,15 @@ var setPathnameHeader = ({
43
43
  var PREFIX_PLACEHOLDER = "{locale}";
44
44
 
45
45
  // src/shared/utils/locale/normalize-locale.ts
46
+ var toCanonical = (input) => {
47
+ try {
48
+ return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
49
+ } catch {
50
+ return;
51
+ }
52
+ };
46
53
  var normalizeLocale = (locale = "", supportedLocales = []) => {
47
54
  if (!locale || supportedLocales.length === 0) return;
48
- const toCanonical = (input) => {
49
- try {
50
- return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
51
- } catch {
52
- return;
53
- }
54
- };
55
55
  const canonicalLocale = toCanonical(locale);
56
56
  if (!canonicalLocale) return;
57
57
  const supportedCanonicalMap = /* @__PURE__ */ new Map();
@@ -82,12 +82,12 @@ var resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
82
82
  const supportedLocalesSet = new Set(supportedLocales);
83
83
  const preferred = acceptLanguageHeader.split(",").map((part) => {
84
84
  const [lang, qValue] = part.split(";");
85
- const q = qValue ? parseFloat(qValue.split("=")[1]) : 1;
86
- if (isNaN(q)) {
85
+ const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
86
+ if (Number.isNaN(q)) {
87
87
  return { lang: lang.trim(), q: 0 };
88
88
  }
89
89
  return { lang: lang.trim(), q };
90
- }).sort((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
90
+ }).toSorted((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
91
91
  return preferred;
92
92
  };
93
93
 
@@ -96,8 +96,8 @@ var normalizePathname = (rawPathname, options = {}) => {
96
96
  const length = rawPathname.length;
97
97
  let start = 0;
98
98
  let end = length - 1;
99
- while (start <= end && rawPathname.charCodeAt(start) <= 32) start++;
100
- while (end >= start && rawPathname.charCodeAt(end) <= 32) end--;
99
+ while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
100
+ while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
101
101
  if (start > end) return "/";
102
102
  let result = "";
103
103
  let hasSlash = false;
@@ -108,11 +108,7 @@ var normalizePathname = (rawPathname, options = {}) => {
108
108
  hasSlash = true;
109
109
  }
110
110
  } else {
111
- if (hasSlash || result === "") {
112
- result += "/" + char;
113
- } else {
114
- result += char;
115
- }
111
+ result += hasSlash || result === "" ? "/" + char : char;
116
112
  hasSlash = false;
117
113
  }
118
114
  }
@@ -136,8 +132,8 @@ var extractPathname = ({
136
132
  } else if (basePath && normalizedPathname === basePath) {
137
133
  prefixedPathname = "/";
138
134
  }
139
- const pathParts = prefixedPathname.split("/").filter(Boolean);
140
- const maybeLocale = pathParts[0] || "";
135
+ const pathPart = prefixedPathname.split("/").find(Boolean);
136
+ const maybeLocale = pathPart || "";
141
137
  const isLocalePrefixed = config.supportedLocales?.includes(maybeLocale);
142
138
  let unprefixedPathname = prefixedPathname;
143
139
  if (prefix === "all") {
@@ -170,7 +166,7 @@ var standardizePathname = ({
170
166
  PREFIX_PLACEHOLDER,
171
167
  normalizePathname(pathname)
172
168
  ];
173
- const standardizedPathname = parts.join("/").replace(/\/{2,}/g, "/");
169
+ const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
174
170
  return normalizePathname(standardizedPathname);
175
171
  };
176
172
 
@@ -191,15 +187,11 @@ var localePrefixPathname = ({
191
187
  );
192
188
  }
193
189
  if (prefix === "except-default") {
194
- if (locale === config.defaultLocale) {
195
- return normalizePathname(
196
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
197
- );
198
- } else {
199
- return normalizePathname(
200
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
201
- );
202
- }
190
+ return locale === config.defaultLocale ? normalizePathname(
191
+ standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
192
+ ) : normalizePathname(
193
+ standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
194
+ );
203
195
  }
204
196
  return normalizePathname(
205
197
  standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
@@ -249,12 +241,7 @@ var createResponse = ({
249
241
  locale
250
242
  });
251
243
  url.pathname = localePrefixedPathname;
252
- let response;
253
- if (responseType === "redirect") {
254
- response = NextResponse.redirect(url);
255
- } else {
256
- response = NextResponse.next();
257
- }
244
+ const response = responseType === "redirect" ? NextResponse.redirect(url) : NextResponse.next();
258
245
  if (locale) {
259
246
  setLocaleCookieEdge({
260
247
  request,
@@ -274,7 +261,8 @@ var determineInitialLocale = async (config) => {
274
261
  const { defaultLocale, supportedLocales, routing } = config;
275
262
  let initialLocale = defaultLocale;
276
263
  if (routing.firstVisit.localeSource === "browser") {
277
- const acceptLanguageHeader = (await headers()).get("accept-language") || void 0;
264
+ const headersStore = await headers();
265
+ const acceptLanguageHeader = headersStore.get("accept-language") || void 0;
278
266
  const preferredLocale = resolvePreferredLocale(
279
267
  acceptLanguageHeader,
280
268
  supportedLocales