UNPKG

@builder.io/sdk

Version:

This SDK is largely a wrapper over our [Content API](https://www.builder.io/c/docs/content-api)

952 lines 60.8 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var builder_class_1 = require("./builder.class"); var observable_class_1 = require("./classes/observable.class"); describe('Builder', function () { test('trustedHosts', function () { expect(builder_class_1.Builder.isTrustedHost('localhost')).toBe(true); expect(builder_class_1.Builder.isTrustedHost('builder.io')).toBe(true); expect(builder_class_1.Builder.isTrustedHost('beta.builder.io')).toBe(true); expect(builder_class_1.Builder.isTrustedHost('qa.builder.io')).toBe(true); expect(builder_class_1.Builder.isTrustedHost('123-review-build.beta.builder.io')).toBe(true); }); test('arbitrary builder.io subdomains', function () { expect(builder_class_1.Builder.isTrustedHost('cdn.builder.io')).toBe(false); expect(builder_class_1.Builder.isTrustedHost('foo.builder.io')).toBe(false); expect(builder_class_1.Builder.isTrustedHost('evildomainbeta.builder.io')).toBe(false); }); test('add trusted host', function () { expect(builder_class_1.Builder.isTrustedHost('example.com')).toBe(false); builder_class_1.Builder.registerTrustedHost('example.com'); expect(builder_class_1.Builder.isTrustedHost('example.com')).toBe(true); }); }); describe('serializeIncludingFunctions', function () { test('serializes functions in inputs', function () { var input = { name: 'TestComponent', inputs: [ { name: 'text', type: 'string', onChange: function (value) { return value.toUpperCase(); }, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toContain('return value.toUpperCase()'); }); test('serializes arrow functions in inputs', function () { // Using eval and template literal to prevent TypeScript from adding parens var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); var input = { name: 'ArrowComponent', inputs: [ { name: 'number', type: 'number', onChange: function (value) { return value * 2; }, showIf: fn, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toContain('value * 2'); expect(result.inputs[0].showIf).toBe("return (e => !0 === e.get(\"isABTest\")).apply(this, arguments)"); }); test('does not modify non-function properties', function () { var input = { name: 'MixedComponent', inputs: [ { name: 'text', type: 'string', defaultValue: 'hello', }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(result).toEqual(input); }); test('handles multiple inputs with mixed properties', function () { var input = { name: 'ComplexComponent', inputs: [ { name: 'text', type: 'string', onChange: function (value) { return value.trim(); }, }, { name: 'number', type: 'number', defaultValue: 42, }, { name: 'options', type: 'string', onChange: function (value) { return value.map(function (v) { return v.toLowerCase(); }); }, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toContain('value.trim()'); expect(result.inputs[1]).toEqual(input.inputs[1]); expect(typeof result.inputs[2].onChange).toBe('string'); expect(result.inputs[2].onChange).toContain('v.toLowerCase()'); }); test('serializes arrow functions with non-parenthesized args in inputs', function () { // Using eval and template literal to prevent TypeScript from adding parens var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); var input = { name: 'onChangeComponent', inputs: [ { name: 'number', type: 'number', // @ts-expect-error required for this test onChange: function (value) { return value * 2; }, showIf: fn, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toBe("return ((value) => value * 2).apply(this, arguments)"); }); test('serializes functions with parenthesized args in inputs', function () { // Using eval and template literal to prevent TypeScript from adding parens var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); var input = { name: 'onChangeComponent', inputs: [ { name: 'number', type: 'number', onChange: function (value) { return value * 2; }, showIf: fn, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toBe("return (function(value) {\n return value * 2;\n }).apply(this, arguments)"); }); test('serializes async functions with parenthesized args in inputs', function () { // Using eval and template literal to prevent TypeScript from adding parens var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); var input = { name: 'AsyncOnChangeComponent', inputs: [ { name: 'number', type: 'number', onChange: function (value) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, value * 2]; }); }); }, showIf: fn, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toBe("return (async function(value) {\n return value * 2;\n }).apply(this, arguments)"); }); test('serializes async arrow functions with parenthesized args in inputs', function () { // Using eval and template literal to prevent TypeScript from adding parens var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); var input = { name: 'AsyncOnChangeComponent', inputs: [ { name: 'number', type: 'number', onChange: function (value) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, value * 2]; }); }); }, showIf: fn, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toBe('return (async (value) => value * 2).apply(this, arguments)'); }); test('serializes async arrow functions without parenthesized args in inputs', function () { // Using eval and template literal to prevent TypeScript from adding parens var fn = eval("(".concat("e => !0 === e.get(\"isABTest\")", ")")); var input = { name: 'AsyncOnChangeComponent', inputs: [ { name: 'number', type: 'number', // @ts-expect-error onChange: function (value) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, value * 2]; }); }); }, showIf: fn, }, ], }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input); expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toBe('return (async (value) => value * 2).apply(this, arguments)'); }); test('does not serialize onSave function when isForPlugin is true', function () { var onSaveFn = function (data) { return data; }; var input = { name: 'PluginComponent', inputs: [ { name: 'text', type: 'string', onChange: function (value) { return value.toUpperCase(); }, }, ], onSave: onSaveFn, }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input, true); // Check that onChange was serialized to a string expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toContain('value.toUpperCase()'); // Check that onSave was preserved as a function expect(typeof result.onSave).toBe('function'); expect(result.onSave).toBe(onSaveFn); }); test('serializes all functions when isForPlugin is false', function () { var onSaveFn = function (data) { return data; }; var input = { name: 'PluginComponent', inputs: [ { name: 'text', type: 'string', onChange: function (value) { return value.toUpperCase(); }, }, ], onSave: onSaveFn, }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input, false); // Check that all functions were serialized to strings expect(typeof result.inputs[0].onChange).toBe('string'); expect(result.inputs[0].onChange).toContain('value.toUpperCase()'); expect(typeof result.onSave).toBe('string'); }); test('serializes top-level functions when isForPlugin is true except onSave', function () { var onSaveFn = function (data) { return data; }; var validateFn = function (data) { return data.isValid; }; var input = { name: 'PluginComponent', validate: validateFn, onSave: onSaveFn, }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input, true); // Check that validate was serialized expect(typeof result.validate).toBe('string'); expect(result.validate).toContain('return data.isValid'); // Check that onSave was preserved as a function expect(typeof result.onSave).toBe('function'); expect(result.onSave).toBe(onSaveFn); }); test('preserves onSave function in both input and output when isForPlugin is true', function () { var onSaveFn = function (data) { console.log('Saving data'); return (data.modified = true); }; var input = { name: 'PluginWithOnSave', onSave: onSaveFn, }; var result = builder_class_1.Builder['serializeIncludingFunctions'](input, true); // Verify the function is the same reference expect(result.onSave).toBe(input.onSave); // Verify behavior is preserved by calling the function var testData = { value: 'test' }; result.onSave(testData); expect(testData.modified).toBe(true); }); }); describe('prepareComponentSpecToSend', function () { test('removes class property and serializes functions in inputs', function () { var _a, _b; var input = { name: 'TestComponent', class: /** @class */ (function () { function TestClass() { } return TestClass; }()), inputs: [ { name: 'text', type: 'string', onChange: function (value) { return value.toUpperCase(); }, }, ], }; var result = builder_class_1.Builder['prepareComponentSpecToSend'](input); expect(result.class).toBeUndefined(); expect(typeof ((_a = result.inputs) === null || _a === void 0 ? void 0 : _a[0].onChange)).toBe('string'); expect((_b = result.inputs) === null || _b === void 0 ? void 0 : _b[0].onChange).toContain('value.toUpperCase()'); }); test('preserves other properties', function () { var _a, _b, _c, _d, _e; var input = { name: 'ComplexComponent', class: /** @class */ (function () { function ComplexClass() { } return ComplexClass; }()), inputs: [ { name: 'text', type: 'string', defaultValue: 'hello', onChange: function (value) { return value.trim(); }, }, { name: 'number', type: 'number', defaultValue: 42, }, ], }; var result = builder_class_1.Builder['prepareComponentSpecToSend'](input); expect(result.class).toBeUndefined(); expect(result.name).toBe('ComplexComponent'); expect((_a = result.inputs) === null || _a === void 0 ? void 0 : _a.length).toBe(2); expect(typeof ((_b = result.inputs) === null || _b === void 0 ? void 0 : _b[0].onChange)).toBe('string'); expect((_c = result.inputs) === null || _c === void 0 ? void 0 : _c[0].onChange).toContain('value.trim()'); expect((_d = result.inputs) === null || _d === void 0 ? void 0 : _d[0].defaultValue).toBe('hello'); expect((_e = result.inputs) === null || _e === void 0 ? void 0 : _e[1]).toEqual(input.inputs[1]); }); }); describe('flushGetContentQueue', function () { var _a; var API_KEY = '25608a566fbb654ea959c1b1729e370d'; var MODEL = 'page'; var AUTH_TOKEN = '82202e99f9fb4ed1da5940f7fa191e72'; var OMIT = 'data.blocks'; var builder; var codegenOrQueryApiResult = (_a = {}, _a[MODEL] = [ { lastUpdatedBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2', folders: [], data: { themeId: false, title: 'test', blocks: [ { '@type': '@builder.io/sdk:Element', '@version': 2, id: 'builder-370f0829496c41d48b1fb77c1b4ea2b2', component: { name: 'Text', options: { text: 'A is selected', }, }, responsiveStyles: { large: { display: 'flex', flexDirection: 'column', position: 'relative', flexShrink: '0', boxSizing: 'border-box', marginTop: '20px', lineHeight: 'normal', height: 'auto', }, }, }, { id: 'builder-pixel-lrwo8ns32dg', '@type': '@builder.io/sdk:Element', tagName: 'img', properties: { src: 'https://cdn.builder.io/api/v1/pixel?apiKey=5271c255f7824802a30f12bdad90e347', 'aria-hidden': 'true', alt: '', role: 'presentation', width: '0', height: '0', }, responsiveStyles: { large: { height: '0', width: '0', display: 'inline-block', opacity: '0', overflow: 'hidden', pointerEvents: 'none', }, }, }, ], url: '/test', state: { deviceSize: 'large', location: { pathname: '/test', path: ['test'], query: {}, }, }, }, modelId: '12518e35051e42dda999e91f1162f0bd', query: [ { '@type': '@builder.io/core:Query', property: 'urlPath', value: '/test', operator: 'is', }, { '@type': '@builder.io/core:Query', property: 'name', value: ['a'], operator: 'is', }, ], published: 'published', firstPublished: 1725450385400, testRatio: 1, lastUpdated: 1725451287436, createdDate: 1725450170945, createdBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2', meta: { lastPreviewUrl: 'http://localhost:5173/test?builder.space=5271c255f7824802a30f12bdad90e347&builder.user.permissions=read%2Ccreate%2Cpublish%2CeditCode%2CeditDesigns%2Cadmin%2CeditLayouts%2CeditLayers&builder.user.role.name=Admin&builder.user.role.id=admin&builder.cachebust=true&builder.preview=page&builder.noCache=true&builder.allowTextEdit=true&__builder_editing__=true&builder.overrides.page=ad03bbebf34b49a9912aeae629571db7&builder.overrides.ad03bbebf34b49a9912aeae629571db7=ad03bbebf34b49a9912aeae629571db7&builder.overrides.page:/test=ad03bbebf34b49a9912aeae629571db7&builder.options.locale=Default', kind: 'page', hasLinks: false, }, variations: {}, name: 'test', id: 'ad03bbebf34b49a9912aeae629571db7', rev: '9inkgroan7l', }, ], _a); var contentApiResult = { results: [ { lastUpdatedBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2', folders: [], data: { themeId: false, title: 'test', blocks: [], url: '/test', state: { deviceSize: 'large', location: { path: '', query: {}, }, }, }, modelId: '12518e35051e42dda999e91f1162f0bd', query: [ { '@type': '@builder.io/core:Query', property: 'urlPath', value: '/test', operator: 'is', }, { '@type': '@builder.io/core:Query', property: 'name', value: ['a'], operator: 'is', }, ], published: 'published', firstPublished: 1725450385400, testRatio: 1, lastUpdated: 1725451287436, createdDate: 1725450170945, createdBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2', meta: { lastPreviewUrl: 'http://localhost:5173/test?builder.space=5271c255f7824802a30f12bdad90e347&builder.user.permissions=read%2Ccreate%2Cpublish%2CeditCode%2CeditDesigns%2Cadmin%2CeditLayouts%2CeditLayers&builder.user.role.name=Admin&builder.user.role.id=admin&builder.cachebust=true&builder.preview=page&builder.noCache=true&builder.allowTextEdit=true&__builder_editing__=true&builder.overrides.page=ad03bbebf34b49a9912aeae629571db7&builder.overrides.ad03bbebf34b49a9912aeae629571db7=ad03bbebf34b49a9912aeae629571db7&builder.overrides.page:/test=ad03bbebf34b49a9912aeae629571db7&builder.options.locale=Default', kind: 'page', hasLinks: false, }, variations: {}, name: 'test', id: 'ad03bbebf34b49a9912aeae629571db7', rev: 'kvr9rrrklws', }, { createdDate: 1725363956284, data: { title: 'Builder + React Demo Page', blocks: [], url: ['/builder-demo'], state: { deviceSize: 'large', location: { path: '', query: {}, }, }, }, modelId: '12518e35051e42dda999e91f1162f0bd', query: [ { property: 'urlPath', value: ['/builder-demo'], operator: 'is', }, ], name: 'Builder + React Demo Page', id: '87853dcacee64c4a9b573faa46823e61', published: 'published', meta: {}, rev: 'kvr9rrrklws', }, { lastUpdatedBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2', folders: [], data: { themeId: false, title: 'Test Page', blocks: [], url: '/test-page', state: { deviceSize: 'large', location: { path: '', query: {}, }, }, }, modelId: '12518e35051e42dda999e91f1162f0bd', query: [ { '@type': '@builder.io/core:Query', property: 'urlPath', value: '/test-page', operator: 'is', }, ], published: 'published', firstPublished: 1722527310201, testRatio: 1, lastUpdated: 1722528875919, createdDate: 1722527254768, createdBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2', meta: { kind: 'page', lastPreviewUrl: 'http://localhost:3000/test-page?builder.space=5271c255f7824802a30f12bdad90e347&builder.user.permissions=read%2Ccreate%2Cpublish%2CeditCode%2CeditDesigns%2Cadmin%2CeditLayouts%2CeditLayers&builder.user.role.name=Admin&builder.user.role.id=admin&builder.cachebust=true&builder.preview=page&builder.noCache=true&builder.allowTextEdit=true&__builder_editing__=true&builder.overrides.page=e53863a02641455294ac59ab7e2be643&builder.overrides.e53863a02641455294ac59ab7e2be643=e53863a02641455294ac59ab7e2be643&builder.overrides.page:/test-page=e53863a02641455294ac59ab7e2be643', hasLinks: false, }, variations: {}, name: 'Test Page', id: 'e53863a02641455294ac59ab7e2be643', rev: 'kvr9rrrklws', }, ], }; beforeEach(function () { builder = new builder_class_1.Builder(API_KEY, undefined, undefined, false, AUTH_TOKEN, 'v3'); var builderSubject = new observable_class_1.BehaviorSubject([]); builderSubject.next = jest.fn(function () { }); builder.observersByKey[MODEL] = builderSubject; builder['makeFetchApiCall'] = jest.fn(function (url) { var result = url.includes('/codegen/') || url.includes('/query/') ? codegenOrQueryApiResult : contentApiResult; return Promise.resolve({ json: function () { return Promise.resolve(result); }, }); }); }); test('throws error if apiKey is not defined', function () { builder = new builder_class_1.Builder(); try { builder['flushGetContentQueue'](); } catch (err) { expect(err.message).toBe('Fetching content failed, expected apiKey to be defined instead got: null'); } }); test('throws error if apiVersion is not v3', function () { builder = new builder_class_1.Builder(API_KEY, undefined, undefined, false, AUTH_TOKEN, 'v1'); try { builder['flushGetContentQueue'](); } catch (err) { expect(err.message).toBe("Invalid apiVersion: expected 'v3', received 'v1'"); } }); test("hits codegen url when format is 'solid'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'solid'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v1/codegen/".concat(API_KEY, "/").concat(MODEL, "?omit=").concat(OMIT, "&apiKey=").concat(API_KEY, "&fields=data&format=solid&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&options.").concat(MODEL, ".model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits codegen url when format is 'react'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'react'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v1/codegen/".concat(API_KEY, "/").concat(MODEL, "?omit=").concat(OMIT, "&apiKey=").concat(API_KEY, "&fields=data&format=react&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&options.").concat(MODEL, ".model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits query url when apiEndpoint is undefined and format is 'html'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'html'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/query/".concat(API_KEY, "/").concat(MODEL, "?omit=").concat(OMIT, "&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&options.").concat(MODEL, ".model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits content url when apiEndpoint is 'content' and format is 'html'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'html'; builder.apiEndpoint = 'content'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', limit: 10, }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) })); expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1])); expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits query url when apiEndpoint is undefined and format is 'amp'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'amp'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/query/".concat(API_KEY, "/").concat(MODEL, "?omit=").concat(OMIT, "&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&options.").concat(MODEL, ".model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits content url when apiEndpoint is 'content' and format is 'amp'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'amp'; builder.apiEndpoint = 'content'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', limit: 10, }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) })); expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1])); expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits query url when apiEndpoint is undefined and format is 'email'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'email'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/query/".concat(API_KEY, "/").concat(MODEL, "?omit=").concat(OMIT, "&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&options.").concat(MODEL, ".model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits query url when apiEndpoint is undefined and format is 'email' and url is passed instead of userAttributes", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'email'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, url: '/test-page', omit: OMIT, fields: 'data', }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/query/".concat(API_KEY, "/").concat(MODEL, "?omit=").concat(OMIT, "&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22urlPath%22%3A%22%2Ftest-page%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&options.").concat(MODEL, ".model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits content url when apiEndpoint is 'content' and format is 'email'", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'email'; builder.apiEndpoint = 'content'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, userAttributes: { respectScheduling: true }, omit: OMIT, fields: 'data', limit: 10, }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) })); expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1])); expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22respectScheduling%22%3Atrue%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); return [2 /*return*/]; } }); }); }); test("hits content url when apiEndpoint is 'content' and format is 'email' and url is passed instead of userAttributes", function () { return __awaiter(void 0, void 0, void 0, function () { var expectedFormat, result, observerNextMock; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: expectedFormat = 'email'; builder.apiEndpoint = 'content'; return [4 /*yield*/, builder['flushGetContentQueue'](true, [ { model: MODEL, format: expectedFormat, key: MODEL, url: '/test-page', omit: OMIT, fields: 'data', limit: 10, }, ])]; case 1: result = _b.sent(); observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next; expect(observerNextMock).toBeCalledTimes(1); expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) })); expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1])); expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) })); expect(builder['makeFetchApiCall']).toBeCalledTimes(1); expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(MODEL, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22urlPath%22%3A%22%2Ftest-page%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=10&model=%22").concat(MODEL, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } }); retur