next-intlayer 1.0.1 → 1.2.1

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 (52) hide show
  1. package/README.md +199 -0
  2. package/dist/cjs/client/index.cjs +4 -4
  3. package/dist/cjs/client/index.cjs.map +1 -1
  4. package/dist/cjs/client/index.d.ts +1 -1
  5. package/dist/cjs/client/useLocale.cjs +2 -2
  6. package/dist/cjs/client/useLocale.cjs.map +1 -1
  7. package/dist/cjs/generateStaticParams.cjs +1 -1
  8. package/dist/cjs/generateStaticParams.cjs.map +1 -1
  9. package/dist/cjs/index.cjs +4 -4
  10. package/dist/cjs/index.cjs.map +1 -1
  11. package/dist/cjs/index.d.ts +1 -1
  12. package/dist/cjs/middleware/intlayerMiddleware.cjs +1 -1
  13. package/dist/cjs/middleware/intlayerMiddleware.cjs.map +1 -1
  14. package/dist/cjs/middleware/intlayerMiddleware.d.ts +17 -0
  15. package/dist/cjs/middleware/localeDetector.cjs.map +1 -1
  16. package/dist/cjs/middleware/localeDetector.d.ts +5 -0
  17. package/dist/cjs/server/index.cjs +4 -4
  18. package/dist/cjs/server/index.cjs.map +1 -1
  19. package/dist/cjs/server/index.d.ts +1 -1
  20. package/dist/cjs/server/withIntlayer.cjs +12 -15
  21. package/dist/cjs/server/withIntlayer.cjs.map +1 -1
  22. package/dist/cjs/server/withIntlayer.d.ts +12 -0
  23. package/dist/esm/client/index.d.mts +1 -1
  24. package/dist/esm/client/index.mjs +4 -4
  25. package/dist/esm/client/index.mjs.map +1 -1
  26. package/dist/esm/client/useLocale.mjs +4 -6
  27. package/dist/esm/client/useLocale.mjs.map +1 -1
  28. package/dist/esm/generateStaticParams.mjs +2 -2
  29. package/dist/esm/generateStaticParams.mjs.map +1 -1
  30. package/dist/esm/index.d.mts +1 -1
  31. package/dist/esm/index.mjs +4 -4
  32. package/dist/esm/index.mjs.map +1 -1
  33. package/dist/esm/middleware/intlayerMiddleware.d.mts +17 -0
  34. package/dist/esm/middleware/intlayerMiddleware.mjs +2 -2
  35. package/dist/esm/middleware/intlayerMiddleware.mjs.map +1 -1
  36. package/dist/esm/middleware/localeDetector.d.mts +5 -0
  37. package/dist/esm/middleware/localeDetector.mjs.map +1 -1
  38. package/dist/esm/server/index.d.mts +1 -1
  39. package/dist/esm/server/index.mjs +4 -4
  40. package/dist/esm/server/index.mjs.map +1 -1
  41. package/dist/esm/server/withIntlayer.d.mts +12 -0
  42. package/dist/esm/server/withIntlayer.mjs +12 -15
  43. package/dist/esm/server/withIntlayer.mjs.map +1 -1
  44. package/package.json +11 -9
  45. package/src/client/index.ts +2 -2
  46. package/src/client/useLocale.ts +4 -8
  47. package/src/generateStaticParams.ts +2 -2
  48. package/src/index.ts +2 -2
  49. package/src/middleware/intlayerMiddleware.ts +19 -2
  50. package/src/middleware/localeDetector.ts +5 -0
  51. package/src/server/index.ts +2 -2
  52. package/src/server/withIntlayer.ts +35 -27
package/README.md ADDED
@@ -0,0 +1,199 @@
1
+ # Intlayer: Next-Level Content Management in JavaScript
2
+
3
+ **Intlayer** is an innovative Content Management System (CMS) designed specifically for JavaScript developers. It enables seamless transpilation of JavaScript content into structured dictionaries, making integration into your codebase straightforward and efficient.
4
+
5
+ ## Why Choose Intlayer?
6
+
7
+ - **JavaScript-Powered Content Management**: Harness the flexibility of JavaScript to define and manage your content efficiently.
8
+ - **Type-Safe Environment**: Leverage TypeScript to ensure all your content definitions are precise and error-free.
9
+ - **Integrated Content Files**: Keep your translations close to their respective components, enhancing maintainability and clarity.
10
+ - **Simplified Setup**: Get up and running quickly with minimal configuration, especially optimized for Next.js projects.
11
+ - **Server Component Support**: Perfectly suited for Next.js server components, ensuring smooth server-side rendering.
12
+ - **Enhanced Routing**: Full support for Next.js app routing, adapting seamlessly to complex application structures.
13
+
14
+ ## Getting Started with Intlayer
15
+
16
+ Setting up Intlayer in a Next.js application is straightforward:
17
+
18
+ ### Step 1: Install Dependencies
19
+
20
+ Install the necessary packages using npm:
21
+
22
+ ```bash
23
+ npm install intlayer next-intlayer
24
+ ```
25
+
26
+ ```bash
27
+ yarn install intlayer next-intlayer
28
+ ```
29
+
30
+ ```bash
31
+ pnpm install intlayer next-intlayer
32
+ ```
33
+
34
+ ### Step 2: Integrate Intlayer in Your Next.js Configuration
35
+
36
+ Configure your Next.js setup to use Intlayer:
37
+
38
+ ```typescript
39
+ // next.config.mjs
40
+ import { withIntlayer } from "next-intlayer/server";
41
+
42
+ const nextConfig = {};
43
+
44
+ export default withIntlayer(nextConfig);
45
+ ```
46
+
47
+ ### Step 3: Configure Middleware for Locale Detection
48
+
49
+ Set up middleware to detect the user's preferred locale:
50
+
51
+ ```typescript
52
+ // src/middleware.ts
53
+ export { intlayerMiddleware as middleware } from 'next-intlayer/middleware';
54
+
55
+ export const config = {
56
+ matcher: '/((?!api|static|._\\.._|\_next).*),
57
+ };
58
+ ```
59
+
60
+ ### Step 4: Define Dynamic Locale Routes
61
+
62
+ Implement dynamic routing for localized content:
63
+
64
+ Change `src/app/page.ts` to `src/app/[locale]/page.ts`
65
+
66
+ ### Step 5: Manage Your Content
67
+
68
+ Create and manage your content dictionaries:
69
+
70
+ ```tsx
71
+ // src/app/[locale]/page.content.ts
72
+ import { t, type ContentModule } from "intlayer";
73
+
74
+ const pageContent: ContentModule = {
75
+ id: "page",
76
+ getStarted: {
77
+ main: t({
78
+ en: "Get started by editing",
79
+ fr: "Commencez par éditer",
80
+ es: "Comience por editar",
81
+ }),
82
+ pageLink: "src/app/page.tsx",
83
+ },
84
+ };
85
+
86
+ export default pageContent;
87
+ ```
88
+
89
+ [See how to declare your Intlayer declaration files](https://github.com/aypineau/intlayer/blob/main/packages/intlayer/readme.md).
90
+
91
+ ### Step 6: Utilize Intlayer in Your Code
92
+
93
+ Access your content dictionaries throughout your application:
94
+
95
+ ```tsx
96
+ // src/app/[locale]/page.ts
97
+
98
+ import { ClientComponentExample } from "@component/components/ClientComponentExample";
99
+ import { LocaleSwitcher } from "@component/components/LangSwitcherDropDown";
100
+ import { NestedServerComponentExample } from "@component/components/NestedServerComponentExample";
101
+ import { ServerComponentExample } from "@component/components/ServerComponentExample";
102
+ import { type NextPageIntlayer, IntlayerClientProvider } from "next-intlayer";
103
+ import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
104
+
105
+ const Page: NextPageIntlayer = ({ params: { locale } }) => {
106
+ const content = useIntlayer("page", locale);
107
+
108
+ return (
109
+ <>
110
+ <p>
111
+ {content.getStarted.main}
112
+ <code>{content.getStarted.pageLink}</code>
113
+ </p>
114
+ {/**
115
+ * IntlayerServerProvider is used to provide the locale to the server children
116
+ * Don't work if set in the layout
117
+ */}
118
+ <IntlayerServerProvider locale={locale}>
119
+ <ServerComponentExample />
120
+ </IntlayerServerProvider>
121
+ {/**
122
+ * IntlayerClientProvider is used to provide the locale to the client children
123
+ * Can be set in any parent component, including the layout
124
+ */}
125
+ <IntlayerClientProvider locale={locale}>
126
+ <ClientComponentExample />
127
+ </IntlayerClientProvider>
128
+ </>
129
+ );
130
+ };
131
+
132
+ export default Page;
133
+ ```
134
+
135
+ ```tsx
136
+ // src/components/ClientComponentExample.tsx
137
+
138
+ "use client";
139
+
140
+ import { useIntlayer } from "next-intlayer";
141
+
142
+ export const ClientComponentExample = () => {
143
+ const content = useIntlayer("client-component-example"); // Create related content declaration
144
+
145
+ return (
146
+ <div>
147
+ <h2>{content.title} </h2>
148
+ <p>{content.content}</p>
149
+ </div>
150
+ );
151
+ };
152
+ ```
153
+
154
+ ```tsx
155
+ // src/components/ServerComponentExample.tsx
156
+
157
+ import { useIntlayer } from "next-intlayer/server";
158
+
159
+ export const ServerComponentExample = () => {
160
+ const content = useIntlayer("server-component-example"); // Create related content declaration
161
+
162
+ return (
163
+ <div>
164
+ <h2>{content.title} </h2>
165
+ <p>{content.content}</p>
166
+ </div>
167
+ );
168
+ };
169
+ ```
170
+
171
+ For more detailed usage of intlayer into Client, or Server component, see the [nextJS example here](https://github.com/aypineau/intlayer/blob/main/examples/nextjs-app/src/app/%5Blocale%5D/demo-usage-components/page.tsx).
172
+
173
+ ## Configuration of your project
174
+
175
+ Create a config file to configure the languages of your application:
176
+
177
+ ```typescript
178
+ // intlayer.config.ts
179
+
180
+ import { Locales, type IntlayerConfig } from "intlayer";
181
+
182
+ const config: IntlayerConfig = {
183
+ internationalization: {
184
+ locales: [
185
+ Locales.ENGLISH,
186
+ // Your other locales
187
+ ],
188
+ defaultLocale: Locales.ENGLISH,
189
+ },
190
+ };
191
+
192
+ export default config;
193
+ ```
194
+
195
+ To see all available parameters, refer to the [configuration documentation here](https://github.com/aypineau/intlayer/blob/main/docs/configuration.md).
196
+
197
+ ---
198
+
199
+ This version emphasizes ease of use, practical steps, and the professional application of Intlayer in a Next.js environment.
@@ -18,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var client_exports = {};
20
20
  __export(client_exports, {
21
- LocaleClientContext: () => import_react_intlayer.LocaleClientContext,
22
- LocaleClientContextProvider: () => import_react_intlayer.LocaleClientContextProvider,
21
+ IntlayerClient: () => import_react_intlayer.IntlayerClient,
22
+ IntlayerClientProvider: () => import_react_intlayer.IntlayerClientProvider,
23
23
  getTranslation: () => import_react_intlayer.getTranslation,
24
24
  useIntlayer: () => import_react_intlayer.useIntlayer,
25
25
  useLocale: () => import_useLocale.useLocale,
@@ -31,8 +31,8 @@ var import_react_intlayer = require("react-intlayer");
31
31
  var import_useLocale = require('./useLocale.cjs');
32
32
  // Annotate the CommonJS export names for ESM import in node:
33
33
  0 && (module.exports = {
34
- LocaleClientContext,
35
- LocaleClientContextProvider,
34
+ IntlayerClient,
35
+ IntlayerClientProvider,
36
36
  getTranslation,
37
37
  useIntlayer,
38
38
  useLocale,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["export {\n getTranslation,\n LocaleClientContextProvider,\n LocaleClientContext,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { useLocale } from './useLocale';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOO;AACP,uBAA0B;","names":[]}
1
+ {"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["export {\n getTranslation,\n IntlayerClientProvider,\n IntlayerClient,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { useLocale } from './useLocale';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOO;AACP,uBAA0B;","names":[]}
@@ -1,3 +1,3 @@
1
- export { LocaleClientContext, LocaleClientContextProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
1
+ export { IntlayerClient, IntlayerClientProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
2
2
  export { useLocale } from './useLocale.js';
3
3
  import '@intlayer/config/client';
@@ -24,10 +24,10 @@ module.exports = __toCommonJS(useLocale_exports);
24
24
  var import_client = require("@intlayer/config/client");
25
25
  var import_navigation = require("next/navigation.js");
26
26
  var import_react_intlayer = require("react-intlayer");
27
- const { prefixDefault } = import_client.intlayerMiddlewareConfiguration;
28
27
  const useLocale = () => {
28
+ const { prefixDefault } = (0, import_client.getConfiguration)().middleware;
29
29
  const { setLocaleCookie } = (0, import_react_intlayer.useLocaleCookie)();
30
- const reactLocaleHook = (0, import_react_intlayer.useLocale)();
30
+ const reactLocaleHook = (0, import_react_intlayer.useLocaleBase)();
31
31
  const router = (0, import_navigation.useRouter)();
32
32
  const pathname = (0, import_navigation.usePathname)();
33
33
  const {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/useLocale.ts"],"sourcesContent":["import {\n type Locales,\n intlayerMiddlewareConfiguration,\n} from '@intlayer/config/client';\nimport { usePathname, useRouter } from 'next/navigation.js';\nimport { useLocale as useReactLocale, useLocaleCookie } from 'react-intlayer';\n\nconst { prefixDefault } = intlayerMiddlewareConfiguration;\n\nexport const useLocale = () => {\n const { setLocaleCookie } = useLocaleCookie();\n const reactLocaleHook = useReactLocale();\n const router = useRouter();\n const pathname = usePathname();\n\n const {\n defaultLocale,\n availableLocales,\n locale: currentLocale,\n } = reactLocaleHook;\n\n const setLocale = (locale: Locales) => {\n if (currentLocale.toString() === locale.toString()) return;\n\n if (!availableLocales.includes(locale)) {\n console.error(`Locale ${locale} is not available`);\n return;\n }\n\n setLocaleCookie(locale);\n\n const pathWithoutLocale =\n !prefixDefault && currentLocale.toString() === defaultLocale.toString()\n ? pathname\n : pathname.slice(`/${currentLocale}`.length) || '/';\n\n if (!prefixDefault && locale === defaultLocale) {\n return router.push(pathWithoutLocale);\n }\n\n return router.push(`/${locale}${pathWithoutLocale}`);\n };\n\n return {\n ...reactLocaleHook,\n setLocale,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAGO;AACP,wBAAuC;AACvC,4BAA6D;AAE7D,MAAM,EAAE,cAAc,IAAI;AAEnB,MAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,gBAAgB,QAAI,uCAAgB;AAC5C,QAAM,sBAAkB,sBAAAA,WAAe;AACvC,QAAM,aAAS,6BAAU;AACzB,QAAM,eAAW,+BAAY;AAE7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,YAAY,CAAC,WAAoB;AACrC,QAAI,cAAc,SAAS,MAAM,OAAO,SAAS;AAAG;AAEpD,QAAI,CAAC,iBAAiB,SAAS,MAAM,GAAG;AACtC,cAAQ,MAAM,UAAU,MAAM,mBAAmB;AACjD;AAAA,IACF;AAEA,oBAAgB,MAAM;AAEtB,UAAM,oBACJ,CAAC,iBAAiB,cAAc,SAAS,MAAM,cAAc,SAAS,IAClE,WACA,SAAS,MAAM,IAAI,aAAa,GAAG,MAAM,KAAK;AAEpD,QAAI,CAAC,iBAAiB,WAAW,eAAe;AAC9C,aAAO,OAAO,KAAK,iBAAiB;AAAA,IACtC;AAEA,WAAO,OAAO,KAAK,IAAI,MAAM,GAAG,iBAAiB,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":["useReactLocale"]}
1
+ {"version":3,"sources":["../../../src/client/useLocale.ts"],"sourcesContent":["import { type Locales, getConfiguration } from '@intlayer/config/client';\nimport { usePathname, useRouter } from 'next/navigation.js';\nimport { useLocaleCookie, useLocaleBase } from 'react-intlayer';\n\nexport const useLocale = () => {\n const { prefixDefault } = getConfiguration().middleware;\n const { setLocaleCookie } = useLocaleCookie();\n const reactLocaleHook = useLocaleBase();\n const router = useRouter();\n const pathname = usePathname();\n\n const {\n defaultLocale,\n availableLocales,\n locale: currentLocale,\n } = reactLocaleHook;\n\n const setLocale = (locale: Locales) => {\n if (currentLocale.toString() === locale.toString()) return;\n\n if (!availableLocales.includes(locale)) {\n console.error(`Locale ${locale} is not available`);\n return;\n }\n\n setLocaleCookie(locale);\n\n const pathWithoutLocale =\n !prefixDefault && currentLocale.toString() === defaultLocale.toString()\n ? pathname\n : pathname.slice(`/${currentLocale}`.length) || '/';\n\n if (!prefixDefault && locale === defaultLocale) {\n return router.push(pathWithoutLocale);\n }\n\n return router.push(`/${locale}${pathWithoutLocale}`);\n };\n\n return {\n ...reactLocaleHook,\n setLocale,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+C;AAC/C,wBAAuC;AACvC,4BAA+C;AAExC,MAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,cAAc,QAAI,gCAAiB,EAAE;AAC7C,QAAM,EAAE,gBAAgB,QAAI,uCAAgB;AAC5C,QAAM,sBAAkB,qCAAc;AACtC,QAAM,aAAS,6BAAU;AACzB,QAAM,eAAW,+BAAY;AAE7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,YAAY,CAAC,WAAoB;AACrC,QAAI,cAAc,SAAS,MAAM,OAAO,SAAS;AAAG;AAEpD,QAAI,CAAC,iBAAiB,SAAS,MAAM,GAAG;AACtC,cAAQ,MAAM,UAAU,MAAM,mBAAmB;AACjD;AAAA,IACF;AAEA,oBAAgB,MAAM;AAEtB,UAAM,oBACJ,CAAC,iBAAiB,cAAc,SAAS,MAAM,cAAc,SAAS,IAClE,WACA,SAAS,MAAM,IAAI,aAAa,GAAG,MAAM,KAAK;AAEpD,QAAI,CAAC,iBAAiB,WAAW,eAAe;AAC9C,aAAO,OAAO,KAAK,iBAAiB;AAAA,IACtC;AAEA,WAAO,OAAO,KAAK,IAAI,MAAM,GAAG,iBAAiB,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -22,7 +22,7 @@ __export(generateStaticParams_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(generateStaticParams_exports);
24
24
  var import_client = require("@intlayer/config/client");
25
- const { locales } = import_client.intlayerIntlConfiguration;
25
+ const { locales } = (0, import_client.getConfiguration)().internationalization;
26
26
  const generateStaticParams = () => locales.map((locale) => ({ locale }));
27
27
  // Annotate the CommonJS export names for ESM import in node:
28
28
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/generateStaticParams.ts"],"sourcesContent":["import { intlayerIntlConfiguration } from '@intlayer/config/client';\n\nconst { locales } = intlayerIntlConfiguration;\n\nexport const generateStaticParams = () => locales.map((locale) => ({ locale }));\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0C;AAE1C,MAAM,EAAE,QAAQ,IAAI;AAEb,MAAM,uBAAuB,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;","names":[]}
1
+ {"version":3,"sources":["../../src/generateStaticParams.ts"],"sourcesContent":["import { getConfiguration } from '@intlayer/config/client';\n\nconst { locales } = getConfiguration().internationalization;\n\nexport const generateStaticParams = () => locales.map((locale) => ({ locale }));\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAiC;AAEjC,MAAM,EAAE,QAAQ,QAAI,gCAAiB,EAAE;AAEhC,MAAM,uBAAuB,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;","names":[]}
@@ -18,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var src_exports = {};
20
20
  __export(src_exports, {
21
- LocaleClientContext: () => import_react_intlayer.LocaleClientContext,
22
- LocaleClientContextProvider: () => import_react_intlayer.LocaleClientContextProvider,
21
+ IntlayerClient: () => import_react_intlayer.IntlayerClient,
22
+ IntlayerClientProvider: () => import_react_intlayer.IntlayerClientProvider,
23
23
  generateStaticParams: () => import_generateStaticParams.generateStaticParams,
24
24
  getTranslation: () => import_react_intlayer.getTranslation,
25
25
  useIntlayer: () => import_react_intlayer.useIntlayer,
@@ -33,8 +33,8 @@ var import_generateStaticParams = require('./generateStaticParams.cjs');
33
33
  var import_useLocale = require('./client/useLocale.cjs');
34
34
  // Annotate the CommonJS export names for ESM import in node:
35
35
  0 && (module.exports = {
36
- LocaleClientContext,
37
- LocaleClientContextProvider,
36
+ IntlayerClient,
37
+ IntlayerClientProvider,
38
38
  generateStaticParams,
39
39
  getTranslation,
40
40
  useIntlayer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export {\n getTranslation,\n LocaleClientContextProvider,\n LocaleClientContext,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { generateStaticParams } from './generateStaticParams';\nexport type { LocalParams, NextPageIntlayer } from './types/index';\nexport { useLocale } from './client/useLocale';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOO;AACP,kCAAqC;AAErC,uBAA0B;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export {\n getTranslation,\n IntlayerClientProvider,\n IntlayerClient,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { generateStaticParams } from './generateStaticParams';\nexport type { LocalParams, NextPageIntlayer } from './types/index';\nexport { useLocale } from './client/useLocale';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAOO;AACP,kCAAqC;AAErC,uBAA0B;","names":[]}
@@ -1,4 +1,4 @@
1
- export { LocaleClientContext, LocaleClientContextProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
1
+ export { IntlayerClient, IntlayerClientProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
2
2
  export { generateStaticParams } from './generateStaticParams.js';
3
3
  export { LocalParams, NextPageIntlayer } from './types/NextPage.js';
4
4
  export { useLocale } from './client/useLocale.js';
@@ -24,7 +24,7 @@ module.exports = __toCommonJS(intlayerMiddleware_exports);
24
24
  var import_client = require("@intlayer/config/client");
25
25
  var import_server = require("next/server");
26
26
  var import_localeDetector = require('./localeDetector.cjs');
27
- const { internationalization, middleware } = import_client.intlayerConfiguration;
27
+ const { internationalization, middleware } = (0, import_client.getConfiguration)();
28
28
  const { locales, defaultLocale } = internationalization;
29
29
  const {
30
30
  headerName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/middleware/intlayerMiddleware.ts"],"sourcesContent":["import { type Locales, intlayerConfiguration } from '@intlayer/config/client';\nimport { type NextRequest, NextResponse } from 'next/server';\nimport { localeDetector } from './localeDetector';\n\nconst { internationalization, middleware } = intlayerConfiguration;\nconst { locales, defaultLocale } = internationalization;\nconst {\n headerName,\n cookieName,\n prefixDefault,\n basePath,\n serverSetCookie,\n noPrefix,\n} = middleware;\n\nexport const intlayerMiddleware = (request: NextRequest): NextResponse => {\n const pathname = request.nextUrl.pathname;\n const cookieLocale = getCookieLocale(request);\n const basePathTrailingSlash = basePath.endsWith('/');\n\n if (noPrefix) {\n return handleNoPrefix(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n\n const pathLocale = getPathLocale(pathname);\n return handlePrefix(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst getCookieLocale = (request: NextRequest): Locales | undefined => {\n if (!cookieName) return undefined;\n const cookieValue = request.cookies.get(cookieName)?.value as Locales;\n if (cookieValue && locales.includes(cookieValue)) {\n return cookieValue;\n }\n};\n\nconst handleNoPrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n const locale = cookieLocale ?? defaultLocale;\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return rewriteUrl(request, newPath, locale);\n};\n\nconst getPathLocale = (pathname: string): Locales | undefined =>\n locales.find(\n (locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`\n );\n\nconst handlePrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!pathLocale) {\n return handleMissingPathLocale(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n return handleExistingPathLocale(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleMissingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n let locale = cookieLocale ?? localeDetector?.(request) ?? defaultLocale;\n if (!locales.includes(locale)) {\n console.warn(\n 'The localeDetector callback must return a locale included in your locales array. Reverting to using defaultLocale.'\n );\n locale = defaultLocale;\n }\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return prefixDefault || locale !== defaultLocale\n ? redirectUrl(request, newPath)\n : rewriteUrl(request, newPath, locale);\n};\n\nconst handleExistingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (\n cookieLocale &&\n cookieLocale !== pathLocale &&\n serverSetCookie !== 'always'\n ) {\n const newPath = handleCookieLocaleMismatch(\n request,\n pathname,\n pathLocale,\n cookieLocale,\n basePath,\n basePathTrailingSlash\n );\n return redirectUrl(request, newPath);\n }\n\n return handleDefaultLocaleRedirect(\n request,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleCookieLocaleMismatch = (\n request: NextRequest,\n\n pathname: string,\n pathLocale: Locales,\n cookieLocale: Locales,\n basePath: string,\n basePathTrailingSlash: boolean\n): string => {\n const newPath = pathname.replace(`/${pathLocale}`, `/${cookieLocale}`);\n return constructPath(\n cookieLocale,\n newPath,\n basePath,\n basePathTrailingSlash,\n request.nextUrl.search\n );\n};\n\nconst handleDefaultLocaleRedirect = (\n request: NextRequest,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!prefixDefault && pathLocale === defaultLocale) {\n let pathWithoutLocale = pathname.slice(`/${pathLocale}`.length) || '/';\n\n if (basePathTrailingSlash) {\n pathWithoutLocale = pathWithoutLocale.slice(1);\n }\n\n if (request.nextUrl.search) {\n pathWithoutLocale += request.nextUrl.search;\n }\n\n return rewriteUrl(request, `${basePath}${pathWithoutLocale}`, pathLocale);\n }\n return rewriteUrl(request, pathname, pathLocale);\n};\n\nconst constructPath = (\n locale: Locales,\n path: string,\n basePath: string,\n basePathTrailingSlash: boolean,\n search?: string\n): string => {\n let newPath = `${locale}${path}`;\n newPath = `${basePath}${basePathTrailingSlash ? '' : '/'}${newPath}`;\n if (search) {\n newPath += search;\n }\n return newPath;\n};\n\nconst rewriteUrl = (\n request: NextRequest,\n newPath: string,\n locale: Locales\n): NextResponse => {\n const response = NextResponse.rewrite(new URL(newPath, request.url));\n response.headers.set(headerName, locale);\n return response;\n};\n\nconst redirectUrl = (request: NextRequest, newPath: string): NextResponse =>\n NextResponse.redirect(new URL(newPath, request.url));\n"],"mappings":"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","names":["basePath"]}
1
+ {"version":3,"sources":["../../../src/middleware/intlayerMiddleware.ts"],"sourcesContent":["import { type Locales, getConfiguration } from '@intlayer/config/client';\nimport { type NextRequest, NextResponse } from 'next/server';\nimport { localeDetector } from './localeDetector';\n\nconst { internationalization, middleware } = getConfiguration();\nconst { locales, defaultLocale } = internationalization;\nconst {\n headerName,\n cookieName,\n prefixDefault,\n basePath,\n serverSetCookie,\n noPrefix,\n} = middleware;\n\n/**\n * Middleware that handles the internationalization layer\n *\n * Usage:\n *\n * // ./src/middleware.ts\n *\n * ```ts\n * export { intlayerMiddleware as middleware } from '@intlayer/next/middleware';\n *\n * // applies this middleware only to files in the app directory\n * export const config = {\n * matcher: '/((?!api|static|.*\\\\..*|_next).*)',\n * };\n * ```\n *\n */\nexport const intlayerMiddleware = (request: NextRequest): NextResponse => {\n const pathname = request.nextUrl.pathname;\n const cookieLocale = getCookieLocale(request);\n const basePathTrailingSlash = basePath.endsWith('/');\n\n if (noPrefix) {\n return handleNoPrefix(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n\n const pathLocale = getPathLocale(pathname);\n return handlePrefix(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst getCookieLocale = (request: NextRequest): Locales | undefined => {\n if (!cookieName) return undefined;\n const cookieValue = request.cookies.get(cookieName)?.value as Locales;\n if (cookieValue && locales.includes(cookieValue)) {\n return cookieValue;\n }\n};\n\nconst handleNoPrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n const locale = cookieLocale ?? defaultLocale;\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return rewriteUrl(request, newPath, locale);\n};\n\nconst getPathLocale = (pathname: string): Locales | undefined =>\n locales.find(\n (locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`\n );\n\nconst handlePrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!pathLocale) {\n return handleMissingPathLocale(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n return handleExistingPathLocale(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleMissingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n let locale = cookieLocale ?? localeDetector?.(request) ?? defaultLocale;\n if (!locales.includes(locale)) {\n console.warn(\n 'The localeDetector callback must return a locale included in your locales array. Reverting to using defaultLocale.'\n );\n locale = defaultLocale;\n }\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return prefixDefault || locale !== defaultLocale\n ? redirectUrl(request, newPath)\n : rewriteUrl(request, newPath, locale);\n};\n\nconst handleExistingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (\n cookieLocale &&\n cookieLocale !== pathLocale &&\n serverSetCookie !== 'always'\n ) {\n const newPath = handleCookieLocaleMismatch(\n request,\n pathname,\n pathLocale,\n cookieLocale,\n basePath,\n basePathTrailingSlash\n );\n return redirectUrl(request, newPath);\n }\n\n return handleDefaultLocaleRedirect(\n request,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleCookieLocaleMismatch = (\n request: NextRequest,\n\n pathname: string,\n pathLocale: Locales,\n cookieLocale: Locales,\n basePath: string,\n basePathTrailingSlash: boolean\n): string => {\n const newPath = pathname.replace(`/${pathLocale}`, `/${cookieLocale}`);\n return constructPath(\n cookieLocale,\n newPath,\n basePath,\n basePathTrailingSlash,\n request.nextUrl.search\n );\n};\n\nconst handleDefaultLocaleRedirect = (\n request: NextRequest,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!prefixDefault && pathLocale === defaultLocale) {\n let pathWithoutLocale = pathname.slice(`/${pathLocale}`.length) || '/';\n\n if (basePathTrailingSlash) {\n pathWithoutLocale = pathWithoutLocale.slice(1);\n }\n\n if (request.nextUrl.search) {\n pathWithoutLocale += request.nextUrl.search;\n }\n\n return rewriteUrl(request, `${basePath}${pathWithoutLocale}`, pathLocale);\n }\n return rewriteUrl(request, pathname, pathLocale);\n};\n\nconst constructPath = (\n locale: Locales,\n path: string,\n basePath: string,\n basePathTrailingSlash: boolean,\n search?: string\n): string => {\n let newPath = `${locale}${path}`;\n newPath = `${basePath}${basePathTrailingSlash ? '' : '/'}${newPath}`;\n if (search) {\n newPath += search;\n }\n return newPath;\n};\n\nconst rewriteUrl = (\n request: NextRequest,\n newPath: string,\n locale: Locales\n): NextResponse => {\n const response = NextResponse.rewrite(new URL(newPath, request.url));\n response.headers.set(headerName, locale);\n return response;\n};\n\nconst redirectUrl = (request: NextRequest, newPath: string): NextResponse =>\n NextResponse.redirect(new URL(newPath, request.url));\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+C;AAC/C,oBAA+C;AAC/C,4BAA+B;AAE/B,MAAM,EAAE,sBAAsB,WAAW,QAAI,gCAAiB;AAC9D,MAAM,EAAE,SAAS,cAAc,IAAI;AACnC,MAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAI;AAmBG,MAAM,qBAAqB,CAAC,YAAuC;AACxE,QAAM,WAAW,QAAQ,QAAQ;AACjC,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,wBAAwB,SAAS,SAAS,GAAG;AAEnD,MAAI,UAAU;AACZ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,QAAQ;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,kBAAkB,CAAC,YAA8C;AACrE,MAAI,CAAC;AAAY,WAAO;AACxB,QAAM,cAAc,QAAQ,QAAQ,IAAI,UAAU,GAAG;AACrD,MAAI,eAAe,QAAQ,SAAS,WAAW,GAAG;AAChD,WAAO;AAAA,EACT;AACF;AAEA,MAAM,iBAAiB,CACrB,SACA,cACA,UACA,0BACiB;AACjB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,WAAW,SAAS,SAAS,MAAM;AAC5C;AAEA,MAAM,gBAAgB,CAAC,aACrB,QAAQ;AAAA,EACN,CAAC,WAAW,SAAS,WAAW,IAAI,MAAM,GAAG,KAAK,aAAa,IAAI,MAAM;AAC3E;AAEF,MAAM,eAAe,CACnB,SACA,cACA,YACA,UACA,0BACiB;AACjB,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,0BAA0B,CAC9B,SACA,cACA,UACA,0BACiB;AACjB,MAAI,SAAS,oBAAgB,wCAAiB,OAAO,KAAK;AAC1D,MAAI,CAAC,QAAQ,SAAS,MAAM,GAAG;AAC7B,YAAQ;AAAA,MACN;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,iBAAiB,WAAW,gBAC/B,YAAY,SAAS,OAAO,IAC5B,WAAW,SAAS,SAAS,MAAM;AACzC;AAEA,MAAM,2BAA2B,CAC/B,SACA,cACA,YACA,UACA,0BACiB;AACjB,MACE,gBACA,iBAAiB,cACjB,oBAAoB,UACpB;AACA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,YAAY,SAAS,OAAO;AAAA,EACrC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,6BAA6B,CACjC,SAEA,UACA,YACA,cACAA,WACA,0BACW;AACX,QAAM,UAAU,SAAS,QAAQ,IAAI,UAAU,IAAI,IAAI,YAAY,EAAE;AACrE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACAA;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,MAAM,8BAA8B,CAClC,SACA,YACA,UACA,0BACiB;AACjB,MAAI,CAAC,iBAAiB,eAAe,eAAe;AAClD,QAAI,oBAAoB,SAAS,MAAM,IAAI,UAAU,GAAG,MAAM,KAAK;AAEnE,QAAI,uBAAuB;AACzB,0BAAoB,kBAAkB,MAAM,CAAC;AAAA,IAC/C;AAEA,QAAI,QAAQ,QAAQ,QAAQ;AAC1B,2BAAqB,QAAQ,QAAQ;AAAA,IACvC;AAEA,WAAO,WAAW,SAAS,GAAG,QAAQ,GAAG,iBAAiB,IAAI,UAAU;AAAA,EAC1E;AACA,SAAO,WAAW,SAAS,UAAU,UAAU;AACjD;AAEA,MAAM,gBAAgB,CACpB,QACA,MACAA,WACA,uBACA,WACW;AACX,MAAI,UAAU,GAAG,MAAM,GAAG,IAAI;AAC9B,YAAU,GAAGA,SAAQ,GAAG,wBAAwB,KAAK,GAAG,GAAG,OAAO;AAClE,MAAI,QAAQ;AACV,eAAW;AAAA,EACb;AACA,SAAO;AACT;AAEA,MAAM,aAAa,CACjB,SACA,SACA,WACiB;AACjB,QAAM,WAAW,2BAAa,QAAQ,IAAI,IAAI,SAAS,QAAQ,GAAG,CAAC;AACnE,WAAS,QAAQ,IAAI,YAAY,MAAM;AACvC,SAAO;AACT;AAEA,MAAM,cAAc,CAAC,SAAsB,YACzC,2BAAa,SAAS,IAAI,IAAI,SAAS,QAAQ,GAAG,CAAC;","names":["basePath"]}
@@ -1,5 +1,22 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
2
 
3
+ /**
4
+ * Middleware that handles the internationalization layer
5
+ *
6
+ * Usage:
7
+ *
8
+ * // ./src/middleware.ts
9
+ *
10
+ * ```ts
11
+ * export { intlayerMiddleware as middleware } from '@intlayer/next/middleware';
12
+ *
13
+ * // applies this middleware only to files in the app directory
14
+ * export const config = {
15
+ * matcher: '/((?!api|static|.*\\..*|_next).*)',
16
+ * };
17
+ * ```
18
+ *
19
+ */
3
20
  declare const intlayerMiddleware: (request: NextRequest) => NextResponse;
4
21
 
5
22
  export { intlayerMiddleware };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/middleware/localeDetector.ts"],"sourcesContent":["import { match } from '@formatjs/intl-localematcher';\nimport type { Locales } from '@intlayer/config';\nimport { getConfiguration } from '@intlayer/config/client';\nimport Negotiator from 'negotiator';\nimport type { NextRequest } from 'next/server.js';\n\nconst { locales, defaultLocale } = getConfiguration().internationalization;\n\nexport const localeDetector = (request: NextRequest): Locales => {\n const negotiatorHeaders: Record<string, string> = {};\n\n request.headers.forEach((value, key) => (negotiatorHeaders[key] = value));\n\n const languages = new Negotiator({ headers: negotiatorHeaders }).languages();\n\n // match can only use specifically formatted locales\n // https://stackoverflow.com/questions/76447732/nextjs-13-i18n-incorrect-locale-information-provided\n try {\n return match(languages, locales, defaultLocale) as Locales;\n } catch (e) {\n console.warn(\n `No valid locales in accept-language header: ${languages.join(', ')}`\n );\n console.warn(`Reverting to using defaultLocale: ${defaultLocale}`);\n\n return defaultLocale;\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAsB;AAEtB,oBAAiC;AACjC,wBAAuB;AAGvB,MAAM,EAAE,SAAS,cAAc,QAAI,gCAAiB,EAAE;AAE/C,MAAM,iBAAiB,CAAC,YAAkC;AAC/D,QAAM,oBAA4C,CAAC;AAEnD,UAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAS,kBAAkB,GAAG,IAAI,KAAM;AAExE,QAAM,YAAY,IAAI,kBAAAA,QAAW,EAAE,SAAS,kBAAkB,CAAC,EAAE,UAAU;AAI3E,MAAI;AACF,eAAO,iCAAM,WAAW,SAAS,aAAa;AAAA,EAChD,SAAS,GAAG;AACV,YAAQ;AAAA,MACN,+CAA+C,UAAU,KAAK,IAAI,CAAC;AAAA,IACrE;AACA,YAAQ,KAAK,qCAAqC,aAAa,EAAE;AAEjE,WAAO;AAAA,EACT;AACF;","names":["Negotiator"]}
1
+ {"version":3,"sources":["../../../src/middleware/localeDetector.ts"],"sourcesContent":["import { match } from '@formatjs/intl-localematcher';\nimport type { Locales } from '@intlayer/config';\nimport { getConfiguration } from '@intlayer/config/client';\nimport Negotiator from 'negotiator';\nimport type { NextRequest } from 'next/server.js';\n\nconst { locales, defaultLocale } = getConfiguration().internationalization;\n\n/**\n * Detects the locale from the request headers\n *\n * Headers are provided by the browser and can be used to determine the user's preferred language\n */\nexport const localeDetector = (request: NextRequest): Locales => {\n const negotiatorHeaders: Record<string, string> = {};\n\n request.headers.forEach((value, key) => (negotiatorHeaders[key] = value));\n\n const languages = new Negotiator({ headers: negotiatorHeaders }).languages();\n\n // match can only use specifically formatted locales\n // https://stackoverflow.com/questions/76447732/nextjs-13-i18n-incorrect-locale-information-provided\n try {\n return match(languages, locales, defaultLocale) as Locales;\n } catch (e) {\n console.warn(\n `No valid locales in accept-language header: ${languages.join(', ')}`\n );\n console.warn(`Reverting to using defaultLocale: ${defaultLocale}`);\n\n return defaultLocale;\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAsB;AAEtB,oBAAiC;AACjC,wBAAuB;AAGvB,MAAM,EAAE,SAAS,cAAc,QAAI,gCAAiB,EAAE;AAO/C,MAAM,iBAAiB,CAAC,YAAkC;AAC/D,QAAM,oBAA4C,CAAC;AAEnD,UAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAS,kBAAkB,GAAG,IAAI,KAAM;AAExE,QAAM,YAAY,IAAI,kBAAAA,QAAW,EAAE,SAAS,kBAAkB,CAAC,EAAE,UAAU;AAI3E,MAAI;AACF,eAAO,iCAAM,WAAW,SAAS,aAAa;AAAA,EAChD,SAAS,GAAG;AACV,YAAQ;AAAA,MACN,+CAA+C,UAAU,KAAK,IAAI,CAAC;AAAA,IACrE;AACA,YAAQ,KAAK,qCAAqC,aAAa,EAAE;AAEjE,WAAO;AAAA,EACT;AACF;","names":["Negotiator"]}
@@ -1,6 +1,11 @@
1
1
  import { Locales } from '@intlayer/config';
2
2
  import { NextRequest } from 'next/server.js';
3
3
 
4
+ /**
5
+ * Detects the locale from the request headers
6
+ *
7
+ * Headers are provided by the browser and can be used to determine the user's preferred language
8
+ */
4
9
  declare const localeDetector: (request: NextRequest) => Locales;
5
10
 
6
11
  export { localeDetector };
@@ -18,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var server_exports = {};
20
20
  __export(server_exports, {
21
- LocaleServerContext: () => import_server.LocaleServerContext,
22
- LocaleServerContextProvider: () => import_server.LocaleServerContextProvider,
21
+ IntlayerServer: () => import_server.IntlayerServer,
22
+ IntlayerServerProvider: () => import_server.IntlayerServerProvider,
23
23
  getLocaleContent: () => import_server.getLocaleContent,
24
24
  locale: () => import_server.locale,
25
25
  useIntlayer: () => import_server.useIntlayer,
@@ -31,8 +31,8 @@ var import_server = require("react-intlayer/server");
31
31
  var import_withIntlayer = require('./withIntlayer.cjs');
32
32
  // Annotate the CommonJS export names for ESM import in node:
33
33
  0 && (module.exports = {
34
- LocaleServerContext,
35
- LocaleServerContextProvider,
34
+ IntlayerServer,
35
+ IntlayerServerProvider,
36
36
  getLocaleContent,
37
37
  locale,
38
38
  useIntlayer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/index.ts"],"sourcesContent":["export {\n getLocaleContent,\n useTraduction,\n LocaleServerContext,\n LocaleServerContextProvider,\n locale,\n useIntlayer,\n} from 'react-intlayer/server';\nexport { withIntlayer } from './withIntlayer';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOO;AACP,0BAA6B;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/index.ts"],"sourcesContent":["export {\n getLocaleContent,\n useTraduction,\n IntlayerServer,\n IntlayerServerProvider,\n locale,\n useIntlayer,\n} from 'react-intlayer/server';\nexport { withIntlayer } from './withIntlayer';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOO;AACP,0BAA6B;","names":[]}
@@ -1,3 +1,3 @@
1
- export { LocaleServerContext, LocaleServerContextProvider, getLocaleContent, locale, useIntlayer, useTraduction } from 'react-intlayer/server';
1
+ export { IntlayerServer, IntlayerServerProvider, getLocaleContent, locale, useIntlayer, useTraduction } from 'react-intlayer/server';
2
2
  export { withIntlayer } from './withIntlayer.js';
3
3
  import 'next';
@@ -23,36 +23,33 @@ __export(withIntlayer_exports, {
23
23
  module.exports = __toCommonJS(withIntlayer_exports);
24
24
  var import_path = require("path");
25
25
  var import_config = require("@intlayer/config");
26
- const intlayerConfig = (0, import_config.getConfiguration)({
27
- verbose: true
28
- });
29
- const env = (0, import_config.formatEnvVariable)("NEXT_PUBLIC_INTLAYER_");
30
- const { mainDir, baseDir } = intlayerConfig.content;
31
- const mergeEnvVariable = (nextEnv = {}) => Object.assign({}, nextEnv, env);
32
- const mergeStats = (nextStats = {}) => Object.assign({}, nextStats, {
33
- warnings: false
34
- });
26
+ var import_webpack = require("@intlayer/webpack");
35
27
  const withIntlayer = (_pluginOptions = {}) => (nextConfig = {}) => {
36
28
  if (typeof nextConfig !== "object")
37
29
  nextConfig = {};
30
+ const intlayerConfig = (0, import_config.getConfiguration)();
31
+ const env = (0, import_config.formatEnvVariable)("next");
32
+ const { mainDir, baseDir } = intlayerConfig.content;
38
33
  return Object.assign({}, nextConfig, {
39
- env: mergeEnvVariable(nextConfig.env),
40
- stats: mergeStats(nextConfig.stats),
41
- webpack: (config) => {
34
+ env: { ...nextConfig.env, ...env },
35
+ webpack: (config, { isServer, nextRuntime }) => {
42
36
  const dictionariesPath = (0, import_path.join)(mainDir, "dictionaries.cjs");
43
37
  const relativeDictionariesPath = (0, import_path.relative)(baseDir, dictionariesPath);
38
+ config.resolve.alias["@intlayer/dictionaries-entry"] = (0, import_path.resolve)(
39
+ relativeDictionariesPath
40
+ );
44
41
  config.externals.push({
45
42
  esbuild: "esbuild",
46
43
  module: "module",
47
44
  fs: "fs"
48
45
  });
49
- config.resolve.alias["@intlayer/dictionaries-entry"] = (0, import_path.resolve)(
50
- relativeDictionariesPath
51
- );
52
46
  config.module.rules.push({
53
47
  test: /\.node$/,
54
48
  loader: "node-loader"
55
49
  });
50
+ if (isServer && nextRuntime === "nodejs") {
51
+ config.plugins.push(new import_webpack.IntLayerPlugin());
52
+ }
56
53
  return config;
57
54
  }
58
55
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { resolve, relative, join } from 'path';\nimport { getConfiguration, formatEnvVariable } from '@intlayer/config';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\n\ntype PluginOptions = {\n // TODO: add options\n};\n\nconst intlayerConfig = getConfiguration({\n verbose: true,\n});\n\n// Set all configuration values as environment variables\nconst env = formatEnvVariable('NEXT_PUBLIC_INTLAYER_');\nconst { mainDir, baseDir } = intlayerConfig.content;\n\nconst mergeEnvVariable = (\n nextEnv: Record<string, unknown> | undefined = {}\n): Record<string, string> => Object.assign({}, nextEnv, env);\n\nconst mergeStats = (\n nextStats: Record<string, unknown> | undefined = {}\n): Record<string, unknown> =>\n Object.assign({}, nextStats, {\n warnings: false,\n });\n\nexport const withIntlayer =\n (_pluginOptions: PluginOptions = {}) =>\n (nextConfig: Partial<NextConfig> = {}): Partial<NextConfig> => {\n if (typeof nextConfig !== 'object') nextConfig = {};\n\n return Object.assign({}, nextConfig, {\n env: mergeEnvVariable(nextConfig.env),\n\n stats: mergeStats(nextConfig.stats),\n\n webpack: (config: Parameters<NextJsWebpackConfig>['0']) => {\n const dictionariesPath = join(mainDir, 'dictionaries.cjs');\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n });\n\n config.resolve.alias['@intlayer/dictionaries-entry'] = resolve(\n relativeDictionariesPath\n );\n\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n return config;\n },\n });\n };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwC;AACxC,oBAAoD;AAQpD,MAAM,qBAAiB,gCAAiB;AAAA,EACtC,SAAS;AACX,CAAC;AAGD,MAAM,UAAM,iCAAkB,uBAAuB;AACrD,MAAM,EAAE,SAAS,QAAQ,IAAI,eAAe;AAE5C,MAAM,mBAAmB,CACvB,UAA+C,CAAC,MACrB,OAAO,OAAO,CAAC,GAAG,SAAS,GAAG;AAE3D,MAAM,aAAa,CACjB,YAAiD,CAAC,MAElD,OAAO,OAAO,CAAC,GAAG,WAAW;AAAA,EAC3B,UAAU;AACZ,CAAC;AAEI,MAAM,eACX,CAAC,iBAAgC,CAAC,MAClC,CAAC,aAAkC,CAAC,MAA2B;AAC7D,MAAI,OAAO,eAAe;AAAU,iBAAa,CAAC;AAElD,SAAO,OAAO,OAAO,CAAC,GAAG,YAAY;AAAA,IACnC,KAAK,iBAAiB,WAAW,GAAG;AAAA,IAEpC,OAAO,WAAW,WAAW,KAAK;AAAA,IAElC,SAAS,CAAC,WAAiD;AACzD,YAAM,uBAAmB,kBAAK,SAAS,kBAAkB;AACzD,YAAM,+BAA2B,sBAAS,SAAS,gBAAgB;AAEnE,aAAO,UAAU,KAAK;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI;AAAA,MACN,CAAC;AAED,aAAO,QAAQ,MAAM,8BAA8B,QAAI;AAAA,QACrD;AAAA,MACF;AAEA,aAAO,OAAO,MAAM,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAED,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { resolve, relative, join } from 'path';\nimport { getConfiguration, formatEnvVariable } from '@intlayer/config';\nimport { IntLayerPlugin } from '@intlayer/webpack';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\n\ntype PluginOptions = {\n // TODO: add options\n};\n\ntype WebpackParams = Parameters<NextJsWebpackConfig>;\n\n/**\n * A Next.js plugin that adds the intlayer configuration to the webpack configuration\n * and sets the environment variables\n *\n * Usage:\n *\n * ```ts\n * // next.config.js\n * export default withIntlayer(nextConfig)\n * ```\n *\n */\nexport const withIntlayer =\n (_pluginOptions: PluginOptions = {}) =>\n (nextConfig: Partial<NextConfig> = {}): Partial<NextConfig> => {\n if (typeof nextConfig !== 'object') nextConfig = {};\n\n const intlayerConfig = getConfiguration();\n\n // Set all configuration values as environment variables\n const env = formatEnvVariable('next');\n\n const { mainDir, baseDir } = intlayerConfig.content;\n\n return Object.assign({}, nextConfig, {\n env: { ...nextConfig.env, ...env },\n\n webpack: (\n config: WebpackParams['0'],\n { isServer, nextRuntime }: WebpackParams[1]\n ) => {\n const dictionariesPath = join(mainDir, 'dictionaries.cjs');\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n\n config.resolve.alias['@intlayer/dictionaries-entry'] = resolve(\n relativeDictionariesPath\n );\n\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n });\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n // Apply IntLayerPlugin only on the server-side\n if (isServer && nextRuntime === 'nodejs') {\n config.plugins.push(new IntLayerPlugin());\n }\n\n return config;\n },\n });\n };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwC;AACxC,oBAAoD;AACpD,qBAA+B;AAsBxB,MAAM,eACX,CAAC,iBAAgC,CAAC,MAClC,CAAC,aAAkC,CAAC,MAA2B;AAC7D,MAAI,OAAO,eAAe;AAAU,iBAAa,CAAC;AAElD,QAAM,qBAAiB,gCAAiB;AAGxC,QAAM,UAAM,iCAAkB,MAAM;AAEpC,QAAM,EAAE,SAAS,QAAQ,IAAI,eAAe;AAE5C,SAAO,OAAO,OAAO,CAAC,GAAG,YAAY;AAAA,IACnC,KAAK,EAAE,GAAG,WAAW,KAAK,GAAG,IAAI;AAAA,IAEjC,SAAS,CACP,QACA,EAAE,UAAU,YAAY,MACrB;AACH,YAAM,uBAAmB,kBAAK,SAAS,kBAAkB;AACzD,YAAM,+BAA2B,sBAAS,SAAS,gBAAgB;AAEnE,aAAO,QAAQ,MAAM,8BAA8B,QAAI;AAAA,QACrD;AAAA,MACF;AAEA,aAAO,UAAU,KAAK;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI;AAAA,MACN,CAAC;AACD,aAAO,OAAO,MAAM,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAGD,UAAI,YAAY,gBAAgB,UAAU;AACxC,eAAO,QAAQ,KAAK,IAAI,8BAAe,CAAC;AAAA,MAC1C;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -2,6 +2,18 @@ import 'react-intlayer/server';
2
2
  import { NextConfig } from 'next';
3
3
 
4
4
  type PluginOptions = {};
5
+ /**
6
+ * A Next.js plugin that adds the intlayer configuration to the webpack configuration
7
+ * and sets the environment variables
8
+ *
9
+ * Usage:
10
+ *
11
+ * ```ts
12
+ * // next.config.js
13
+ * export default withIntlayer(nextConfig)
14
+ * ```
15
+ *
16
+ */
5
17
  declare const withIntlayer: (_pluginOptions?: PluginOptions) => (nextConfig?: Partial<NextConfig>) => Partial<NextConfig>;
6
18
 
7
19
  export { withIntlayer };
@@ -1,3 +1,3 @@
1
- export { LocaleClientContext, LocaleClientContextProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
1
+ export { IntlayerClient, IntlayerClientProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
2
2
  export { useLocale } from './useLocale.mjs';
3
3
  import '@intlayer/config/client';
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  getTranslation,
3
- LocaleClientContextProvider,
4
- LocaleClientContext,
3
+ IntlayerClientProvider,
4
+ IntlayerClient,
5
5
  useIntlayer,
6
6
  useTraduction,
7
7
  useLocaleCookie
8
8
  } from "react-intlayer";
9
9
  import { useLocale } from './useLocale.mjs';
10
10
  export {
11
- LocaleClientContext,
12
- LocaleClientContextProvider,
11
+ IntlayerClient,
12
+ IntlayerClientProvider,
13
13
  getTranslation,
14
14
  useIntlayer,
15
15
  useLocale,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["export {\n getTranslation,\n LocaleClientContextProvider,\n LocaleClientContext,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { useLocale } from './useLocale';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;","names":[]}
1
+ {"version":3,"sources":["../../../src/client/index.ts"],"sourcesContent":["export {\n getTranslation,\n IntlayerClientProvider,\n IntlayerClient,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { useLocale } from './useLocale';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;","names":[]}
@@ -1,12 +1,10 @@
1
- import {
2
- intlayerMiddlewareConfiguration
3
- } from "@intlayer/config/client";
1
+ import { getConfiguration } from "@intlayer/config/client";
4
2
  import { usePathname, useRouter } from "next/navigation.js";
5
- import { useLocale as useReactLocale, useLocaleCookie } from "react-intlayer";
6
- const { prefixDefault } = intlayerMiddlewareConfiguration;
3
+ import { useLocaleCookie, useLocaleBase } from "react-intlayer";
7
4
  const useLocale = () => {
5
+ const { prefixDefault } = getConfiguration().middleware;
8
6
  const { setLocaleCookie } = useLocaleCookie();
9
- const reactLocaleHook = useReactLocale();
7
+ const reactLocaleHook = useLocaleBase();
10
8
  const router = useRouter();
11
9
  const pathname = usePathname();
12
10
  const {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/client/useLocale.ts"],"sourcesContent":["import {\n type Locales,\n intlayerMiddlewareConfiguration,\n} from '@intlayer/config/client';\nimport { usePathname, useRouter } from 'next/navigation.js';\nimport { useLocale as useReactLocale, useLocaleCookie } from 'react-intlayer';\n\nconst { prefixDefault } = intlayerMiddlewareConfiguration;\n\nexport const useLocale = () => {\n const { setLocaleCookie } = useLocaleCookie();\n const reactLocaleHook = useReactLocale();\n const router = useRouter();\n const pathname = usePathname();\n\n const {\n defaultLocale,\n availableLocales,\n locale: currentLocale,\n } = reactLocaleHook;\n\n const setLocale = (locale: Locales) => {\n if (currentLocale.toString() === locale.toString()) return;\n\n if (!availableLocales.includes(locale)) {\n console.error(`Locale ${locale} is not available`);\n return;\n }\n\n setLocaleCookie(locale);\n\n const pathWithoutLocale =\n !prefixDefault && currentLocale.toString() === defaultLocale.toString()\n ? pathname\n : pathname.slice(`/${currentLocale}`.length) || '/';\n\n if (!prefixDefault && locale === defaultLocale) {\n return router.push(pathWithoutLocale);\n }\n\n return router.push(`/${locale}${pathWithoutLocale}`);\n };\n\n return {\n ...reactLocaleHook,\n setLocale,\n };\n};\n"],"mappings":"AAAA;AAAA,EAEE;AAAA,OACK;AACP,SAAS,aAAa,iBAAiB;AACvC,SAAS,aAAa,gBAAgB,uBAAuB;AAE7D,MAAM,EAAE,cAAc,IAAI;AAEnB,MAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,gBAAgB,IAAI,gBAAgB;AAC5C,QAAM,kBAAkB,eAAe;AACvC,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,YAAY;AAE7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,YAAY,CAAC,WAAoB;AACrC,QAAI,cAAc,SAAS,MAAM,OAAO,SAAS;AAAG;AAEpD,QAAI,CAAC,iBAAiB,SAAS,MAAM,GAAG;AACtC,cAAQ,MAAM,UAAU,MAAM,mBAAmB;AACjD;AAAA,IACF;AAEA,oBAAgB,MAAM;AAEtB,UAAM,oBACJ,CAAC,iBAAiB,cAAc,SAAS,MAAM,cAAc,SAAS,IAClE,WACA,SAAS,MAAM,IAAI,aAAa,GAAG,MAAM,KAAK;AAEpD,QAAI,CAAC,iBAAiB,WAAW,eAAe;AAC9C,aAAO,OAAO,KAAK,iBAAiB;AAAA,IACtC;AAEA,WAAO,OAAO,KAAK,IAAI,MAAM,GAAG,iBAAiB,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/client/useLocale.ts"],"sourcesContent":["import { type Locales, getConfiguration } from '@intlayer/config/client';\nimport { usePathname, useRouter } from 'next/navigation.js';\nimport { useLocaleCookie, useLocaleBase } from 'react-intlayer';\n\nexport const useLocale = () => {\n const { prefixDefault } = getConfiguration().middleware;\n const { setLocaleCookie } = useLocaleCookie();\n const reactLocaleHook = useLocaleBase();\n const router = useRouter();\n const pathname = usePathname();\n\n const {\n defaultLocale,\n availableLocales,\n locale: currentLocale,\n } = reactLocaleHook;\n\n const setLocale = (locale: Locales) => {\n if (currentLocale.toString() === locale.toString()) return;\n\n if (!availableLocales.includes(locale)) {\n console.error(`Locale ${locale} is not available`);\n return;\n }\n\n setLocaleCookie(locale);\n\n const pathWithoutLocale =\n !prefixDefault && currentLocale.toString() === defaultLocale.toString()\n ? pathname\n : pathname.slice(`/${currentLocale}`.length) || '/';\n\n if (!prefixDefault && locale === defaultLocale) {\n return router.push(pathWithoutLocale);\n }\n\n return router.push(`/${locale}${pathWithoutLocale}`);\n };\n\n return {\n ...reactLocaleHook,\n setLocale,\n };\n};\n"],"mappings":"AAAA,SAAuB,wBAAwB;AAC/C,SAAS,aAAa,iBAAiB;AACvC,SAAS,iBAAiB,qBAAqB;AAExC,MAAM,YAAY,MAAM;AAC7B,QAAM,EAAE,cAAc,IAAI,iBAAiB,EAAE;AAC7C,QAAM,EAAE,gBAAgB,IAAI,gBAAgB;AAC5C,QAAM,kBAAkB,cAAc;AACtC,QAAM,SAAS,UAAU;AACzB,QAAM,WAAW,YAAY;AAE7B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,YAAY,CAAC,WAAoB;AACrC,QAAI,cAAc,SAAS,MAAM,OAAO,SAAS;AAAG;AAEpD,QAAI,CAAC,iBAAiB,SAAS,MAAM,GAAG;AACtC,cAAQ,MAAM,UAAU,MAAM,mBAAmB;AACjD;AAAA,IACF;AAEA,oBAAgB,MAAM;AAEtB,UAAM,oBACJ,CAAC,iBAAiB,cAAc,SAAS,MAAM,cAAc,SAAS,IAClE,WACA,SAAS,MAAM,IAAI,aAAa,GAAG,MAAM,KAAK;AAEpD,QAAI,CAAC,iBAAiB,WAAW,eAAe;AAC9C,aAAO,OAAO,KAAK,iBAAiB;AAAA,IACtC;AAEA,WAAO,OAAO,KAAK,IAAI,MAAM,GAAG,iBAAiB,EAAE;AAAA,EACrD;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
@@ -1,5 +1,5 @@
1
- import { intlayerIntlConfiguration } from "@intlayer/config/client";
2
- const { locales } = intlayerIntlConfiguration;
1
+ import { getConfiguration } from "@intlayer/config/client";
2
+ const { locales } = getConfiguration().internationalization;
3
3
  const generateStaticParams = () => locales.map((locale) => ({ locale }));
4
4
  export {
5
5
  generateStaticParams
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/generateStaticParams.ts"],"sourcesContent":["import { intlayerIntlConfiguration } from '@intlayer/config/client';\n\nconst { locales } = intlayerIntlConfiguration;\n\nexport const generateStaticParams = () => locales.map((locale) => ({ locale }));\n"],"mappings":"AAAA,SAAS,iCAAiC;AAE1C,MAAM,EAAE,QAAQ,IAAI;AAEb,MAAM,uBAAuB,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;","names":[]}
1
+ {"version":3,"sources":["../../src/generateStaticParams.ts"],"sourcesContent":["import { getConfiguration } from '@intlayer/config/client';\n\nconst { locales } = getConfiguration().internationalization;\n\nexport const generateStaticParams = () => locales.map((locale) => ({ locale }));\n"],"mappings":"AAAA,SAAS,wBAAwB;AAEjC,MAAM,EAAE,QAAQ,IAAI,iBAAiB,EAAE;AAEhC,MAAM,uBAAuB,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;","names":[]}
@@ -1,4 +1,4 @@
1
- export { LocaleClientContext, LocaleClientContextProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
1
+ export { IntlayerClient, IntlayerClientProvider, getTranslation, useIntlayer, useLocaleCookie, useTraduction } from 'react-intlayer';
2
2
  export { generateStaticParams } from './generateStaticParams.mjs';
3
3
  export { LocalParams, NextPageIntlayer } from './types/NextPage.mjs';
4
4
  export { useLocale } from './client/useLocale.mjs';
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getTranslation,
3
- LocaleClientContextProvider,
4
- LocaleClientContext,
3
+ IntlayerClientProvider,
4
+ IntlayerClient,
5
5
  useIntlayer,
6
6
  useTraduction,
7
7
  useLocaleCookie
@@ -9,8 +9,8 @@ import {
9
9
  import { generateStaticParams } from './generateStaticParams.mjs';
10
10
  import { useLocale } from './client/useLocale.mjs';
11
11
  export {
12
- LocaleClientContext,
13
- LocaleClientContextProvider,
12
+ IntlayerClient,
13
+ IntlayerClientProvider,
14
14
  generateStaticParams,
15
15
  getTranslation,
16
16
  useIntlayer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export {\n getTranslation,\n LocaleClientContextProvider,\n LocaleClientContext,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { generateStaticParams } from './generateStaticParams';\nexport type { LocalParams, NextPageIntlayer } from './types/index';\nexport { useLocale } from './client/useLocale';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AAErC,SAAS,iBAAiB;","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export {\n getTranslation,\n IntlayerClientProvider,\n IntlayerClient,\n useIntlayer,\n useTraduction,\n useLocaleCookie,\n} from 'react-intlayer';\nexport { generateStaticParams } from './generateStaticParams';\nexport type { LocalParams, NextPageIntlayer } from './types/index';\nexport { useLocale } from './client/useLocale';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AAErC,SAAS,iBAAiB;","names":[]}
@@ -1,5 +1,22 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
2
 
3
+ /**
4
+ * Middleware that handles the internationalization layer
5
+ *
6
+ * Usage:
7
+ *
8
+ * // ./src/middleware.ts
9
+ *
10
+ * ```ts
11
+ * export { intlayerMiddleware as middleware } from '@intlayer/next/middleware';
12
+ *
13
+ * // applies this middleware only to files in the app directory
14
+ * export const config = {
15
+ * matcher: '/((?!api|static|.*\\..*|_next).*)',
16
+ * };
17
+ * ```
18
+ *
19
+ */
3
20
  declare const intlayerMiddleware: (request: NextRequest) => NextResponse;
4
21
 
5
22
  export { intlayerMiddleware };
@@ -1,7 +1,7 @@
1
- import { intlayerConfiguration } from "@intlayer/config/client";
1
+ import { getConfiguration } from "@intlayer/config/client";
2
2
  import { NextResponse } from "next/server";
3
3
  import { localeDetector } from './localeDetector.mjs';
4
- const { internationalization, middleware } = intlayerConfiguration;
4
+ const { internationalization, middleware } = getConfiguration();
5
5
  const { locales, defaultLocale } = internationalization;
6
6
  const {
7
7
  headerName,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/middleware/intlayerMiddleware.ts"],"sourcesContent":["import { type Locales, intlayerConfiguration } from '@intlayer/config/client';\nimport { type NextRequest, NextResponse } from 'next/server';\nimport { localeDetector } from './localeDetector';\n\nconst { internationalization, middleware } = intlayerConfiguration;\nconst { locales, defaultLocale } = internationalization;\nconst {\n headerName,\n cookieName,\n prefixDefault,\n basePath,\n serverSetCookie,\n noPrefix,\n} = middleware;\n\nexport const intlayerMiddleware = (request: NextRequest): NextResponse => {\n const pathname = request.nextUrl.pathname;\n const cookieLocale = getCookieLocale(request);\n const basePathTrailingSlash = basePath.endsWith('/');\n\n if (noPrefix) {\n return handleNoPrefix(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n\n const pathLocale = getPathLocale(pathname);\n return handlePrefix(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst getCookieLocale = (request: NextRequest): Locales | undefined => {\n if (!cookieName) return undefined;\n const cookieValue = request.cookies.get(cookieName)?.value as Locales;\n if (cookieValue && locales.includes(cookieValue)) {\n return cookieValue;\n }\n};\n\nconst handleNoPrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n const locale = cookieLocale ?? defaultLocale;\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return rewriteUrl(request, newPath, locale);\n};\n\nconst getPathLocale = (pathname: string): Locales | undefined =>\n locales.find(\n (locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`\n );\n\nconst handlePrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!pathLocale) {\n return handleMissingPathLocale(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n return handleExistingPathLocale(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleMissingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n let locale = cookieLocale ?? localeDetector?.(request) ?? defaultLocale;\n if (!locales.includes(locale)) {\n console.warn(\n 'The localeDetector callback must return a locale included in your locales array. Reverting to using defaultLocale.'\n );\n locale = defaultLocale;\n }\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return prefixDefault || locale !== defaultLocale\n ? redirectUrl(request, newPath)\n : rewriteUrl(request, newPath, locale);\n};\n\nconst handleExistingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (\n cookieLocale &&\n cookieLocale !== pathLocale &&\n serverSetCookie !== 'always'\n ) {\n const newPath = handleCookieLocaleMismatch(\n request,\n pathname,\n pathLocale,\n cookieLocale,\n basePath,\n basePathTrailingSlash\n );\n return redirectUrl(request, newPath);\n }\n\n return handleDefaultLocaleRedirect(\n request,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleCookieLocaleMismatch = (\n request: NextRequest,\n\n pathname: string,\n pathLocale: Locales,\n cookieLocale: Locales,\n basePath: string,\n basePathTrailingSlash: boolean\n): string => {\n const newPath = pathname.replace(`/${pathLocale}`, `/${cookieLocale}`);\n return constructPath(\n cookieLocale,\n newPath,\n basePath,\n basePathTrailingSlash,\n request.nextUrl.search\n );\n};\n\nconst handleDefaultLocaleRedirect = (\n request: NextRequest,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!prefixDefault && pathLocale === defaultLocale) {\n let pathWithoutLocale = pathname.slice(`/${pathLocale}`.length) || '/';\n\n if (basePathTrailingSlash) {\n pathWithoutLocale = pathWithoutLocale.slice(1);\n }\n\n if (request.nextUrl.search) {\n pathWithoutLocale += request.nextUrl.search;\n }\n\n return rewriteUrl(request, `${basePath}${pathWithoutLocale}`, pathLocale);\n }\n return rewriteUrl(request, pathname, pathLocale);\n};\n\nconst constructPath = (\n locale: Locales,\n path: string,\n basePath: string,\n basePathTrailingSlash: boolean,\n search?: string\n): string => {\n let newPath = `${locale}${path}`;\n newPath = `${basePath}${basePathTrailingSlash ? '' : '/'}${newPath}`;\n if (search) {\n newPath += search;\n }\n return newPath;\n};\n\nconst rewriteUrl = (\n request: NextRequest,\n newPath: string,\n locale: Locales\n): NextResponse => {\n const response = NextResponse.rewrite(new URL(newPath, request.url));\n response.headers.set(headerName, locale);\n return response;\n};\n\nconst redirectUrl = (request: NextRequest, newPath: string): NextResponse =>\n NextResponse.redirect(new URL(newPath, request.url));\n"],"mappings":"AAAA,SAAuB,6BAA6B;AACpD,SAA2B,oBAAoB;AAC/C,SAAS,sBAAsB;AAE/B,MAAM,EAAE,sBAAsB,WAAW,IAAI;AAC7C,MAAM,EAAE,SAAS,cAAc,IAAI;AACnC,MAAM;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAI;AAEG,MAAM,qBAAqB,CAAC,YAAuC;AACxE,QAAM,WAAW,QAAQ,QAAQ;AACjC,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,wBAAwB,SAAS,SAAS,GAAG;AAEnD,MAAI,UAAU;AACZ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,QAAQ;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,kBAAkB,CAAC,YAA8C;AACrE,MAAI,CAAC;AAAY,WAAO;AACxB,QAAM,cAAc,QAAQ,QAAQ,IAAI,UAAU,GAAG;AACrD,MAAI,eAAe,QAAQ,SAAS,WAAW,GAAG;AAChD,WAAO;AAAA,EACT;AACF;AAEA,MAAM,iBAAiB,CACrB,SACA,cACA,UACA,0BACiB;AACjB,QAAM,SAAS,gBAAgB;AAC/B,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,WAAW,SAAS,SAAS,MAAM;AAC5C;AAEA,MAAM,gBAAgB,CAAC,aACrB,QAAQ;AAAA,EACN,CAAC,WAAW,SAAS,WAAW,IAAI,MAAM,GAAG,KAAK,aAAa,IAAI,MAAM;AAC3E;AAEF,MAAM,eAAe,CACnB,SACA,cACA,YACA,UACA,0BACiB;AACjB,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,0BAA0B,CAC9B,SACA,cACA,UACA,0BACiB;AACjB,MAAI,SAAS,gBAAgB,iBAAiB,OAAO,KAAK;AAC1D,MAAI,CAAC,QAAQ,SAAS,MAAM,GAAG;AAC7B,YAAQ;AAAA,MACN;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,iBAAiB,WAAW,gBAC/B,YAAY,SAAS,OAAO,IAC5B,WAAW,SAAS,SAAS,MAAM;AACzC;AAEA,MAAM,2BAA2B,CAC/B,SACA,cACA,YACA,UACA,0BACiB;AACjB,MACE,gBACA,iBAAiB,cACjB,oBAAoB,UACpB;AACA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,YAAY,SAAS,OAAO;AAAA,EACrC;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,6BAA6B,CACjC,SAEA,UACA,YACA,cACAA,WACA,0BACW;AACX,QAAM,UAAU,SAAS,QAAQ,IAAI,UAAU,IAAI,IAAI,YAAY,EAAE;AACrE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACAA;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,MAAM,8BAA8B,CAClC,SACA,YACA,UACA,0BACiB;AACjB,MAAI,CAAC,iBAAiB,eAAe,eAAe;AAClD,QAAI,oBAAoB,SAAS,MAAM,IAAI,UAAU,GAAG,MAAM,KAAK;AAEnE,QAAI,uBAAuB;AACzB,0BAAoB,kBAAkB,MAAM,CAAC;AAAA,IAC/C;AAEA,QAAI,QAAQ,QAAQ,QAAQ;AAC1B,2BAAqB,QAAQ,QAAQ;AAAA,IACvC;AAEA,WAAO,WAAW,SAAS,GAAG,QAAQ,GAAG,iBAAiB,IAAI,UAAU;AAAA,EAC1E;AACA,SAAO,WAAW,SAAS,UAAU,UAAU;AACjD;AAEA,MAAM,gBAAgB,CACpB,QACA,MACAA,WACA,uBACA,WACW;AACX,MAAI,UAAU,GAAG,MAAM,GAAG,IAAI;AAC9B,YAAU,GAAGA,SAAQ,GAAG,wBAAwB,KAAK,GAAG,GAAG,OAAO;AAClE,MAAI,QAAQ;AACV,eAAW;AAAA,EACb;AACA,SAAO;AACT;AAEA,MAAM,aAAa,CACjB,SACA,SACA,WACiB;AACjB,QAAM,WAAW,aAAa,QAAQ,IAAI,IAAI,SAAS,QAAQ,GAAG,CAAC;AACnE,WAAS,QAAQ,IAAI,YAAY,MAAM;AACvC,SAAO;AACT;AAEA,MAAM,cAAc,CAAC,SAAsB,YACzC,aAAa,SAAS,IAAI,IAAI,SAAS,QAAQ,GAAG,CAAC;","names":["basePath"]}
1
+ {"version":3,"sources":["../../../src/middleware/intlayerMiddleware.ts"],"sourcesContent":["import { type Locales, getConfiguration } from '@intlayer/config/client';\nimport { type NextRequest, NextResponse } from 'next/server';\nimport { localeDetector } from './localeDetector';\n\nconst { internationalization, middleware } = getConfiguration();\nconst { locales, defaultLocale } = internationalization;\nconst {\n headerName,\n cookieName,\n prefixDefault,\n basePath,\n serverSetCookie,\n noPrefix,\n} = middleware;\n\n/**\n * Middleware that handles the internationalization layer\n *\n * Usage:\n *\n * // ./src/middleware.ts\n *\n * ```ts\n * export { intlayerMiddleware as middleware } from '@intlayer/next/middleware';\n *\n * // applies this middleware only to files in the app directory\n * export const config = {\n * matcher: '/((?!api|static|.*\\\\..*|_next).*)',\n * };\n * ```\n *\n */\nexport const intlayerMiddleware = (request: NextRequest): NextResponse => {\n const pathname = request.nextUrl.pathname;\n const cookieLocale = getCookieLocale(request);\n const basePathTrailingSlash = basePath.endsWith('/');\n\n if (noPrefix) {\n return handleNoPrefix(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n\n const pathLocale = getPathLocale(pathname);\n return handlePrefix(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst getCookieLocale = (request: NextRequest): Locales | undefined => {\n if (!cookieName) return undefined;\n const cookieValue = request.cookies.get(cookieName)?.value as Locales;\n if (cookieValue && locales.includes(cookieValue)) {\n return cookieValue;\n }\n};\n\nconst handleNoPrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n const locale = cookieLocale ?? defaultLocale;\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return rewriteUrl(request, newPath, locale);\n};\n\nconst getPathLocale = (pathname: string): Locales | undefined =>\n locales.find(\n (locale) => pathname.startsWith(`/${locale}/`) || pathname === `/${locale}`\n );\n\nconst handlePrefix = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!pathLocale) {\n return handleMissingPathLocale(\n request,\n cookieLocale,\n pathname,\n basePathTrailingSlash\n );\n }\n return handleExistingPathLocale(\n request,\n cookieLocale,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleMissingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n let locale = cookieLocale ?? localeDetector?.(request) ?? defaultLocale;\n if (!locales.includes(locale)) {\n console.warn(\n 'The localeDetector callback must return a locale included in your locales array. Reverting to using defaultLocale.'\n );\n locale = defaultLocale;\n }\n const newPath = constructPath(\n locale,\n pathname,\n basePath,\n basePathTrailingSlash\n );\n return prefixDefault || locale !== defaultLocale\n ? redirectUrl(request, newPath)\n : rewriteUrl(request, newPath, locale);\n};\n\nconst handleExistingPathLocale = (\n request: NextRequest,\n cookieLocale: Locales | undefined,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (\n cookieLocale &&\n cookieLocale !== pathLocale &&\n serverSetCookie !== 'always'\n ) {\n const newPath = handleCookieLocaleMismatch(\n request,\n pathname,\n pathLocale,\n cookieLocale,\n basePath,\n basePathTrailingSlash\n );\n return redirectUrl(request, newPath);\n }\n\n return handleDefaultLocaleRedirect(\n request,\n pathLocale,\n pathname,\n basePathTrailingSlash\n );\n};\n\nconst handleCookieLocaleMismatch = (\n request: NextRequest,\n\n pathname: string,\n pathLocale: Locales,\n cookieLocale: Locales,\n basePath: string,\n basePathTrailingSlash: boolean\n): string => {\n const newPath = pathname.replace(`/${pathLocale}`, `/${cookieLocale}`);\n return constructPath(\n cookieLocale,\n newPath,\n basePath,\n basePathTrailingSlash,\n request.nextUrl.search\n );\n};\n\nconst handleDefaultLocaleRedirect = (\n request: NextRequest,\n pathLocale: Locales,\n pathname: string,\n basePathTrailingSlash: boolean\n): NextResponse => {\n if (!prefixDefault && pathLocale === defaultLocale) {\n let pathWithoutLocale = pathname.slice(`/${pathLocale}`.length) || '/';\n\n if (basePathTrailingSlash) {\n pathWithoutLocale = pathWithoutLocale.slice(1);\n }\n\n if (request.nextUrl.search) {\n pathWithoutLocale += request.nextUrl.search;\n }\n\n return rewriteUrl(request, `${basePath}${pathWithoutLocale}`, pathLocale);\n }\n return rewriteUrl(request, pathname, pathLocale);\n};\n\nconst constructPath = (\n locale: Locales,\n path: string,\n basePath: string,\n basePathTrailingSlash: boolean,\n search?: string\n): string => {\n let newPath = `${locale}${path}`;\n newPath = `${basePath}${basePathTrailingSlash ? '' : '/'}${newPath}`;\n if (search) {\n newPath += search;\n }\n return newPath;\n};\n\nconst rewriteUrl = (\n request: NextRequest,\n newPath: string,\n locale: Locales\n): NextResponse => {\n const response = NextResponse.rewrite(new URL(newPath, request.url));\n response.headers.set(headerName, locale);\n return response;\n};\n\nconst redirectUrl = (request: NextRequest, newPath: string): NextResponse =>\n NextResponse.redirect(new URL(newPath, request.url));\n"],"mappings":"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","names":["basePath"]}
@@ -1,6 +1,11 @@
1
1
  import { Locales } from '@intlayer/config';
2
2
  import { NextRequest } from 'next/server.js';
3
3
 
4
+ /**
5
+ * Detects the locale from the request headers
6
+ *
7
+ * Headers are provided by the browser and can be used to determine the user's preferred language
8
+ */
4
9
  declare const localeDetector: (request: NextRequest) => Locales;
5
10
 
6
11
  export { localeDetector };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/middleware/localeDetector.ts"],"sourcesContent":["import { match } from '@formatjs/intl-localematcher';\nimport type { Locales } from '@intlayer/config';\nimport { getConfiguration } from '@intlayer/config/client';\nimport Negotiator from 'negotiator';\nimport type { NextRequest } from 'next/server.js';\n\nconst { locales, defaultLocale } = getConfiguration().internationalization;\n\nexport const localeDetector = (request: NextRequest): Locales => {\n const negotiatorHeaders: Record<string, string> = {};\n\n request.headers.forEach((value, key) => (negotiatorHeaders[key] = value));\n\n const languages = new Negotiator({ headers: negotiatorHeaders }).languages();\n\n // match can only use specifically formatted locales\n // https://stackoverflow.com/questions/76447732/nextjs-13-i18n-incorrect-locale-information-provided\n try {\n return match(languages, locales, defaultLocale) as Locales;\n } catch (e) {\n console.warn(\n `No valid locales in accept-language header: ${languages.join(', ')}`\n );\n console.warn(`Reverting to using defaultLocale: ${defaultLocale}`);\n\n return defaultLocale;\n }\n};\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,wBAAwB;AACjC,OAAO,gBAAgB;AAGvB,MAAM,EAAE,SAAS,cAAc,IAAI,iBAAiB,EAAE;AAE/C,MAAM,iBAAiB,CAAC,YAAkC;AAC/D,QAAM,oBAA4C,CAAC;AAEnD,UAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAS,kBAAkB,GAAG,IAAI,KAAM;AAExE,QAAM,YAAY,IAAI,WAAW,EAAE,SAAS,kBAAkB,CAAC,EAAE,UAAU;AAI3E,MAAI;AACF,WAAO,MAAM,WAAW,SAAS,aAAa;AAAA,EAChD,SAAS,GAAG;AACV,YAAQ;AAAA,MACN,+CAA+C,UAAU,KAAK,IAAI,CAAC;AAAA,IACrE;AACA,YAAQ,KAAK,qCAAqC,aAAa,EAAE;AAEjE,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/middleware/localeDetector.ts"],"sourcesContent":["import { match } from '@formatjs/intl-localematcher';\nimport type { Locales } from '@intlayer/config';\nimport { getConfiguration } from '@intlayer/config/client';\nimport Negotiator from 'negotiator';\nimport type { NextRequest } from 'next/server.js';\n\nconst { locales, defaultLocale } = getConfiguration().internationalization;\n\n/**\n * Detects the locale from the request headers\n *\n * Headers are provided by the browser and can be used to determine the user's preferred language\n */\nexport const localeDetector = (request: NextRequest): Locales => {\n const negotiatorHeaders: Record<string, string> = {};\n\n request.headers.forEach((value, key) => (negotiatorHeaders[key] = value));\n\n const languages = new Negotiator({ headers: negotiatorHeaders }).languages();\n\n // match can only use specifically formatted locales\n // https://stackoverflow.com/questions/76447732/nextjs-13-i18n-incorrect-locale-information-provided\n try {\n return match(languages, locales, defaultLocale) as Locales;\n } catch (e) {\n console.warn(\n `No valid locales in accept-language header: ${languages.join(', ')}`\n );\n console.warn(`Reverting to using defaultLocale: ${defaultLocale}`);\n\n return defaultLocale;\n }\n};\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,wBAAwB;AACjC,OAAO,gBAAgB;AAGvB,MAAM,EAAE,SAAS,cAAc,IAAI,iBAAiB,EAAE;AAO/C,MAAM,iBAAiB,CAAC,YAAkC;AAC/D,QAAM,oBAA4C,CAAC;AAEnD,UAAQ,QAAQ,QAAQ,CAAC,OAAO,QAAS,kBAAkB,GAAG,IAAI,KAAM;AAExE,QAAM,YAAY,IAAI,WAAW,EAAE,SAAS,kBAAkB,CAAC,EAAE,UAAU;AAI3E,MAAI;AACF,WAAO,MAAM,WAAW,SAAS,aAAa;AAAA,EAChD,SAAS,GAAG;AACV,YAAQ;AAAA,MACN,+CAA+C,UAAU,KAAK,IAAI,CAAC;AAAA,IACrE;AACA,YAAQ,KAAK,qCAAqC,aAAa,EAAE;AAEjE,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1,3 +1,3 @@
1
- export { LocaleServerContext, LocaleServerContextProvider, getLocaleContent, locale, useIntlayer, useTraduction } from 'react-intlayer/server';
1
+ export { IntlayerServer, IntlayerServerProvider, getLocaleContent, locale, useIntlayer, useTraduction } from 'react-intlayer/server';
2
2
  export { withIntlayer } from './withIntlayer.mjs';
3
3
  import 'next';
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  getLocaleContent,
3
3
  useTraduction,
4
- LocaleServerContext,
5
- LocaleServerContextProvider,
4
+ IntlayerServer,
5
+ IntlayerServerProvider,
6
6
  locale,
7
7
  useIntlayer
8
8
  } from "react-intlayer/server";
9
9
  import { withIntlayer } from './withIntlayer.mjs';
10
10
  export {
11
- LocaleServerContext,
12
- LocaleServerContextProvider,
11
+ IntlayerServer,
12
+ IntlayerServerProvider,
13
13
  getLocaleContent,
14
14
  locale,
15
15
  useIntlayer,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/index.ts"],"sourcesContent":["export {\n getLocaleContent,\n useTraduction,\n LocaleServerContext,\n LocaleServerContextProvider,\n locale,\n useIntlayer,\n} from 'react-intlayer/server';\nexport { withIntlayer } from './withIntlayer';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAoB;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/index.ts"],"sourcesContent":["export {\n getLocaleContent,\n useTraduction,\n IntlayerServer,\n IntlayerServerProvider,\n locale,\n useIntlayer,\n} from 'react-intlayer/server';\nexport { withIntlayer } from './withIntlayer';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAoB;","names":[]}
@@ -2,6 +2,18 @@ import 'react-intlayer/server';
2
2
  import { NextConfig } from 'next';
3
3
 
4
4
  type PluginOptions = {};
5
+ /**
6
+ * A Next.js plugin that adds the intlayer configuration to the webpack configuration
7
+ * and sets the environment variables
8
+ *
9
+ * Usage:
10
+ *
11
+ * ```ts
12
+ * // next.config.js
13
+ * export default withIntlayer(nextConfig)
14
+ * ```
15
+ *
16
+ */
5
17
  declare const withIntlayer: (_pluginOptions?: PluginOptions) => (nextConfig?: Partial<NextConfig>) => Partial<NextConfig>;
6
18
 
7
19
  export { withIntlayer };
@@ -1,35 +1,32 @@
1
1
  import { resolve, relative, join } from "path";
2
2
  import { getConfiguration, formatEnvVariable } from "@intlayer/config";
3
- const intlayerConfig = getConfiguration({
4
- verbose: true
5
- });
6
- const env = formatEnvVariable("NEXT_PUBLIC_INTLAYER_");
7
- const { mainDir, baseDir } = intlayerConfig.content;
8
- const mergeEnvVariable = (nextEnv = {}) => Object.assign({}, nextEnv, env);
9
- const mergeStats = (nextStats = {}) => Object.assign({}, nextStats, {
10
- warnings: false
11
- });
3
+ import { IntLayerPlugin } from "@intlayer/webpack";
12
4
  const withIntlayer = (_pluginOptions = {}) => (nextConfig = {}) => {
13
5
  if (typeof nextConfig !== "object")
14
6
  nextConfig = {};
7
+ const intlayerConfig = getConfiguration();
8
+ const env = formatEnvVariable("next");
9
+ const { mainDir, baseDir } = intlayerConfig.content;
15
10
  return Object.assign({}, nextConfig, {
16
- env: mergeEnvVariable(nextConfig.env),
17
- stats: mergeStats(nextConfig.stats),
18
- webpack: (config) => {
11
+ env: { ...nextConfig.env, ...env },
12
+ webpack: (config, { isServer, nextRuntime }) => {
19
13
  const dictionariesPath = join(mainDir, "dictionaries.cjs");
20
14
  const relativeDictionariesPath = relative(baseDir, dictionariesPath);
15
+ config.resolve.alias["@intlayer/dictionaries-entry"] = resolve(
16
+ relativeDictionariesPath
17
+ );
21
18
  config.externals.push({
22
19
  esbuild: "esbuild",
23
20
  module: "module",
24
21
  fs: "fs"
25
22
  });
26
- config.resolve.alias["@intlayer/dictionaries-entry"] = resolve(
27
- relativeDictionariesPath
28
- );
29
23
  config.module.rules.push({
30
24
  test: /\.node$/,
31
25
  loader: "node-loader"
32
26
  });
27
+ if (isServer && nextRuntime === "nodejs") {
28
+ config.plugins.push(new IntLayerPlugin());
29
+ }
33
30
  return config;
34
31
  }
35
32
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { resolve, relative, join } from 'path';\nimport { getConfiguration, formatEnvVariable } from '@intlayer/config';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\n\ntype PluginOptions = {\n // TODO: add options\n};\n\nconst intlayerConfig = getConfiguration({\n verbose: true,\n});\n\n// Set all configuration values as environment variables\nconst env = formatEnvVariable('NEXT_PUBLIC_INTLAYER_');\nconst { mainDir, baseDir } = intlayerConfig.content;\n\nconst mergeEnvVariable = (\n nextEnv: Record<string, unknown> | undefined = {}\n): Record<string, string> => Object.assign({}, nextEnv, env);\n\nconst mergeStats = (\n nextStats: Record<string, unknown> | undefined = {}\n): Record<string, unknown> =>\n Object.assign({}, nextStats, {\n warnings: false,\n });\n\nexport const withIntlayer =\n (_pluginOptions: PluginOptions = {}) =>\n (nextConfig: Partial<NextConfig> = {}): Partial<NextConfig> => {\n if (typeof nextConfig !== 'object') nextConfig = {};\n\n return Object.assign({}, nextConfig, {\n env: mergeEnvVariable(nextConfig.env),\n\n stats: mergeStats(nextConfig.stats),\n\n webpack: (config: Parameters<NextJsWebpackConfig>['0']) => {\n const dictionariesPath = join(mainDir, 'dictionaries.cjs');\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n });\n\n config.resolve.alias['@intlayer/dictionaries-entry'] = resolve(\n relativeDictionariesPath\n );\n\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n return config;\n },\n });\n };\n"],"mappings":"AAAA,SAAS,SAAS,UAAU,YAAY;AACxC,SAAS,kBAAkB,yBAAyB;AAQpD,MAAM,iBAAiB,iBAAiB;AAAA,EACtC,SAAS;AACX,CAAC;AAGD,MAAM,MAAM,kBAAkB,uBAAuB;AACrD,MAAM,EAAE,SAAS,QAAQ,IAAI,eAAe;AAE5C,MAAM,mBAAmB,CACvB,UAA+C,CAAC,MACrB,OAAO,OAAO,CAAC,GAAG,SAAS,GAAG;AAE3D,MAAM,aAAa,CACjB,YAAiD,CAAC,MAElD,OAAO,OAAO,CAAC,GAAG,WAAW;AAAA,EAC3B,UAAU;AACZ,CAAC;AAEI,MAAM,eACX,CAAC,iBAAgC,CAAC,MAClC,CAAC,aAAkC,CAAC,MAA2B;AAC7D,MAAI,OAAO,eAAe;AAAU,iBAAa,CAAC;AAElD,SAAO,OAAO,OAAO,CAAC,GAAG,YAAY;AAAA,IACnC,KAAK,iBAAiB,WAAW,GAAG;AAAA,IAEpC,OAAO,WAAW,WAAW,KAAK;AAAA,IAElC,SAAS,CAAC,WAAiD;AACzD,YAAM,mBAAmB,KAAK,SAAS,kBAAkB;AACzD,YAAM,2BAA2B,SAAS,SAAS,gBAAgB;AAEnE,aAAO,UAAU,KAAK;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI;AAAA,MACN,CAAC;AAED,aAAO,QAAQ,MAAM,8BAA8B,IAAI;AAAA,QACrD;AAAA,MACF;AAEA,aAAO,OAAO,MAAM,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAED,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../src/server/withIntlayer.ts"],"sourcesContent":["import { resolve, relative, join } from 'path';\nimport { getConfiguration, formatEnvVariable } from '@intlayer/config';\nimport { IntLayerPlugin } from '@intlayer/webpack';\nimport type { NextConfig } from 'next';\nimport type { NextJsWebpackConfig } from 'next/dist/server/config-shared';\n\ntype PluginOptions = {\n // TODO: add options\n};\n\ntype WebpackParams = Parameters<NextJsWebpackConfig>;\n\n/**\n * A Next.js plugin that adds the intlayer configuration to the webpack configuration\n * and sets the environment variables\n *\n * Usage:\n *\n * ```ts\n * // next.config.js\n * export default withIntlayer(nextConfig)\n * ```\n *\n */\nexport const withIntlayer =\n (_pluginOptions: PluginOptions = {}) =>\n (nextConfig: Partial<NextConfig> = {}): Partial<NextConfig> => {\n if (typeof nextConfig !== 'object') nextConfig = {};\n\n const intlayerConfig = getConfiguration();\n\n // Set all configuration values as environment variables\n const env = formatEnvVariable('next');\n\n const { mainDir, baseDir } = intlayerConfig.content;\n\n return Object.assign({}, nextConfig, {\n env: { ...nextConfig.env, ...env },\n\n webpack: (\n config: WebpackParams['0'],\n { isServer, nextRuntime }: WebpackParams[1]\n ) => {\n const dictionariesPath = join(mainDir, 'dictionaries.cjs');\n const relativeDictionariesPath = relative(baseDir, dictionariesPath);\n\n config.resolve.alias['@intlayer/dictionaries-entry'] = resolve(\n relativeDictionariesPath\n );\n\n config.externals.push({\n esbuild: 'esbuild',\n module: 'module',\n fs: 'fs',\n });\n config.module.rules.push({\n test: /\\.node$/,\n loader: 'node-loader',\n });\n\n // Apply IntLayerPlugin only on the server-side\n if (isServer && nextRuntime === 'nodejs') {\n config.plugins.push(new IntLayerPlugin());\n }\n\n return config;\n },\n });\n };\n"],"mappings":"AAAA,SAAS,SAAS,UAAU,YAAY;AACxC,SAAS,kBAAkB,yBAAyB;AACpD,SAAS,sBAAsB;AAsBxB,MAAM,eACX,CAAC,iBAAgC,CAAC,MAClC,CAAC,aAAkC,CAAC,MAA2B;AAC7D,MAAI,OAAO,eAAe;AAAU,iBAAa,CAAC;AAElD,QAAM,iBAAiB,iBAAiB;AAGxC,QAAM,MAAM,kBAAkB,MAAM;AAEpC,QAAM,EAAE,SAAS,QAAQ,IAAI,eAAe;AAE5C,SAAO,OAAO,OAAO,CAAC,GAAG,YAAY;AAAA,IACnC,KAAK,EAAE,GAAG,WAAW,KAAK,GAAG,IAAI;AAAA,IAEjC,SAAS,CACP,QACA,EAAE,UAAU,YAAY,MACrB;AACH,YAAM,mBAAmB,KAAK,SAAS,kBAAkB;AACzD,YAAM,2BAA2B,SAAS,SAAS,gBAAgB;AAEnE,aAAO,QAAQ,MAAM,8BAA8B,IAAI;AAAA,QACrD;AAAA,MACF;AAEA,aAAO,UAAU,KAAK;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI;AAAA,MACN,CAAC;AACD,aAAO,OAAO,MAAM,KAAK;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AAGD,UAAI,YAAY,gBAAgB,UAAU;AACxC,eAAO,QAAQ,KAAK,IAAI,eAAe,CAAC;AAAA,MAC1C;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-intlayer",
3
- "version": "1.0.1",
3
+ "version": "1.2.1",
4
4
  "private": false,
5
5
  "description": "Webpack configuration for IntLayer using NextJS",
6
6
  "keywords": [
@@ -66,20 +66,22 @@
66
66
  "negotiator": "^0.6.3",
67
67
  "next": "14.1.4",
68
68
  "webpack": "^5.91.0",
69
- "@intlayer/config": "^1.0.1",
70
- "@intlayer/core": "^1.0.1",
71
- "@intlayer/dictionaries-entry": "^1.0.1",
72
- "intlayer": "^1.0.1",
73
- "react-intlayer": "^1.0.1"
69
+ "@intlayer/chokidar": "^1.2.1",
70
+ "@intlayer/config": "^1.2.1",
71
+ "@intlayer/core": "^1.2.1",
72
+ "@intlayer/dictionaries-entry": "^1.2.1",
73
+ "@intlayer/webpack": "^1.2.1",
74
+ "intlayer": "^1.2.1",
75
+ "react-intlayer": "^1.2.1"
74
76
  },
75
77
  "devDependencies": {
76
78
  "@types/negotiator": "^0.6.3",
77
- "@types/node": "^20.11.30",
78
- "@types/react": "^18.2.78",
79
+ "@types/node": "^20.12.7",
80
+ "@types/react": "^18.2.79",
79
81
  "react": "^18.2.0",
80
82
  "rimraf": "5.0.5",
81
83
  "tsup": "^8.0.2",
82
- "typescript": "^5.4.3",
84
+ "typescript": "^5.4.5",
83
85
  "@utils/eslint-config": "^1.0.1",
84
86
  "@utils/ts-config": "^1.0.1"
85
87
  },
@@ -1,7 +1,7 @@
1
1
  export {
2
2
  getTranslation,
3
- LocaleClientContextProvider,
4
- LocaleClientContext,
3
+ IntlayerClientProvider,
4
+ IntlayerClient,
5
5
  useIntlayer,
6
6
  useTraduction,
7
7
  useLocaleCookie,
@@ -1,15 +1,11 @@
1
- import {
2
- type Locales,
3
- intlayerMiddlewareConfiguration,
4
- } from '@intlayer/config/client';
1
+ import { type Locales, getConfiguration } from '@intlayer/config/client';
5
2
  import { usePathname, useRouter } from 'next/navigation.js';
6
- import { useLocale as useReactLocale, useLocaleCookie } from 'react-intlayer';
7
-
8
- const { prefixDefault } = intlayerMiddlewareConfiguration;
3
+ import { useLocaleCookie, useLocaleBase } from 'react-intlayer';
9
4
 
10
5
  export const useLocale = () => {
6
+ const { prefixDefault } = getConfiguration().middleware;
11
7
  const { setLocaleCookie } = useLocaleCookie();
12
- const reactLocaleHook = useReactLocale();
8
+ const reactLocaleHook = useLocaleBase();
13
9
  const router = useRouter();
14
10
  const pathname = usePathname();
15
11
 
@@ -1,5 +1,5 @@
1
- import { intlayerIntlConfiguration } from '@intlayer/config/client';
1
+ import { getConfiguration } from '@intlayer/config/client';
2
2
 
3
- const { locales } = intlayerIntlConfiguration;
3
+ const { locales } = getConfiguration().internationalization;
4
4
 
5
5
  export const generateStaticParams = () => locales.map((locale) => ({ locale }));
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export {
2
2
  getTranslation,
3
- LocaleClientContextProvider,
4
- LocaleClientContext,
3
+ IntlayerClientProvider,
4
+ IntlayerClient,
5
5
  useIntlayer,
6
6
  useTraduction,
7
7
  useLocaleCookie,
@@ -1,8 +1,8 @@
1
- import { type Locales, intlayerConfiguration } from '@intlayer/config/client';
1
+ import { type Locales, getConfiguration } from '@intlayer/config/client';
2
2
  import { type NextRequest, NextResponse } from 'next/server';
3
3
  import { localeDetector } from './localeDetector';
4
4
 
5
- const { internationalization, middleware } = intlayerConfiguration;
5
+ const { internationalization, middleware } = getConfiguration();
6
6
  const { locales, defaultLocale } = internationalization;
7
7
  const {
8
8
  headerName,
@@ -13,6 +13,23 @@ const {
13
13
  noPrefix,
14
14
  } = middleware;
15
15
 
16
+ /**
17
+ * Middleware that handles the internationalization layer
18
+ *
19
+ * Usage:
20
+ *
21
+ * // ./src/middleware.ts
22
+ *
23
+ * ```ts
24
+ * export { intlayerMiddleware as middleware } from '@intlayer/next/middleware';
25
+ *
26
+ * // applies this middleware only to files in the app directory
27
+ * export const config = {
28
+ * matcher: '/((?!api|static|.*\\..*|_next).*)',
29
+ * };
30
+ * ```
31
+ *
32
+ */
16
33
  export const intlayerMiddleware = (request: NextRequest): NextResponse => {
17
34
  const pathname = request.nextUrl.pathname;
18
35
  const cookieLocale = getCookieLocale(request);
@@ -6,6 +6,11 @@ import type { NextRequest } from 'next/server.js';
6
6
 
7
7
  const { locales, defaultLocale } = getConfiguration().internationalization;
8
8
 
9
+ /**
10
+ * Detects the locale from the request headers
11
+ *
12
+ * Headers are provided by the browser and can be used to determine the user's preferred language
13
+ */
9
14
  export const localeDetector = (request: NextRequest): Locales => {
10
15
  const negotiatorHeaders: Record<string, string> = {};
11
16
 
@@ -1,8 +1,8 @@
1
1
  export {
2
2
  getLocaleContent,
3
3
  useTraduction,
4
- LocaleServerContext,
5
- LocaleServerContextProvider,
4
+ IntlayerServer,
5
+ IntlayerServerProvider,
6
6
  locale,
7
7
  useIntlayer,
8
8
  } from 'react-intlayer/server';
@@ -1,5 +1,6 @@
1
1
  import { resolve, relative, join } from 'path';
2
2
  import { getConfiguration, formatEnvVariable } from '@intlayer/config';
3
+ import { IntLayerPlugin } from '@intlayer/webpack';
3
4
  import type { NextConfig } from 'next';
4
5
  import type { NextJsWebpackConfig } from 'next/dist/server/config-shared';
5
6
 
@@ -7,54 +8,61 @@ type PluginOptions = {
7
8
  // TODO: add options
8
9
  };
9
10
 
10
- const intlayerConfig = getConfiguration({
11
- verbose: true,
12
- });
13
-
14
- // Set all configuration values as environment variables
15
- const env = formatEnvVariable('NEXT_PUBLIC_INTLAYER_');
16
- const { mainDir, baseDir } = intlayerConfig.content;
17
-
18
- const mergeEnvVariable = (
19
- nextEnv: Record<string, unknown> | undefined = {}
20
- ): Record<string, string> => Object.assign({}, nextEnv, env);
21
-
22
- const mergeStats = (
23
- nextStats: Record<string, unknown> | undefined = {}
24
- ): Record<string, unknown> =>
25
- Object.assign({}, nextStats, {
26
- warnings: false,
27
- });
11
+ type WebpackParams = Parameters<NextJsWebpackConfig>;
28
12
 
13
+ /**
14
+ * A Next.js plugin that adds the intlayer configuration to the webpack configuration
15
+ * and sets the environment variables
16
+ *
17
+ * Usage:
18
+ *
19
+ * ```ts
20
+ * // next.config.js
21
+ * export default withIntlayer(nextConfig)
22
+ * ```
23
+ *
24
+ */
29
25
  export const withIntlayer =
30
26
  (_pluginOptions: PluginOptions = {}) =>
31
27
  (nextConfig: Partial<NextConfig> = {}): Partial<NextConfig> => {
32
28
  if (typeof nextConfig !== 'object') nextConfig = {};
33
29
 
34
- return Object.assign({}, nextConfig, {
35
- env: mergeEnvVariable(nextConfig.env),
30
+ const intlayerConfig = getConfiguration();
31
+
32
+ // Set all configuration values as environment variables
33
+ const env = formatEnvVariable('next');
36
34
 
37
- stats: mergeStats(nextConfig.stats),
35
+ const { mainDir, baseDir } = intlayerConfig.content;
38
36
 
39
- webpack: (config: Parameters<NextJsWebpackConfig>['0']) => {
37
+ return Object.assign({}, nextConfig, {
38
+ env: { ...nextConfig.env, ...env },
39
+
40
+ webpack: (
41
+ config: WebpackParams['0'],
42
+ { isServer, nextRuntime }: WebpackParams[1]
43
+ ) => {
40
44
  const dictionariesPath = join(mainDir, 'dictionaries.cjs');
41
45
  const relativeDictionariesPath = relative(baseDir, dictionariesPath);
42
46
 
47
+ config.resolve.alias['@intlayer/dictionaries-entry'] = resolve(
48
+ relativeDictionariesPath
49
+ );
50
+
43
51
  config.externals.push({
44
52
  esbuild: 'esbuild',
45
53
  module: 'module',
46
54
  fs: 'fs',
47
55
  });
48
-
49
- config.resolve.alias['@intlayer/dictionaries-entry'] = resolve(
50
- relativeDictionariesPath
51
- );
52
-
53
56
  config.module.rules.push({
54
57
  test: /\.node$/,
55
58
  loader: 'node-loader',
56
59
  });
57
60
 
61
+ // Apply IntLayerPlugin only on the server-side
62
+ if (isServer && nextRuntime === 'nodejs') {
63
+ config.plugins.push(new IntLayerPlugin());
64
+ }
65
+
58
66
  return config;
59
67
  },
60
68
  });