diff --git a/Makefile b/Makefile
index c9ce47f8..3a2beebb 100644
--- a/Makefile
+++ b/Makefile
@@ -6,16 +6,26 @@ export PATH := .bin:${PATH}
.PHONY: install
install:
npm install
+ npx playwright install --with-deps
+.PHONY: test
test:
npm run test
+.PHONY: build
+build:
+ npx nx run-many --target=build --all
+ npx nx run-many --all --target=build-storybook -- --stats-json
+
+.PHONY: dev
+dev:
+ npx nx run-many --target=dev --all
+
test-containerized:
# https://github.com/microsoft/playwright/issues/26482
# For unsupported distros, use the `test-containerized` target instead of `test`
sh -c ./playwright-docker.sh
-
PRETTIER_VERSION=$(shell cat package.json | jq -r '.devDependencies["prettier"] // .dependencies["prettier"]')
format: .bin/ory
@@ -23,7 +33,6 @@ format: .bin/ory
@echo "Prettier Version: $(PRETTIER_VERSION)"
npx prettier@$$PRETTIER_VERSION --write .
-
licenses: .bin/licenses node_modules # checks open-source licenses
.bin/licenses
diff --git a/eslint.config.mjs b/eslint.config.mjs
index e8ae9e4b..f68d8fcf 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -106,6 +106,17 @@ const config = tseslint.config([
"no-extra-semi": "off",
},
},
+ {
+ files: [
+ "examples/nextjs-app-router/**/*.ts",
+ "examples/nextjs-app-router/**/*.tsx",
+ ],
+ languageOptions: {
+ parserOptions: {
+ project: ["./examples/nextjs-app-router/tsconfig.json"],
+ },
+ },
+ },
{
name: "elements-react",
files: ["packages/elements-react/**"],
diff --git a/examples/nextjs-app-router/.env b/examples/nextjs-app-router/.env
new file mode 100644
index 00000000..f1fa2c66
--- /dev/null
+++ b/examples/nextjs-app-router/.env
@@ -0,0 +1 @@
+NEXT_PUBLIC_ORY_SDK_URL=https://playground.projects.oryapis.com
diff --git a/examples/nextjs-app-router/.gitignore b/examples/nextjs-app-router/.gitignore
new file mode 100644
index 00000000..fd3dbb57
--- /dev/null
+++ b/examples/nextjs-app-router/.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/nextjs-app-router/README.md b/examples/nextjs-app-router/README.md
new file mode 100644
index 00000000..1491ba83
--- /dev/null
+++ b/examples/nextjs-app-router/README.md
@@ -0,0 +1,43 @@
+This is a simple example application using @ory/elements-react & Next.js app
+router.
+
+## Getting started
+
+1. Sign up for an account at https://console.ory.sh
+2. Create a new or use an existing project
+3. Go to https://console.ory.sh/projects/current/settings and copy the **API
+ endpoints** URL
+4. Set the `NEXT_PUBLIC_ORY_SDK_URL` to your project's **API endpoints** URL
+5. Run `npm install`
+6. Run `npm run dev` and open navigate to http://localhost:3000
+
+
+> [!WARNING]
+> For convinience Ory provides a default "playground" project, that
+> can be used to interact with Ory's APIs. It is a public project, that can be
+> used by anyone and data can be deleted at any time. Make sure to use a
+> dedicated project.
+
+
+## Features
+
+- All self-service user flows Ory supports
+ - [Login](http://localhost:3000/auth/login)
+ - [Registration](http://localhost:3000/auth/registration)
+ - [Recovery](http://localhost:3000/auth/recovery)
+ - [Verification](http://localhost:3000/auth/verification)
+ - [Settings](http://localhost:3000/settings)
+- User Logout
+
+## Project structure
+
+The project files reside in the `app/` directory:
+
+- `app/auth` - contains the page files for the user auth flows
+- `app/settings` - contaisn the page file for the settings flow
+- `app` - contains the root page file and layout.
+
+## Need help?
+
+If you have any issues using this examples, or Ory's products, don't hesitate to
+reach out via the [Ory Community Slack](https://slack.ory.sh).
diff --git a/examples/nextjs-app-router/app/auth/layout.tsx b/examples/nextjs-app-router/app/auth/layout.tsx
new file mode 100644
index 00000000..72a7c57a
--- /dev/null
+++ b/examples/nextjs-app-router/app/auth/layout.tsx
@@ -0,0 +1,7 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { DefaultCardLayout } from "@ory/elements-react/theme"
+import "@ory/elements-react/theme/styles.css"
+
+export default DefaultCardLayout
diff --git a/examples/nextjs-app-router/app/auth/login/page.tsx b/examples/nextjs-app-router/app/auth/login/page.tsx
new file mode 100644
index 00000000..56f41e53
--- /dev/null
+++ b/examples/nextjs-app-router/app/auth/login/page.tsx
@@ -0,0 +1,26 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { Login } from "@ory/elements-react/theme"
+import { enhanceOryConfig } from "@ory/nextjs"
+import { getLoginFlow, OryPageParams } from "@ory/nextjs/app"
+
+import config from "@/ory.config"
+
+export default async function LoginPage(props: OryPageParams) {
+ const flow = await getLoginFlow(props.searchParams)
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/examples/nextjs-app-router/app/auth/recovery/page.tsx b/examples/nextjs-app-router/app/auth/recovery/page.tsx
new file mode 100644
index 00000000..850610b6
--- /dev/null
+++ b/examples/nextjs-app-router/app/auth/recovery/page.tsx
@@ -0,0 +1,29 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { Recovery } from "@ory/elements-react/theme"
+import { enhanceOryConfig } from "@ory/nextjs"
+import { getRecoveryFlow, OryPageParams } from "@ory/nextjs/app"
+
+import CustomCardHeader from "@/components/custom-card-header"
+import config from "@/ory.config"
+
+export default async function RecoveryPage(props: OryPageParams) {
+ const flow = await getRecoveryFlow(props.searchParams)
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/examples/nextjs-app-router/app/auth/registration/page.tsx b/examples/nextjs-app-router/app/auth/registration/page.tsx
new file mode 100644
index 00000000..f390fdcd
--- /dev/null
+++ b/examples/nextjs-app-router/app/auth/registration/page.tsx
@@ -0,0 +1,26 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { Registration } from "@ory/elements-react/theme"
+import { enhanceOryConfig } from "@ory/nextjs"
+import { getRegistrationFlow, OryPageParams } from "@ory/nextjs/app"
+
+import config from "@/ory.config"
+
+export default async function RegistrationPage(props: OryPageParams) {
+ const flow = await getRegistrationFlow(props.searchParams)
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/examples/nextjs-app-router/app/auth/verification/page.tsx b/examples/nextjs-app-router/app/auth/verification/page.tsx
new file mode 100644
index 00000000..80ca6f89
--- /dev/null
+++ b/examples/nextjs-app-router/app/auth/verification/page.tsx
@@ -0,0 +1,29 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { Verification } from "@ory/elements-react/theme"
+import { enhanceOryConfig } from "@ory/nextjs"
+import { getVerificationFlow, OryPageParams } from "@ory/nextjs/app"
+
+import CustomCardHeader from "@/components/custom-card-header"
+import config from "@/ory.config"
+
+export default async function VerificationPage(props: OryPageParams) {
+ const flow = await getVerificationFlow(props.searchParams)
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+ )
+}
diff --git a/examples/nextjs-app-router/app/globals.css b/examples/nextjs-app-router/app/globals.css
new file mode 100644
index 00000000..5c75f0d9
--- /dev/null
+++ b/examples/nextjs-app-router/app/globals.css
@@ -0,0 +1,18 @@
+/* Copyright © 2024 Ory Corp */
+/* SPDX-License-Identifier: Apache-2.0 */
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+body {
+ color: var(--foreground);
+ background: var(--background);
+ font-family: Inter, Helvetica, sans-serif;
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+}
diff --git a/examples/nextjs-app-router/app/layout.tsx b/examples/nextjs-app-router/app/layout.tsx
new file mode 100644
index 00000000..a9ddd6c5
--- /dev/null
+++ b/examples/nextjs-app-router/app/layout.tsx
@@ -0,0 +1,22 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import "./globals.css"
+import React, { Suspense, ReactNode } from "react"
+import { Inter } from "next/font/google"
+
+const inter = Inter({ subsets: ["latin"] })
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: ReactNode
+}>) {
+ return (
+
+
+ {children}
+
+
+ )
+}
diff --git a/examples/nextjs-app-router/app/logo.svg b/examples/nextjs-app-router/app/logo.svg
new file mode 100644
index 00000000..aa232910
--- /dev/null
+++ b/examples/nextjs-app-router/app/logo.svg
@@ -0,0 +1,8 @@
+
diff --git a/examples/nextjs-app-router/app/page.tsx b/examples/nextjs-app-router/app/page.tsx
new file mode 100644
index 00000000..42b30331
--- /dev/null
+++ b/examples/nextjs-app-router/app/page.tsx
@@ -0,0 +1,93 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { SessionProvider } from "@ory/elements-react/client"
+import { getLogoutFlow, getServerSession } from "@ory/nextjs/app"
+import { Metadata } from "next"
+import Image from "next/image"
+import Link from "next/link"
+import OryLogo from "./logo.svg"
+
+export const metadata: Metadata = {
+ title: "Ory Next.js App router Example",
+}
+
+export default async function RootLayout() {
+ const session = await getServerSession()
+
+ return (
+
+
+
+
+
Ory Next.js App Router Example
+ {!session && (
+
+
+ Registration
+
+
+ Login
+
+
+ Account Recovery
+
+
+ Account Verification
+
+
+ )}
+ {session && (
+
+
+ Hi,{" "}
+ {session.identity?.traits.email ??
+ session.identity?.traits.username ??
+ session.identity?.traits.phone}
+ !
+
+
+ Settings
+
+
+
+ )}
+
+
+
+
+ )
+}
+
+async function LogoutLink() {
+ const flow = await getLogoutFlow({})
+
+ return (
+
+ Logout
+
+ )
+}
diff --git a/examples/nextjs-app-router/app/settings/page.tsx b/examples/nextjs-app-router/app/settings/page.tsx
new file mode 100644
index 00000000..89dc9070
--- /dev/null
+++ b/examples/nextjs-app-router/app/settings/page.tsx
@@ -0,0 +1,32 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { Settings } from "@ory/elements-react/theme"
+import { SessionProvider } from "@ory/elements-react/client"
+import { enhanceOryConfig } from "@ory/nextjs"
+import { getSettingsFlow, OryPageParams } from "@ory/nextjs/app"
+import "@ory/elements-react/theme/styles.css"
+
+import config from "@/ory.config"
+
+export default async function SettingsPage(props: OryPageParams) {
+ const flow = await getSettingsFlow(props.searchParams)
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+
+
+
+
+ )
+}
diff --git a/examples/nextjs-app-router/components/custom-card-header.tsx b/examples/nextjs-app-router/components/custom-card-header.tsx
new file mode 100644
index 00000000..31683ac6
--- /dev/null
+++ b/examples/nextjs-app-router/components/custom-card-header.tsx
@@ -0,0 +1,8 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+"use client"
+
+export default function CustomCardHeader() {
+ return My custom card header
+}
diff --git a/examples/nextjs-app-router/middleware.ts b/examples/nextjs-app-router/middleware.ts
new file mode 100644
index 00000000..5d713195
--- /dev/null
+++ b/examples/nextjs-app-router/middleware.ts
@@ -0,0 +1,11 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { createOryMiddleware } from "@ory/nextjs/middleware"
+import oryConfig from "@/ory.config"
+
+// This function can be marked `async` if using `await` inside
+export const middleware = createOryMiddleware(oryConfig)
+
+// See "Matching Paths" below to learn more
+export const config = {}
diff --git a/examples/nextjs-app-router/next.config.mjs b/examples/nextjs-app-router/next.config.mjs
new file mode 100644
index 00000000..1d614782
--- /dev/null
+++ b/examples/nextjs-app-router/next.config.mjs
@@ -0,0 +1,4 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {}
+
+export default nextConfig
diff --git a/examples/nextjs-app-router/ory.config.ts b/examples/nextjs-app-router/ory.config.ts
new file mode 100644
index 00000000..95bd016f
--- /dev/null
+++ b/examples/nextjs-app-router/ory.config.ts
@@ -0,0 +1,18 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import type { OryConfig } from "@ory/nextjs"
+
+const config: OryConfig = {
+ override: {
+ applicationName: "Ory Next.js App Router Example",
+ loginUiPath: "/auth/login",
+ registrationUiPath: "/auth/registration",
+ recoveryUiPath: "/auth/recovery",
+ verificationUiPath: "/auth/verification",
+ settingsUiPath: "/settings",
+ defaultRedirectUri: "/",
+ },
+}
+
+export default config
diff --git a/examples/nextjs-app-router/package.json b/examples/nextjs-app-router/package.json
new file mode 100644
index 00000000..8745aad3
--- /dev/null
+++ b/examples/nextjs-app-router/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "nextjs-app-router",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint"
+ },
+ "dependencies": {
+ "@ory/nextjs": "^0.0.1",
+ "next": "^15.0.3",
+ "react": "^18",
+ "react-dom": "^18"
+ },
+ "devDependencies": {
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "eslint": "^8",
+ "eslint-config-next": "14.2.15",
+ "postcss": "^8",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5"
+ }
+}
diff --git a/examples/nextjs-app-router/postcss.config.mjs b/examples/nextjs-app-router/postcss.config.mjs
new file mode 100644
index 00000000..0dc456ad
--- /dev/null
+++ b/examples/nextjs-app-router/postcss.config.mjs
@@ -0,0 +1,8 @@
+/** @type {import('postcss-load-config').Config} */
+const config = {
+ plugins: {
+ tailwindcss: {},
+ },
+}
+
+export default config
diff --git a/examples/nextjs-app-router/project.json b/examples/nextjs-app-router/project.json
new file mode 100644
index 00000000..bce18f2e
--- /dev/null
+++ b/examples/nextjs-app-router/project.json
@@ -0,0 +1,11 @@
+{
+ "targets": {
+ "lint": {
+ "command": "eslint",
+ "dependsOn": ["build"],
+ "options": {
+ "cwd": "examples/nextjs-app-router"
+ }
+ }
+ }
+}
diff --git a/examples/nextjs-app-router/tailwind.config.ts b/examples/nextjs-app-router/tailwind.config.ts
new file mode 100644
index 00000000..c570415c
--- /dev/null
+++ b/examples/nextjs-app-router/tailwind.config.ts
@@ -0,0 +1,22 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import type { Config } from "tailwindcss"
+
+const config: Config = {
+ content: [
+ "./pages/**/*.{js,ts,jsx,tsx,mdx}",
+ "./components/**/*.{js,ts,jsx,tsx,mdx}",
+ "./app/**/*.{js,ts,jsx,tsx,mdx}",
+ ],
+ theme: {
+ extend: {
+ colors: {
+ background: "var(--background)",
+ foreground: "var(--foreground)",
+ },
+ },
+ },
+ plugins: [],
+}
+export default config
diff --git a/examples/nextjs-app-router/tsconfig.json b/examples/nextjs-app-router/tsconfig.json
new file mode 100644
index 00000000..64c21044
--- /dev/null
+++ b/examples/nextjs-app-router/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "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": {
+ "@/*": ["./*"]
+ },
+ "target": "ES2017"
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/examples/nextjs-pages-router/.env b/examples/nextjs-pages-router/.env
new file mode 100644
index 00000000..f1fa2c66
--- /dev/null
+++ b/examples/nextjs-pages-router/.env
@@ -0,0 +1 @@
+NEXT_PUBLIC_ORY_SDK_URL=https://playground.projects.oryapis.com
diff --git a/examples/nextjs-pages-router/.gitignore b/examples/nextjs-pages-router/.gitignore
new file mode 100644
index 00000000..fd3dbb57
--- /dev/null
+++ b/examples/nextjs-pages-router/.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/nextjs-pages-router/README.md b/examples/nextjs-pages-router/README.md
new file mode 100644
index 00000000..4218b4f9
--- /dev/null
+++ b/examples/nextjs-pages-router/README.md
@@ -0,0 +1,35 @@
+This is a simple example application using @ory/elements-react & Next.js pages
+router.
+
+## Getting started
+
+1. Sign up for an account at https://console.ory.sh
+2. Create a new or use an existing project
+3. Go to https://console.ory.sh/projects/current/settings and copy the **API
+ endpoints** URL
+4. Set the `NEXT_PUBLIC_ORY_SDK_URL` to your project's **API endpoints** URL
+5. Run `npm install`
+6. Run `npm run dev` and open navigate to http://localhost:3000
+
+## Features
+
+- All self-service user flows Ory supports
+ - [Login](http://localhost:3000/auth/login)
+ - [Registration](http://localhost:3000/auth/registration)
+ - [Recovery](http://localhost:3000/auth/recovery)
+ - [Verification](http://localhost:3000/auth/verification)
+ - [Settings](http://localhost:3000/settings)
+- User Logout
+
+
+> [!WARNING]
+> For convinience Ory provides a default "playground" project, that
+> can be used to interact with Ory's APIs. It is a public project, that can be
+> used by anyone and data can be deleted at any time. Make sure to use a
+> dedicated project.
+
+
+## Need help?
+
+If you have any issues using this examples, or Ory's products, don't hesitate to
+reach out via the [Ory Community Slack](https://slack.ory.sh).
diff --git a/examples/nextjs-pages-router/middleware.ts b/examples/nextjs-pages-router/middleware.ts
new file mode 100644
index 00000000..f38bfa5e
--- /dev/null
+++ b/examples/nextjs-pages-router/middleware.ts
@@ -0,0 +1,11 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { createOryMiddleware } from "@ory/nextjs/middleware"
+import oryConfig from "./ory.config"
+
+// This function can be marked `async` if using `await` inside
+export const middleware = createOryMiddleware(oryConfig)
+
+// See "Matching Paths" below to learn more
+export const config = {}
diff --git a/examples/nextjs-pages-router/next.config.mjs b/examples/nextjs-pages-router/next.config.mjs
new file mode 100644
index 00000000..94be31c3
--- /dev/null
+++ b/examples/nextjs-pages-router/next.config.mjs
@@ -0,0 +1,6 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+}
+
+export default nextConfig
diff --git a/examples/nextjs-pages-router/ory.config.ts b/examples/nextjs-pages-router/ory.config.ts
new file mode 100644
index 00000000..0e674b7c
--- /dev/null
+++ b/examples/nextjs-pages-router/ory.config.ts
@@ -0,0 +1,18 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import type { OryConfig } from "@ory/nextjs"
+
+const config: OryConfig = {
+ override: {
+ applicationName: "NextJS pages router example",
+ loginUiPath: "/auth/login",
+ registrationUiPath: "/auth/registration",
+ recoveryUiPath: "/auth/recovery",
+ verificationUiPath: "/auth/verification",
+ settingsUiPath: "/settings",
+ defaultRedirectUri: "/",
+ },
+}
+
+export default config
diff --git a/examples/nextjs-pages-router/package.json b/examples/nextjs-pages-router/package.json
new file mode 100644
index 00000000..641f6f91
--- /dev/null
+++ b/examples/nextjs-pages-router/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "nextjs-pages-router",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start"
+ },
+ "dependencies": {
+ "@ory/nextjs": "^0.0.1",
+ "next": "^15.0.3",
+ "react": "^18",
+ "react-dom": "^18"
+ },
+ "devDependencies": {
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "eslint": "^8",
+ "eslint-config-next": "14.2.15",
+ "postcss": "^8",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5"
+ }
+}
diff --git a/examples/nextjs-pages-router/pages/_app.tsx b/examples/nextjs-pages-router/pages/_app.tsx
new file mode 100644
index 00000000..e99b17c0
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/_app.tsx
@@ -0,0 +1,9 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import "@/styles/globals.css"
+import type { AppProps } from "next/app"
+
+export default function App({ Component, pageProps }: AppProps) {
+ return
+}
diff --git a/examples/nextjs-pages-router/pages/_document.tsx b/examples/nextjs-pages-router/pages/_document.tsx
new file mode 100644
index 00000000..e07d3884
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/_document.tsx
@@ -0,0 +1,16 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { Html, Head, Main, NextScript } from "next/document"
+
+export default function Document() {
+ return (
+
+
+
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/pages/auth/login.tsx b/examples/nextjs-pages-router/pages/auth/login.tsx
new file mode 100644
index 00000000..7e3f47b6
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/auth/login.tsx
@@ -0,0 +1,29 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+"use client"
+import { Login } from "@ory/elements-react/theme"
+import { useLoginFlow } from "@ory/nextjs/pages"
+import { enhanceOryConfig } from "@ory/nextjs"
+import "@ory/elements-react/theme/styles.css"
+
+import config from "@/ory.config"
+
+export default function LoginPage() {
+ const flow = useLoginFlow()
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/pages/auth/recovery.tsx b/examples/nextjs-pages-router/pages/auth/recovery.tsx
new file mode 100644
index 00000000..5fb04f9d
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/auth/recovery.tsx
@@ -0,0 +1,29 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+"use client"
+import { Recovery } from "@ory/elements-react/theme"
+import { useRecoveryFlow } from "@ory/nextjs/pages"
+import { enhanceOryConfig } from "@ory/nextjs"
+import "@ory/elements-react/theme/styles.css"
+
+import config from "@/ory.config"
+
+export default function RecoveryPage() {
+ const flow = useRecoveryFlow()
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/pages/auth/registration.tsx b/examples/nextjs-pages-router/pages/auth/registration.tsx
new file mode 100644
index 00000000..6d85c8a6
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/auth/registration.tsx
@@ -0,0 +1,29 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+"use client"
+import { Registration } from "@ory/elements-react/theme"
+import { useRegistrationFlow } from "@ory/nextjs/pages"
+import { enhanceOryConfig } from "@ory/nextjs"
+import "@ory/elements-react/theme/styles.css"
+
+import config from "@/ory.config"
+
+export default function RegistrationPage() {
+ const flow = useRegistrationFlow()
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/pages/auth/verification.tsx b/examples/nextjs-pages-router/pages/auth/verification.tsx
new file mode 100644
index 00000000..24a14276
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/auth/verification.tsx
@@ -0,0 +1,29 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+"use client"
+import { Verification } from "@ory/elements-react/theme"
+import { useVerificationFlow } from "@ory/nextjs/pages"
+import { enhanceOryConfig } from "@ory/nextjs"
+import "@ory/elements-react/theme/styles.css"
+
+import config from "@/ory.config"
+
+export default function VerificationPage() {
+ const flow = useVerificationFlow()
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/pages/index.tsx b/examples/nextjs-pages-router/pages/index.tsx
new file mode 100644
index 00000000..ff49d7a2
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/index.tsx
@@ -0,0 +1,93 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import React from "react"
+import Link from "next/link"
+import { SessionProvider, useSession } from "@ory/elements-react/client"
+import Image from "next/image"
+import OryLogo from "./logo.svg"
+import { useLogoutFlow } from "@ory/nextjs/pages"
+
+function HomeContent() {
+ const { session } = useSession()
+
+ return (
+
+
+
+
Ory Next.js App Router Example
+ {!session && (
+
+
+ Registration
+
+
+ Login
+
+
+ Account Recovery
+
+
+ Account Verification
+
+
+ )}
+ {session && (
+
+
+ Hi,{" "}
+ {session.identity?.traits.email ??
+ session.identity?.traits.username ??
+ session.identity?.traits.phone}
+ !
+
+
+ Settings
+
+
+
+ )}
+
+
+
+ )
+}
+
+function LogoutLink() {
+ const flow = useLogoutFlow()
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+ Logout
+
+ )
+}
+
+export default function Home() {
+ return (
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/pages/logo.svg b/examples/nextjs-pages-router/pages/logo.svg
new file mode 100644
index 00000000..aa232910
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/logo.svg
@@ -0,0 +1,8 @@
+
diff --git a/examples/nextjs-pages-router/pages/settings.tsx b/examples/nextjs-pages-router/pages/settings.tsx
new file mode 100644
index 00000000..4b205c33
--- /dev/null
+++ b/examples/nextjs-pages-router/pages/settings.tsx
@@ -0,0 +1,31 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import config from "@/ory.config"
+import { getSettingsFlow, OryPageParams } from "@ory/nextjs/app"
+import { SessionProvider } from "../../../packages/elements-react/dist/client/session-provider"
+import { Settings } from "@ory/elements-react/theme"
+import { enhanceOryConfig } from "@ory/nextjs"
+import { useSettingsFlow } from "@ory/nextjs/pages"
+
+export default function SettingsPage() {
+ const flow = useSettingsFlow()
+
+ if (!flow) {
+ return null
+ }
+
+ return (
+
+
+
+
+
+ )
+}
diff --git a/examples/nextjs-pages-router/postcss.config.mjs b/examples/nextjs-pages-router/postcss.config.mjs
new file mode 100644
index 00000000..0dc456ad
--- /dev/null
+++ b/examples/nextjs-pages-router/postcss.config.mjs
@@ -0,0 +1,8 @@
+/** @type {import('postcss-load-config').Config} */
+const config = {
+ plugins: {
+ tailwindcss: {},
+ },
+}
+
+export default config
diff --git a/examples/nextjs-pages-router/project.json b/examples/nextjs-pages-router/project.json
new file mode 100644
index 00000000..fc897f7c
--- /dev/null
+++ b/examples/nextjs-pages-router/project.json
@@ -0,0 +1,11 @@
+{
+ "targets": {
+ "lint": {
+ "command": "eslint",
+ "dependsOn": ["build"],
+ "options": {
+ "cwd": "examples/nextjs-pages-router"
+ }
+ }
+ }
+}
diff --git a/examples/nextjs-pages-router/public/favicon.ico b/examples/nextjs-pages-router/public/favicon.ico
new file mode 100644
index 00000000..718d6fea
Binary files /dev/null and b/examples/nextjs-pages-router/public/favicon.ico differ
diff --git a/examples/nextjs-pages-router/styles/globals.css b/examples/nextjs-pages-router/styles/globals.css
new file mode 100644
index 00000000..5c75f0d9
--- /dev/null
+++ b/examples/nextjs-pages-router/styles/globals.css
@@ -0,0 +1,18 @@
+/* Copyright © 2024 Ory Corp */
+/* SPDX-License-Identifier: Apache-2.0 */
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+body {
+ color: var(--foreground);
+ background: var(--background);
+ font-family: Inter, Helvetica, sans-serif;
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+}
diff --git a/examples/nextjs-pages-router/tailwind.config.ts b/examples/nextjs-pages-router/tailwind.config.ts
new file mode 100644
index 00000000..c570415c
--- /dev/null
+++ b/examples/nextjs-pages-router/tailwind.config.ts
@@ -0,0 +1,22 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import type { Config } from "tailwindcss"
+
+const config: Config = {
+ content: [
+ "./pages/**/*.{js,ts,jsx,tsx,mdx}",
+ "./components/**/*.{js,ts,jsx,tsx,mdx}",
+ "./app/**/*.{js,ts,jsx,tsx,mdx}",
+ ],
+ theme: {
+ extend: {
+ colors: {
+ background: "var(--background)",
+ foreground: "var(--foreground)",
+ },
+ },
+ },
+ plugins: [],
+}
+export default config
diff --git a/examples/nextjs-pages-router/tsconfig.json b/examples/nextjs-pages-router/tsconfig.json
new file mode 100644
index 00000000..e6f11a05
--- /dev/null
+++ b/examples/nextjs-pages-router/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "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,
+ "paths": {
+ "@/*": ["./*"]
+ },
+ "target": "ES2017"
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
+ "exclude": ["node_modules"]
+}
diff --git a/package-lock.json b/package-lock.json
index 4b781716..4a7b78c6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -113,42 +113,1472 @@
},
"examples/nextjs-app-router": {
"version": "0.1.0",
- "extraneous": true,
"dependencies": {
- "@ory/nextjs": "^0.0.1",
- "next": "^15.0.3",
- "react": "^18",
- "react-dom": "^18"
+ "@ory/nextjs": "^0.0.1",
+ "next": "^15.0.3",
+ "react": "^18",
+ "react-dom": "^18"
+ },
+ "devDependencies": {
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "eslint": "^8",
+ "eslint-config-next": "14.2.15",
+ "postcss": "^8",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/env": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.0.3.tgz",
+ "integrity": "sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==",
+ "license": "MIT"
+ },
+ "examples/nextjs-app-router/node_modules/@next/eslint-plugin-next": {
+ "version": "14.2.15",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.15.tgz",
+ "integrity": "sha512-pKU0iqKRBlFB/ocOI1Ip2CkKePZpYpnw5bEItEkuZ/Nr9FQP1+p7VDWr4VfOdff4i9bFmrOaeaU1bFEyAcxiMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob": "10.3.10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-darwin-arm64": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz",
+ "integrity": "sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-darwin-x64": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz",
+ "integrity": "sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz",
+ "integrity": "sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz",
+ "integrity": "sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz",
+ "integrity": "sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz",
+ "integrity": "sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz",
+ "integrity": "sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz",
+ "integrity": "sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/@types/node": {
+ "version": "20.17.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz",
+ "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "examples/nextjs-app-router/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/eslint-config-next": {
+ "version": "14.2.15",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.15.tgz",
+ "integrity": "sha512-mKg+NC/8a4JKLZRIOBplxXNdStgxy7lzWuedUaCc8tev+Al9mwDUTujQH6W6qXDH9kycWiVo28tADWGvpBsZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "14.2.15",
+ "@rushstack/eslint-patch": "^1.3.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "examples/nextjs-app-router/node_modules/eslint-plugin-react": {
+ "version": "7.37.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
+ "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.1.0",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/eslint/node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "examples/nextjs-app-router/node_modules/next": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.0.3.tgz",
+ "integrity": "sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "15.0.3",
+ "@swc/counter": "0.1.3",
+ "@swc/helpers": "0.5.13",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.0.3",
+ "@next/swc-darwin-x64": "15.0.3",
+ "@next/swc-linux-arm64-gnu": "15.0.3",
+ "@next/swc-linux-arm64-musl": "15.0.3",
+ "@next/swc-linux-x64-gnu": "15.0.3",
+ "@next/swc-linux-x64-musl": "15.0.3",
+ "@next/swc-win32-arm64-msvc": "15.0.3",
+ "@next/swc-win32-x64-msvc": "15.0.3",
+ "sharp": "^0.33.5"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-66855b96-20241106",
+ "react-dom": "^18.2.0 || 19.0.0-rc-66855b96-20241106",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "examples/nextjs-app-router/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "examples/nextjs-app-router/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "examples/nextjs-app-router/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "examples/nextjs-pages-router": {
+ "version": "0.1.0",
+ "dependencies": {
+ "@ory/nextjs": "^0.0.1",
+ "next": "^15.0.3",
+ "react": "^18",
+ "react-dom": "^18"
+ },
+ "devDependencies": {
+ "@types/node": "^20",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "eslint": "^8",
+ "eslint-config-next": "14.2.15",
+ "postcss": "^8",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/env": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.0.3.tgz",
+ "integrity": "sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==",
+ "license": "MIT"
+ },
+ "examples/nextjs-pages-router/node_modules/@next/eslint-plugin-next": {
+ "version": "14.2.15",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.15.tgz",
+ "integrity": "sha512-pKU0iqKRBlFB/ocOI1Ip2CkKePZpYpnw5bEItEkuZ/Nr9FQP1+p7VDWr4VfOdff4i9bFmrOaeaU1bFEyAcxiMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob": "10.3.10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-darwin-arm64": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.0.3.tgz",
+ "integrity": "sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-darwin-x64": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.0.3.tgz",
+ "integrity": "sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.0.3.tgz",
+ "integrity": "sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.0.3.tgz",
+ "integrity": "sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.0.3.tgz",
+ "integrity": "sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.0.3.tgz",
+ "integrity": "sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.0.3.tgz",
+ "integrity": "sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.0.3.tgz",
+ "integrity": "sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/@types/node": {
+ "version": "20.17.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.6.tgz",
+ "integrity": "sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.19.2"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
},
- "devDependencies": {
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "eslint": "^8",
- "eslint-config-next": "14.2.15",
- "postcss": "^8",
- "tailwindcss": "^3.4.1",
- "typescript": "^5"
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "examples/nextjs-pages-router": {
- "version": "0.1.0",
- "extraneous": true,
+ "examples/nextjs-pages-router/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "examples/nextjs-pages-router/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@ory/nextjs": "^0.0.1",
- "next": "^15.0.3",
- "react": "^18",
- "react-dom": "^18"
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
- "devDependencies": {
- "@types/node": "^20",
- "@types/react": "^18",
- "@types/react-dom": "^18",
- "eslint": "^8",
- "eslint-config-next": "14.2.15",
- "postcss": "^8",
- "tailwindcss": "^3.4.1",
- "typescript": "^5"
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/eslint-config-next": {
+ "version": "14.2.15",
+ "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.15.tgz",
+ "integrity": "sha512-mKg+NC/8a4JKLZRIOBplxXNdStgxy7lzWuedUaCc8tev+Al9mwDUTujQH6W6qXDH9kycWiVo28tADWGvpBsZcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@next/eslint-plugin-next": "14.2.15",
+ "@rushstack/eslint-patch": "^1.3.3",
+ "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
+ "eslint-import-resolver-node": "^0.3.6",
+ "eslint-import-resolver-typescript": "^3.5.2",
+ "eslint-plugin-import": "^2.28.1",
+ "eslint-plugin-jsx-a11y": "^6.7.1",
+ "eslint-plugin-react": "^7.33.2",
+ "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
+ },
+ "peerDependencies": {
+ "eslint": "^7.23.0 || ^8.0.0",
+ "typescript": ">=3.3.1"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/eslint-plugin-react": {
+ "version": "7.37.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
+ "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.1.0",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/eslint/node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/glob": {
+ "version": "10.3.10",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+ "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.5",
+ "minimatch": "^9.0.1",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+ "path-scurry": "^1.10.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "examples/nextjs-pages-router/node_modules/next": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.0.3.tgz",
+ "integrity": "sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "15.0.3",
+ "@swc/counter": "0.1.3",
+ "@swc/helpers": "0.5.13",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.0.3",
+ "@next/swc-darwin-x64": "15.0.3",
+ "@next/swc-linux-arm64-gnu": "15.0.3",
+ "@next/swc-linux-arm64-musl": "15.0.3",
+ "@next/swc-linux-x64-gnu": "15.0.3",
+ "@next/swc-linux-x64-musl": "15.0.3",
+ "@next/swc-win32-arm64-msvc": "15.0.3",
+ "@next/swc-win32-x64-msvc": "15.0.3",
+ "sharp": "^0.33.5"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-66855b96-20241106",
+ "react-dom": "^18.2.0 || 19.0.0-rc-66855b96-20241106",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "examples/nextjs-pages-router/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"examples/nextjs-spa": {
@@ -4557,6 +5987,22 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -4571,6 +6017,14 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/@humanwhocodes/retry": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
@@ -8549,9 +10003,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz",
- "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.2.tgz",
+ "integrity": "sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA==",
"cpu": [
"arm"
],
@@ -8563,9 +10017,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz",
- "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.2.tgz",
+ "integrity": "sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ==",
"cpu": [
"arm64"
],
@@ -8577,9 +10031,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz",
- "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.2.tgz",
+ "integrity": "sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A==",
"cpu": [
"arm64"
],
@@ -8591,9 +10045,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz",
- "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.2.tgz",
+ "integrity": "sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g==",
"cpu": [
"x64"
],
@@ -8605,9 +10059,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz",
- "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.2.tgz",
+ "integrity": "sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g==",
"cpu": [
"arm64"
],
@@ -8619,9 +10073,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz",
- "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.2.tgz",
+ "integrity": "sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g==",
"cpu": [
"x64"
],
@@ -8633,9 +10087,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz",
- "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.2.tgz",
+ "integrity": "sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA==",
"cpu": [
"arm"
],
@@ -8647,9 +10101,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz",
- "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.2.tgz",
+ "integrity": "sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw==",
"cpu": [
"arm"
],
@@ -8661,9 +10115,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz",
- "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.2.tgz",
+ "integrity": "sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA==",
"cpu": [
"arm64"
],
@@ -8675,9 +10129,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz",
- "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.2.tgz",
+ "integrity": "sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA==",
"cpu": [
"arm64"
],
@@ -8689,9 +10143,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz",
- "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.2.tgz",
+ "integrity": "sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g==",
"cpu": [
"ppc64"
],
@@ -8703,9 +10157,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz",
- "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.2.tgz",
+ "integrity": "sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ==",
"cpu": [
"riscv64"
],
@@ -8717,9 +10171,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz",
- "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.2.tgz",
+ "integrity": "sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ==",
"cpu": [
"s390x"
],
@@ -8731,9 +10185,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz",
- "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.2.tgz",
+ "integrity": "sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg==",
"cpu": [
"x64"
],
@@ -8745,9 +10199,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz",
- "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.2.tgz",
+ "integrity": "sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ==",
"cpu": [
"x64"
],
@@ -8759,9 +10213,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz",
- "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.2.tgz",
+ "integrity": "sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w==",
"cpu": [
"arm64"
],
@@ -8773,9 +10227,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz",
- "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.2.tgz",
+ "integrity": "sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ==",
"cpu": [
"ia32"
],
@@ -8787,9 +10241,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz",
- "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.2.tgz",
+ "integrity": "sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA==",
"cpu": [
"x64"
],
@@ -21569,6 +23023,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
@@ -25565,6 +27029,14 @@
"integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
"license": "0BSD"
},
+ "node_modules/nextjs-app-router": {
+ "resolved": "examples/nextjs-app-router",
+ "link": true
+ },
+ "node_modules/nextjs-pages-router": {
+ "resolved": "examples/nextjs-pages-router",
+ "link": true
+ },
"node_modules/nextjs-spa": {
"resolved": "examples/nextjs-spa",
"link": true
@@ -28437,9 +29909,9 @@
}
},
"node_modules/rollup": {
- "version": "4.27.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz",
- "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==",
+ "version": "4.27.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.2.tgz",
+ "integrity": "sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -28453,24 +29925,24 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.27.4",
- "@rollup/rollup-android-arm64": "4.27.4",
- "@rollup/rollup-darwin-arm64": "4.27.4",
- "@rollup/rollup-darwin-x64": "4.27.4",
- "@rollup/rollup-freebsd-arm64": "4.27.4",
- "@rollup/rollup-freebsd-x64": "4.27.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.27.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.27.4",
- "@rollup/rollup-linux-arm64-gnu": "4.27.4",
- "@rollup/rollup-linux-arm64-musl": "4.27.4",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.27.4",
- "@rollup/rollup-linux-s390x-gnu": "4.27.4",
- "@rollup/rollup-linux-x64-gnu": "4.27.4",
- "@rollup/rollup-linux-x64-musl": "4.27.4",
- "@rollup/rollup-win32-arm64-msvc": "4.27.4",
- "@rollup/rollup-win32-ia32-msvc": "4.27.4",
- "@rollup/rollup-win32-x64-msvc": "4.27.4",
+ "@rollup/rollup-android-arm-eabi": "4.27.2",
+ "@rollup/rollup-android-arm64": "4.27.2",
+ "@rollup/rollup-darwin-arm64": "4.27.2",
+ "@rollup/rollup-darwin-x64": "4.27.2",
+ "@rollup/rollup-freebsd-arm64": "4.27.2",
+ "@rollup/rollup-freebsd-x64": "4.27.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.27.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.27.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.27.2",
+ "@rollup/rollup-linux-arm64-musl": "4.27.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.27.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.27.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.27.2",
+ "@rollup/rollup-linux-x64-gnu": "4.27.2",
+ "@rollup/rollup-linux-x64-musl": "4.27.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.27.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.27.2",
+ "@rollup/rollup-win32-x64-msvc": "4.27.2",
"fsevents": "~2.3.2"
}
},
@@ -29922,6 +31394,13 @@
"node": ">=8"
}
},
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -34523,15 +36002,15 @@
}
},
"packages/nextjs/node_modules/@ory/client-fetch": {
- "version": "1.15.13",
- "resolved": "https://registry.npmjs.org/@ory/client-fetch/-/client-fetch-1.15.13.tgz",
- "integrity": "sha512-LjyoRkzI0FWmMAajUx9DcKdN0fBxyJs2w9tKPXcMOSWJ0x+Eahbc3jiLzKKLOCrTaqSuLLZVQZoNZKboOQesvQ==",
+ "version": "1.15.10",
+ "resolved": "https://registry.npmjs.org/@ory/client-fetch/-/client-fetch-1.15.10.tgz",
+ "integrity": "sha512-PKKi9XjjdCah0pVz/4WB3G41ttA4tuXuOLGrdAJR63iFKTiRtINocVCdXzmI9GzYI/kjhjKxwbRTs1pXCY6H7A==",
"license": "Apache-2.0"
},
"packages/nextjs/node_modules/cookie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
- "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.1.tgz",
+ "integrity": "sha512-Xd8lFX4LM9QEEwxQpF9J9NTUh8pmdJO0cyRJhFiDoLTk2eH8FXlRv2IFGYVadZpqI3j8fhNrSdKCeYPxiAhLXw==",
"license": "MIT",
"engines": {
"node": ">=18"
diff --git a/package.json b/package.json
index 3fa7ffcd..3499e26a 100644
--- a/package.json
+++ b/package.json
@@ -5,12 +5,13 @@
"storybook": "storybook dev -p 6006",
"build-storybook": "nx storybook legacy-stories",
"build:clean": "nx run-many --target=build --all --skip-nx-cache",
- "build": "nx run-many --target=build --all",
+ "build": "nx run-many --target=build,api-extractor --all",
"build:react": "nx run @ory/elements:build --skip-nx-cache",
"build:preact": "nx run @ory/elements-preact:build --skip-nx-cache",
"build:markup": "nx run @ory/elements-markup:build --skip-nx-cache",
"build:test": "nx run @ory/elements-test:build --skip-nx-cache",
"test": "nx run-many --target=test --all",
+ "lint": "nx run-many --target=lint,api-extractor --all",
"docs": "typedoc --entryPointStrategy packages . --out docs",
"generate-locales": "cd scripts && npm run generate-locales",
"prerelease-v1": "nx release --skip-publish && nx release publish --tag next"
diff --git a/packages/elements-react/api-report/elements-react-theme.api.json b/packages/elements-react/api-report/elements-react-theme.api.json
index 44890c9c..f2f4778d 100644
--- a/packages/elements-react/api-report/elements-react-theme.api.json
+++ b/packages/elements-react/api-report/elements-react-theme.api.json
@@ -478,6 +478,53 @@
"parameters": [],
"name": "DefaultCardHeader"
},
+ {
+ "kind": "Function",
+ "canonicalReference": "@ory/elements-react!DefaultCardLayout:function(1)",
+ "docComment": "",
+ "excerptTokens": [
+ {
+ "kind": "Content",
+ "text": "declare function DefaultCardLayout({ children }: "
+ },
+ {
+ "kind": "Reference",
+ "text": "PropsWithChildren",
+ "canonicalReference": "@types/react!React.PropsWithChildren:type"
+ },
+ {
+ "kind": "Content",
+ "text": "): "
+ },
+ {
+ "kind": "Reference",
+ "text": "react_jsx_runtime.JSX.Element",
+ "canonicalReference": "@types/react!JSX.Element:interface"
+ },
+ {
+ "kind": "Content",
+ "text": ";"
+ }
+ ],
+ "fileUrlPath": "dist/theme/default/index.d.ts",
+ "returnTypeTokenRange": {
+ "startIndex": 3,
+ "endIndex": 4
+ },
+ "releaseTag": "Public",
+ "overloadIndex": 1,
+ "parameters": [
+ {
+ "parameterName": "{ children }",
+ "parameterTypeTokenRange": {
+ "startIndex": 1,
+ "endIndex": 2
+ },
+ "isOptional": false
+ }
+ ],
+ "name": "DefaultCardLayout"
+ },
{
"kind": "Function",
"canonicalReference": "@ory/elements-react!DefaultCardLogo:function(1)",
diff --git a/packages/elements-react/api-report/elements-react-theme.api.md b/packages/elements-react/api-report/elements-react-theme.api.md
index 5732e945..a4d4eb3c 100644
--- a/packages/elements-react/api-report/elements-react-theme.api.md
+++ b/packages/elements-react/api-report/elements-react-theme.api.md
@@ -56,6 +56,9 @@ export function DefaultCardFooter(): react_jsx_runtime.JSX.Element | null;
// @public (undocumented)
export function DefaultCardHeader(): react_jsx_runtime.JSX.Element;
+// @public (undocumented)
+export function DefaultCardLayout({ children }: PropsWithChildren): react_jsx_runtime.JSX.Element;
+
// @public (undocumented)
export function DefaultCardLogo(): react_jsx_runtime.JSX.Element;
@@ -138,8 +141,8 @@ export type VerificationFlowContextProps = {
// Warnings were encountered during analysis:
//
-// dist/theme/default/index.d.ts:36:5 - (ae-forgotten-export) The symbol "OryFlowComponentOverrides" needs to be exported by the entry point index.d.ts
-// dist/theme/default/index.d.ts:37:5 - (ae-forgotten-export) The symbol "OryClientConfiguration" needs to be exported by the entry point index.d.ts
+// dist/theme/default/index.d.ts:38:5 - (ae-forgotten-export) The symbol "OryFlowComponentOverrides" needs to be exported by the entry point index.d.ts
+// dist/theme/default/index.d.ts:39:5 - (ae-forgotten-export) The symbol "OryClientConfiguration" needs to be exported by the entry point index.d.ts
// (No @packageDocumentation comment for this package)
diff --git a/packages/elements-react/src/client/config.ts b/packages/elements-react/src/client/config.ts
index 86d1828c..12a13c8d 100644
--- a/packages/elements-react/src/client/config.ts
+++ b/packages/elements-react/src/client/config.ts
@@ -27,9 +27,13 @@ export function orySdkUrl() {
/**
* This function returns whether the current environment is a production environment.
*/
-export const isProduction = ["production", "prod"].includes(
- process.env.VERCEL_ENV ?? process.env.NODE_ENV ?? "",
-)
+export function isProduction() {
+ return (
+ ["production", "prod"].indexOf(
+ process.env.VERCEL_ENV ?? process.env.NODE_ENV ?? "",
+ ) > -1
+ )
+}
/**
* This function returns the Ory SDK URL. If the environment is not production, it tries to guess the SDK URL based on the environment variables, assuming
@@ -42,7 +46,7 @@ export const isProduction = ["production", "prod"].includes(
export function guessPotentiallyProxiedOrySdkUrl(options?: {
knownProxiedUrl?: string
}) {
- if (isProduction) {
+ if (isProduction()) {
// In production, we use the production custom domain
return orySdkUrl()
}
@@ -53,7 +57,7 @@ export function guessPotentiallyProxiedOrySdkUrl(options?: {
// The domain name of the generated deployment URL. Example: *.vercel.app. The value does not include the protocol scheme https://.
//
// This is only available for preview deployments on Vercel.
- if (!isProduction && process.env.VERCEL_URL) {
+ if (!isProduction() && process.env.VERCEL_URL) {
return `https://${process.env.VERCEL_URL}`.replace(/\/$/, "")
}
diff --git a/packages/elements-react/src/theme/default/components/card/index.tsx b/packages/elements-react/src/theme/default/components/card/index.tsx
index c289a1bd..3bce1c5b 100644
--- a/packages/elements-react/src/theme/default/components/card/index.tsx
+++ b/packages/elements-react/src/theme/default/components/card/index.tsx
@@ -8,6 +8,7 @@ import { DefaultCardFooter } from "./footer"
import { DefaultCardHeader } from "./header"
import { DefaultCardLogo } from "./logo"
import { DefaultCurrentIdentifierButton } from "./current-identifier-button"
+import { DefaultCardLayout } from "./layout"
export function DefaultCard({ children }: OryCardProps) {
return (
@@ -25,5 +26,6 @@ export {
DefaultCardFooter,
DefaultCardHeader,
DefaultCardLogo,
+ DefaultCardLayout,
DefaultCurrentIdentifierButton,
}
diff --git a/packages/elements-react/src/theme/default/components/card/layout.tsx b/packages/elements-react/src/theme/default/components/card/layout.tsx
new file mode 100644
index 00000000..706465a6
--- /dev/null
+++ b/packages/elements-react/src/theme/default/components/card/layout.tsx
@@ -0,0 +1,12 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { PropsWithChildren } from "react"
+
+export function DefaultCardLayout({ children }: PropsWithChildren) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/packages/elements-react/src/util/ui/index.ts b/packages/elements-react/src/util/ui/index.ts
index f788f231..9769a0bb 100644
--- a/packages/elements-react/src/util/ui/index.ts
+++ b/packages/elements-react/src/util/ui/index.ts
@@ -46,7 +46,7 @@ export function triggerToWindowCall(
return
}
- // Retry every 250ms for 5 seconds
+ // Retry every 100ms for 10 seconds
let i = 0
const ms = 100
const interval = setInterval(() => {
@@ -73,7 +73,7 @@ function triggerToFunction(
| UiNodeInputAttributesOnloadTriggerEnum,
) {
if (typeof window === "undefined") {
- console.error(
+ console.debug(
"The Ory SDK is missing a required function: window is undefined.",
)
return undefined
@@ -81,13 +81,12 @@ function triggerToFunction(
const typedWindow = window as { [key: string]: any } // eslint-disable-line @typescript-eslint/no-explicit-any
if (!(trigger in typedWindow) || !typedWindow[trigger]) {
- console.error(`The Ory SDK is missing a required function: ${trigger}.`)
+ console.debug(`The Ory SDK is missing a required function: ${trigger}.`)
return undefined
}
-
const triggerFn = typedWindow[trigger]
if (typeof triggerFn !== "function") {
- console.error(
+ console.debug(
`The Ory SDK is missing a required function: ${trigger}. It is not a function.`,
)
return undefined
diff --git a/packages/nextjs/src/app/flow.test.ts b/packages/nextjs/src/app/flow.test.ts
index 33fdcba6..e297610c 100644
--- a/packages/nextjs/src/app/flow.test.ts
+++ b/packages/nextjs/src/app/flow.test.ts
@@ -10,9 +10,9 @@ import {
getRegistrationFlow,
getVerificationFlow,
} from "."
+import { QueryParams } from "../types"
import { serverSideFrontendClient } from "./client"
import { getPublicUrl } from "./utils"
-import { QueryParams } from "../types"
jest.mock("./utils", () => ({
getPublicUrl: jest.fn(),
diff --git a/packages/nextjs/src/app/index.ts b/packages/nextjs/src/app/index.ts
index 72de6a2d..5ad1fb39 100644
--- a/packages/nextjs/src/app/index.ts
+++ b/packages/nextjs/src/app/index.ts
@@ -7,6 +7,7 @@ export { getRegistrationFlow } from "./registration"
export { getRecoveryFlow } from "./recovery"
export { getVerificationFlow } from "./verification"
export { getSettingsFlow } from "./settings"
+export { getLogoutFlow } from "./logout"
export { getServerSession } from "./session"
export type { OryPageParams } from "./utils"
diff --git a/packages/nextjs/src/app/layout.tsx b/packages/nextjs/src/app/layout.tsx
new file mode 100644
index 00000000..027a4720
--- /dev/null
+++ b/packages/nextjs/src/app/layout.tsx
@@ -0,0 +1,13 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+import { PropsWithChildren } from "react"
+
+import "@ory/elements-react/theme/styles.css"
+
+export default function AuthLayout({ children }: PropsWithChildren) {
+ return (
+
+ {children}
+
+ )
+}
diff --git a/packages/nextjs/src/app/logout.ts b/packages/nextjs/src/app/logout.ts
new file mode 100644
index 00000000..4c0dcdf4
--- /dev/null
+++ b/packages/nextjs/src/app/logout.ts
@@ -0,0 +1,46 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+import { LogoutFlow } from "@ory/client-fetch"
+
+import { headers } from "next/headers"
+import { rewriteJsonResponse } from "../utils/rewrite"
+import { guessPotentiallyProxiedOrySdkUrl } from "../utils/sdk"
+import { serverSideFrontendClient } from "./client"
+import { getPublicUrl } from "./utils"
+
+/**
+ * Use this method in an app router page to create a new logout flow. This method works with server-side rendering.
+ *
+ * ```
+ * import { getLogoutFlow } from "@ory/nextjs/app"
+ *
+ * async function LogoutLink() {
+ * const flow = await getLogoutFlow()
+ *
+ * return (
+ *
+ * Logout
+ *
+ * )
+ * }
+ *
+ * ```
+ *
+ * @param params - The query parameters of the request.
+ */
+export async function getLogoutFlow({
+ returnTo,
+}: { returnTo?: string } = {}): Promise {
+ const h = await headers()
+
+ const knownProxiedUrl = await getPublicUrl()
+ const url = guessPotentiallyProxiedOrySdkUrl({
+ knownProxiedUrl,
+ })
+ return serverSideFrontendClient
+ .createBrowserLogoutFlow({
+ cookie: h.get("cookie") ?? "",
+ returnTo,
+ })
+ .then((v: LogoutFlow): LogoutFlow => rewriteJsonResponse(v, url))
+}
diff --git a/packages/nextjs/src/middleware/middleware.test.ts b/packages/nextjs/src/middleware/middleware.test.ts
index 890d877f..1ba0bd04 100644
--- a/packages/nextjs/src/middleware/middleware.test.ts
+++ b/packages/nextjs/src/middleware/middleware.test.ts
@@ -56,6 +56,7 @@ const createOptions = (): OryConfig => ({
forwardAdditionalHeaders: ["x-custom-header"],
override: {
loginUiPath: "/custom-login",
+ defaultRedirectUri: "/custom-redirect",
},
})
@@ -175,6 +176,25 @@ describe("proxyRequest", () => {
expect(response?.status).toBe(302)
})
+ it("modifies relative location header for redirects", async () => {
+ const request = createMockLoginRequest()
+ const upstreamResponseHeaders = new Headers({
+ location: "/ui/welcome",
+ })
+
+ mockFetch({
+ headers: upstreamResponseHeaders,
+ status: 302,
+ })
+
+ const response = await proxyRequest(request, createOptions())
+
+ expect(response?.headers.get("location")).toBe(
+ "http://localhost/custom-redirect",
+ )
+ expect(response?.status).toBe(302)
+ })
+
const createTestCase = (
part: "login" | "registration" | "recovery" | "verification" | "settings",
) => ({
diff --git a/packages/nextjs/src/middleware/middleware.ts b/packages/nextjs/src/middleware/middleware.ts
index cfc7344d..31343fdf 100644
--- a/packages/nextjs/src/middleware/middleware.ts
+++ b/packages/nextjs/src/middleware/middleware.ts
@@ -94,6 +94,9 @@ export async function proxyRequest(request: NextRequest, options: OryConfig) {
// This is not needed with the "new" account experience based on this SDK.
if (location.startsWith("../self-service")) {
location = location.replace("../self-service", "/self-service")
+ } else if (!location.startsWith("http")) {
+ // If the location header is not an absolute URL, we need to make it one for rewriteUrls to properly rewrite it.
+ location = new URL(location, matchBaseUrl).toString()
}
location = rewriteUrls(location, matchBaseUrl.toString(), selfUrl, options)
diff --git a/packages/nextjs/src/pages/index.ts b/packages/nextjs/src/pages/index.ts
index e2a8c6ae..a82a2ce5 100644
--- a/packages/nextjs/src/pages/index.ts
+++ b/packages/nextjs/src/pages/index.ts
@@ -6,3 +6,5 @@ export { useRegistrationFlow } from "./registration"
export { useVerificationFlow } from "./verification"
export { useRecoveryFlow } from "./recovery"
export { useLoginFlow } from "./login"
+export { useSettingsFlow } from "./settings"
+export { useLogoutFlow } from "./logout"
diff --git a/packages/nextjs/src/pages/logout.ts b/packages/nextjs/src/pages/logout.ts
new file mode 100644
index 00000000..cfed4a65
--- /dev/null
+++ b/packages/nextjs/src/pages/logout.ts
@@ -0,0 +1,23 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { LogoutFlow } from "@ory/client-fetch"
+import { clientSideFrontendClient } from "./client"
+import { useEffect, useState } from "react"
+
+export function useLogoutFlow() {
+ const [flow, setFlow] = useState(undefined)
+
+ const createFlow = async () => {
+ const flow = await clientSideFrontendClient().createBrowserLogoutFlow({})
+ setFlow(flow)
+ }
+
+ useEffect(() => {
+ if (!flow) {
+ void createFlow()
+ }
+ }, [])
+
+ return flow
+}
diff --git a/packages/nextjs/src/pages/settings.ts b/packages/nextjs/src/pages/settings.ts
new file mode 100644
index 00000000..9fbf82df
--- /dev/null
+++ b/packages/nextjs/src/pages/settings.ts
@@ -0,0 +1,17 @@
+// Copyright © 2024 Ory Corp
+// SPDX-License-Identifier: Apache-2.0
+
+import { FlowType } from "@ory/client-fetch"
+import { createUseFlowFactory } from "./flow"
+import { clientSideFrontendClient } from "./client"
+
+export const useSettingsFlow = createUseFlowFactory(
+ FlowType.Settings,
+ (params: URLSearchParams) => {
+ return clientSideFrontendClient().createBrowserSettingsFlowRaw({
+ returnTo: params.get("return_to") ?? undefined,
+ cookie: params.get("cookie") ?? undefined,
+ })
+ },
+ (id) => clientSideFrontendClient().getSettingsFlowRaw({ id }),
+)