diff --git a/.changeset/hungry-bugs-repeat.md b/.changeset/hungry-bugs-repeat.md new file mode 100644 index 00000000000..1980a001039 --- /dev/null +++ b/.changeset/hungry-bugs-repeat.md @@ -0,0 +1,5 @@ +--- +'@clerk/nextjs': minor +--- + +Remove usage of `ezheaders` diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 0bb119c3080..150f1fb25c8 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -70,7 +70,6 @@ "@clerk/shared": "workspace:*", "@clerk/types": "workspace:*", "crypto-js": "4.2.0", - "ezheaders": "0.1.0", "server-only": "0.0.1", "tslib": "catalog:repo" }, diff --git a/packages/nextjs/src/app-router/server-actions.ts b/packages/nextjs/src/app-router/server-actions.ts index 9139016888a..8c27edc300b 100644 --- a/packages/nextjs/src/app-router/server-actions.ts +++ b/packages/nextjs/src/app-router/server-actions.ts @@ -1,11 +1,11 @@ 'use server'; -import { getCookies } from 'ezheaders'; +import { cookies } from 'next/headers'; // This function needs to be async as we'd like to support next versions in the range of [14.1.2,14.2.0) // These versions required 'use server' files to export async methods only. This check was later relaxed // and the async is no longer required in newer next versions. // ref: https://github.com/vercel/next.js/pull/62821 export async function invalidateCacheAction(): Promise { - void (await getCookies()).delete(`__clerk_invalidate_cache_cookie_${Date.now()}`); + void (await cookies()).delete(`__clerk_invalidate_cache_cookie_${Date.now()}`); } diff --git a/packages/nextjs/src/app-router/server/ClerkProvider.tsx b/packages/nextjs/src/app-router/server/ClerkProvider.tsx index c7a17da813a..b8c7dbd4f93 100644 --- a/packages/nextjs/src/app-router/server/ClerkProvider.tsx +++ b/packages/nextjs/src/app-router/server/ClerkProvider.tsx @@ -1,6 +1,6 @@ import type { AuthObject } from '@clerk/backend'; import type { InitialState, Without } from '@clerk/types'; -import { header } from 'ezheaders'; +import { headers } from 'next/headers'; import nextPkg from 'next/package.json'; import React from 'react'; @@ -21,7 +21,7 @@ const getDynamicClerkState = React.cache(async function getDynamicClerkState() { }); const getNonceFromCSPHeader = React.cache(async function getNonceFromCSPHeader() { - return getScriptNonceFromHeader((await header('Content-Security-Policy')) || '') || ''; + return getScriptNonceFromHeader((await headers()).get('Content-Security-Policy') || '') || ''; }); export async function ClerkProvider( diff --git a/packages/nextjs/src/app-router/server/utils.ts b/packages/nextjs/src/app-router/server/utils.ts index ae1f70d9f11..7e8c220155f 100644 --- a/packages/nextjs/src/app-router/server/utils.ts +++ b/packages/nextjs/src/app-router/server/utils.ts @@ -22,9 +22,10 @@ export const isPrerenderingBailout = (e: unknown) => { export async function buildRequestLike() { try { // Dynamically import next/headers, otherwise Next12 apps will break - // @ts-ignore: Cannot find module 'next/headers' or its corresponding type declarations.ts(2307) - const { getHeaders } = await import('ezheaders'); - return new NextRequest('https://placeholder.com', { headers: await getHeaders() }); + // @ts-expect-error: Cannot find module 'next/headers' or its corresponding type declarations.ts(2307) + const { headers } = await import('next/headers'); + const resolvedHeaders = await headers(); + return new NextRequest('https://placeholder.com', { headers: resolvedHeaders }); } catch (e: any) { // rethrow the error when react throws a prerendering bailout // https://nextjs.org/docs/messages/ppr-caught-error diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 650a2af9363..c68f15694ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -784,9 +784,6 @@ importers: crypto-js: specifier: 4.2.0 version: 4.2.0 - ezheaders: - specifier: 0.1.0 - version: 0.1.0(next@14.2.16(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: specifier: ^18 || ^19.0.0-0 version: 18.3.1 @@ -8655,11 +8652,6 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - ezheaders@0.1.0: - resolution: {integrity: sha512-U0wdCs2dS+IzFuxyHGyw1aWhiunW22sGqnyH4yQsovkgqUvO4YSbzQ5BQzV6HY4oFlNnK+TbFGJj8rvvX5aN7w==} - peerDependencies: - next: ^13.5.4 || ^14 || ^15 - fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -25227,10 +25219,6 @@ snapshots: extsprintf@1.3.0: {} - ezheaders@0.1.0(next@14.2.16(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): - dependencies: - next: 14.2.16(@babel/core@7.26.0)(@playwright/test@1.44.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fast-decode-uri-component@1.0.1: {} fast-deep-equal@3.1.3: {}