next-intl 2.11.0-beta.13 → 2.11.0-beta.14

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 (46) hide show
  1. package/dist/client/next-intl.esm.js +27 -18
  2. package/dist/client/next-intl.esm.js.map +1 -1
  3. package/dist/client/next-intl.esm2.js +18 -27
  4. package/dist/client/next-intl.esm2.js.map +1 -1
  5. package/dist/{server → middleware}/NextIntlMiddlewareConfig.d.ts +2 -0
  6. package/dist/middleware/getHost.d.ts +1 -0
  7. package/dist/middleware/index.d.ts +1 -0
  8. package/dist/{src → middleware}/middleware.d.ts +3 -3
  9. package/dist/{server → middleware}/resolveLocale.d.ts +0 -0
  10. package/dist/middleware/setAlternateLinksHeader.d.ts +6 -0
  11. package/dist/next-intl.esm.js +4 -4
  12. package/dist/react-client/next-intl.esm.js +1 -1
  13. package/dist/shared/next-intl.esm.js +33 -36
  14. package/dist/shared/next-intl.esm.js.map +1 -1
  15. package/dist/shared/next-intl.esm2.js +36 -33
  16. package/dist/shared/next-intl.esm2.js.map +1 -1
  17. package/dist/src/{server → middleware}/NextIntlMiddlewareConfig.d.ts +2 -0
  18. package/dist/src/{server → middleware}/NextIntlMiddlewareConfig.js +0 -0
  19. package/dist/src/middleware/NextIntlMiddlewareConfig.js.map +1 -0
  20. package/dist/src/middleware/getHost.d.ts +1 -0
  21. package/dist/src/middleware/getHost.js +6 -0
  22. package/dist/src/middleware/getHost.js.map +1 -0
  23. package/dist/src/middleware/index.d.ts +1 -0
  24. package/dist/src/middleware/index.js +2 -0
  25. package/dist/src/middleware/index.js.map +1 -0
  26. package/dist/{middleware.d.ts → src/middleware/middleware.d.ts} +3 -3
  27. package/dist/src/{middleware.js → middleware/middleware.js} +6 -4
  28. package/dist/src/middleware/middleware.js.map +1 -0
  29. package/dist/src/{server → middleware}/resolveLocale.d.ts +0 -0
  30. package/dist/src/{server → middleware}/resolveLocale.js +2 -3
  31. package/dist/src/middleware/resolveLocale.js.map +1 -0
  32. package/dist/src/middleware/setAlternateLinksHeader.d.ts +6 -0
  33. package/dist/src/middleware/setAlternateLinksHeader.js +51 -0
  34. package/dist/src/middleware/setAlternateLinksHeader.js.map +1 -0
  35. package/package.json +2 -4
  36. package/src/{server → middleware}/NextIntlMiddlewareConfig.tsx +3 -0
  37. package/src/middleware/getHost.tsx +7 -0
  38. package/src/middleware/index.tsx +1 -0
  39. package/src/{middleware.tsx → middleware/middleware.tsx} +8 -5
  40. package/src/{server → middleware}/resolveLocale.tsx +2 -5
  41. package/src/middleware/setAlternateLinksHeader.tsx +74 -0
  42. package/client.js +0 -1
  43. package/dist/src/middleware.js.map +0 -1
  44. package/dist/src/server/NextIntlMiddlewareConfig.js.map +0 -1
  45. package/dist/src/server/resolveLocale.js.map +0 -1
  46. package/server.js +0 -1
@@ -1,24 +1,33 @@
1
1
  import { extends as _extends } from '../_virtual/next-intl.esm.js';
2
- import { useRouter as useRouter$1 } from 'next/navigation';
3
- import { useMemo } from 'react';
4
- import localizeHref from './next-intl.esm2.js';
2
+ import localizePathname from '../shared/next-intl.esm3.js';
3
+ import getCookieLocale from './next-intl.esm3.js';
4
+ import hasPathnamePrefixed from './next-intl.esm4.js';
5
5
 
6
- function useRouter() {
7
- var router = useRouter$1();
8
- return useMemo(function () {
9
- return _extends({}, router, {
10
- push: function push(href) {
11
- return router.push(localizeHref(href));
12
- },
13
- replace: function replace(href) {
14
- return router.replace(localizeHref(href));
15
- },
16
- prefetch: function prefetch(href) {
17
- return router.prefetch(localizeHref(href));
6
+ function localizeHref(href, locale) {
7
+ var cookieLocale = getCookieLocale();
8
+ if (!locale) locale = cookieLocale;
9
+ var pathname = window.location.pathname;
10
+ var isSwitchingLocale = locale !== cookieLocale;
11
+ var isPathnamePrefixed = hasPathnamePrefixed(locale, pathname);
12
+
13
+ if (isPathnamePrefixed || isSwitchingLocale) {
14
+ var prefixedHref;
15
+
16
+ if (typeof href === 'string') {
17
+ prefixedHref = localizePathname(locale, href);
18
+ } else {
19
+ prefixedHref = _extends({}, href);
20
+
21
+ if (href.pathname) {
22
+ prefixedHref.pathname = localizePathname(locale, href.pathname);
18
23
  }
19
- });
20
- }, [router]);
24
+ }
25
+
26
+ return prefixedHref;
27
+ } else {
28
+ return href;
29
+ }
21
30
  }
22
31
 
23
- export { useRouter as default };
32
+ export { localizeHref as default };
24
33
  //# sourceMappingURL=next-intl.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"next-intl.esm.js","sources":["../../src/client/useRouter.tsx"],"sourcesContent":["import {useRouter as useNextRouter} from 'next/navigation';\nimport {useMemo} from 'react';\nimport localizeHref from './localizeHref';\n\nexport default function useRouter() {\n const router = useNextRouter();\n\n return useMemo(\n () => ({\n ...router,\n push(href: string) {\n return router.push(localizeHref(href));\n },\n replace(href: string) {\n return router.replace(localizeHref(href));\n },\n prefetch(href: string) {\n return router.prefetch(localizeHref(href));\n }\n }),\n [router]\n );\n}\n"],"names":["useRouter","router","useNextRouter","useMemo","push","href","localizeHref","replace","prefetch"],"mappings":";;;;;AAIc,SAAUA,SAAV,GAAmB;AAC/B,EAAMC,IAAAA,MAAM,GAAGC,WAAa,EAA5B,CAAA;AAEA,EAAA,OAAOC,OAAO,CACZ,YAAA;AAAA,IAAA,OAAA,QAAA,CAAA,EAAA,EACKF,MADL,EAAA;AAEEG,MAAAA,IAFF,EAEOC,SAAAA,IAAAA,CAAAA,IAFP,EAEmB;AACf,QAAOJ,OAAAA,MAAM,CAACG,IAAP,CAAYE,YAAY,CAACD,IAAD,CAAxB,CAAP,CAAA;AACD,OAJH;AAKEE,MAAAA,OALF,EAKUF,SAAAA,OAAAA,CAAAA,IALV,EAKsB;AAClB,QAAOJ,OAAAA,MAAM,CAACM,OAAP,CAAeD,YAAY,CAACD,IAAD,CAA3B,CAAP,CAAA;AACD,OAPH;AAQEG,MAAAA,QARF,EAQWH,SAAAA,QAAAA,CAAAA,IARX,EAQuB;AACnB,QAAOJ,OAAAA,MAAM,CAACO,QAAP,CAAgBF,YAAY,CAACD,IAAD,CAA5B,CAAP,CAAA;AACD,OAAA;AAVH,KAAA,CAAA,CAAA;AAAA,GADY,EAaZ,CAACJ,MAAD,CAbY,CAAd,CAAA;AAeD;;;;"}
1
+ {"version":3,"file":"next-intl.esm.js","sources":["../../src/client/localizeHref.tsx"],"sourcesContent":["import {UrlObject} from 'url';\nimport localizePathname from '../shared/localizePathname';\nimport getCookieLocale from './getCookieLocale';\nimport hasPathnamePrefixed from './hasPathnamePrefixed';\n\nexport default function localizeHref(href: string, locale?: string): string;\nexport default function localizeHref(\n href: UrlObject | string,\n locale?: string\n): UrlObject | string;\nexport default function localizeHref(\n href: UrlObject | string,\n locale?: string\n) {\n const cookieLocale = getCookieLocale();\n if (!locale) locale = cookieLocale;\n\n const {pathname} = window.location;\n const isSwitchingLocale = locale !== cookieLocale;\n const isPathnamePrefixed = hasPathnamePrefixed(locale, pathname);\n\n if (isPathnamePrefixed || isSwitchingLocale) {\n let prefixedHref;\n if (typeof href === 'string') {\n prefixedHref = localizePathname(locale, href);\n } else {\n prefixedHref = {...href};\n if (href.pathname) {\n prefixedHref.pathname = localizePathname(locale, href.pathname);\n }\n }\n\n return prefixedHref;\n } else {\n return href;\n }\n}\n"],"names":["localizeHref","href","locale","cookieLocale","getCookieLocale","pathname","window","location","isSwitchingLocale","isPathnamePrefixed","hasPathnamePrefixed","prefixedHref","localizePathname"],"mappings":";;;;;AAUc,SAAUA,YAAV,CACZC,IADY,EAEZC,MAFY,EAEG;AAEf,EAAMC,IAAAA,YAAY,GAAGC,eAAe,EAApC,CAAA;AACA,EAAA,IAAI,CAACF,MAAL,EAAaA,MAAM,GAAGC,YAAT,CAAA;AAEb,EAAA,IAAOE,QAAP,GAAmBC,MAAM,CAACC,QAA1B,CAAOF,QAAP,CAAA;AACA,EAAA,IAAMG,iBAAiB,GAAGN,MAAM,KAAKC,YAArC,CAAA;AACA,EAAA,IAAMM,kBAAkB,GAAGC,mBAAmB,CAACR,MAAD,EAASG,QAAT,CAA9C,CAAA;;AAEA,EAAII,IAAAA,kBAAkB,IAAID,iBAA1B,EAA6C;AAC3C,IAAA,IAAIG,YAAJ,CAAA;;AACA,IAAA,IAAI,OAAOV,IAAP,KAAgB,QAApB,EAA8B;AAC5BU,MAAAA,YAAY,GAAGC,gBAAgB,CAACV,MAAD,EAASD,IAAT,CAA/B,CAAA;AACD,KAFD,MAEO;AACLU,MAAAA,YAAY,GAAOV,QAAAA,CAAAA,EAAAA,EAAAA,IAAP,CAAZ,CAAA;;AACA,MAAIA,IAAAA,IAAI,CAACI,QAAT,EAAmB;AACjBM,QAAAA,YAAY,CAACN,QAAb,GAAwBO,gBAAgB,CAACV,MAAD,EAASD,IAAI,CAACI,QAAd,CAAxC,CAAA;AACD,OAAA;AACF,KAAA;;AAED,IAAA,OAAOM,YAAP,CAAA;AACD,GAZD,MAYO;AACL,IAAA,OAAOV,IAAP,CAAA;AACD,GAAA;AACF;;;;"}
@@ -1,33 +1,24 @@
1
1
  import { extends as _extends } from '../_virtual/next-intl.esm.js';
2
- import localizePathname from '../shared/next-intl.esm3.js';
3
- import getCookieLocale from './next-intl.esm3.js';
4
- import hasPathnamePrefixed from './next-intl.esm4.js';
2
+ import { useRouter as useRouter$1 } from 'next/navigation';
3
+ import { useMemo } from 'react';
4
+ import localizeHref from './next-intl.esm.js';
5
5
 
6
- function localizeHref(href, locale) {
7
- var cookieLocale = getCookieLocale();
8
- if (!locale) locale = cookieLocale;
9
- var pathname = window.location.pathname;
10
- var isSwitchingLocale = locale !== cookieLocale;
11
- var isPathnamePrefixed = hasPathnamePrefixed(locale, pathname);
12
-
13
- if (isPathnamePrefixed || isSwitchingLocale) {
14
- var prefixedHref;
15
-
16
- if (typeof href === 'string') {
17
- prefixedHref = localizePathname(locale, href);
18
- } else {
19
- prefixedHref = _extends({}, href);
20
-
21
- if (href.pathname) {
22
- prefixedHref.pathname = localizePathname(locale, href.pathname);
6
+ function useRouter() {
7
+ var router = useRouter$1();
8
+ return useMemo(function () {
9
+ return _extends({}, router, {
10
+ push: function push(href) {
11
+ return router.push(localizeHref(href));
12
+ },
13
+ replace: function replace(href) {
14
+ return router.replace(localizeHref(href));
15
+ },
16
+ prefetch: function prefetch(href) {
17
+ return router.prefetch(localizeHref(href));
23
18
  }
24
- }
25
-
26
- return prefixedHref;
27
- } else {
28
- return href;
29
- }
19
+ });
20
+ }, [router]);
30
21
  }
31
22
 
32
- export { localizeHref as default };
23
+ export { useRouter as default };
33
24
  //# sourceMappingURL=next-intl.esm2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"next-intl.esm2.js","sources":["../../src/client/localizeHref.tsx"],"sourcesContent":["import {UrlObject} from 'url';\nimport localizePathname from '../shared/localizePathname';\nimport getCookieLocale from './getCookieLocale';\nimport hasPathnamePrefixed from './hasPathnamePrefixed';\n\nexport default function localizeHref(href: string, locale?: string): string;\nexport default function localizeHref(\n href: UrlObject | string,\n locale?: string\n): UrlObject | string;\nexport default function localizeHref(\n href: UrlObject | string,\n locale?: string\n) {\n const cookieLocale = getCookieLocale();\n if (!locale) locale = cookieLocale;\n\n const {pathname} = window.location;\n const isSwitchingLocale = locale !== cookieLocale;\n const isPathnamePrefixed = hasPathnamePrefixed(locale, pathname);\n\n if (isPathnamePrefixed || isSwitchingLocale) {\n let prefixedHref;\n if (typeof href === 'string') {\n prefixedHref = localizePathname(locale, href);\n } else {\n prefixedHref = {...href};\n if (href.pathname) {\n prefixedHref.pathname = localizePathname(locale, href.pathname);\n }\n }\n\n return prefixedHref;\n } else {\n return href;\n }\n}\n"],"names":["localizeHref","href","locale","cookieLocale","getCookieLocale","pathname","window","location","isSwitchingLocale","isPathnamePrefixed","hasPathnamePrefixed","prefixedHref","localizePathname"],"mappings":";;;;;AAUc,SAAUA,YAAV,CACZC,IADY,EAEZC,MAFY,EAEG;AAEf,EAAMC,IAAAA,YAAY,GAAGC,eAAe,EAApC,CAAA;AACA,EAAA,IAAI,CAACF,MAAL,EAAaA,MAAM,GAAGC,YAAT,CAAA;AAEb,EAAA,IAAOE,QAAP,GAAmBC,MAAM,CAACC,QAA1B,CAAOF,QAAP,CAAA;AACA,EAAA,IAAMG,iBAAiB,GAAGN,MAAM,KAAKC,YAArC,CAAA;AACA,EAAA,IAAMM,kBAAkB,GAAGC,mBAAmB,CAACR,MAAD,EAASG,QAAT,CAA9C,CAAA;;AAEA,EAAII,IAAAA,kBAAkB,IAAID,iBAA1B,EAA6C;AAC3C,IAAA,IAAIG,YAAJ,CAAA;;AACA,IAAA,IAAI,OAAOV,IAAP,KAAgB,QAApB,EAA8B;AAC5BU,MAAAA,YAAY,GAAGC,gBAAgB,CAACV,MAAD,EAASD,IAAT,CAA/B,CAAA;AACD,KAFD,MAEO;AACLU,MAAAA,YAAY,GAAOV,QAAAA,CAAAA,EAAAA,EAAAA,IAAP,CAAZ,CAAA;;AACA,MAAIA,IAAAA,IAAI,CAACI,QAAT,EAAmB;AACjBM,QAAAA,YAAY,CAACN,QAAb,GAAwBO,gBAAgB,CAACV,MAAD,EAASD,IAAI,CAACI,QAAd,CAAxC,CAAA;AACD,OAAA;AACF,KAAA;;AAED,IAAA,OAAOM,YAAP,CAAA;AACD,GAZD,MAYO;AACL,IAAA,OAAOV,IAAP,CAAA;AACD,GAAA;AACF;;;;"}
1
+ {"version":3,"file":"next-intl.esm2.js","sources":["../../src/client/useRouter.tsx"],"sourcesContent":["import {useRouter as useNextRouter} from 'next/navigation';\nimport {useMemo} from 'react';\nimport localizeHref from './localizeHref';\n\nexport default function useRouter() {\n const router = useNextRouter();\n\n return useMemo(\n () => ({\n ...router,\n push(href: string) {\n return router.push(localizeHref(href));\n },\n replace(href: string) {\n return router.replace(localizeHref(href));\n },\n prefetch(href: string) {\n return router.prefetch(localizeHref(href));\n }\n }),\n [router]\n );\n}\n"],"names":["useRouter","router","useNextRouter","useMemo","push","href","localizeHref","replace","prefetch"],"mappings":";;;;;AAIc,SAAUA,SAAV,GAAmB;AAC/B,EAAMC,IAAAA,MAAM,GAAGC,WAAa,EAA5B,CAAA;AAEA,EAAA,OAAOC,OAAO,CACZ,YAAA;AAAA,IAAA,OAAA,QAAA,CAAA,EAAA,EACKF,MADL,EAAA;AAEEG,MAAAA,IAFF,EAEOC,SAAAA,IAAAA,CAAAA,IAFP,EAEmB;AACf,QAAOJ,OAAAA,MAAM,CAACG,IAAP,CAAYE,YAAY,CAACD,IAAD,CAAxB,CAAP,CAAA;AACD,OAJH;AAKEE,MAAAA,OALF,EAKUF,SAAAA,OAAAA,CAAAA,IALV,EAKsB;AAClB,QAAOJ,OAAAA,MAAM,CAACM,OAAP,CAAeD,YAAY,CAACD,IAAD,CAA3B,CAAP,CAAA;AACD,OAPH;AAQEG,MAAAA,QARF,EAQWH,SAAAA,QAAAA,CAAAA,IARX,EAQuB;AACnB,QAAOJ,OAAAA,MAAM,CAACO,QAAP,CAAgBF,YAAY,CAACD,IAAD,CAA5B,CAAP,CAAA;AACD,OAAA;AAVH,KAAA,CAAA,CAAA;AAAA,GADY,EAaZ,CAACJ,MAAD,CAbY,CAAd,CAAA;AAeD;;;;"}
@@ -7,5 +7,7 @@ declare type NextIntlMiddlewareConfig = {
7
7
  domain: string;
8
8
  defaultLocale: string;
9
9
  }>;
10
+ /** Sets the `Link` response header to notify search engines about content in other languages (defaults to `true`). See https://developers.google.com/search/docs/specialty/international/localized-versions#http */
11
+ alternateLinks?: boolean;
10
12
  };
11
13
  export default NextIntlMiddlewareConfig;
@@ -0,0 +1 @@
1
+ export default function getHost(requestHeaders: Headers): string | undefined;
@@ -0,0 +1 @@
1
+ export { default } from './middleware';
@@ -1,3 +1,3 @@
1
- import { NextRequest, NextResponse } from 'next/server';
2
- import NextIntlMiddlewareConfig from './server/NextIntlMiddlewareConfig';
3
- export default function createIntlMiddleware(config: NextIntlMiddlewareConfig): (request: NextRequest) => NextResponse;
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
3
+ export default function createIntlMiddleware(config: NextIntlMiddlewareConfig): (request: NextRequest) => NextResponse;
File without changes
@@ -0,0 +1,6 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
3
+ /**
4
+ * See https://developers.google.com/search/docs/specialty/international/localized-versions
5
+ */
6
+ export default function setAlternateLinksHeader(config: NextIntlMiddlewareConfig, request: NextRequest, response: NextResponse): void;
@@ -1,7 +1,7 @@
1
- import Link from './shared/next-intl.esm2.js';
2
- export { default as Link } from './shared/next-intl.esm2.js';
3
- import NextIntlClientProvider from './shared/next-intl.esm.js';
4
- export { default as NextIntlClientProvider } from './shared/next-intl.esm.js';
1
+ import Link from './shared/next-intl.esm.js';
2
+ export { default as Link } from './shared/next-intl.esm.js';
3
+ import NextIntlClientProvider from './shared/next-intl.esm2.js';
4
+ export { default as NextIntlClientProvider } from './shared/next-intl.esm2.js';
5
5
  export * from 'use-intl';
6
6
  export { default as useLocalizedRouter } from './react-client/next-intl.esm.js';
7
7
 
@@ -1,4 +1,4 @@
1
- import useRouter from '../client/next-intl.esm.js';
1
+ import useRouter from '../client/next-intl.esm2.js';
2
2
 
3
3
  // during the beta, remove for stable release
4
4
 
@@ -1,47 +1,44 @@
1
1
  import { objectWithoutPropertiesLoose as _objectWithoutPropertiesLoose, extends as _extends } from '../_virtual/next-intl.esm.js';
2
- import { useRouter } from 'next/router';
3
- import React from 'react';
4
- import { IntlProvider } from 'use-intl';
5
-
6
- var _excluded = ["children", "locale", "now"];
7
-
8
- function NextIntlClientProvider(_ref) {
9
- var children = _ref.children,
2
+ import NextLink from 'next/link';
3
+ import { usePathname } from 'next/navigation';
4
+ import React, { forwardRef, useState, useEffect } from 'react';
5
+ import localizeHref from '../client/next-intl.esm.js';
6
+
7
+ var _excluded = ["href", "locale", "prefetch"];
8
+ /**
9
+ * Wraps `next/link` and prefixes the `href` with the current locale.
10
+ */
11
+
12
+ function Link(_ref, ref) {
13
+ var href = _ref.href,
10
14
  locale = _ref.locale,
11
- now = _ref.now,
15
+ prefetch = _ref.prefetch,
12
16
  rest = _objectWithoutPropertiesLoose(_ref, _excluded);
13
17
 
14
- var router;
15
-
16
- try {
17
- // Reading from context is practically ok to do conditionally
18
- // eslint-disable-next-line react-hooks/rules-of-hooks
19
- router = useRouter();
20
- } catch (error) {// Calling `useRouter` is not supported in the app folder
21
- } // The router can be undefined if used in a context outside
22
- // of Next.js (e.g. unit tests, Storybook, ...)
23
-
18
+ var _useState = useState(href),
19
+ localizedHref = _useState[0],
20
+ setLocalizedHref = _useState[1];
24
21
 
25
- if (!locale && router) {
26
- locale = router.locale;
27
- } // Currently RSC serialize dates to strings, therefore make sure we have
28
- // a date object. We might be able to remove this once more types have
29
- // first-class serialization support (https://github.com/facebook/react/issues/25687)
22
+ var pathname = usePathname(); // When the user renders a link to another locale, Next.js might prefetch it
23
+ // and the `set-cookie` response header will cause the locale cookie on the
24
+ // current page to be overwritten. Therefore default to disabling prefetching
25
+ // when the user passes a `locale` prop.
30
26
 
31
-
32
- if (typeof now === 'string') {
33
- now = new Date(now);
34
- }
35
-
36
- if (!locale) {
37
- throw new Error(process.env.NODE_ENV !== 'production' ? "Couldn't determine locale. Please pass an explicit `locale` prop the provider, or if you're using the `pages` folder, use internationalized routing (https://nextjs.org/docs/advanced-features/i18n-routing)." : undefined);
27
+ if (prefetch === undefined && locale !== undefined) {
28
+ prefetch = false;
38
29
  }
39
30
 
40
- return React.createElement(IntlProvider, _extends({
41
- locale: locale,
42
- now: now
43
- }, rest), children);
31
+ useEffect(function () {
32
+ setLocalizedHref(localizeHref(href, locale));
33
+ }, [href, locale, pathname]);
34
+ return React.createElement(NextLink, _extends({
35
+ ref: ref,
36
+ href: localizedHref,
37
+ prefetch: prefetch
38
+ }, rest));
44
39
  }
45
40
 
46
- export { NextIntlClientProvider as default };
41
+ var Link$1 = /*#__PURE__*/forwardRef(Link);
42
+
43
+ export { Link$1 as default };
47
44
  //# sourceMappingURL=next-intl.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"next-intl.esm.js","sources":["../../src/shared/NextIntlClientProvider.tsx"],"sourcesContent":["'use client';\n\nimport {useRouter} from 'next/router';\nimport React, {ComponentProps} from 'react';\nimport {IntlProvider} from 'use-intl';\n\ntype Props = Omit<ComponentProps<typeof IntlProvider>, 'locale' | 'now'> & {\n locale?: string;\n /** If a string is supplied, make sure this conforms to the ISO 8601 format (YYYY-MM-DDTHH:mm:ss.sssZ */\n now?: Date | string;\n};\n\n// Move this from /client to default\n\nexport default function NextIntlClientProvider({\n children,\n locale,\n now,\n ...rest\n}: Props) {\n let router;\n try {\n // Reading from context is practically ok to do conditionally\n // eslint-disable-next-line react-hooks/rules-of-hooks\n router = useRouter();\n } catch (error) {\n // Calling `useRouter` is not supported in the app folder\n }\n\n // The router can be undefined if used in a context outside\n // of Next.js (e.g. unit tests, Storybook, ...)\n if (!locale && router) {\n locale = router.locale;\n }\n\n // Currently RSC serialize dates to strings, therefore make sure we have\n // a date object. We might be able to remove this once more types have\n // first-class serialization support (https://github.com/facebook/react/issues/25687)\n if (typeof now === 'string') {\n now = new Date(now);\n }\n\n if (!locale) {\n throw new Error(\n process.env.NODE_ENV !== 'production'\n ? \"Couldn't determine locale. Please pass an explicit `locale` prop the provider, or if you're using the `pages` folder, use internationalized routing (https://nextjs.org/docs/advanced-features/i18n-routing).\"\n : undefined\n );\n }\n\n return (\n <IntlProvider locale={locale} now={now} {...rest}>\n {children}\n </IntlProvider>\n );\n}\n"],"names":["NextIntlClientProvider","children","locale","now","rest","router","useRouter","error","Date","Error","process","env","NODE_ENV","undefined","React","createElement","IntlProvider"],"mappings":";;;;;;;AAcwB,SAAAA,sBAAA,CAKhB,IAAA,EAAA;AAAA,EAJNC,IAAAA,QAIM,QAJNA,QAIM;AAAA,MAHNC,MAGM,QAHNA,MAGM;AAAA,MAFNC,GAEM,QAFNA,GAEM;AAAA,MADHC,IACG,GAAA,6BAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;;AACN,EAAA,IAAIC,MAAJ,CAAA;;AACA,EAAI,IAAA;AACF;AACA;AACAA,IAAAA,MAAM,GAAGC,SAAS,EAAlB,CAAA;AACD,GAJD,CAIE,OAAOC,KAAP,EAAc;AAEf,GARK;AAWN;;;AACA,EAAA,IAAI,CAACL,MAAD,IAAWG,MAAf,EAAuB;AACrBH,IAAAA,MAAM,GAAGG,MAAM,CAACH,MAAhB,CAAA;AACD,GAdK;AAiBN;AACA;;;AACA,EAAA,IAAI,OAAOC,GAAP,KAAe,QAAnB,EAA6B;AAC3BA,IAAAA,GAAG,GAAG,IAAIK,IAAJ,CAASL,GAAT,CAAN,CAAA;AACD,GAAA;;AAED,EAAI,IAAA,CAACD,MAAL,EAAa;AACX,IAAA,MAAM,IAAIO,KAAJ,CACJC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,GACI,+MADJ,GAEIC,SAHA,CAAN,CAAA;AAKD,GAAA;;AAED,EAAA,OACEC,KAAC,CAAAC,aAAD,CAACC,YAAD,EAAA,QAAA,CAAA;AAAcd,IAAAA,MAAM,EAAEA,MAAtB;AAA8BC,IAAAA,GAAG,EAAEA,GAAAA;AAAnC,GAA4CC,EAAAA,IAA5C,CACGH,EAAAA,QADH,CADF,CAAA;AAKD;;;;"}
1
+ {"version":3,"file":"next-intl.esm.js","sources":["../../src/shared/Link.tsx"],"sourcesContent":["'use client';\n\nimport NextLink from 'next/link';\nimport {usePathname} from 'next/navigation';\nimport React, {ComponentProps, forwardRef, useEffect, useState} from 'react';\nimport localizeHref from '../client/localizeHref';\n\ntype Props = Omit<ComponentProps<typeof NextLink>, 'locale'> & {\n locale?: string;\n};\n\n/**\n * Wraps `next/link` and prefixes the `href` with the current locale.\n */\nfunction Link({href, locale, prefetch, ...rest}: Props, ref: Props['ref']) {\n const [localizedHref, setLocalizedHref] = useState<typeof href>(href);\n const pathname = usePathname();\n\n // When the user renders a link to another locale, Next.js might prefetch it\n // and the `set-cookie` response header will cause the locale cookie on the\n // current page to be overwritten. Therefore default to disabling prefetching\n // when the user passes a `locale` prop.\n if (prefetch === undefined && locale !== undefined) {\n prefetch = false;\n }\n\n useEffect(() => {\n setLocalizedHref(localizeHref(href, locale));\n }, [href, locale, pathname]);\n\n return (\n <NextLink ref={ref} href={localizedHref} prefetch={prefetch} {...rest} />\n );\n}\n\nexport default forwardRef(Link);\n"],"names":["Link","ref","href","locale","prefetch","rest","useState","localizedHref","setLocalizedHref","pathname","usePathname","undefined","useEffect","localizeHref","React","createElement","NextLink","forwardRef"],"mappings":";;;;;;;AAWA;;AAEG;;AACH,SAASA,IAAT,CAAwDC,IAAAA,EAAAA,GAAxD,EAAyE;AAAA,EAA1DC,IAAAA,IAA0D,QAA1DA,IAA0D;AAAA,MAApDC,MAAoD,QAApDA,MAAoD;AAAA,MAA5CC,QAA4C,QAA5CA,QAA4C;AAAA,MAA/BC,IAA+B,GAAA,6BAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;;AACvE,EAA0CC,IAAAA,SAAAA,GAAAA,QAAQ,CAAcJ,IAAd,CAAlD;AAAA,MAAOK,aAAP,GAAA,SAAA,CAAA,CAAA,CAAA;AAAA,MAAsBC,gBAAtB,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AACA,EAAA,IAAMC,QAAQ,GAAGC,WAAW,EAA5B,CAFuE;AAKvE;AACA;AACA;;AACA,EAAA,IAAIN,QAAQ,KAAKO,SAAb,IAA0BR,MAAM,KAAKQ,SAAzC,EAAoD;AAClDP,IAAAA,QAAQ,GAAG,KAAX,CAAA;AACD,GAAA;;AAEDQ,EAAAA,SAAS,CAAC,YAAK;AACbJ,IAAAA,gBAAgB,CAACK,YAAY,CAACX,IAAD,EAAOC,MAAP,CAAb,CAAhB,CAAA;AACD,GAFQ,EAEN,CAACD,IAAD,EAAOC,MAAP,EAAeM,QAAf,CAFM,CAAT,CAAA;AAIA,EAAA,OACEK,KAAC,CAAAC,aAAD,CAACC,QAAD,EAAA,QAAA,CAAA;AAAUf,IAAAA,GAAG,EAAEA,GAAf;AAAoBC,IAAAA,IAAI,EAAEK,aAA1B;AAAyCH,IAAAA,QAAQ,EAAEA,QAAAA;AAAnD,GAAA,EAAiEC,IAAjE,CADF,CAAA,CAAA;AAGD,CAAA;;AAED,aAAeY,aAAAA,UAAU,CAACjB,IAAD,CAAzB;;;;"}
@@ -1,44 +1,47 @@
1
1
  import { objectWithoutPropertiesLoose as _objectWithoutPropertiesLoose, extends as _extends } from '../_virtual/next-intl.esm.js';
2
- import NextLink from 'next/link';
3
- import { usePathname } from 'next/navigation';
4
- import React, { forwardRef, useState, useEffect } from 'react';
5
- import localizeHref from '../client/next-intl.esm2.js';
6
-
7
- var _excluded = ["href", "locale", "prefetch"];
8
- /**
9
- * Wraps `next/link` and prefixes the `href` with the current locale.
10
- */
11
-
12
- function Link(_ref, ref) {
13
- var href = _ref.href,
2
+ import { useRouter } from 'next/router';
3
+ import React from 'react';
4
+ import { IntlProvider } from 'use-intl';
5
+
6
+ var _excluded = ["children", "locale", "now"];
7
+
8
+ function NextIntlClientProvider(_ref) {
9
+ var children = _ref.children,
14
10
  locale = _ref.locale,
15
- prefetch = _ref.prefetch,
11
+ now = _ref.now,
16
12
  rest = _objectWithoutPropertiesLoose(_ref, _excluded);
17
13
 
18
- var _useState = useState(href),
19
- localizedHref = _useState[0],
20
- setLocalizedHref = _useState[1];
14
+ var router;
15
+
16
+ try {
17
+ // Reading from context is practically ok to do conditionally
18
+ // eslint-disable-next-line react-hooks/rules-of-hooks
19
+ router = useRouter();
20
+ } catch (error) {// Calling `useRouter` is not supported in the app folder
21
+ } // The router can be undefined if used in a context outside
22
+ // of Next.js (e.g. unit tests, Storybook, ...)
23
+
21
24
 
22
- var pathname = usePathname(); // When the user renders a link to another locale, Next.js might prefetch it
23
- // and the `set-cookie` response header will cause the locale cookie on the
24
- // current page to be overwritten. Therefore default to disabling prefetching
25
- // when the user passes a `locale` prop.
25
+ if (!locale && router) {
26
+ locale = router.locale;
27
+ } // Currently RSC serialize dates to strings, therefore make sure we have
28
+ // a date object. We might be able to remove this once more types have
29
+ // first-class serialization support (https://github.com/facebook/react/issues/25687)
26
30
 
27
- if (prefetch === undefined && locale !== undefined) {
28
- prefetch = false;
31
+
32
+ if (typeof now === 'string') {
33
+ now = new Date(now);
29
34
  }
30
35
 
31
- useEffect(function () {
32
- setLocalizedHref(localizeHref(href, locale));
33
- }, [href, locale, pathname]);
34
- return React.createElement(NextLink, _extends({
35
- ref: ref,
36
- href: localizedHref,
37
- prefetch: prefetch
38
- }, rest));
39
- }
36
+ if (!locale) {
37
+ throw new Error(process.env.NODE_ENV !== 'production' ? "Couldn't determine locale. Please pass an explicit `locale` prop the provider, or if you're using the `pages` folder, use internationalized routing (https://nextjs.org/docs/advanced-features/i18n-routing)." : undefined);
38
+ }
40
39
 
41
- var Link$1 = /*#__PURE__*/forwardRef(Link);
40
+ return React.createElement(IntlProvider, _extends({
41
+ locale: locale,
42
+ now: now
43
+ }, rest), children);
44
+ }
42
45
 
43
- export { Link$1 as default };
46
+ export { NextIntlClientProvider as default };
44
47
  //# sourceMappingURL=next-intl.esm2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"next-intl.esm2.js","sources":["../../src/shared/Link.tsx"],"sourcesContent":["'use client';\n\nimport NextLink from 'next/link';\nimport {usePathname} from 'next/navigation';\nimport React, {ComponentProps, forwardRef, useEffect, useState} from 'react';\nimport localizeHref from '../client/localizeHref';\n\ntype Props = Omit<ComponentProps<typeof NextLink>, 'locale'> & {\n locale?: string;\n};\n\n/**\n * Wraps `next/link` and prefixes the `href` with the current locale.\n */\nfunction Link({href, locale, prefetch, ...rest}: Props, ref: Props['ref']) {\n const [localizedHref, setLocalizedHref] = useState<typeof href>(href);\n const pathname = usePathname();\n\n // When the user renders a link to another locale, Next.js might prefetch it\n // and the `set-cookie` response header will cause the locale cookie on the\n // current page to be overwritten. Therefore default to disabling prefetching\n // when the user passes a `locale` prop.\n if (prefetch === undefined && locale !== undefined) {\n prefetch = false;\n }\n\n useEffect(() => {\n setLocalizedHref(localizeHref(href, locale));\n }, [href, locale, pathname]);\n\n return (\n <NextLink ref={ref} href={localizedHref} prefetch={prefetch} {...rest} />\n );\n}\n\nexport default forwardRef(Link);\n"],"names":["Link","ref","href","locale","prefetch","rest","useState","localizedHref","setLocalizedHref","pathname","usePathname","undefined","useEffect","localizeHref","React","createElement","NextLink","forwardRef"],"mappings":";;;;;;;AAWA;;AAEG;;AACH,SAASA,IAAT,CAAwDC,IAAAA,EAAAA,GAAxD,EAAyE;AAAA,EAA1DC,IAAAA,IAA0D,QAA1DA,IAA0D;AAAA,MAApDC,MAAoD,QAApDA,MAAoD;AAAA,MAA5CC,QAA4C,QAA5CA,QAA4C;AAAA,MAA/BC,IAA+B,GAAA,6BAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;;AACvE,EAA0CC,IAAAA,SAAAA,GAAAA,QAAQ,CAAcJ,IAAd,CAAlD;AAAA,MAAOK,aAAP,GAAA,SAAA,CAAA,CAAA,CAAA;AAAA,MAAsBC,gBAAtB,GAAA,SAAA,CAAA,CAAA,CAAA,CAAA;;AACA,EAAA,IAAMC,QAAQ,GAAGC,WAAW,EAA5B,CAFuE;AAKvE;AACA;AACA;;AACA,EAAA,IAAIN,QAAQ,KAAKO,SAAb,IAA0BR,MAAM,KAAKQ,SAAzC,EAAoD;AAClDP,IAAAA,QAAQ,GAAG,KAAX,CAAA;AACD,GAAA;;AAEDQ,EAAAA,SAAS,CAAC,YAAK;AACbJ,IAAAA,gBAAgB,CAACK,YAAY,CAACX,IAAD,EAAOC,MAAP,CAAb,CAAhB,CAAA;AACD,GAFQ,EAEN,CAACD,IAAD,EAAOC,MAAP,EAAeM,QAAf,CAFM,CAAT,CAAA;AAIA,EAAA,OACEK,KAAC,CAAAC,aAAD,CAACC,QAAD,EAAA,QAAA,CAAA;AAAUf,IAAAA,GAAG,EAAEA,GAAf;AAAoBC,IAAAA,IAAI,EAAEK,aAA1B;AAAyCH,IAAAA,QAAQ,EAAEA,QAAAA;AAAnD,GAAA,EAAiEC,IAAjE,CADF,CAAA,CAAA;AAGD,CAAA;;AAED,aAAeY,aAAAA,UAAU,CAACjB,IAAD,CAAzB;;;;"}
1
+ {"version":3,"file":"next-intl.esm2.js","sources":["../../src/shared/NextIntlClientProvider.tsx"],"sourcesContent":["'use client';\n\nimport {useRouter} from 'next/router';\nimport React, {ComponentProps} from 'react';\nimport {IntlProvider} from 'use-intl';\n\ntype Props = Omit<ComponentProps<typeof IntlProvider>, 'locale' | 'now'> & {\n locale?: string;\n /** If a string is supplied, make sure this conforms to the ISO 8601 format (YYYY-MM-DDTHH:mm:ss.sssZ */\n now?: Date | string;\n};\n\n// Move this from /client to default\n\nexport default function NextIntlClientProvider({\n children,\n locale,\n now,\n ...rest\n}: Props) {\n let router;\n try {\n // Reading from context is practically ok to do conditionally\n // eslint-disable-next-line react-hooks/rules-of-hooks\n router = useRouter();\n } catch (error) {\n // Calling `useRouter` is not supported in the app folder\n }\n\n // The router can be undefined if used in a context outside\n // of Next.js (e.g. unit tests, Storybook, ...)\n if (!locale && router) {\n locale = router.locale;\n }\n\n // Currently RSC serialize dates to strings, therefore make sure we have\n // a date object. We might be able to remove this once more types have\n // first-class serialization support (https://github.com/facebook/react/issues/25687)\n if (typeof now === 'string') {\n now = new Date(now);\n }\n\n if (!locale) {\n throw new Error(\n process.env.NODE_ENV !== 'production'\n ? \"Couldn't determine locale. Please pass an explicit `locale` prop the provider, or if you're using the `pages` folder, use internationalized routing (https://nextjs.org/docs/advanced-features/i18n-routing).\"\n : undefined\n );\n }\n\n return (\n <IntlProvider locale={locale} now={now} {...rest}>\n {children}\n </IntlProvider>\n );\n}\n"],"names":["NextIntlClientProvider","children","locale","now","rest","router","useRouter","error","Date","Error","process","env","NODE_ENV","undefined","React","createElement","IntlProvider"],"mappings":";;;;;;;AAcwB,SAAAA,sBAAA,CAKhB,IAAA,EAAA;AAAA,EAJNC,IAAAA,QAIM,QAJNA,QAIM;AAAA,MAHNC,MAGM,QAHNA,MAGM;AAAA,MAFNC,GAEM,QAFNA,GAEM;AAAA,MADHC,IACG,GAAA,6BAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;;AACN,EAAA,IAAIC,MAAJ,CAAA;;AACA,EAAI,IAAA;AACF;AACA;AACAA,IAAAA,MAAM,GAAGC,SAAS,EAAlB,CAAA;AACD,GAJD,CAIE,OAAOC,KAAP,EAAc;AAEf,GARK;AAWN;;;AACA,EAAA,IAAI,CAACL,MAAD,IAAWG,MAAf,EAAuB;AACrBH,IAAAA,MAAM,GAAGG,MAAM,CAACH,MAAhB,CAAA;AACD,GAdK;AAiBN;AACA;;;AACA,EAAA,IAAI,OAAOC,GAAP,KAAe,QAAnB,EAA6B;AAC3BA,IAAAA,GAAG,GAAG,IAAIK,IAAJ,CAASL,GAAT,CAAN,CAAA;AACD,GAAA;;AAED,EAAI,IAAA,CAACD,MAAL,EAAa;AACX,IAAA,MAAM,IAAIO,KAAJ,CACJC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAAzB,GACI,+MADJ,GAEIC,SAHA,CAAN,CAAA;AAKD,GAAA;;AAED,EAAA,OACEC,KAAC,CAAAC,aAAD,CAACC,YAAD,EAAA,QAAA,CAAA;AAAcd,IAAAA,MAAM,EAAEA,MAAtB;AAA8BC,IAAAA,GAAG,EAAEA,GAAAA;AAAnC,GAA4CC,EAAAA,IAA5C,CACGH,EAAAA,QADH,CADF,CAAA;AAKD;;;;"}
@@ -7,5 +7,7 @@ declare type NextIntlMiddlewareConfig = {
7
7
  domain: string;
8
8
  defaultLocale: string;
9
9
  }>;
10
+ /** Sets the `Link` response header to notify search engines about content in other languages (defaults to `true`). See https://developers.google.com/search/docs/specialty/international/localized-versions#http */
11
+ alternateLinks?: boolean;
10
12
  };
11
13
  export default NextIntlMiddlewareConfig;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NextIntlMiddlewareConfig.js","sourceRoot":"","sources":["../../../src/middleware/NextIntlMiddlewareConfig.tsx"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export default function getHost(requestHeaders: Headers): string | undefined;
@@ -0,0 +1,6 @@
1
+ export default function getHost(requestHeaders) {
2
+ return (requestHeaders.get('x-forwarded-host') ??
3
+ requestHeaders.get('host') ??
4
+ undefined);
5
+ }
6
+ //# sourceMappingURL=getHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getHost.js","sourceRoot":"","sources":["../../../src/middleware/getHost.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,cAAuB;IACrD,OAAO,CACL,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,SAAS,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export { default } from './middleware';
@@ -0,0 +1,2 @@
1
+ export { default } from './middleware';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC"}
@@ -1,3 +1,3 @@
1
- import { NextRequest, NextResponse } from 'next/server';
2
- import NextIntlMiddlewareConfig from './server/NextIntlMiddlewareConfig';
3
- export default function createIntlMiddleware(config: NextIntlMiddlewareConfig): (request: NextRequest) => NextResponse;
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
3
+ export default function createIntlMiddleware(config: NextIntlMiddlewareConfig): (request: NextRequest) => NextResponse;
@@ -1,11 +1,10 @@
1
1
  import { NextResponse } from 'next/server';
2
- import resolveLocale from './server/resolveLocale';
3
- import { COOKIE_LOCALE_NAME, HEADER_LOCALE_NAME } from './shared/constants';
2
+ import { COOKIE_LOCALE_NAME, HEADER_LOCALE_NAME } from '../shared/constants';
3
+ import resolveLocale from './resolveLocale';
4
+ import setAlternateLinksHeader from './setAlternateLinksHeader';
4
5
  const ROOT_URL = '/';
5
6
  export default function createIntlMiddleware(config) {
6
7
  return function middleware(request) {
7
- // Ideally we could use the `headers()` and `cookies()` API here
8
- // as well, but they are currently not available in middleware.
9
8
  const { domain, locale } = resolveLocale(config, request.headers, request.cookies, request.nextUrl.pathname);
10
9
  const isRoot = request.nextUrl.pathname === ROOT_URL;
11
10
  const hasOutdatedCookie = request.cookies.get(COOKIE_LOCALE_NAME)?.value !== locale;
@@ -76,6 +75,9 @@ export default function createIntlMiddleware(config) {
76
75
  if (hasOutdatedCookie) {
77
76
  response.cookies.set(COOKIE_LOCALE_NAME, locale);
78
77
  }
78
+ if ((config.alternateLinks ?? true) && config.locales.length > 1) {
79
+ setAlternateLinksHeader(config, request, response);
80
+ }
79
81
  return response;
80
82
  };
81
83
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/middleware/middleware.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  import { match } from '@formatjs/intl-localematcher';
2
2
  import Negotiator from 'negotiator';
3
3
  import { COOKIE_LOCALE_NAME } from '../shared/constants';
4
+ import getHost from './getHost';
4
5
  function findLocaleDomain(requestHeaders, i18n) {
5
- let host = requestHeaders.get('x-forwarded-host') ??
6
- requestHeaders.get('host') ??
7
- undefined;
6
+ let host = getHost(requestHeaders);
8
7
  // Remove port
9
8
  host = host?.replace(/:\d+$/, '');
10
9
  // Consider optional www subdomain
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveLocale.js","sourceRoot":"","sources":["../../../src/middleware/resolveLocale.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,8BAA8B,CAAC;AACnD,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAC;AAEvD,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,SAAS,gBAAgB,CACvB,cAAuB,EACvB,IAA8B;IAE9B,IAAI,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACnC,cAAc;IACd,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAElC,kCAAkC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5C,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YACjC,OAAO,GAAG,CAAC;SACZ;QACD,OAAO,CAAC,GAAG,EAAE,EAAC,GAAG,GAAG,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,EAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,IAAI,IAAI,OAAO,EAAE;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC;KACf;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CACnC,IAA8B,EAC9B,cAAuB,EACvB,cAA8B,EAC9B,QAAgB;IAEhB,IAAI,MAAM,EAAE,MAAM,CAAC;IAEnB,2BAA2B;IAC3B,IAAI,QAAQ,EAAE;QACZ,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAClC,MAAM,GAAG,OAAO,CAAC;aAClB;SACF;KACF;IAED,uBAAuB;IACvB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;QAC3B,MAAM,GAAG,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAEhD,IAAI,MAAM,EAAE;YACV,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;SAC/B;KACF;IAED,8BAA8B;IAC9B,IAAI,CAAC,MAAM,IAAI,cAAc,EAAE;QAC7B,IAAI,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE;YAC1C,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC;SACxD;KACF;IAED,2CAA2C;IAC3C,IAAI,CAAC,MAAM,IAAI,cAAc,EAAE;QAC7B,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC;YAC/B,OAAO,EAAE;gBACP,iBAAiB,EAAE,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,SAAS;aACtE;SACF,CAAC,CAAC,SAAS,EAAE,CAAC;QACf,IAAI;YACF,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;SAC7D;QAAC,OAAO,CAAC,EAAE;YACV,mBAAmB;SACpB;KACF;IAED,6BAA6B;IAC7B,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;KAC7B;IAED,OAAO,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
3
+ /**
4
+ * See https://developers.google.com/search/docs/specialty/international/localized-versions
5
+ */
6
+ export default function setAlternateLinksHeader(config: NextIntlMiddlewareConfig, request: NextRequest, response: NextResponse): void;
@@ -0,0 +1,51 @@
1
+ function getUnprefixedPathname(config, request) {
2
+ const url = new URL(request.url);
3
+ if (!url.pathname.endsWith('/')) {
4
+ url.pathname += '/';
5
+ }
6
+ url.pathname = url.pathname.replace(new RegExp(`^/(${config.locales.join('|')})/`), '/');
7
+ // Remove trailing slash
8
+ if (url.pathname !== '/') {
9
+ url.pathname = url.pathname.slice(0, -1);
10
+ }
11
+ return url.toString();
12
+ }
13
+ function getAlternateEntry(url, locale) {
14
+ return `<${url}>; rel="alternate"; hreflang="${locale}"`;
15
+ }
16
+ /**
17
+ * See https://developers.google.com/search/docs/specialty/international/localized-versions
18
+ */
19
+ export default function setAlternateLinksHeader(config, request, response) {
20
+ const unprefixedPathname = getUnprefixedPathname(config, request);
21
+ const links = config.locales.flatMap((locale) => {
22
+ function localizePathname(url) {
23
+ if (url.pathname === '/') {
24
+ url.pathname = `/${locale}`;
25
+ }
26
+ else {
27
+ url.pathname = `/${locale}${url.pathname}`;
28
+ }
29
+ return url;
30
+ }
31
+ let url;
32
+ const domainConfigs = config.domains?.filter((cur) => cur.defaultLocale === locale) || [];
33
+ if (domainConfigs.length > 1) {
34
+ // Prio 1: Configured domain(s)
35
+ return domainConfigs.map((domainConfig) => {
36
+ url = new URL(unprefixedPathname);
37
+ url.host = domainConfig.domain;
38
+ return getAlternateEntry(url.toString(), locale);
39
+ });
40
+ }
41
+ else {
42
+ // Prio 2: Prefixed route
43
+ url = new URL(unprefixedPathname);
44
+ localizePathname(url);
45
+ }
46
+ return getAlternateEntry(url.toString(), locale);
47
+ });
48
+ links.push(getAlternateEntry(unprefixedPathname, 'x-default'));
49
+ response.headers.set('Link', links.join(', '));
50
+ }
51
+ //# sourceMappingURL=setAlternateLinksHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setAlternateLinksHeader.js","sourceRoot":"","sources":["../../../src/middleware/setAlternateLinksHeader.tsx"],"names":[],"mappings":"AAGA,SAAS,qBAAqB,CAC5B,MAAgC,EAChC,OAAoB;IAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;QAC/B,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;KACrB;IAED,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CACjC,IAAI,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAC9C,GAAG,CACJ,CAAC;IAEF,wBAAwB;IACxB,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE;QACxB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAC1C;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,MAAc;IACpD,OAAO,IAAI,GAAG,iCAAiC,MAAM,GAAG,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,MAAgC,EAChC,OAAoB,EACpB,QAAsB;IAEtB,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9C,SAAS,gBAAgB,CAAC,GAAQ;YAChC,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE;gBACxB,GAAG,CAAC,QAAQ,GAAG,IAAI,MAAM,EAAE,CAAC;aAC7B;iBAAM;gBACL,GAAG,CAAC,QAAQ,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;aAC5C;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,GAAG,CAAC;QAER,MAAM,aAAa,GACjB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAEtE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,+BAA+B;YAC/B,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;gBACxC,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAClC,GAAG,CAAC,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC;gBAC/B,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,yBAAyB;YACzB,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAClC,gBAAgB,CAAC,GAAG,CAAC,CAAC;SACvB;QAED,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC;IAE/D,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-intl",
3
- "version": "2.11.0-beta.13",
3
+ "version": "2.11.0-beta.14",
4
4
  "sideEffects": false,
5
5
  "author": "Jan Amann <jan@amann.work>",
6
6
  "description": "A minimal, but complete solution for internationalization in Next.js apps.",
@@ -30,16 +30,14 @@
30
30
  "./server": "./dist/src/server/index.js",
31
31
  "./client": "./dist/src/client/index.js",
32
32
  "./config": "./config.js",
33
- "./middleware": "./dist/src/middleware.js",
33
+ "./middleware": "./dist/src/middleware/index.js",
34
34
  "./withNextIntl": "./withNextIntl.js",
35
35
  "./plugin": "./plugin.js"
36
36
  },
37
37
  "files": [
38
38
  "dist",
39
39
  "src",
40
- "server.js",
41
40
  "server.d.ts",
42
- "client.js",
43
41
  "client.d.ts",
44
42
  "config.js",
45
43
  "middleware.d.ts",
@@ -7,6 +7,9 @@ type NextIntlMiddlewareConfig = {
7
7
 
8
8
  /** Configure a list of domains where the `defaultLocale` is changed (e.g. `es.example.com/about`, `example.fr/about`). Note that the `x-forwarded-host` or alternatively the `host` header will be used to determine the requested domain. */
9
9
  domains?: Array<{domain: string; defaultLocale: string}>;
10
+
11
+ /** Sets the `Link` response header to notify search engines about content in other languages (defaults to `true`). See https://developers.google.com/search/docs/specialty/international/localized-versions#http */
12
+ alternateLinks?: boolean;
10
13
  };
11
14
 
12
15
  export default NextIntlMiddlewareConfig;
@@ -0,0 +1,7 @@
1
+ export default function getHost(requestHeaders: Headers) {
2
+ return (
3
+ requestHeaders.get('x-forwarded-host') ??
4
+ requestHeaders.get('host') ??
5
+ undefined
6
+ );
7
+ }
@@ -0,0 +1 @@
1
+ export {default} from './middleware';
@@ -1,14 +1,13 @@
1
1
  import {NextRequest, NextResponse} from 'next/server';
2
- import NextIntlMiddlewareConfig from './server/NextIntlMiddlewareConfig';
3
- import resolveLocale from './server/resolveLocale';
4
- import {COOKIE_LOCALE_NAME, HEADER_LOCALE_NAME} from './shared/constants';
2
+ import {COOKIE_LOCALE_NAME, HEADER_LOCALE_NAME} from '../shared/constants';
3
+ import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
4
+ import resolveLocale from './resolveLocale';
5
+ import setAlternateLinksHeader from './setAlternateLinksHeader';
5
6
 
6
7
  const ROOT_URL = '/';
7
8
 
8
9
  export default function createIntlMiddleware(config: NextIntlMiddlewareConfig) {
9
10
  return function middleware(request: NextRequest) {
10
- // Ideally we could use the `headers()` and `cookies()` API here
11
- // as well, but they are currently not available in middleware.
12
11
  const {domain, locale} = resolveLocale(
13
12
  config,
14
13
  request.headers,
@@ -95,6 +94,10 @@ export default function createIntlMiddleware(config: NextIntlMiddlewareConfig) {
95
94
  response.cookies.set(COOKIE_LOCALE_NAME, locale);
96
95
  }
97
96
 
97
+ if ((config.alternateLinks ?? true) && config.locales.length > 1) {
98
+ setAlternateLinksHeader(config, request, response);
99
+ }
100
+
98
101
  return response;
99
102
  };
100
103
  }
@@ -3,16 +3,13 @@ import Negotiator from 'negotiator';
3
3
  import {RequestCookies} from 'next/dist/server/web/spec-extension/cookies';
4
4
  import {COOKIE_LOCALE_NAME} from '../shared/constants';
5
5
  import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
6
+ import getHost from './getHost';
6
7
 
7
8
  function findLocaleDomain(
8
9
  requestHeaders: Headers,
9
10
  i18n: NextIntlMiddlewareConfig
10
11
  ) {
11
- let host =
12
- requestHeaders.get('x-forwarded-host') ??
13
- requestHeaders.get('host') ??
14
- undefined;
15
-
12
+ let host = getHost(requestHeaders);
16
13
  // Remove port
17
14
  host = host?.replace(/:\d+$/, '');
18
15
 
@@ -0,0 +1,74 @@
1
+ import {NextRequest, NextResponse} from 'next/server';
2
+ import NextIntlMiddlewareConfig from './NextIntlMiddlewareConfig';
3
+
4
+ function getUnprefixedPathname(
5
+ config: NextIntlMiddlewareConfig,
6
+ request: NextRequest
7
+ ) {
8
+ const url = new URL(request.url);
9
+ if (!url.pathname.endsWith('/')) {
10
+ url.pathname += '/';
11
+ }
12
+
13
+ url.pathname = url.pathname.replace(
14
+ new RegExp(`^/(${config.locales.join('|')})/`),
15
+ '/'
16
+ );
17
+
18
+ // Remove trailing slash
19
+ if (url.pathname !== '/') {
20
+ url.pathname = url.pathname.slice(0, -1);
21
+ }
22
+
23
+ return url.toString();
24
+ }
25
+
26
+ function getAlternateEntry(url: string, locale: string) {
27
+ return `<${url}>; rel="alternate"; hreflang="${locale}"`;
28
+ }
29
+
30
+ /**
31
+ * See https://developers.google.com/search/docs/specialty/international/localized-versions
32
+ */
33
+ export default function setAlternateLinksHeader(
34
+ config: NextIntlMiddlewareConfig,
35
+ request: NextRequest,
36
+ response: NextResponse
37
+ ) {
38
+ const unprefixedPathname = getUnprefixedPathname(config, request);
39
+
40
+ const links = config.locales.flatMap((locale) => {
41
+ function localizePathname(url: URL) {
42
+ if (url.pathname === '/') {
43
+ url.pathname = `/${locale}`;
44
+ } else {
45
+ url.pathname = `/${locale}${url.pathname}`;
46
+ }
47
+ return url;
48
+ }
49
+
50
+ let url;
51
+
52
+ const domainConfigs =
53
+ config.domains?.filter((cur) => cur.defaultLocale === locale) || [];
54
+
55
+ if (domainConfigs.length > 1) {
56
+ // Prio 1: Configured domain(s)
57
+ return domainConfigs.map((domainConfig) => {
58
+ url = new URL(unprefixedPathname);
59
+ url.host = domainConfig.domain;
60
+ return getAlternateEntry(url.toString(), locale);
61
+ });
62
+ } else {
63
+ // Prio 2: Prefixed route
64
+ url = new URL(unprefixedPathname);
65
+ localizePathname(url);
66
+ }
67
+
68
+ return getAlternateEntry(url.toString(), locale);
69
+ });
70
+
71
+ links.push(getAlternateEntry(unprefixedPathname, 'x-default'));
72
+
73
+ response.headers.set('Link', links.join(', '));
74
+ }
package/client.js DELETED
@@ -1 +0,0 @@
1
- export * from './dist/src/client';
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/middleware.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"NextIntlMiddlewareConfig.js","sourceRoot":"","sources":["../../../src/server/NextIntlMiddlewareConfig.tsx"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolveLocale.js","sourceRoot":"","sources":["../../../src/server/resolveLocale.tsx"],"names":[],"mappings":"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"}
package/server.js DELETED
@@ -1 +0,0 @@
1
- export * from './dist/src/server';