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..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 @@ -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,29 @@ 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(Object.values(result.graphql.variables).every((value) => value !== undefined)).toBe( + true + ); + 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..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,16 @@ 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) + ); +} + /** * Client for interacting with the DotCMS Page API. * Provides methods to retrieve and manipulate pages. @@ -160,6 +170,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 +214,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 +250,7 @@ export class PageClient extends BaseApiClient { throw new DotErrorPage(message, status, code, undefined, { query: completeQuery, - variables: requestVariables + variables: responseVariables }); } } @@ -262,7 +273,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 +285,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 +301,7 @@ export class PageClient extends BaseApiClient { error.status, 'UNKNOWN', error, - { query: completeQuery, variables: requestVariables } + { query: completeQuery, variables: responseVariables } ); } @@ -299,7 +310,7 @@ export class PageClient extends BaseApiClient { 500, 'UNKNOWN', undefined, - { query: completeQuery, variables: requestVariables } + { query: completeQuery, variables: responseVariables } ); } }