next-intl 3.0.2 → 3.1.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.
@@ -4,21 +4,20 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
6
6
  var React = require('react');
7
- var useLocale = require('../../react-server/useLocale.js');
8
7
  var BaseLinkWithLocale = require('../../shared/BaseLinkWithLocale.js');
8
+ var getLocale = require('../../server/getLocale.js');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
12
  var React__default = /*#__PURE__*/_interopDefault(React);
13
13
 
14
- function BaseLink(_ref) {
14
+ async function BaseLink(_ref) {
15
15
  let {
16
16
  locale,
17
17
  ...rest
18
18
  } = _ref;
19
- const defaultLocale = useLocale.default();
20
19
  return /*#__PURE__*/React__default.default.createElement(BaseLinkWithLocale.default, _rollupPluginBabelHelpers.extends({
21
- locale: locale || defaultLocale
20
+ locale: locale || (await getLocale.default())
22
21
  }, rest));
23
22
  }
24
23
 
@@ -10,38 +10,72 @@ var path__default = /*#__PURE__*/_interopDefault(path);
10
10
 
11
11
  /* eslint-env node */
12
12
 
13
- function resolveI18nPath(cwd, providedPath) {
14
- let i18nPath = providedPath;
15
- if (i18nPath) {
16
- i18nPath = path__default.default.resolve(i18nPath);
17
- if (!fs__default.default.existsSync(i18nPath)) {
18
- throw new Error("Could not find i18n config at ".concat(i18nPath, ", please provide a valid path."));
13
+ function resolveI18nPath(providedPath, cwd) {
14
+ function resolvePath(pathname) {
15
+ const parts = [];
16
+ if (cwd) parts.push(cwd);
17
+ parts.push(pathname);
18
+ return path__default.default.resolve(...parts);
19
+ }
20
+ function pathExists(pathname) {
21
+ return fs__default.default.existsSync(resolvePath(pathname));
22
+ }
23
+ if (providedPath) {
24
+ if (!pathExists(providedPath)) {
25
+ throw new Error("Could not find i18n config at ".concat(providedPath, ", please provide a valid path."));
19
26
  }
27
+ return providedPath;
20
28
  } else {
21
- i18nPath = ['./i18n.tsx', './i18n.ts', './i18n.js', './i18n.jsx', './src/i18n.tsx', './src/i18n.ts', './src/i18n.js', './src/i18n.jsx'].map(cur => path__default.default.resolve(cwd, cur)).find(cur => fs__default.default.existsSync(cur));
22
- if (!i18nPath) {
23
- throw new Error("\n\nCould not locate i18n config. Create one at `./(src/)i18n.{js,jsx,ts,tsx}` or specify a custom location:\n\nconst withNextIntl = require('next-intl/plugin')(\n './path/to/i18n.tsx'\n);\n\nmodule.exports = withNextIntl({\n // Other Next.js configuration ...\n});\n");
29
+ for (const candidate of ['./i18n.tsx', './i18n.ts', './i18n.js', './i18n.jsx', './src/i18n.tsx', './src/i18n.ts', './src/i18n.js', './src/i18n.jsx']) {
30
+ if (pathExists(candidate)) {
31
+ return candidate;
32
+ }
24
33
  }
34
+ throw new Error("\n\nCould not locate i18n config. Create one at `./(src/)i18n.{js,jsx,ts,tsx}` or specify a custom location:\n\nconst withNextIntl = require('next-intl/plugin')(\n './path/to/i18n.tsx'\n);\n\nmodule.exports = withNextIntl({\n // Other Next.js configuration ...\n});\n");
25
35
  }
26
- return i18nPath;
27
36
  }
28
37
  function initPlugin(i18nPath, nextConfig) {
29
38
  if ((nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.i18n) != null) {
30
39
  console.warn("\nnext-intl has found an `i18n` config in your next.config.js. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the `pages` folder, you can refer to this example: https://github.com/amannn/next-intl/tree/main/packages/example-app-router-migration\n");
31
40
  }
32
- return Object.assign({}, nextConfig, {
33
- webpack() {
34
- for (var _len = arguments.length, _ref = new Array(_len), _key = 0; _key < _len; _key++) {
35
- _ref[_key] = arguments[_key];
41
+ const useTurbo = process.env.TURBOPACK != null;
42
+ let nextIntlConfig;
43
+ if (useTurbo) {
44
+ var _nextConfig$experimen, _nextConfig$experimen2;
45
+ if (i18nPath && i18nPath.startsWith('/')) {
46
+ throw new Error("Turbopack support for next-intl currently does not support absolute paths, please provide a relative one (e.g. './src/i18n/config.ts').\n\nFound: " + i18nPath + '\n');
47
+ }
48
+ nextIntlConfig = {
49
+ experimental: {
50
+ ...(nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.experimental),
51
+ turbo: {
52
+ ...(nextConfig === null || nextConfig === void 0 || (_nextConfig$experimen = nextConfig.experimental) === null || _nextConfig$experimen === void 0 ? void 0 : _nextConfig$experimen.turbo),
53
+ resolveAlias: {
54
+ ...(nextConfig === null || nextConfig === void 0 || (_nextConfig$experimen2 = nextConfig.experimental) === null || _nextConfig$experimen2 === void 0 || (_nextConfig$experimen2 = _nextConfig$experimen2.turbo) === null || _nextConfig$experimen2 === void 0 ? void 0 : _nextConfig$experimen2.resolveAlias),
55
+ // Turbo aliases don't work with absolute
56
+ // paths (see error handling above)
57
+ 'next-intl/config': resolveI18nPath(i18nPath)
58
+ }
59
+ }
36
60
  }
37
- let [config, options] = _ref;
38
- config.resolve.alias['next-intl/config'] = require.resolve(resolveI18nPath(config.context, i18nPath));
39
- if (typeof (nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.webpack) === 'function') {
40
- return nextConfig.webpack(config, options);
61
+ };
62
+ } else {
63
+ nextIntlConfig = {
64
+ webpack() {
65
+ for (var _len = arguments.length, _ref = new Array(_len), _key = 0; _key < _len; _key++) {
66
+ _ref[_key] = arguments[_key];
67
+ }
68
+ let [config, options] = _ref;
69
+ // Webpack requires absolute paths
70
+ config.resolve.alias['next-intl/config'] = path__default.default.resolve(config.context, resolveI18nPath(i18nPath, config.context));
71
+ if (typeof (nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.webpack) === 'function') {
72
+ return nextConfig.webpack(config, options);
73
+ }
74
+ return config;
41
75
  }
42
- return config;
43
- }
44
- });
76
+ };
77
+ }
78
+ return Object.assign({}, nextConfig, nextIntlConfig);
45
79
  }
46
80
  module.exports = function withNextIntl(i18nPath) {
47
81
  return nextConfig => initPlugin(i18nPath, nextConfig);
@@ -5,28 +5,28 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
6
6
  var React = require('react');
7
7
  var NextIntlClientProvider$1 = require('../shared/NextIntlClientProvider.js');
8
- var useLocale = require('./useLocale.js');
9
- var useNow = require('./useNow.js');
10
- var useTimeZone = require('./useTimeZone.js');
8
+ var getLocale = require('../server/getLocale.js');
9
+ var getNow = require('../server/getNow.js');
10
+ var getTimeZone = require('../server/getTimeZone.js');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
13
 
14
14
  var React__default = /*#__PURE__*/_interopDefault(React);
15
15
 
16
- function NextIntlClientProvider(_ref) {
16
+ async function NextIntlClientProvider(_ref) {
17
17
  let {
18
18
  locale,
19
19
  now,
20
20
  timeZone,
21
21
  ...rest
22
22
  } = _ref;
23
- const defaultLocale = useLocale.default();
24
- const defaultNow = useNow.default();
25
- const defaultTimeZone = useTimeZone.default();
26
- return /*#__PURE__*/React__default.default.createElement(NextIntlClientProvider$1.default, _rollupPluginBabelHelpers.extends({
27
- locale: locale !== null && locale !== void 0 ? locale : defaultLocale,
28
- now: now !== null && now !== void 0 ? now : defaultNow,
29
- timeZone: timeZone !== null && timeZone !== void 0 ? timeZone : defaultTimeZone
23
+ return /*#__PURE__*/React__default.default.createElement(NextIntlClientProvider$1.default
24
+ // We need to be careful about potentially reading from headers here.
25
+ // See https://github.com/amannn/next-intl/issues/631
26
+ , _rollupPluginBabelHelpers.extends({
27
+ locale: locale !== null && locale !== void 0 ? locale : await getLocale.default(),
28
+ now: now !== null && now !== void 0 ? now : await getNow.default(),
29
+ timeZone: timeZone !== null && timeZone !== void 0 ? timeZone : await getTimeZone.default()
30
30
  }, rest));
31
31
  }
32
32
 
@@ -1 +1 @@
1
- import{extends as e}from"../../_virtual/_rollupPluginBabelHelpers.js";import r from"react";import t from"../../react-server/useLocale.js";import o from"../../shared/BaseLinkWithLocale.js";function l(l){let{locale:a,...s}=l;const c=t();return r.createElement(o,e({locale:a||c},s))}export{l as default};
1
+ import{extends as e}from"../../_virtual/_rollupPluginBabelHelpers.js";import r from"react";import t from"../../shared/BaseLinkWithLocale.js";import a from"../../server/getLocale.js";async function l(l){let{locale:o,...s}=l;return r.createElement(t,e({locale:o||await a()},s))}export{l as default};
@@ -1 +1 @@
1
- import n from"fs";import e from"path";function t(t,o){return null!=(null==o?void 0:o.i18n)&&console.warn("\nnext-intl has found an `i18n` config in your next.config.js. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the `pages` folder, you can refer to this example: https://github.com/amannn/next-intl/tree/main/packages/example-app-router-migration\n"),Object.assign({},o,{webpack(){for(var i=arguments.length,r=new Array(i),s=0;s<i;s++)r[s]=arguments[s];let[a,l]=r;return a.resolve.alias["next-intl/config"]=require.resolve(function(t,o){let i=o;if(i){if(i=e.resolve(i),!n.existsSync(i))throw new Error("Could not find i18n config at ".concat(i,", please provide a valid path."))}else if(i=["./i18n.tsx","./i18n.ts","./i18n.js","./i18n.jsx","./src/i18n.tsx","./src/i18n.ts","./src/i18n.js","./src/i18n.jsx"].map((n=>e.resolve(t,n))).find((e=>n.existsSync(e))),!i)throw new Error("\n\nCould not locate i18n config. Create one at `./(src/)i18n.{js,jsx,ts,tsx}` or specify a custom location:\n\nconst withNextIntl = require('next-intl/plugin')(\n './path/to/i18n.tsx'\n);\n\nmodule.exports = withNextIntl({\n // Other Next.js configuration ...\n});\n");return i}(a.context,t)),"function"==typeof(null==o?void 0:o.webpack)?o.webpack(a,l):a}})}module.exports=function(n){return e=>t(n,e)};
1
+ import n from"fs";import e from"path";function t(t,o){function r(t){return n.existsSync(function(n){const t=[];return o&&t.push(o),t.push(n),e.resolve(...t)}(t))}if(t){if(!r(t))throw new Error("Could not find i18n config at ".concat(t,", please provide a valid path."));return t}for(const n of["./i18n.tsx","./i18n.ts","./i18n.js","./i18n.jsx","./src/i18n.tsx","./src/i18n.ts","./src/i18n.js","./src/i18n.jsx"])if(r(n))return n;throw new Error("\n\nCould not locate i18n config. Create one at `./(src/)i18n.{js,jsx,ts,tsx}` or specify a custom location:\n\nconst withNextIntl = require('next-intl/plugin')(\n './path/to/i18n.tsx'\n);\n\nmodule.exports = withNextIntl({\n // Other Next.js configuration ...\n});\n")}module.exports=function(n){return o=>function(n,o){let r;if(null!=(null==o?void 0:o.i18n)&&console.warn("\nnext-intl has found an `i18n` config in your next.config.js. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the `pages` folder, you can refer to this example: https://github.com/amannn/next-intl/tree/main/packages/example-app-router-migration\n"),null!=process.env.TURBOPACK){var i,s;if(n&&n.startsWith("/"))throw new Error("Turbopack support for next-intl currently does not support absolute paths, please provide a relative one (e.g. './src/i18n/config.ts').\n\nFound: "+n+"\n");r={experimental:{...null==o?void 0:o.experimental,turbo:{...null==o||null===(i=o.experimental)||void 0===i?void 0:i.turbo,resolveAlias:{...null==o||null===(s=o.experimental)||void 0===s||null===(s=s.turbo)||void 0===s?void 0:s.resolveAlias,"next-intl/config":t(n)}}}}}else r={webpack(){for(var r=arguments.length,i=new Array(r),s=0;s<r;s++)i[s]=arguments[s];let[l,a]=i;return l.resolve.alias["next-intl/config"]=e.resolve(l.context,t(n,l.context)),"function"==typeof(null==o?void 0:o.webpack)?o.webpack(l,a):l}};return Object.assign({},o,r)}(n,o)};
@@ -1 +1 @@
1
- import{extends as e}from"../_virtual/_rollupPluginBabelHelpers.js";import o from"react";import r from"../shared/NextIntlClientProvider.js";import l from"./useLocale.js";import t from"./useNow.js";import n from"./useTimeZone.js";function m(m){let{locale:i,now:s,timeZone:u,...a}=m;const p=l(),f=t(),c=n();return o.createElement(r,e({locale:null!=i?i:p,now:null!=s?s:f,timeZone:null!=u?u:c},a))}export{m as default};
1
+ import{extends as e}from"../_virtual/_rollupPluginBabelHelpers.js";import r from"react";import t from"../shared/NextIntlClientProvider.js";import o from"../server/getLocale.js";import l from"../server/getNow.js";import a from"../server/getTimeZone.js";async function i(i){let{locale:n,now:m,timeZone:s,...p}=i;return r.createElement(t,e({locale:null!=n?n:await o(),now:null!=m?m:await l(),timeZone:null!=s?s:await a()},p))}export{i as default};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../_virtual/_rollupPluginBabelHelpers.js"),r=require("react"),t=require("../../react-server/useLocale.js"),l=require("../../shared/BaseLinkWithLocale.js");function u(e){return e&&e.__esModule?e:{default:e}}var a=u(r);exports.default=function(r){let{locale:u,...s}=r;const o=t.default();return a.default.createElement(l.default,e.extends({locale:u||o},s))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../../_virtual/_rollupPluginBabelHelpers.js"),r=require("react"),t=require("../../shared/BaseLinkWithLocale.js"),l=require("../../server/getLocale.js");function a(e){return e&&e.__esModule?e:{default:e}}var u=a(r);exports.default=async function(r){let{locale:a,...s}=r;return u.default.createElement(t.default,e.extends({locale:a||await l.default()},s))};
@@ -1 +1 @@
1
- "use strict";var n=require("fs"),e=require("path");function t(n){return n&&n.__esModule?n:{default:n}}var r=t(n),i=t(e);function o(n,e){return null!=(null==e?void 0:e.i18n)&&console.warn("\nnext-intl has found an `i18n` config in your next.config.js. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the `pages` folder, you can refer to this example: https://github.com/amannn/next-intl/tree/main/packages/example-app-router-migration\n"),Object.assign({},e,{webpack(){for(var t=arguments.length,o=new Array(t),s=0;s<t;s++)o[s]=arguments[s];let[a,l]=o;return a.resolve.alias["next-intl/config"]=require.resolve(function(n,e){let t=e;if(t){if(t=i.default.resolve(t),!r.default.existsSync(t))throw new Error("Could not find i18n config at ".concat(t,", please provide a valid path."))}else if(t=["./i18n.tsx","./i18n.ts","./i18n.js","./i18n.jsx","./src/i18n.tsx","./src/i18n.ts","./src/i18n.js","./src/i18n.jsx"].map((e=>i.default.resolve(n,e))).find((n=>r.default.existsSync(n))),!t)throw new Error("\n\nCould not locate i18n config. Create one at `./(src/)i18n.{js,jsx,ts,tsx}` or specify a custom location:\n\nconst withNextIntl = require('next-intl/plugin')(\n './path/to/i18n.tsx'\n);\n\nmodule.exports = withNextIntl({\n // Other Next.js configuration ...\n});\n");return t}(a.context,n)),"function"==typeof(null==e?void 0:e.webpack)?e.webpack(a,l):a}})}module.exports=function(n){return e=>o(n,e)};
1
+ "use strict";var n=require("fs"),e=require("path");function t(n){return n&&n.__esModule?n:{default:n}}var o=t(n),r=t(e);function i(n,e){function t(n){return o.default.existsSync(function(n){const t=[];return e&&t.push(e),t.push(n),r.default.resolve(...t)}(n))}if(n){if(!t(n))throw new Error("Could not find i18n config at ".concat(n,", please provide a valid path."));return n}for(const n of["./i18n.tsx","./i18n.ts","./i18n.js","./i18n.jsx","./src/i18n.tsx","./src/i18n.ts","./src/i18n.js","./src/i18n.jsx"])if(t(n))return n;throw new Error("\n\nCould not locate i18n config. Create one at `./(src/)i18n.{js,jsx,ts,tsx}` or specify a custom location:\n\nconst withNextIntl = require('next-intl/plugin')(\n './path/to/i18n.tsx'\n);\n\nmodule.exports = withNextIntl({\n // Other Next.js configuration ...\n});\n")}module.exports=function(n){return e=>function(n,e){let t;if(null!=(null==e?void 0:e.i18n)&&console.warn("\nnext-intl has found an `i18n` config in your next.config.js. This likely causes conflicts and should therefore be removed if you use the App Router.\n\nIf you're in progress of migrating from the `pages` folder, you can refer to this example: https://github.com/amannn/next-intl/tree/main/packages/example-app-router-migration\n"),null!=process.env.TURBOPACK){var o,s;if(n&&n.startsWith("/"))throw new Error("Turbopack support for next-intl currently does not support absolute paths, please provide a relative one (e.g. './src/i18n/config.ts').\n\nFound: "+n+"\n");t={experimental:{...null==e?void 0:e.experimental,turbo:{...null==e||null===(o=e.experimental)||void 0===o?void 0:o.turbo,resolveAlias:{...null==e||null===(s=e.experimental)||void 0===s||null===(s=s.turbo)||void 0===s?void 0:s.resolveAlias,"next-intl/config":i(n)}}}}}else t={webpack(){for(var t=arguments.length,o=new Array(t),s=0;s<t;s++)o[s]=arguments[s];let[l,u]=o;return l.resolve.alias["next-intl/config"]=r.default.resolve(l.context,i(n,l.context)),"function"==typeof(null==e?void 0:e.webpack)?e.webpack(l,u):l}};return Object.assign({},e,t)}(n,e)};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../_virtual/_rollupPluginBabelHelpers.js"),l=require("react"),r=require("../shared/NextIntlClientProvider.js"),u=require("./useLocale.js"),t=require("./useNow.js"),n=require("./useTimeZone.js");function o(e){return e&&e.__esModule?e:{default:e}}var a=o(l);exports.default=function(l){let{locale:o,now:s,timeZone:i,...d}=l;const c=u.default(),f=t.default(),j=n.default();return a.default.createElement(r.default,e.extends({locale:null!=o?o:c,now:null!=s?s:f,timeZone:null!=i?i:j},d))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("../_virtual/_rollupPluginBabelHelpers.js"),r=require("react"),t=require("../shared/NextIntlClientProvider.js"),l=require("../server/getLocale.js"),u=require("../server/getNow.js"),a=require("../server/getTimeZone.js");function n(e){return e&&e.__esModule?e:{default:e}}var i=n(r);exports.default=async function(r){let{locale:n,now:o,timeZone:s,...d}=r;return i.default.createElement(t.default,e.extends({locale:null!=n?n:await l.default(),now:null!=o?o:await u.default(),timeZone:null!=s?s:await a.default()},d))};
@@ -4,5 +4,5 @@ import { AllLocales } from '../../shared/types';
4
4
  type Props<Locales extends AllLocales> = Omit<ComponentProps<typeof BaseLinkWithLocale>, 'locale'> & {
5
5
  locale?: Locales[number];
6
6
  };
7
- export default function BaseLink<Locales extends AllLocales>({ locale, ...rest }: Props<Locales>): React.JSX.Element;
7
+ export default function BaseLink<Locales extends AllLocales>({ locale, ...rest }: Props<Locales>): Promise<React.JSX.Element>;
8
8
  export {};
@@ -37,7 +37,7 @@ export default function createSharedPathnamesNavigation<Locales extends AllLocal
37
37
  locale: string;
38
38
  }, "ref"> & import("react").RefAttributes<HTMLAnchorElement>, "locale"> & {
39
39
  locale?: Locales[number] | undefined;
40
- }) => import("react").JSX.Element;
40
+ }) => Promise<import("react").JSX.Element>;
41
41
  redirect: typeof baseRedirect;
42
42
  usePathname: () => never;
43
43
  useRouter: () => never;
@@ -1,5 +1,5 @@
1
1
  import React, { ComponentProps } from 'react';
2
2
  import BaseNextIntlClientProvider from '../shared/NextIntlClientProvider';
3
3
  type Props = ComponentProps<typeof BaseNextIntlClientProvider>;
4
- export default function NextIntlClientProvider({ locale, now, timeZone, ...rest }: Props): React.JSX.Element;
4
+ export default function NextIntlClientProvider({ locale, now, timeZone, ...rest }: Props): Promise<React.JSX.Element>;
5
5
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-intl",
3
- "version": "3.0.2",
3
+ "version": "3.1.0",
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.",
@@ -73,7 +73,7 @@
73
73
  "dependencies": {
74
74
  "@formatjs/intl-localematcher": "^0.2.32",
75
75
  "negotiator": "^0.6.3",
76
- "use-intl": "^3.0.2"
76
+ "use-intl": "^3.1.0"
77
77
  },
78
78
  "peerDependencies": {
79
79
  "next": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0",
@@ -89,7 +89,7 @@
89
89
  "eslint": "^8.46.0",
90
90
  "eslint-config-molindo": "^7.0.0",
91
91
  "eslint-plugin-deprecation": "^1.4.1",
92
- "next": "14.0.1",
92
+ "next": "14.0.3",
93
93
  "path-to-regexp": "^6.2.1",
94
94
  "react": "^18.2.0",
95
95
  "react-dom": "^18.2.0",
@@ -125,5 +125,5 @@
125
125
  "limit": "5.7 KB"
126
126
  }
127
127
  ],
128
- "gitHead": "a1b397dbab0dabee1c04b820848fab66b89df6e3"
128
+ "gitHead": "12d1bb5ea05e2e41b036d0d68c59ff13a946f841"
129
129
  }