diff --git a/examples/auth-intl/src/app/rewritten/page.tsx b/examples/auth-intl/src/app/rewritten/page.tsx
deleted file mode 100644
index 404e795..0000000
--- a/examples/auth-intl/src/app/rewritten/page.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function Rewritten() {
- return (
-
- );
-}
diff --git a/examples/auth5-intl/.env b/examples/auth5-intl/.env
new file mode 100644
index 0000000..b4baa20
--- /dev/null
+++ b/examples/auth5-intl/.env
@@ -0,0 +1,2 @@
+AUTH_SECRET='CexiU4XAW2916xBJie525+khEgSo+jdyNCX9SvLC+yc='
+NEXTAUTH_URL='http://localhost:3000'
\ No newline at end of file
diff --git a/examples/auth5-intl/.gitignore b/examples/auth5-intl/.gitignore
new file mode 100644
index 0000000..fd3dbb5
--- /dev/null
+++ b/examples/auth5-intl/.gitignore
@@ -0,0 +1,36 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# local env files
+.env*.local
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
diff --git a/examples/auth5-intl/README.md b/examples/auth5-intl/README.md
new file mode 100644
index 0000000..c403366
--- /dev/null
+++ b/examples/auth5-intl/README.md
@@ -0,0 +1,36 @@
+This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
+
+## Getting Started
+
+First, run the development server:
+
+```bash
+npm run dev
+# or
+yarn dev
+# or
+pnpm dev
+# or
+bun dev
+```
+
+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+
+You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
+
+This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
+
+## Learn More
+
+To learn more about Next.js, take a look at the following resources:
+
+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
+
+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
+
+## Deploy on Vercel
+
+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
+
+Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
diff --git a/examples/auth5-intl/next.config.mjs b/examples/auth5-intl/next.config.mjs
new file mode 100644
index 0000000..4678774
--- /dev/null
+++ b/examples/auth5-intl/next.config.mjs
@@ -0,0 +1,4 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {};
+
+export default nextConfig;
diff --git a/examples/auth5-intl/package.json b/examples/auth5-intl/package.json
new file mode 100644
index 0000000..e29c8c8
--- /dev/null
+++ b/examples/auth5-intl/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "auth5-intl",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "@nimpl/middleware-chain": "0.1.2",
+ "next": "14.2.3",
+ "next-auth": "5.0.0-beta.19",
+ "next-intl": "3.14.1",
+ "react": "^18",
+ "react-dom": "^18"
+ },
+ "devDependencies": {
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "typescript": "^5"
+ }
+}
\ No newline at end of file
diff --git a/examples/auth5-intl/pnpm-lock.yaml b/examples/auth5-intl/pnpm-lock.yaml
new file mode 100644
index 0000000..8c8daf8
--- /dev/null
+++ b/examples/auth5-intl/pnpm-lock.yaml
@@ -0,0 +1,495 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@nimpl/middleware-chain':
+ specifier: 0.1.2
+ version: 0.1.2(next@14.2.3)(react@18.3.1)
+ next:
+ specifier: 14.2.3
+ version: 14.2.3(react-dom@18.3.1)(react@18.3.1)
+ next-auth:
+ specifier: 5.0.0-beta.19
+ version: 5.0.0-beta.19(next@14.2.3)(react@18.3.1)
+ next-intl:
+ specifier: 3.14.1
+ version: 3.14.1(next@14.2.3)(react@18.3.1)
+ react:
+ specifier: ^18
+ version: 18.3.1
+ react-dom:
+ specifier: ^18
+ version: 18.3.1(react@18.3.1)
+
+devDependencies:
+ '@types/node':
+ specifier: ^20
+ version: 20.12.12
+ '@types/react':
+ specifier: ^18
+ version: 18.3.3
+ '@types/react-dom':
+ specifier: ^18
+ version: 18.3.0
+ typescript:
+ specifier: ^5
+ version: 5.4.5
+
+packages:
+
+ /@auth/core@0.32.0:
+ resolution: {integrity: sha512-3+ssTScBd+1fd0/fscAyQN1tSygXzuhysuVVzB942ggU4mdfiTbv36P0ccVnExKWYJKvu3E2r3/zxXCCAmTOrg==}
+ peerDependencies:
+ '@simplewebauthn/browser': ^9.0.1
+ '@simplewebauthn/server': ^9.0.2
+ nodemailer: ^6.8.0
+ peerDependenciesMeta:
+ '@simplewebauthn/browser':
+ optional: true
+ '@simplewebauthn/server':
+ optional: true
+ nodemailer:
+ optional: true
+ dependencies:
+ '@panva/hkdf': 1.1.1
+ '@types/cookie': 0.6.0
+ cookie: 0.6.0
+ jose: 5.3.0
+ oauth4webapi: 2.10.4
+ preact: 10.11.3
+ preact-render-to-string: 5.2.3(preact@10.11.3)
+ dev: false
+
+ /@formatjs/ecma402-abstract@1.18.3:
+ resolution: {integrity: sha512-J961RbhyjHWeCIv+iOceNxpoZ/qomJOs5lH+rUJCeKNa59gME4KC0LJVMeWODjHsnv/hTH8Hvd6sevzcAzjuaQ==}
+ dependencies:
+ '@formatjs/intl-localematcher': 0.5.4
+ tslib: 2.6.2
+ dev: false
+
+ /@formatjs/ecma402-abstract@2.0.0:
+ resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==}
+ dependencies:
+ '@formatjs/intl-localematcher': 0.5.4
+ tslib: 2.6.2
+ dev: false
+
+ /@formatjs/fast-memoize@2.2.0:
+ resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==}
+ dependencies:
+ tslib: 2.6.2
+ dev: false
+
+ /@formatjs/icu-messageformat-parser@2.7.8:
+ resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.0.0
+ '@formatjs/icu-skeleton-parser': 1.8.2
+ tslib: 2.6.2
+ dev: false
+
+ /@formatjs/icu-skeleton-parser@1.8.2:
+ resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.0.0
+ tslib: 2.6.2
+ dev: false
+
+ /@formatjs/intl-localematcher@0.2.32:
+ resolution: {integrity: sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==}
+ dependencies:
+ tslib: 2.6.2
+ dev: false
+
+ /@formatjs/intl-localematcher@0.5.4:
+ resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==}
+ dependencies:
+ tslib: 2.6.2
+ dev: false
+
+ /@next/env@14.2.3:
+ resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==}
+ dev: false
+
+ /@next/swc-darwin-arm64@14.2.3:
+ resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-darwin-x64@14.2.3:
+ resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-arm64-gnu@14.2.3:
+ resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-arm64-musl@14.2.3:
+ resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-x64-gnu@14.2.3:
+ resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-x64-musl@14.2.3:
+ resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-win32-arm64-msvc@14.2.3:
+ resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-win32-ia32-msvc@14.2.3:
+ resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-win32-x64-msvc@14.2.3:
+ resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@nimpl/middleware-chain@0.1.2(next@14.2.3)(react@18.3.1):
+ resolution: {integrity: sha512-UInQsML8yP3Be1oCCLDTiGNpIvb46BPg7nQZUFBsJxNAg9FDDYapbhdWzScZo+XeoKlZ2S51/1ew0SU8ehfzVw==}
+ peerDependencies:
+ next: '>= 14.0.0'
+ react: '>= 18.2.0'
+ dependencies:
+ next: 14.2.3(react-dom@18.3.1)(react@18.3.1)
+ react: 18.3.1
+ dev: false
+
+ /@panva/hkdf@1.1.1:
+ resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==}
+ dev: false
+
+ /@swc/counter@0.1.3:
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+ dev: false
+
+ /@swc/helpers@0.5.5:
+ resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
+ dependencies:
+ '@swc/counter': 0.1.3
+ tslib: 2.6.2
+ dev: false
+
+ /@types/cookie@0.6.0:
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+ dev: false
+
+ /@types/node@20.12.12:
+ resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==}
+ dependencies:
+ undici-types: 5.26.5
+ dev: true
+
+ /@types/prop-types@15.7.12:
+ resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
+ dev: true
+
+ /@types/react-dom@18.3.0:
+ resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
+ dependencies:
+ '@types/react': 18.3.3
+ dev: true
+
+ /@types/react@18.3.3:
+ resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==}
+ dependencies:
+ '@types/prop-types': 15.7.12
+ csstype: 3.1.3
+ dev: true
+
+ /busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+ dependencies:
+ streamsearch: 1.1.0
+ dev: false
+
+ /caniuse-lite@1.0.30001621:
+ resolution: {integrity: sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==}
+ dev: false
+
+ /client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+ dev: false
+
+ /cookie@0.6.0:
+ resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: false
+
+ /intl-messageformat@10.5.14:
+ resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==}
+ dependencies:
+ '@formatjs/ecma402-abstract': 2.0.0
+ '@formatjs/fast-memoize': 2.2.0
+ '@formatjs/icu-messageformat-parser': 2.7.8
+ tslib: 2.6.2
+ dev: false
+
+ /jose@5.3.0:
+ resolution: {integrity: sha512-IChe9AtAE79ru084ow8jzkN2lNrG3Ntfiv65Cvj9uOCE2m5LNsdHG+9EbxWxAoWRF9TgDOqLN5jm08++owDVRg==}
+ dev: false
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: false
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+ dev: false
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: false
+
+ /negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /next-auth@5.0.0-beta.19(next@14.2.3)(react@18.3.1):
+ resolution: {integrity: sha512-YHu1igcAxZPh8ZB7GIM93dqgY6gcAzq66FOhQFheAdOx1raxNcApt05nNyNCSB6NegSiyJ4XOPsaNow4pfDmsg==}
+ peerDependencies:
+ '@simplewebauthn/browser': ^9.0.1
+ '@simplewebauthn/server': ^9.0.2
+ next: ^14 || ^15.0.0-0
+ nodemailer: ^6.6.5
+ react: ^18.2.0 || ^19.0.0-0
+ peerDependenciesMeta:
+ '@simplewebauthn/browser':
+ optional: true
+ '@simplewebauthn/server':
+ optional: true
+ nodemailer:
+ optional: true
+ dependencies:
+ '@auth/core': 0.32.0
+ next: 14.2.3(react-dom@18.3.1)(react@18.3.1)
+ react: 18.3.1
+ dev: false
+
+ /next-intl@3.14.1(next@14.2.3)(react@18.3.1):
+ resolution: {integrity: sha512-Jb5KdYaJCH3z4O/Ab05YOi7lzaqtFcnOa8KdUCHvHKxPYNM7H6I/5hC3dvKPDb9S5gW6wMp3bNQoMzcWw227jw==}
+ peerDependencies:
+ next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@formatjs/intl-localematcher': 0.2.32
+ negotiator: 0.6.3
+ next: 14.2.3(react-dom@18.3.1)(react@18.3.1)
+ react: 18.3.1
+ use-intl: 3.14.1(react@18.3.1)
+ dev: false
+
+ /next@14.2.3(react-dom@18.3.1)(react@18.3.1):
+ resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==}
+ engines: {node: '>=18.17.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ react: ^18.2.0
+ react-dom: ^18.2.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ sass:
+ optional: true
+ dependencies:
+ '@next/env': 14.2.3
+ '@swc/helpers': 0.5.5
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001621
+ graceful-fs: 4.2.11
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.1(react@18.3.1)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 14.2.3
+ '@next/swc-darwin-x64': 14.2.3
+ '@next/swc-linux-arm64-gnu': 14.2.3
+ '@next/swc-linux-arm64-musl': 14.2.3
+ '@next/swc-linux-x64-gnu': 14.2.3
+ '@next/swc-linux-x64-musl': 14.2.3
+ '@next/swc-win32-arm64-msvc': 14.2.3
+ '@next/swc-win32-ia32-msvc': 14.2.3
+ '@next/swc-win32-x64-msvc': 14.2.3
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+ dev: false
+
+ /oauth4webapi@2.10.4:
+ resolution: {integrity: sha512-DSoj8QoChzOCQlJkRmYxAJCIpnXFW32R0Uq7avyghIeB6iJq0XAblOD7pcq3mx4WEBDwMuKr0Y1qveCBleG2Xw==}
+ dev: false
+
+ /picocolors@1.0.1:
+ resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ dev: false
+
+ /postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.1
+ source-map-js: 1.2.0
+ dev: false
+
+ /preact-render-to-string@5.2.3(preact@10.11.3):
+ resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==}
+ peerDependencies:
+ preact: '>=10'
+ dependencies:
+ preact: 10.11.3
+ pretty-format: 3.8.0
+ dev: false
+
+ /preact@10.11.3:
+ resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==}
+ dev: false
+
+ /pretty-format@3.8.0:
+ resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
+ dev: false
+
+ /react-dom@18.3.1(react@18.3.1):
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+ dev: false
+
+ /react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+ dev: false
+
+ /styled-jsx@5.1.1(react@18.3.1):
+ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+ dependencies:
+ client-only: 0.0.1
+ react: 18.3.1
+ dev: false
+
+ /tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ dev: false
+
+ /typescript@5.4.5:
+ resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ dev: true
+
+ /use-intl@3.14.1(react@18.3.1):
+ resolution: {integrity: sha512-LVjHUSnQxryiWY+zCFkwoe+a8LK4RIM/4+lV54FSLehOH3gO1JcnXQ85TbfKUTfvEDY7B0DkH7WOM+CWppZanA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@formatjs/ecma402-abstract': 1.18.3
+ intl-messageformat: 10.5.14
+ react: 18.3.1
+ dev: false
diff --git a/examples/auth5-intl/public/next.svg b/examples/auth5-intl/public/next.svg
new file mode 100644
index 0000000..5174b28
--- /dev/null
+++ b/examples/auth5-intl/public/next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/examples/auth5-intl/public/vercel.svg b/examples/auth5-intl/public/vercel.svg
new file mode 100644
index 0000000..d2f8422
--- /dev/null
+++ b/examples/auth5-intl/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/examples/auth5-intl/src/app/api/auth/[...nextauth]/route.ts b/examples/auth5-intl/src/app/api/auth/[...nextauth]/route.ts
new file mode 100644
index 0000000..fa39f10
--- /dev/null
+++ b/examples/auth5-intl/src/app/api/auth/[...nextauth]/route.ts
@@ -0,0 +1,3 @@
+import { handlers } from "@/auth"; // Referring to the auth.ts we just created
+
+export const { GET, POST } = handlers;
diff --git a/examples/auth5-intl/src/app/dk/login/page.tsx b/examples/auth5-intl/src/app/dk/login/page.tsx
new file mode 100644
index 0000000..c0d2e2d
--- /dev/null
+++ b/examples/auth5-intl/src/app/dk/login/page.tsx
@@ -0,0 +1,14 @@
+import { signIn } from "@/auth";
+
+export default function SignIn() {
+ return (
+
+ );
+}
diff --git a/examples/auth5-intl/src/app/dk/page.tsx b/examples/auth5-intl/src/app/dk/page.tsx
new file mode 100644
index 0000000..41af40f
--- /dev/null
+++ b/examples/auth5-intl/src/app/dk/page.tsx
@@ -0,0 +1,7 @@
+export default function Home() {
+ return (
+
+ );
+}
diff --git a/examples/auth5-intl/src/app/en/login/page.tsx b/examples/auth5-intl/src/app/en/login/page.tsx
new file mode 100644
index 0000000..c0d2e2d
--- /dev/null
+++ b/examples/auth5-intl/src/app/en/login/page.tsx
@@ -0,0 +1,14 @@
+import { signIn } from "@/auth";
+
+export default function SignIn() {
+ return (
+
+ );
+}
diff --git a/examples/auth5-intl/src/app/en/page.tsx b/examples/auth5-intl/src/app/en/page.tsx
new file mode 100644
index 0000000..41af40f
--- /dev/null
+++ b/examples/auth5-intl/src/app/en/page.tsx
@@ -0,0 +1,7 @@
+export default function Home() {
+ return (
+
+ );
+}
diff --git a/examples/auth5-intl/src/app/favicon.ico b/examples/auth5-intl/src/app/favicon.ico
new file mode 100644
index 0000000..718d6fe
Binary files /dev/null and b/examples/auth5-intl/src/app/favicon.ico differ
diff --git a/examples/auth5-intl/src/app/globals.css b/examples/auth5-intl/src/app/globals.css
new file mode 100644
index 0000000..d2a7c17
--- /dev/null
+++ b/examples/auth5-intl/src/app/globals.css
@@ -0,0 +1,16 @@
+* {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+}
+
+html,
+body {
+ max-width: 100vw;
+ overflow-x: hidden;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
diff --git a/examples/auth5-intl/src/app/layout.tsx b/examples/auth5-intl/src/app/layout.tsx
new file mode 100644
index 0000000..0d3d5cc
--- /dev/null
+++ b/examples/auth5-intl/src/app/layout.tsx
@@ -0,0 +1,19 @@
+import type { Metadata } from "next";
+import "./globals.css";
+
+export const metadata: Metadata = {
+ title: "Create Next App",
+ description: "Generated by create next app",
+};
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/examples/auth5-intl/src/auth.ts b/examples/auth5-intl/src/auth.ts
new file mode 100644
index 0000000..a78693d
--- /dev/null
+++ b/examples/auth5-intl/src/auth.ts
@@ -0,0 +1,7 @@
+/* eslint-disable no-param-reassign */
+import NextAuth from "next-auth";
+import Google from "next-auth/providers/google";
+
+export const { handlers, signIn, signOut, auth } = NextAuth({
+ providers: [Google],
+});
diff --git a/examples/auth5-intl/src/middleware.ts b/examples/auth5-intl/src/middleware.ts
new file mode 100644
index 0000000..e1e03c6
--- /dev/null
+++ b/examples/auth5-intl/src/middleware.ts
@@ -0,0 +1,33 @@
+import { auth } from "@/auth";
+import createMiddleware from "next-intl/middleware";
+import { chain, FinalNextResponse } from "@nimpl/middleware-chain";
+import { Middleware } from "@nimpl/middleware-chain/dist/lib/types";
+
+const intlMiddleware = createMiddleware({
+ locales: ["en", "dk"],
+ defaultLocale: "en",
+});
+
+export default chain([
+ intlMiddleware,
+ (req) => {
+ if (req.summary.type === "redirect") return FinalNextResponse.next();
+ },
+ auth((req) => {
+ const [, language = "en", pathname] = req.nextUrl.pathname.match(/\/(en|dk)(.*)/) || [];
+
+ if (req.auth) {
+ if (pathname === "/login") {
+ return FinalNextResponse.redirect(new URL(`/${language}`, req.nextUrl.origin));
+ }
+ } else if (pathname !== "/login") {
+ return FinalNextResponse.redirect(new URL(`/${language}/login`, req.nextUrl.origin));
+ }
+
+ return FinalNextResponse.next();
+ }) as unknown as Middleware,
+]);
+
+export const config = {
+ matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
+};
diff --git a/examples/auth5-intl/tsconfig.json b/examples/auth5-intl/tsconfig.json
new file mode 100644
index 0000000..7b28589
--- /dev/null
+++ b/examples/auth5-intl/tsconfig.json
@@ -0,0 +1,26 @@
+{
+ "compilerOptions": {
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}