@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
JavaScript
"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