From 6e92867029aa7f8b823256286a5d85e8f7ad4af3 Mon Sep 17 00:00:00 2001 From: Clyde Mendonca Date: Thu, 26 Jun 2025 14:53:39 +0530 Subject: [PATCH 1/2] fix[gen1][core]: ENG-9774 backported fix from v6.1.1 into v4 upgrade --- packages/core/CHANGELOG.md | 6 ++ packages/core/package.json | 2 +- packages/core/src/builder.class.test.ts | 133 ++++++++++++++++++++++++ packages/core/src/builder.class.ts | 7 +- 4 files changed, 144 insertions(+), 4 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 9cc86a74441..760509a50b9 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,11 @@ # @builder.io/sdk +## 4.0.4 + +### Patch Changes + +- Backported fix from v6.1.1: Corrected the conversion of query-objects with $-mongo-operators which are passed to builder.get() with apiEndpoint is "content" + ## 4.0.3 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index 94013a6cd4a..f4028b4fd71 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@builder.io/sdk", - "version": "4.0.3", + "version": "4.0.4", "unpkg": "./dist/index.browser.js", "main": "./dist/index.cjs.js", "module": "./dist/index.esm.js", diff --git a/packages/core/src/builder.class.test.ts b/packages/core/src/builder.class.test.ts index 80fe35d7f60..ef8bb84461e 100644 --- a/packages/core/src/builder.class.test.ts +++ b/packages/core/src/builder.class.test.ts @@ -615,4 +615,137 @@ describe('flushGetContentQueue', () => { { headers: { Authorization: `Bearer ${AUTH_TOKEN}` } } ); }); + + test('hits content url with query.id when id is passed in options.query', async () => { + const expectedModel = 'symbol'; + const expectedFormat = 'email'; + const expectedEntryId = '123'; + + const result = await builder['flushGetContentQueue'](true, [ + { + apiEndpoint: 'content', + model: expectedModel, + format: expectedFormat, + key: expectedModel, + omit: OMIT, + fields: 'data', + limit: 10, + entry: expectedEntryId, + query: { + id: expectedEntryId, + }, + }, + ]); + + expect(builder['makeFetchApiCall']).toBeCalledTimes(1); + expect(builder['makeFetchApiCall']).toBeCalledWith( + `https://cdn.builder.io/api/v3/content/${expectedModel}?omit=data.blocks&apiKey=${API_KEY}&fields=data&format=${expectedFormat}&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&limit=10&model=%22${expectedModel}%22&entry=%22123%22&enrich=true&query.id=%22${expectedEntryId}%22`, + { headers: { Authorization: `Bearer ${AUTH_TOKEN}` } } + ); + }); + + test('hits content url with query as the same object as the one passed in options.query if query contains $ mongo-operator', async () => { + const expectedModel = 'symbol'; + const expectedFormat = 'email'; + const expectedEntryId = '123'; + + const result = await builder['flushGetContentQueue'](true, [ + { + apiEndpoint: 'content', + model: expectedModel, + format: expectedFormat, + key: expectedModel, + omit: OMIT, + fields: 'data', + limit: 10, + entry: expectedEntryId, + query: { + data: { + id: '123', + }, + $or: [ + { + data: { + sourceUrl: '/c/docs/develop', + }, + }, + { + data: { + sourceUrl: 'https://www.builder.io' + '/c/docs/develop', + }, + }, + ], + }, + }, + ]); + + expect(builder['makeFetchApiCall']).toBeCalledTimes(1); + expect(builder['makeFetchApiCall']).toBeCalledWith( + `https://cdn.builder.io/api/v3/content/symbol?omit=data.blocks&apiKey=25608a566fbb654ea959c1b1729e370d&fields=data&format=email&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&limit=10&model=%22symbol%22&entry=%22123%22&enrich=true&query=%7B%22data%22%3A%7B%22id%22%3A%22123%22%7D%2C%22%24or%22%3A%5B%7B%22data%22%3A%7B%22sourceUrl%22%3A%22%2Fc%2Fdocs%2Fdevelop%22%7D%7D%2C%7B%22data%22%3A%7B%22sourceUrl%22%3A%22https%3A%2F%2Fwww.builder.io%2Fc%2Fdocs%2Fdevelop%22%7D%7D%5D%7D`, + { headers: { Authorization: `Bearer ${AUTH_TOKEN}` } } + ); + }); + + test('hits content url with query as the same object as the one passed in options.query if query contains nested $ mongo-operator', async () => { + const expectedModel = 'symbol'; + const expectedFormat = 'email'; + const expectedEntryId = '123'; + + const result = await builder['flushGetContentQueue'](true, [ + { + apiEndpoint: 'content', + model: expectedModel, + format: expectedFormat, + key: expectedModel, + omit: OMIT, + fields: 'data', + limit: 10, + entry: expectedEntryId, + query: { + data: { + sourceUrl: { $eq: '/c/docs/develop' }, + }, + }, + }, + ]); + + expect(builder['makeFetchApiCall']).toBeCalledTimes(1); + expect(builder['makeFetchApiCall']).toBeCalledWith( + `https://cdn.builder.io/api/v3/content/symbol?omit=data.blocks&apiKey=25608a566fbb654ea959c1b1729e370d&fields=data&format=email&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&limit=10&model=%22symbol%22&entry=%22123%22&enrich=true&query.data.sourceUrl=%7B%22%24eq%22%3A%22%2Fc%2Fdocs%2Fdevelop%22%7D`, + { headers: { Authorization: `Bearer ${AUTH_TOKEN}` } } + ); + }); + + test('hits content url with query as the flattened object as the one passed in options.query if query does not contain $ mongo-operator', async () => { + const expectedModel = 'symbol'; + const expectedFormat = 'email'; + const expectedEntryId = '123'; + + const result = await builder['flushGetContentQueue'](true, [ + { + apiEndpoint: 'content', + model: expectedModel, + format: expectedFormat, + key: expectedModel, + omit: OMIT, + fields: 'data', + limit: 10, + entry: expectedEntryId, + query: { + data: { + sourceUrl: '/c/docs/develop', + }, + name: { + fullName: 'John Doe', + }, + }, + }, + ]); + + expect(builder['makeFetchApiCall']).toBeCalledTimes(1); + expect(builder['makeFetchApiCall']).toBeCalledWith( + `https://cdn.builder.io/api/v3/content/symbol?omit=data.blocks&apiKey=25608a566fbb654ea959c1b1729e370d&fields=data&format=email&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&limit=10&model=%22symbol%22&entry=%22123%22&enrich=true&query.data.sourceUrl=%22%2Fc%2Fdocs%2Fdevelop%22&query.name.fullName=%22John%20Doe%22`, + { headers: { Authorization: `Bearer ${AUTH_TOKEN}` } } + ); + }); }); diff --git a/packages/core/src/builder.class.ts b/packages/core/src/builder.class.ts index c47829781ea..ee8a5ce03ea 100644 --- a/packages/core/src/builder.class.ts +++ b/packages/core/src/builder.class.ts @@ -2618,11 +2618,12 @@ export class Builder { if (!isApiCallForCodegen) { queryParams.enrich = true; if (queue[0].query) { - const flattened = this.flattenMongoQuery({ query: queue[0].query }); + delete queryParams.query; + const objectToFlatten = { query: queue[0].query }; + const flattened = this.flattenMongoQuery(objectToFlatten); for (const key in flattened) { - queryParams[key] = flattened[key]; + queryParams[key] = JSON.stringify(flattened[key]); } - delete queryParams.query; } } From e214862f17f2c4d670f21f5569fab42dec6a58b3 Mon Sep 17 00:00:00 2001 From: Clyde Mendonca Date: Thu, 26 Jun 2025 15:59:32 +0530 Subject: [PATCH 2/2] fix[gen1][core]: ENG-9774 change to builder.class.test.ts --- packages/core/src/builder.class.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/core/src/builder.class.test.ts b/packages/core/src/builder.class.test.ts index ef8bb84461e..d878af50bef 100644 --- a/packages/core/src/builder.class.test.ts +++ b/packages/core/src/builder.class.test.ts @@ -623,7 +623,6 @@ describe('flushGetContentQueue', () => { const result = await builder['flushGetContentQueue'](true, [ { - apiEndpoint: 'content', model: expectedModel, format: expectedFormat, key: expectedModel, @@ -651,7 +650,6 @@ describe('flushGetContentQueue', () => { const result = await builder['flushGetContentQueue'](true, [ { - apiEndpoint: 'content', model: expectedModel, format: expectedFormat, key: expectedModel, @@ -693,7 +691,6 @@ describe('flushGetContentQueue', () => { const result = await builder['flushGetContentQueue'](true, [ { - apiEndpoint: 'content', model: expectedModel, format: expectedFormat, key: expectedModel, @@ -723,7 +720,6 @@ describe('flushGetContentQueue', () => { const result = await builder['flushGetContentQueue'](true, [ { - apiEndpoint: 'content', model: expectedModel, format: expectedFormat, key: expectedModel,