From f018c0e50edff783117930c6e7727ecebdc02f0c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:47:47 +0000 Subject: [PATCH 1/3] Initial plan From 4b1143661d0072adaa1e2c1187c6428998195841 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:56:38 +0000 Subject: [PATCH 2/3] fix: omit undefined page graphql vars --- .../src/lib/client/page/page-api.spec.ts | 36 ++++++++++++------- .../client/src/lib/client/page/page-api.ts | 19 ++++++---- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts b/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts index da663732c922..709540d3681d 100644 --- a/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts +++ b/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts @@ -169,10 +169,7 @@ describe('PageClient', () => { mode: 'LIVE', languageId: '1', fireRules: false, - siteId: 'test-site', - personaId: undefined, - publishDate: undefined, - variantName: undefined + siteId: 'test-site' } } }); @@ -355,10 +352,7 @@ describe('PageClient', () => { mode: 'LIVE', languageId: '1', fireRules: false, - siteId: 'test-site', - personaId: undefined, - publishDate: undefined, - variantName: undefined + siteId: 'test-site' }); } } @@ -591,7 +585,6 @@ describe('PageClient', () => { fireRules: false, siteId: 'test-site', personaId: 'test-persona', - publishDate: undefined, variantName: 'test-variant', customVar: 'customValue' }); @@ -920,10 +913,7 @@ describe('PageClient', () => { mode: 'LIVE', languageId: '1', fireRules: false, - siteId: 'test-site', - personaId: undefined, - publishDate: undefined, - variantName: undefined + siteId: 'test-site' }); }); @@ -1222,6 +1212,26 @@ describe('PageClient', () => { expect(result.graphql.variables).toEqual(getRequestBody().variables); }); + it('omits undefined optional variables from the returned graphql.variables', async () => { + const pageClient = new PageClient( + validConfig, + requestOptions, + new FetchHttpClient() + ); + const result = await pageClient.get('/home'); + + expect(result.graphql.variables).toEqual({ + url: '/home', + mode: 'LIVE', + languageId: '1', + fireRules: false, + siteId: 'test-site' + }); + expect(JSON.parse(JSON.stringify(result.graphql.variables))).toEqual( + result.graphql.variables + ); + }); + it('result.errors is undefined when response has no errors', async () => { const pageClient = new PageClient( validConfig, diff --git a/core-web/libs/sdk/client/src/lib/client/page/page-api.ts b/core-web/libs/sdk/client/src/lib/client/page/page-api.ts index 743ef252f143..6f74998a7a86 100644 --- a/core-web/libs/sdk/client/src/lib/client/page/page-api.ts +++ b/core-web/libs/sdk/client/src/lib/client/page/page-api.ts @@ -31,6 +31,12 @@ function logVerboseError( ); } +function omitUndefinedValues(variables: Record): Record { + return Object.fromEntries( + Object.entries(variables).filter(([, value]) => value !== undefined) + ); +} + /** * Client for interacting with the DotCMS Page API. * Provides methods to retrieve and manipulate pages. @@ -160,6 +166,7 @@ export class PageClient extends BaseApiClient { const requestHeaders = this.requestOptions.headers; const requestBody = JSON.stringify({ query: completeQuery, variables: requestVariables }); + const responseVariables = omitUndefinedValues(requestVariables); try { const response = await fetchGraphQL({ @@ -203,7 +210,7 @@ export class PageClient extends BaseApiClient { message: firstError?.message ?? 'GraphQL query failed', data: response.errors }), - { query: completeQuery, variables: requestVariables } + { query: completeQuery, variables: responseVariables } ); } @@ -239,7 +246,7 @@ export class PageClient extends BaseApiClient { throw new DotErrorPage(message, status, code, undefined, { query: completeQuery, - variables: requestVariables + variables: responseVariables }); } } @@ -262,7 +269,7 @@ export class PageClient extends BaseApiClient { message: `Page '${normalizedUrl}' was not found`, data: response.errors }), - { query: completeQuery, variables: requestVariables } + { query: completeQuery, variables: responseVariables } ); } @@ -274,7 +281,7 @@ export class PageClient extends BaseApiClient { content: contentResponse, graphql: { query: completeQuery, - variables: requestVariables + variables: responseVariables }, errors: response.errors?.length ? response.errors : undefined, ...(styleEditorSchemas?.length && { styleEditorSchemas }) @@ -290,7 +297,7 @@ export class PageClient extends BaseApiClient { error.status, 'UNKNOWN', error, - { query: completeQuery, variables: requestVariables } + { query: completeQuery, variables: responseVariables } ); } @@ -299,7 +306,7 @@ export class PageClient extends BaseApiClient { 500, 'UNKNOWN', undefined, - { query: completeQuery, variables: requestVariables } + { query: completeQuery, variables: responseVariables } ); } } From d29e4a9cbc443ac7ea59339323903d332966732b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Jun 2026 17:57:27 +0000 Subject: [PATCH 3/3] docs: clarify page graphql variable sanitizing --- core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts | 3 +++ core-web/libs/sdk/client/src/lib/client/page/page-api.ts | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts b/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts index 709540d3681d..d066cf4735f9 100644 --- a/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts +++ b/core-web/libs/sdk/client/src/lib/client/page/page-api.spec.ts @@ -1227,6 +1227,9 @@ describe('PageClient', () => { fireRules: false, siteId: 'test-site' }); + expect(Object.values(result.graphql.variables).every((value) => value !== undefined)).toBe( + true + ); expect(JSON.parse(JSON.stringify(result.graphql.variables))).toEqual( result.graphql.variables ); diff --git a/core-web/libs/sdk/client/src/lib/client/page/page-api.ts b/core-web/libs/sdk/client/src/lib/client/page/page-api.ts index 6f74998a7a86..84adfef2aa99 100644 --- a/core-web/libs/sdk/client/src/lib/client/page/page-api.ts +++ b/core-web/libs/sdk/client/src/lib/client/page/page-api.ts @@ -31,6 +31,10 @@ function logVerboseError( ); } +/** + * Removes undefined values so returned GraphQL metadata stays JSON-serializable + * for consumers such as Next.js Pages Router. + */ function omitUndefinedValues(variables: Record): Record { return Object.fromEntries( Object.entries(variables).filter(([, value]) => value !== undefined)