diff --git a/.changeset/slow-beds-grab.md b/.changeset/slow-beds-grab.md new file mode 100644 index 000000000..52c086c4b --- /dev/null +++ b/.changeset/slow-beds-grab.md @@ -0,0 +1,5 @@ +--- +"@headstartwp/next": patch +--- + +Fix bug with preview mode not being handled properly. Fixes #932 diff --git a/package-lock.json b/package-lock.json index 5c9f3e2ad..2c0720628 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6533,9 +6533,9 @@ } }, "node_modules/@next/env": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.7.tgz", - "integrity": "sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==", + "version": "15.5.9", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz", + "integrity": "sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -25113,12 +25113,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.7.tgz", - "integrity": "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==", + "version": "15.5.9", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.9.tgz", + "integrity": "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==", "license": "MIT", "dependencies": { - "@next/env": "15.5.7", + "@next/env": "15.5.9", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", @@ -36306,7 +36306,7 @@ "@linaria/core": "^6.2.0", "@linaria/react": "^6.2.1", "clsx": "^1.1.1", - "next": "^15.5.7", + "next": "^15.5.9", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", @@ -36344,7 +36344,7 @@ "@linaria/core": "^6.2.0", "@linaria/react": "^6.2.1", "clsx": "^1.1.1", - "next": "^15.5.7", + "next": "^15.5.9", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", @@ -36369,7 +36369,7 @@ "dependencies": { "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1", - "next": "^15.5.7", + "next": "^15.5.9", "react": "^18", "react-dom": "^18" }, @@ -36667,7 +36667,7 @@ "@linaria/core": "^6.2.0", "@linaria/react": "^6.2.1", "clsx": "^1.1.1", - "next": "^15.5.7", + "next": "^15.5.9", "nprogress": "^0.2.0", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -36696,7 +36696,7 @@ "@10up/next-redis-cache-provider": "^2.0.0", "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1", - "next": "^15.5.7", + "next": "^15.5.9", "react": "^18", "react-dom": "^18" }, @@ -36761,7 +36761,7 @@ "dependencies": { "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1", - "next": "^15.5.7", + "next": "^15.5.9", "react": "^18", "react-dom": "^18" }, @@ -37363,7 +37363,7 @@ "@headstartwp/core": "^1.6.0", "@headstartwp/epio-search": "file:../epio-search", "@headstartwp/next": "^1.5.1", - "next": "^15.5.7", + "next": "^15.5.9", "react": "^18", "react-dom": "^18" }, @@ -37416,6 +37416,13 @@ "resolved": "test-projects/epio-search", "link": true }, + "test-projects/wp-nextjs-epio/node_modules/@next/env": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", + "dev": true, + "license": "MIT" + }, "test-projects/wp-nextjs-epio/node_modules/@next/eslint-plugin-next": { "version": "15.5.7", "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.7.tgz", @@ -37447,13 +37454,6 @@ "react-dom": "^18" } }, - "test-projects/wp-nextjs-epio/node_modules/@typescript-eslint/parser/node_modules/@next/env": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.33.tgz", - "integrity": "sha512-CgVHNZ1fRIlxkLhIX22flAZI/HmpDaZ8vwyJ/B0SDPTBuLZ1PJ+DWMjCHhqnExfmSQzA/PbZi8OAc7PAq2w9IA==", - "dev": true, - "license": "MIT" - }, "test-projects/wp-nextjs-epio/node_modules/@typescript-eslint/parser/node_modules/@next/swc-darwin-arm64": { "version": "14.2.33", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", @@ -37602,13 +37602,13 @@ } }, "test-projects/wp-nextjs-epio/node_modules/@typescript-eslint/parser/node_modules/next": { - "version": "14.2.33", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.33.tgz", - "integrity": "sha512-GiKHLsD00t4ACm1p00VgrI0rUFAC9cRDGReKyERlM57aeEZkOQGcZTpIbsGn0b562FTPJWmYfKwplfO9EaT6ng==", + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", "dev": true, "license": "MIT", "dependencies": { - "@next/env": "14.2.33", + "@next/env": "14.2.35", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", @@ -37941,7 +37941,7 @@ "@headstartwp/component-library": "*", "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1", - "next": "^15.5.7", + "next": "^15.5.9", "react": "^18", "react-dom": "^18" }, diff --git a/package.json b/package.json index 84a4c4d29..7ce513765 100644 --- a/package.json +++ b/package.json @@ -84,4 +84,4 @@ "turbo-windows-arm64": "^2.0.3" }, "packageManager": "npm@10.5.0" -} +} \ No newline at end of file diff --git a/packages/next/src/rsc/actions/preview.ts b/packages/next/src/rsc/actions/preview.ts index a8cfdb036..06361a9d7 100644 --- a/packages/next/src/rsc/actions/preview.ts +++ b/packages/next/src/rsc/actions/preview.ts @@ -7,8 +7,8 @@ import { COOKIE_NAME } from '../handlers/previewRouteHandler'; export async function disableDraftMode() { const headersObject = await headers(); const currentUrl = headersObject.get('x-headstartwp-current-url') ?? '/'; - const { disable } = await draftMode(); - await disable(); + const draft = await draftMode(); + await draft.disable(); const cookiesObject = await cookies(); cookiesObject.delete(COOKIE_NAME); redirect(currentUrl); diff --git a/packages/next/src/rsc/data/queries/__tests__/queryPost.ts b/packages/next/src/rsc/data/queries/__tests__/queryPost.ts index 5adabfa08..712e930bf 100644 --- a/packages/next/src/rsc/data/queries/__tests__/queryPost.ts +++ b/packages/next/src/rsc/data/queries/__tests__/queryPost.ts @@ -5,7 +5,7 @@ import { queryPost } from '../queryPost'; import { COOKIE_NAME } from '../../../handlers/previewRouteHandler'; jest.mock('next/headers', () => ({ - draftMode: jest.fn(() => ({ isEnabled: false })), + draftMode: jest.fn(() => ({ isEnabled: false, disable: jest.fn() })), cookies: jest.fn(() => ({ get: jest.fn(), has: jest.fn(), @@ -67,7 +67,7 @@ describe('queryPosts', () => { // set cookies // @ts-expect-error - nextHeaders.draftMode.mockReturnValueOnce({ isEnabled: true }); + nextHeaders.draftMode.mockReturnValueOnce({ isEnabled: true, disable: jest.fn() }); const previewDataPayload = JSON.stringify({ id: DRAFT_POST_ID, @@ -93,7 +93,8 @@ describe('queryPosts', () => { }); expect(nextHeaders.draftMode).toHaveBeenCalled(); - expect(nextHeaders.draftMode).toHaveReturnedWith({ isEnabled: true }); + const draftModeResult = nextHeaders.draftMode.mock.results.at(-1)?.value; + expect(draftModeResult?.isEnabled).toBe(true); expect(nextHeaders.cookies).toHaveBeenCalled(); expect(nextHeaders.cookies().has).toHaveBeenCalledWith(COOKIE_NAME); expect(nextHeaders.cookies().get).toHaveReturnedWith({ diff --git a/packages/next/src/rsc/data/queries/queryPost.ts b/packages/next/src/rsc/data/queries/queryPost.ts index 17774042f..24aa1a7dc 100644 --- a/packages/next/src/rsc/data/queries/queryPost.ts +++ b/packages/next/src/rsc/data/queries/queryPost.ts @@ -28,10 +28,10 @@ export async function queryPost< const { config, handleError, ...query } = prepareQuery
(nextQuery, _config); try { - const { isEnabled, disable } = await draftMode(); + const draft = await draftMode(); const cookiesObject = await cookies(); - if (isEnabled) { + if (draft.isEnabled) { // the cookie will only exist for the previewed path if (cookiesObject.has(COOKIE_NAME)) { const previewData: PreviewData = JSON.parse( @@ -50,7 +50,7 @@ export async function queryPost< } } else { // if draft mode was enabled but no preview cookie was found, disable draft mode - await disable(); + await draft.disable(); } } diff --git a/projects/wp-multisite-i18n-nextjs/package.json b/projects/wp-multisite-i18n-nextjs/package.json index 301fb71f4..dfb43e63f 100644 --- a/projects/wp-multisite-i18n-nextjs/package.json +++ b/projects/wp-multisite-i18n-nextjs/package.json @@ -19,7 +19,7 @@ "@linaria/core": "^6.2.0", "@linaria/react": "^6.2.1", "clsx": "^1.1.1", - "next": "^15.5.7", + "next": "^15.5.9", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", diff --git a/projects/wp-multisite-nextjs-app/package.json b/projects/wp-multisite-nextjs-app/package.json index a75fbcd6e..bee42ccdd 100644 --- a/projects/wp-multisite-nextjs-app/package.json +++ b/projects/wp-multisite-nextjs-app/package.json @@ -11,7 +11,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "^15.5.7", + "next": "^15.5.9", "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1" }, diff --git a/projects/wp-multisite-nextjs/package.json b/projects/wp-multisite-nextjs/package.json index 1a8da3297..a48ad43ea 100644 --- a/projects/wp-multisite-nextjs/package.json +++ b/projects/wp-multisite-nextjs/package.json @@ -19,7 +19,7 @@ "@linaria/core": "^6.2.0", "@linaria/react": "^6.2.1", "clsx": "^1.1.1", - "next": "^15.5.7", + "next": "^15.5.9", "nprogress": "^0.2.0", "prop-types": "^15.7.2", "react": "^18.2.0", diff --git a/projects/wp-nextjs-app/package.json b/projects/wp-nextjs-app/package.json index 1377600df..93b431dbb 100644 --- a/projects/wp-nextjs-app/package.json +++ b/projects/wp-nextjs-app/package.json @@ -16,7 +16,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "^15.5.7", + "next": "^15.5.9", "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1", "@10up/next-redis-cache-provider": "^2.0.0" diff --git a/projects/wp-nextjs/package.json b/projects/wp-nextjs/package.json index ed2186280..c7295c09a 100644 --- a/projects/wp-nextjs/package.json +++ b/projects/wp-nextjs/package.json @@ -21,7 +21,7 @@ "@linaria/core": "^6.2.0", "@linaria/react": "^6.2.1", "clsx": "^1.1.1", - "next": "^15.5.7", + "next": "^15.5.9", "nprogress": "^0.2.0", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/projects/wp-polylang-nextjs-app/package.json b/projects/wp-polylang-nextjs-app/package.json index 771b40058..876fec832 100644 --- a/projects/wp-polylang-nextjs-app/package.json +++ b/projects/wp-polylang-nextjs-app/package.json @@ -11,7 +11,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "^15.5.7", + "next": "^15.5.9", "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1" }, diff --git a/test-projects/wp-nextjs-epio/package.json b/test-projects/wp-nextjs-epio/package.json index 006e886a6..df952df67 100644 --- a/test-projects/wp-nextjs-epio/package.json +++ b/test-projects/wp-nextjs-epio/package.json @@ -11,7 +11,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "^15.5.7", + "next": "^15.5.9", "@headstartwp/core": "^1.6.0", "@headstartwp/next": "^1.5.1", "@headstartwp/epio-search": "file:../epio-search" diff --git a/test-projects/wp-nextjs-universal-blocks/package.json b/test-projects/wp-nextjs-universal-blocks/package.json index c1e0b06ed..e57986f4c 100644 --- a/test-projects/wp-nextjs-universal-blocks/package.json +++ b/test-projects/wp-nextjs-universal-blocks/package.json @@ -16,7 +16,7 @@ "dependencies": { "react": "^18", "react-dom": "^18", - "next": "^15.5.7", + "next": "^15.5.9", "@headstartwp/component-library": "*", "@headstartwp/block-primitives": "0.1.0", "@headstartwp/core": "^1.6.0",