diff --git a/.github/workflows/issue_stale.yml b/.github/workflows/issue_stale.yml
index f46757073993e6..ce09df573b1859 100644
--- a/.github/workflows/issue_stale.yml
+++ b/.github/workflows/issue_stale.yml
@@ -23,8 +23,8 @@ jobs:
remove-issue-stale-when-updated: true
stale-issue-label: 'stale'
labels-to-add-when-unstale: 'not stale'
- stale-issue-message: 'This issue has been automatically marked as stale due to two years of inactivity. It will be closed in 7 days unless there’s further input. If you believe this issue is still relevant, please leave a comment or provide updated details. Thank you.'
- close-issue-message: 'This issue has been automatically closed due to two years of inactivity. If you’re still experiencing a similar problem or have additional details to share, please open a new issue following our current issue template. Your updated report helps us investigate and address concerns more efficiently. Thank you for your understanding!'
+ stale-issue-message: 'This issue has been automatically marked as stale due to inactivity. It will be closed in 7 days unless there’s further input. If you believe this issue is still relevant, please leave a comment or provide updated details. Thank you.'
+ close-issue-message: 'This issue has been automatically closed due to inactivity. If you’re still experiencing a similar problem or have additional details to share, please open a new issue following our current issue template. Your updated report helps us investigate and address concerns more efficiently. Thank you for your understanding!'
operations-per-run: 300 # 1 operation per 100 issues, the rest is to label/comment/close
- uses: actions/stale@v9
id: stale-no-repro
diff --git a/examples/prisma-postgres/.gitignore b/examples/prisma-postgres/.gitignore
new file mode 100644
index 00000000000000..c2f6b88b346d30
--- /dev/null
+++ b/examples/prisma-postgres/.gitignore
@@ -0,0 +1,44 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.*
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/versions
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# env files (can opt-in for committing if needed)
+.env*
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+# generated Prisma Client
+/lib/generated/prisma-client
\ No newline at end of file
diff --git a/examples/prisma-postgres/README.md b/examples/prisma-postgres/README.md
new file mode 100644
index 00000000000000..d0b491ce94fd1e
--- /dev/null
+++ b/examples/prisma-postgres/README.md
@@ -0,0 +1,259 @@
+# Prisma ORM + Next.js starter
+
+This repository provides boilerplate to quickly set up a simple Next.js CRUD application with [Prisma Postgres](https://www.prisma.io/postgres?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example) and [Prisma ORM](https://www.prisma.io/orm?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example) for database operations.
+
+## Getting started
+
+Follow these steps to quickly set up the project and start using Prisma ORM with Next.js.
+
+### 1. Create a Next.js app
+
+Run [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) using your preferred package manager:
+
+```bash
+# Using npm
+npx create-next-app@latest --example prisma-postgres my-prisma-postgres-app
+```
+
+
+
+Expand for yarn, pnpm or bun
+
+```bash
+# Using yarn
+yarn create next-app --example prisma-postgres my-prisma-postgres-app
+
+# Using pnpm
+pnpm create-next-app --example prisma-postgres my-prisma-postgres-app
+
+# Using bun
+bunx create-next-app --example prisma-postgres my-prisma-postgres-app
+```
+
+
+
+Navigate into the created app:
+
+```bash
+cd ./my-prisma-postgres-app
+```
+
+Install the dependencies if you haven't already:
+
+```bash
+# Using npm
+npm install
+```
+
+
+
+Expand for yarn, pnpm or bun
+
+```bash
+# Using yarn
+yarn install
+
+# Using pnpm
+pnpm install
+
+# Using bun
+bun install
+```
+
+
+
+### 2. Create a Prisma Postgres instance
+
+Run the following command in your terminal:
+
+```
+npx prisma init --db
+```
+
+If you don't have a [Prisma Data Platform](https://console.prisma.io/) account yet, or if you are not logged in, the command will prompt you to log in using one of the available authentication providers. A browser window will open so you can log in or create an account. Return to the CLI after you have completed this step.
+
+Once logged in (or if you were already logged in), the CLI will prompt you to:
+
+1. Select a **region** (e.g. `us-east-1`)
+1. Enter a **project name**
+
+After successful creation, you will see output similar to the following:
+
+
+
+CLI output
+
+```terminal
+Let's set up your Prisma Postgres database!
+? Select your region: ap-northeast-1 - Asia Pacific (Tokyo)
+? Enter a project name: testing-migration
+✔ Success! Your Prisma Postgres database is ready ✅
+
+We found an existing schema.prisma file in your current project directory.
+
+--- Database URL ---
+
+Connect Prisma ORM to your Prisma Postgres database with this URL:
+
+prisma+postgres://accelerate.prisma-data.net/?api_key=ey...
+
+--- Next steps ---
+
+Go to https://pris.ly/ppg-init for detailed instructions.
+
+1. Install and use the Prisma Accelerate extension
+Prisma Postgres requires the Prisma Accelerate extension for querying. If you haven't already installed it, install it in your project:
+npm install @prisma/extension-accelerate
+
+...and add it to your Prisma Client instance:
+import { withAccelerate } from "@prisma/extension-accelerate"
+
+const prisma = new PrismaClient().$extends(withAccelerate())
+
+2. Apply migrations
+Run the following command to create and apply a migration:
+npx prisma migrate dev
+
+3. Manage your data
+View and edit your data locally by running this command:
+npx prisma studio
+
+...or online in Console:
+https://console.prisma.io/{workspaceId}/{projectId}/studio
+
+4. Send queries from your app
+If you already have an existing app with Prisma ORM, you can now run it and it will send queries against your newly created Prisma Postgres instance.
+
+5. Learn more
+For more info, visit the Prisma Postgres docs: https://pris.ly/ppg-docs
+```
+
+
+
+Locate and copy the database URL provided in the CLI output. Then, follow the instructions in the next step to create a `.env` file in the project root.
+
+### 3. Setup your `.env` file
+
+You now need to configure your database connection via an environment variable.
+
+First, create an `.env` file:
+
+```bash
+touch .env
+```
+
+Then update the `.env` file by replacing the existing `DATABASE_URL` value with the one you previously copied. It will look similar to this:
+
+```bash
+DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=PRISMA_POSTGRES_API_KEY"
+```
+
+### 4. Migrate the database
+
+Run the following commands to set up your database and Prisma schema:
+
+```bash
+# Using npm
+npx prisma migrate dev --name init
+```
+
+
+
+Expand for yarn, pnpm or bun
+
+```bash
+# Using yarn
+yarn prisma migrate dev --name init
+
+# Using pnpm
+pnpm prisma migrate dev --name init
+
+# Using bun
+bun prisma migrate dev --name init
+```
+
+
+
+### 5. Seed the database
+
+Add initial data to your database:
+
+```bash
+# Using npm
+npx prisma db seed
+```
+
+
+
+Expand for yarn, pnpm or bun
+
+```bash
+# Using yarn
+yarn prisma db seed
+
+# Using pnpm
+pnpm prisma db seed
+
+# Using bun
+bun prisma db seed
+```
+
+
+
+### 6. Run the app
+
+Start the development server:
+
+```bash
+# Using npm
+npm run dev
+```
+
+
+
+Expand for yarn, pnpm or bun
+
+```bash
+# Using yarn
+yarn dev
+
+# Using pnpm
+pnpm run dev
+
+# Using bun
+bun run dev
+```
+
+
+
+Once the server is running, visit `http://localhost:3000` to start using the app.
+
+## Usage
+
+The app includes the following routes:
+
+- `/`: Display the thee most recent posts
+- `/posts`: Paginated list view of all posts
+- `/posts/new`: Create a new post
+- `/users/new`: Create a new user
+- `/api/posts/`: Pagination logic
+
+## Deploy your own
+
+Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example):
+
+[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fprisma-orm&env=DATABASE_URL&envDescription=Add%20your%20PRISMA%20POSTGRES%20database%20url&project-name=prisma-orm-app&repository-name=prisma-orm)
+
+## Additional information
+
+Explore different ways to use Prisma ORM in your project with the following resources to help you expand your knowledge and customize your workflow:
+
+- Prisma ORM supports multiple databases. Learn more about the supported databases [here](https://www.prisma.io/docs/orm/reference/supported-databases?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example).
+- To use Prisma ORM in an edge runtime without using [Prisma Postgres](https://www.prisma.io/docs/orm/overview/databases/prisma-postgres?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example) or [Prisma Accelerate](https://www.prisma.io/docs/accelerate/getting-started?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example), refer to the [driver adapters guide](https://www.prisma.io/docs/orm/prisma-client/deployment/edge/deploy-to-vercel?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example).
+
+For further learning and support:
+
+- [Prisma ORM documentation](https://www.prisma.io/docs/orm?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example)
+- [Prisma Client API reference](https://www.prisma.io/docs/orm/prisma-client?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example)
+- [Join our Discord community](https://pris.ly/discord?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example)
+- [Follow us on Twitter](https://pris.ly/x?utm_source=nextjs&utm_medium=example&utm_campaign=nextjs_example)
diff --git a/examples/prisma-postgres/app/Header.tsx b/examples/prisma-postgres/app/Header.tsx
new file mode 100644
index 00000000000000..66b91ab5174ce9
--- /dev/null
+++ b/examples/prisma-postgres/app/Header.tsx
@@ -0,0 +1,32 @@
+"use client";
+
+import Link from "next/link";
+
+export default function Header() {
+ return (
+
+
+
+ );
+}
diff --git a/examples/prisma-postgres/app/api/posts/route.ts b/examples/prisma-postgres/app/api/posts/route.ts
new file mode 100644
index 00000000000000..a7af6e60543195
--- /dev/null
+++ b/examples/prisma-postgres/app/api/posts/route.ts
@@ -0,0 +1,22 @@
+import prisma from "@/lib/prisma";
+import { NextResponse } from "next/server";
+
+export async function GET(request: Request) {
+ const url = new URL(request.url);
+ const page = parseInt(url.searchParams.get("page") || "1");
+ const postsPerPage = 5;
+ const offset = (page - 1) * postsPerPage;
+
+ // Fetch paginated posts
+ const posts = await prisma.post.findMany({
+ skip: offset,
+ take: postsPerPage,
+ orderBy: { createdAt: "desc" },
+ include: { author: { select: { name: true } } },
+ });
+
+ const totalPosts = await prisma.post.count();
+ const totalPages = Math.ceil(totalPosts / postsPerPage);
+
+ return NextResponse.json({ posts, totalPages });
+}
diff --git a/examples/prisma-postgres/app/favicon.ico b/examples/prisma-postgres/app/favicon.ico
new file mode 100644
index 00000000000000..718d6fea4835ec
Binary files /dev/null and b/examples/prisma-postgres/app/favicon.ico differ
diff --git a/examples/prisma-postgres/app/globals.css b/examples/prisma-postgres/app/globals.css
new file mode 100644
index 00000000000000..6b717ad346d3df
--- /dev/null
+++ b/examples/prisma-postgres/app/globals.css
@@ -0,0 +1,21 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+:root {
+ --background: #ffffff;
+ --foreground: #171717;
+}
+
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background: #0a0a0a;
+ --foreground: #ededed;
+ }
+}
+
+body {
+ color: var(--foreground);
+ background: var(--background);
+ font-family: Arial, Helvetica, sans-serif;
+}
diff --git a/examples/prisma-postgres/app/layout.tsx b/examples/prisma-postgres/app/layout.tsx
new file mode 100644
index 00000000000000..dc81382de38064
--- /dev/null
+++ b/examples/prisma-postgres/app/layout.tsx
@@ -0,0 +1,25 @@
+// app/layout.tsx
+import "./globals.css";
+import Header from "./Header";
+
+export const metadata = {
+ title: "Superblog",
+ description: "A blog app using Next.js and Prisma",
+};
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+ Enter a name for your project in the Name{" "}
+ field.
+
+
+ Inside the Prisma Postgres section, click{" "}
+ Get started.
+
+
+ Choose a region close to your location from the{" "}
+ Region dropdown.
+
+
+ Click Create project to set up your database.
+
+
+
+
+ {/* Step 2 */}
+
+
+ 2. Add the Prisma integration token to Netlify
+
+
+ When you created the site with this template, you already
+ installed the{" "}
+
+ Prisma Postgres extension
+ {" "}
+ in your Netlify account. Next, you need to copy Prisma's
+ integration token into the extension in your Neltify Dashboard:
+
+
+
+ In the{" "}
+
+ Prisma Console
+
+ , navigate to the root of your Workspace and click the{" "}
+ Integrations tab in the left-hand sidenav.
+
+
+ In the Configure Team settings section, click
+ the Generate integration token button.
+
+
+ Copy the generated token, you now need to add it to the
+ team-level extension configuration in your Netlify account as
+ described in the next step.
+
+
+ In your Netlify account, click the Extensions{" "}
+ tab in the left-hand sidenav and navigate to the installed{" "}
+ Prisma Postgres extension. Then find the text
+ field for the Integration token, paste the
+ token from the previous step into it and click{" "}
+ Save.
+
+
+
+
+ {/* Step 3 */}
+
+
+ 3. Connect Netlify site with Prisma Postgres instance
+
+
+ In this step, you will connect your Netlify site with the Prisma
+ Postgres instance you just created:
+
+
+
+ In your Netlify Dashboard, click on the Sites{" "}
+ item in the left-hand sidenav and click on the site that was
+ deployed with this template.
+
+
+ In the Extensions section, click on{" "}
+ Prisma Postgres.
+
+
+ Find the Project dropdown and select the one
+ project created in Step 1 before.
+
+
+ In the next two dropdowns for{" "}
+ Production environment and{" "}
+ Preview environment select{" "}
+ Development. Then click Save.
+ (At this stage, you can theoretically connect different database
+ instances to the different environments in Netlify. For the
+ purpose of this demo, we are just connecting both environments
+ to the Development database in Prisma Console).
+
+
+
+
+ {/* Step 4 */}
+
+
+ 4. Re-deploy the site in Netlify
+
+
+ Your site is now fully configured to load data from the Prisma
+ Postgres database you just created, the last thing you need to do
+ is re-deploy the site via the Netlify Dashboard.
+
+
+
+ In your Netlify Dashboard, click on the Sites{" "}
+ item in the left-hand sidenav and click on the site that was
+ deployed with this template.
+
+
+ Find the Project dropdown and select the one
+ project created in Step 1 before.
+
+
+ Click on the Deploys tab on the left, click the{" "}
+ Trigger deploy button, and finally click{" "}
+ Clear cache and deploy site.
+
+
+
+ {" "}
+ Once the deployment is ready, you can click on{" "}
+ Open production deploy and use the app by
+ creating users and posts via the UI 🎉
+
+
+
+
+
+ );
+}
diff --git a/examples/prisma-postgres/app/users/new/page.tsx b/examples/prisma-postgres/app/users/new/page.tsx
new file mode 100644
index 00000000000000..550f25f9932a18
--- /dev/null
+++ b/examples/prisma-postgres/app/users/new/page.tsx
@@ -0,0 +1,65 @@
+export const dynamic = "force-dynamic"; // This disables SSG and ISR
+
+import prisma from "@/lib/prisma";
+import { redirect } from "next/navigation";
+import Form from "next/form";
+
+export default function NewUser() {
+ async function createUser(formData: FormData) {
+ "use server";
+
+ const name = formData.get("name") as string;
+ const email = formData.get("email") as string;
+
+ await prisma.user.create({
+ data: { name, email },
+ });
+
+ redirect("/");
+ }
+
+ return (
+
+
Create New User
+
+
+ );
+}
diff --git a/examples/prisma-postgres/lib/prisma.ts b/examples/prisma-postgres/lib/prisma.ts
new file mode 100644
index 00000000000000..d8f0b32faac299
--- /dev/null
+++ b/examples/prisma-postgres/lib/prisma.ts
@@ -0,0 +1,10 @@
+import { PrismaClient } from "./generated/prisma-client";
+import { withAccelerate } from "@prisma/extension-accelerate";
+
+const prisma = new PrismaClient().$extends(withAccelerate());
+
+const globalForPrisma = global as unknown as { prisma: typeof prisma };
+
+if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
+
+export default prisma;
diff --git a/examples/prisma-postgres/next.config.ts b/examples/prisma-postgres/next.config.ts
new file mode 100644
index 00000000000000..e9ffa3083ad279
--- /dev/null
+++ b/examples/prisma-postgres/next.config.ts
@@ -0,0 +1,7 @@
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+ /* config options here */
+};
+
+export default nextConfig;
diff --git a/examples/prisma-postgres/package.json b/examples/prisma-postgres/package.json
new file mode 100644
index 00000000000000..1f3decae788a28
--- /dev/null
+++ b/examples/prisma-postgres/package.json
@@ -0,0 +1,30 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "next dev --turbopack",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "postinstall": "prisma generate --no-engine"
+ },
+ "prisma": {
+ "seed": "tsx prisma/seed.ts"
+ },
+ "dependencies": {
+ "@prisma/client": "latest",
+ "@prisma/extension-accelerate": "latest",
+ "next": "latest",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0"
+ },
+ "devDependencies": {
+ "@types/node": "^20",
+ "@types/react": "^19",
+ "@types/react-dom": "^19",
+ "postcss": "^8",
+ "prisma": "latest",
+ "tailwindcss": "^3.4.1",
+ "tsx": "^4.19.2",
+ "typescript": "^5"
+ }
+}
diff --git a/examples/prisma-postgres/postcss.config.mjs b/examples/prisma-postgres/postcss.config.mjs
new file mode 100644
index 00000000000000..1a69fd2a450afc
--- /dev/null
+++ b/examples/prisma-postgres/postcss.config.mjs
@@ -0,0 +1,8 @@
+/** @type {import('postcss-load-config').Config} */
+const config = {
+ plugins: {
+ tailwindcss: {},
+ },
+};
+
+export default config;
diff --git a/examples/prisma-postgres/prisma/schema.prisma b/examples/prisma-postgres/prisma/schema.prisma
new file mode 100644
index 00000000000000..9ed05aa7af4e63
--- /dev/null
+++ b/examples/prisma-postgres/prisma/schema.prisma
@@ -0,0 +1,27 @@
+generator client {
+ provider = "prisma-client-js"
+ output = "../lib/generated/prisma-client"
+}
+
+datasource db {
+ provider = "postgresql"
+ url = env("DATABASE_URL")
+}
+
+model User {
+ id Int @id @default(autoincrement())
+ email String @unique
+ name String?
+ posts Post[]
+}
+
+model Post {
+ id Int @id @default(autoincrement())
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ title String
+ content String?
+ published Boolean @default(false)
+ authorId Int
+ author User @relation(fields: [authorId], references: [id])
+}
\ No newline at end of file
diff --git a/examples/prisma-postgres/prisma/seed.ts b/examples/prisma-postgres/prisma/seed.ts
new file mode 100644
index 00000000000000..b6713d3d895181
--- /dev/null
+++ b/examples/prisma-postgres/prisma/seed.ts
@@ -0,0 +1,153 @@
+import { PrismaClient } from "../lib/generated/prisma-client";
+
+const prisma = new PrismaClient();
+
+async function main() {
+ // Create 5 users
+ await prisma.user.createMany({
+ data: [
+ { email: "alice@example.com", name: "Alice" },
+ { email: "bob@example.com", name: "Bob" },
+ { email: "charlie@example.com", name: "Charlie" },
+ { email: "diana@example.com", name: "Diana" },
+ { email: "edward@example.com", name: "Edward" },
+ ],
+ });
+
+ // Find all users to get their IDs
+ const userRecords = await prisma.user.findMany();
+
+ const userIdMapping = {
+ alice: userRecords.find((user) => user.email === "alice@example.com")?.id,
+ bob: userRecords.find((user) => user.email === "bob@example.com")?.id,
+ charlie: userRecords.find((user) => user.email === "charlie@example.com")
+ ?.id,
+ diana: userRecords.find((user) => user.email === "diana@example.com")?.id,
+ edward: userRecords.find((user) => user.email === "edward@example.com")?.id,
+ };
+
+ // Create 15 posts distributed among users
+ await prisma.post.createMany({
+ data: [
+ // Alice's posts
+ {
+ title: "Getting Started with TypeScript and Prisma",
+ content:
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce id erat a lorem tincidunt ultricies. Vivamus porta bibendum nulla vel accumsan.",
+ published: true,
+ authorId: userIdMapping.alice!,
+ },
+ {
+ title: "How ORMs Simplify Complex Queries",
+ content:
+ "Duis sagittis urna ut sapien tristique convallis. Aenean vel ligula felis. Phasellus bibendum sem at elit dictum volutpat.",
+ published: false,
+ authorId: userIdMapping.alice!,
+ },
+
+ // Bob's posts
+ {
+ title: "Mastering Prisma: Efficient Database Migrations",
+ content:
+ "Ut ullamcorper nec erat id auctor. Nullam nec ligula in ex feugiat tincidunt. Cras accumsan vehicula tortor ut eleifend.",
+ published: true,
+ authorId: userIdMapping.bob!,
+ },
+ {
+ title: "Best Practices for Type Safety in ORMs",
+ content:
+ "Aliquam erat volutpat. Suspendisse potenti. Maecenas fringilla elit vel eros laoreet, et tempor sapien vulputate.",
+ published: true,
+ authorId: userIdMapping.bob!,
+ },
+ {
+ title: "TypeScript Utility Types for Database Models",
+ content:
+ "Donec ac magna facilisis, vestibulum ligula at, elementum nisl. Morbi volutpat eget velit eu egestas.",
+ published: false,
+ authorId: userIdMapping.bob!,
+ },
+
+ // Charlie's posts (no posts for Charlie)
+
+ // Diana's posts
+ {
+ title: "Exploring Database Indexes and Their Performance Impact",
+ content:
+ "Vivamus ac velit tincidunt, sollicitudin erat quis, fringilla enim. Aenean posuere est a risus placerat suscipit.",
+ published: true,
+ authorId: userIdMapping.diana!,
+ },
+ {
+ title: "Choosing the Right Database for Your TypeScript Project",
+ content:
+ "Sed vel suscipit lorem. Duis et arcu consequat, sagittis justo quis, pellentesque risus. Curabitur sed consequat est.",
+ published: false,
+ authorId: userIdMapping.diana!,
+ },
+ {
+ title: "Designing Scalable Schemas with Prisma",
+ content:
+ "Phasellus ut erat nec elit ultricies egestas. Vestibulum rhoncus urna eget magna varius pharetra.",
+ published: true,
+ authorId: userIdMapping.diana!,
+ },
+ {
+ title: "Handling Relations Between Models in ORMs",
+ content:
+ "Integer luctus ac augue at tristique. Curabitur varius nisl vitae mi fringilla, vel tincidunt nunc dictum.",
+ published: false,
+ authorId: userIdMapping.diana!,
+ },
+
+ // Edward's posts
+ {
+ title: "Why TypeORM Still Has Its Place in 2025",
+ content:
+ "Morbi non arcu nec velit cursus feugiat sit amet sit amet mi. Etiam porttitor ligula id sem molestie, in tempor arcu bibendum.",
+ published: true,
+ authorId: userIdMapping.edward!,
+ },
+ {
+ title: "NoSQL vs SQL: The Definitive Guide for Developers",
+ content:
+ "Suspendisse a ligula sit amet risus ullamcorper tincidunt. Curabitur tincidunt, sapien id fringilla auctor, risus libero gravida odio, nec volutpat libero orci nec lorem.",
+ published: true,
+ authorId: userIdMapping.edward!,
+ },
+ {
+ title: "Optimizing Queries with Prisma’s Select and Include",
+ content:
+ "Proin vel diam vel nisi facilisis malesuada. Sed vitae diam nec magna mollis commodo a vitae nunc.",
+ published: false,
+ authorId: userIdMapping.edward!,
+ },
+ {
+ title: "PostgreSQL Optimizations Every Developer Should Know",
+ content:
+ "Nullam mollis quam sit amet lacus interdum, at suscipit libero pellentesque. Suspendisse in mi vitae magna finibus pretium.",
+ published: true,
+ authorId: userIdMapping.edward!,
+ },
+ {
+ title: "Scaling Applications with Partitioned Tables in PostgreSQL",
+ content:
+ "Cras vitae tortor in mauris tristique elementum non id ipsum. Nunc vitae pulvinar purus.",
+ published: true,
+ authorId: userIdMapping.edward!,
+ },
+ ],
+ });
+
+ console.log("Seeding completed.");
+}
+
+main()
+ .then(async () => {
+ await prisma.$disconnect();
+ })
+ .catch(async (e) => {
+ console.error(e);
+ await prisma.$disconnect();
+ process.exit(1);
+ });
diff --git a/examples/prisma-postgres/tailwind.config.ts b/examples/prisma-postgres/tailwind.config.ts
new file mode 100644
index 00000000000000..1362b8826a5aa4
--- /dev/null
+++ b/examples/prisma-postgres/tailwind.config.ts
@@ -0,0 +1,18 @@
+import type { Config } from "tailwindcss";
+
+export default {
+ 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: [],
+} satisfies Config;
diff --git a/examples/prisma-postgres/tsconfig.json b/examples/prisma-postgres/tsconfig.json
new file mode 100644
index 00000000000000..d8b93235f205ef
--- /dev/null
+++ b/examples/prisma-postgres/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "compilerOptions": {
+ "target": "ES2017",
+ "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": {
+ "@/*": ["./*"]
+ }
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules"]
+}
diff --git a/packages/next/src/server/lib/patch-fetch.ts b/packages/next/src/server/lib/patch-fetch.ts
index 7c9a4f67bb15e8..2b813379c54d89 100644
--- a/packages/next/src/server/lib/patch-fetch.ts
+++ b/packages/next/src/server/lib/patch-fetch.ts
@@ -559,7 +559,7 @@ export function createPatchedFetcher(
cacheSignal = null
}
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'fetch()'
)
@@ -669,7 +669,7 @@ export function createPatchedFetcher(
cacheSignal.endRead()
cacheSignal = null
}
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'fetch()'
)
@@ -1010,7 +1010,7 @@ export function createPatchedFetcher(
cacheSignal.endRead()
cacheSignal = null
}
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'fetch()'
)
@@ -1044,7 +1044,7 @@ export function createPatchedFetcher(
switch (workUnitStore.type) {
case 'prerender':
case 'prerender-client':
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'fetch()'
)
diff --git a/packages/next/src/server/lib/router-utils/resolve-routes.ts b/packages/next/src/server/lib/router-utils/resolve-routes.ts
index bb2aa2ab004a71..f4831df1b29bfc 100644
--- a/packages/next/src/server/lib/router-utils/resolve-routes.ts
+++ b/packages/next/src/server/lib/router-utils/resolve-routes.ts
@@ -423,7 +423,10 @@ export function getResolveRoutes(
// base path.
if (updated) {
if (hadBasePath) {
- normalized = path.posix.join(config.basePath, normalized)
+ normalized =
+ normalized === '/'
+ ? config.basePath
+ : path.posix.join(config.basePath, normalized)
}
// Re-add the trailing slash (if required).
diff --git a/packages/next/src/server/next-server.ts b/packages/next/src/server/next-server.ts
index 21b033f4c173b9..a6f8939b12e26e 100644
--- a/packages/next/src/server/next-server.ts
+++ b/packages/next/src/server/next-server.ts
@@ -1106,12 +1106,17 @@ export default class NextNodeServer extends BaseServer<
routerServerGlobal[RouterServerContextSymbol] = {}
}
const relativeProjectDir = relative(process.cwd(), this.dir)
+ const existingServerContext =
+ routerServerGlobal[RouterServerContextSymbol][relativeProjectDir]
- if (!routerServerGlobal[RouterServerContextSymbol][relativeProjectDir]) {
+ if (!existingServerContext) {
routerServerGlobal[RouterServerContextSymbol][relativeProjectDir] = {
render404: this.render404.bind(this),
}
}
+ routerServerGlobal[RouterServerContextSymbol][
+ relativeProjectDir
+ ].nextConfig = this.nextConfig
try {
// next.js core assumes page path without trailing slash
diff --git a/packages/next/src/server/use-cache/use-cache-wrapper.ts b/packages/next/src/server/use-cache/use-cache-wrapper.ts
index 59126c1d3004eb..844e9b30ac8c54 100644
--- a/packages/next/src/server/use-cache/use-cache-wrapper.ts
+++ b/packages/next/src/server/use-cache/use-cache-wrapper.ts
@@ -821,7 +821,7 @@ export function cache(
)
if (dynamicAccessAbortController.signal.aborted) {
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
dynamicAccessAbortController.signal.reason.message
)
@@ -886,7 +886,7 @@ export function cache(
if (cacheSignal) {
cacheSignal.endRead()
}
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'dynamic "use cache"'
)
@@ -935,7 +935,7 @@ export function cache(
// transformed with an async function, before being passed into
// the "use cache" function, which escapes the instrumentation.
if (workUnitStore.allowEmptyStaticShell) {
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'dynamic "use cache"'
)
@@ -1029,7 +1029,7 @@ export function cache(
if (cacheSignal) {
cacheSignal.endRead()
}
- return makeHangingPromise(
+ return await makeHangingPromise(
workUnitStore.renderSignal,
'dynamic "use cache"'
)
@@ -1086,7 +1086,7 @@ export function cache(
)
if (result.type === 'prerender-dynamic') {
- return result.hangingPromise
+ return await result.hangingPromise
}
const { stream: newStream, pendingCacheEntry } = result
diff --git a/scripts/build-native.ts b/scripts/build-native.ts
index b6d03ecb78c962..6f3b757b6126ef 100644
--- a/scripts/build-native.ts
+++ b/scripts/build-native.ts
@@ -2,6 +2,7 @@
import { promises as fs } from 'node:fs'
import path from 'node:path'
+import url from 'node:url'
import execa from 'execa'
import { NEXT_DIR, logCommand, execFn } from './pack-util'
@@ -31,7 +32,7 @@ export default async function buildNative(
}
// Check if this file is being run directly
-if (import.meta.url === `file://${process.argv[1]}`) {
+if (import.meta.url === url.pathToFileURL(process.argv[1]).toString()) {
buildNative(process.argv.slice(2)).catch((err) => {
console.error(err)
process.exit(1)
diff --git a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts
index 0e5979ee6c8e77..6461fc76cfcb6d 100644
--- a/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts
+++ b/test/e2e/app-dir/dynamic-io-errors/dynamic-io-errors.test.ts
@@ -554,10 +554,11 @@ describe('Dynamic IO Errors', () => {
"description": "Route "/dynamic-root": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it. See more info: https://nextjs.org/docs/messages/next-prerender-missing-suspense",
"environmentLabel": "Server",
"label": "Console Error",
- "source": "app/dynamic-root/page.tsx (45:56) @ FetchingComponent
- > 45 | {cached ? await fetchRandomCached(nonce) : await fetchRandom(nonce)}
- | ^",
+ "source": "app/dynamic-root/page.tsx (59:26) @ fetchRandom
+ > 59 | const response = await fetch(
+ | ^",
"stack": [
+ "fetchRandom app/dynamic-root/page.tsx (59:26)",
"FetchingComponent app/dynamic-root/page.tsx (45:56)",
"Page app/dynamic-root/page.tsx (22:9)",
"LogSafely ",
@@ -567,10 +568,11 @@ describe('Dynamic IO Errors', () => {
"description": "Route "/dynamic-root": A component accessed data, headers, params, searchParams, or a short-lived cache without a Suspense boundary nor a "use cache" above it. See more info: https://nextjs.org/docs/messages/next-prerender-missing-suspense",
"environmentLabel": "Server",
"label": "Console Error",
- "source": "app/dynamic-root/page.tsx (45:56) @ FetchingComponent
- > 45 | {cached ? await fetchRandomCached(nonce) : await fetchRandom(nonce)}
- | ^",
+ "source": "app/dynamic-root/page.tsx (59:26) @ fetchRandom
+ > 59 | const response = await fetch(
+ | ^",
"stack": [
+ "fetchRandom app/dynamic-root/page.tsx (59:26)",
"FetchingComponent app/dynamic-root/page.tsx (45:56)",
"Page app/dynamic-root/page.tsx (27:7)",
"LogSafely ",
diff --git a/test/e2e/middleware-base-path/app/pages/other.js b/test/e2e/middleware-base-path/app/pages/other.js
new file mode 100644
index 00000000000000..e423f021e5cc24
--- /dev/null
+++ b/test/e2e/middleware-base-path/app/pages/other.js
@@ -0,0 +1,12 @@
+import Link from 'next/link'
+
+export default function Other() {
+ return (
+
+
Other page
+
+ Go to home
+
+
+ )
+}
diff --git a/test/e2e/middleware-base-path/test/index.test.ts b/test/e2e/middleware-base-path/test/index.test.ts
index 90ef2a546ee337..af39eae4b44170 100644
--- a/test/e2e/middleware-base-path/test/index.test.ts
+++ b/test/e2e/middleware-base-path/test/index.test.ts
@@ -35,6 +35,7 @@ describe('Middleware base tests', () => {
const $ = cheerio.load(html)
expect($('.title').text()).toBe('About Page')
})
+
it('router.query must exist when Link clicked page routing', async () => {
const browser = await webdriver(next.url, '/root')
try {
@@ -45,4 +46,15 @@ describe('Middleware base tests', () => {
await browser.close()
}
})
+
+ it('should allow client-side navigation to the root', async () => {
+ const browser = await webdriver(next.url, '/root/other')
+ try {
+ await browser.elementById('go-to-home').click()
+ const title = await browser.waitForElementByCss('.title').text()
+ expect(title).toMatch('Hello World')
+ } finally {
+ await browser.close()
+ }
+ })
})
diff --git a/test/production/custom-server/custom-server.test.ts b/test/production/custom-server/custom-server.test.ts
index a200ca0c5ba6e0..b31097aa35a330 100644
--- a/test/production/custom-server/custom-server.test.ts
+++ b/test/production/custom-server/custom-server.test.ts
@@ -50,6 +50,52 @@ describe('custom server', () => {
})
})
+describe('custom server provided config', () => {
+ const { next } = nextTestSetup({
+ files: __dirname,
+ startCommand: 'node server.js',
+ serverReadyPattern: /^- Local:/,
+ dependencies: {
+ 'get-port': '5.1.1',
+ },
+ env: {
+ PROVIDED_CONFIG: 'true',
+ },
+ })
+
+ it.each(['a', 'b', 'c'])('can navigate to /%s', async (page) => {
+ const $ = await next.render$(`/docs/${page}`)
+ expect($('p').text()).toBe(`Page ${page}`)
+ })
+
+ describe('with app dir', () => {
+ it('should render app with react canary', async () => {
+ const $ = await next.render$(`/docs/1`)
+ expect($('body').text()).toMatch(/app: .+-canary/)
+ })
+
+ it('should render pages with installed react', async () => {
+ const $ = await next.render$(`/docs/2`)
+ if (isReact18) {
+ expect($('body').text()).toMatch(/pages: 18\.\d+\.\d+\{/)
+ } else {
+ expect($('body').text()).toMatch(/pages: 19\.\d+\.\d+/)
+ }
+ })
+
+ describe('when using "use cache" with a custom cache handler', () => {
+ it("should not unset the custom server's ALS context", async () => {
+ const cliOutputLength = next.cliOutput.length
+ const $ = await next.render$('/docs/use-cache')
+ expect($('p').text()).toBe('inner cache')
+ const cliOutput = next.cliOutput.slice(cliOutputLength)
+ expect(cliOutput).toMatch(createCacheSetLogRegExp('outer'))
+ expect(cliOutput).toMatch(createCacheSetLogRegExp('inner'))
+ })
+ })
+ })
+})
+
describe('custom server with quiet setting', () => {
const { next } = nextTestSetup({
files: __dirname,
diff --git a/test/production/custom-server/server.js b/test/production/custom-server/server.js
index e82f053fc000ae..187d65915be140 100644
--- a/test/production/custom-server/server.js
+++ b/test/production/custom-server/server.js
@@ -10,8 +10,15 @@ let requestId = 0
async function main() {
const port = await getPort()
const hostname = 'localhost'
+ let conf = undefined
+
+ if (process.env.PROVIDED_CONFIG) {
+ conf = require('./.next/required-server-files.json').config
+ conf.basePath = '/docs'
+ }
+
// when using middleware `hostname` and `port` must be provided below
- const app = next({ hostname, port, quiet })
+ const app = next({ hostname, port, quiet, conf })
const handle = app.getRequestHandler()
app.prepare().then(() => {
@@ -21,7 +28,11 @@ async function main() {
// Be sure to pass `true` as the second argument to `url.parse`.
// This tells it to parse the query portion of the URL.
const parsedUrl = parse(req.url, true)
- const { pathname, query } = parsedUrl
+ let { pathname, query } = parsedUrl
+
+ if (conf?.basePath) {
+ pathname = pathname.replace(conf.basePath, '') || '/'
+ }
if (pathname === '/a') {
await app.render(req, res, '/a', query)
@@ -30,6 +41,7 @@ async function main() {
} else if (pathname === '/error') {
await app.render(req, res, '/page-error')
} else {
+ parsedUrl.pathname = pathname
await handle(req, res, parsedUrl)
}
} catch (err) {
diff --git a/test/rspack-build-tests-manifest.json b/test/rspack-build-tests-manifest.json
index fcdd6e64dcad6e..fb693d97c16291 100644
--- a/test/rspack-build-tests-manifest.json
+++ b/test/rspack-build-tests-manifest.json
@@ -2249,6 +2249,13 @@
"flakey": [],
"runtimeError": false
},
+ "test/e2e/app-dir/dynamic-io/dynamic-io.console.test.ts": {
+ "passed": ["dynamic-io dims console calls during prospective rendering"],
+ "failed": [],
+ "pending": [],
+ "flakey": [],
+ "runtimeError": false
+ },
"test/e2e/app-dir/dynamic-io/dynamic-io.cookies.test.ts": {
"passed": [
"dynamic-io should be able to access cookie properties",
@@ -2398,6 +2405,7 @@
"dynamic-io does not prerender pages with parallel routes that uses a dynamic API",
"dynamic-io should fully prerender pages that use `unstable_noStore()`",
"dynamic-io should not have route specific errors",
+ "dynamic-io should not resume when client components are dynamic but the RSC render was static",
"dynamic-io should not warn about potential memory leak for even listeners on AbortSignal",
"dynamic-io should partially prerender pages that do any uncached IO",
"dynamic-io should partially prerender pages that do any uncached IO (use cache)",
@@ -5049,6 +5057,26 @@
"flakey": [],
"runtimeError": false
},
+ "test/e2e/app-dir/router-disable-smooth-scroll/router-disable-smooth-scroll.legacy.test.ts": {
+ "passed": [
+ "router smooth scroll optimization (legacy with data attribute) should not warn when data attribute is present even in legacy mode",
+ "router smooth scroll optimization (legacy) should work with smooth scroll CSS and warn in development"
+ ],
+ "failed": [],
+ "pending": [],
+ "flakey": [],
+ "runtimeError": false
+ },
+ "test/e2e/app-dir/router-disable-smooth-scroll/router-disable-smooth-scroll.optimized.test.ts": {
+ "passed": [
+ "router smooth scroll optimization (optimized early exit) should exit early when CSS smooth scroll detected but no data attribute",
+ "router smooth scroll optimization (optimized) should work with smooth scroll CSS and data attribute without warning"
+ ],
+ "failed": [],
+ "pending": [],
+ "flakey": [],
+ "runtimeError": false
+ },
"test/e2e/app-dir/router-stuck-dynamic-static-segment/router-stuck-dynamic-static-segment.test.ts": {
"passed": [
"router-stuck-dynamic-static-segment should allow navigation between dynamic parameter and static parameter of the same value"
@@ -5834,6 +5862,8 @@
"test/e2e/app-dir/server-source-maps/server-source-maps.test.ts": {
"passed": [
"app-dir - server source maps handles invalid sourcemaps gracefully",
+ "app-dir - server source maps ignore-lists anonymous rsc stack frame sandwiches",
+ "app-dir - server source maps ignore-lists anonymous ssr stack frame sandwiches",
"app-dir - server source maps logged errors have a sourcemapped `cause`",
"app-dir - server source maps logged errors have a sourcemapped stack with a codeframe",
"app-dir - server source maps logged errors preserve their name",
@@ -19647,10 +19677,11 @@
},
"test/production/pnpm-support/index.test.ts": {
"passed": [
- "pnpm support should build with dependencies installed via pnpm",
+ "pnpm support should build with dependencies installed via pnpm"
+ ],
+ "failed": [
"pnpm support should execute client-side JS on each page in output: \"standalone\""
],
- "failed": [],
"pending": [],
"flakey": [],
"runtimeError": false
diff --git a/test/rspack-dev-tests-manifest.json b/test/rspack-dev-tests-manifest.json
index ed2f6befd3c92e..2d7e2cebc1d7ab 100644
--- a/test/rspack-dev-tests-manifest.json
+++ b/test/rspack-dev-tests-manifest.json
@@ -1281,6 +1281,25 @@
"flakey": [],
"runtimeError": false
},
+ "packages/next/src/server/lib/source-maps.test.ts": {
+ "passed": [
+ "does not hide sandwiches without a lid",
+ "does not ignore list anonymous frames by default",
+ "does not ignore list anonymous frames that are not likely JS native methods",
+ "does not ignore list anonymous frames where the bottom is shown",
+ "does not ignore list if bottom is not ignore-listed",
+ "does not ignore list if bottom is unknown",
+ "does not ignore list if top is not ignore-listed",
+ "does not ignore list if top is unknown",
+ "hides big macs",
+ "hides big sandwiches",
+ "hides small sandwiches"
+ ],
+ "failed": [],
+ "pending": [],
+ "flakey": [],
+ "runtimeError": false
+ },
"packages/next/src/server/lib/to-route.test.ts": {
"passed": [
"toRoute Function should remove trailing `/index`",
@@ -1895,9 +1914,12 @@
"ReactRefreshLogBox app Call stack for client error",
"ReactRefreshLogBox app Call stack for server error",
"ReactRefreshLogBox app Server component errors should open up in fullscreen",
+ "ReactRefreshLogBox app Should not show __webpack_exports__ when exporting anonymous arrow function",
"ReactRefreshLogBox app Should show error location for server actions in client component",
"ReactRefreshLogBox app Should show error location for server actions in server component",
+ "ReactRefreshLogBox app Unhandled errors and rejections opens up in the minimized state",
"ReactRefreshLogBox app boundaries",
+ "ReactRefreshLogBox app conversion to class component (1)",
"ReactRefreshLogBox app logbox: anchors links in error messages",
"ReactRefreshLogBox app should hide unrelated frames in stack trace with nodejs internal calls",
"ReactRefreshLogBox app should hide unrelated frames in stack trace with unknown anonymous calls",
@@ -1906,9 +1928,6 @@
"failed": [
"ReactRefreshLogBox app Can't resolve @import in CSS file",
"ReactRefreshLogBox app Import trace when module not found in layout",
- "ReactRefreshLogBox app Should not show __webpack_exports__ when exporting anonymous arrow function",
- "ReactRefreshLogBox app Unhandled errors and rejections opens up in the minimized state",
- "ReactRefreshLogBox app conversion to class component (1)",
"ReactRefreshLogBox app css syntax errors",
"ReactRefreshLogBox app module init error not shown",
"ReactRefreshLogBox app server component can recover from error thrown in the module",
@@ -2023,16 +2042,16 @@
"test/development/acceptance-app/error-recovery.test.ts": {
"passed": [
"Error recovery app can recover from a event handler error",
- "Error recovery app server component can recover from a component error"
+ "Error recovery app client component can recover from a component error",
+ "Error recovery app server component can recover from a component error",
+ "Error recovery app stuck error"
],
"failed": [
"Error recovery app can recover from a syntax error without losing state",
- "Error recovery app client component can recover from a component error",
"Error recovery app client component can recover from syntax error",
"Error recovery app displays build error on initial page load",
"Error recovery app render error not shown right after syntax error",
"Error recovery app server component can recover from syntax error",
- "Error recovery app stuck error",
"Error recovery app syntax > runtime error"
],
"pending": [],
@@ -2753,6 +2772,7 @@
"segment-explorer should handle show file segments in order",
"segment-explorer should handle special built-in not-found segments",
"segment-explorer should indicate segment explorer is not available for pages router",
+ "segment-explorer should render route for index page",
"segment-explorer should render the segment explorer for nested routes",
"segment-explorer should render the segment explorer for parallel routes",
"segment-explorer should render the segment explorer for parallel routes in edge runtime",
@@ -6157,6 +6177,13 @@
"flakey": [],
"runtimeError": false
},
+ "test/e2e/app-dir/dynamic-io/dynamic-io.console.test.ts": {
+ "passed": ["dynamic-io dims console calls during prospective rendering"],
+ "failed": [],
+ "pending": [],
+ "flakey": [],
+ "runtimeError": false
+ },
"test/e2e/app-dir/dynamic-io/dynamic-io.cookies.test.ts": {
"passed": [
"dynamic-io should be able to access cookie properties",
@@ -6305,6 +6332,7 @@
"dynamic-io should fully prerender pages that use `unstable_noStore()`",
"dynamic-io should not have route specific errors",
"dynamic-io should not log not-found errors",
+ "dynamic-io should not resume when client components are dynamic but the RSC render was static",
"dynamic-io should partially prerender pages that do any uncached IO",
"dynamic-io should partially prerender pages that do any uncached IO (use cache)",
"dynamic-io should partially prerender pages that take longer than a task to render",
@@ -6474,10 +6502,10 @@
"test/e2e/app-dir/error-on-next-codemod-comment/error-on-next-codemod-comment.test.ts": {
"passed": [
"app-dir - error-on-next-codemod-comment should disappear the error when you replace with bypass comment",
+ "app-dir - error-on-next-codemod-comment should disappear the error when you rre the codemod comment",
"app-dir - error-on-next-codemod-comment should error with inline comment as well"
],
"failed": [
- "app-dir - error-on-next-codemod-comment should disappear the error when you rre the codemod comment",
"app-dir - error-on-next-codemod-comment should error with swc if you have codemod comments left"
],
"pending": [],
@@ -9517,6 +9545,7 @@
"test/e2e/app-dir/server-source-maps/server-source-maps.test.ts": {
"passed": [
"app-dir - server source maps handles invalid sourcemaps gracefully",
+ "app-dir - server source maps ignore-lists anonymous ssr stack frame sandwiches",
"app-dir - server source maps logged errors have a sourcemapped `cause`",
"app-dir - server source maps logged errors have a sourcemapped stack with a codeframe",
"app-dir - server source maps logged errors preserve their name",
@@ -9524,6 +9553,7 @@
"app-dir - server source maps thrown SSR errors"
],
"failed": [
+ "app-dir - server source maps ignore-lists anonymous rsc stack frame sandwiches",
"app-dir - server source maps sourcemaps errors during module evaluation",
"app-dir - server source maps stack frames are ignore-listed in rsc"
],