UNPKG

@builder.io/sdk

Version:

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

1,488 lines 81.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);
    });
    test('trusted message origins', function () {
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'https://builder.io' })).toBe(true);
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'http://localhost:1234' })).toBe(true);
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'https://evil-builder.io.attacker.com' })).toBe(false);
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'https://notlocalhost:1234x' })).toBe(false);
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'javascript://builder.io' })).toBe(false);
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'not a URL' })).toBe(false);
        expect(builder_class_1.Builder.isTrustedHostForEvent({ origin: 'null' })).toBe(false);
    });
});
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('Component.group', function () {
    // If someone removes the `group?: string` field from the `Component` interface,
    // this typed literal will fail excess-property checking at `tsc` build time.
    var spec = {
        name: 'GroupedComponent',
        group: 'Steps',
    };
    test('is preserved by prepareComponentSpecToSend', function () {
        var result = builder_class_1.Builder['prepareComponentSpecToSend'](spec);
        expect(result.group).toBe('Steps');
    });
    test('is preserved on Builder.components after registerComponent', function () {
        var uniqueName = "GroupedComponent_".concat(Date.now(), "_").concat(Math.random());
        builder_class_1.Builder.registerComponent(function GroupedComponent() { }, {
            name: uniqueName,
            group: 'Steps',
        });
        var registered = builder_class_1.Builder.components.find(function (c) { return c.name === uniqueName; });
        expect(registered === null || registered === void 0 ? void 0 : registered.group).toBe('Steps');
    });
});
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) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with query.id when id is passed in options.query', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, expectedFormat, expectedEntryId, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'symbol';
                    expectedFormat = 'email';
                    expectedEntryId = '123';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder['flushGetContentQueue'](true, [
                            {
                                model: expectedModel,
                                format: expectedFormat,
                                key: expectedModel,
                                omit: OMIT,
                                fields: 'data',
                                limit: 10,
                                entry: expectedEntryId,
                                query: {
                                    id: expectedEntryId,
                                },
                            },
                        ])];
                case 1:
                    result = _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=data.blocks&apiKey=").concat(API_KEY, "&fields=data&format=").concat(expectedFormat, "&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=10&model=%22").concat(expectedModel, "%22&entry=%22123%22&query.id=%22").concat(expectedEntryId, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with query as the same object as the one passed in options.query if query contains $ mongo-operator', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, expectedFormat, expectedEntryId, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'symbol';
                    expectedFormat = 'email';
                    expectedEntryId = '123';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder['flushGetContentQueue'](true, [
                            {
                                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',
                                            },
                                        },
                                    ],
                                },
                            },
                        ])];
                case 1:
                    result = _a.sent();
                    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&includeRefs=true&limit=10&model=%22symbol%22&entry=%22123%22&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 ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with query as the same object as the one passed in options.query if query contains nested $ mongo-operator', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, expectedFormat, expectedEntryId, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'symbol';
                    expectedFormat = 'email';
                    expectedEntryId = '123';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder['flushGetContentQueue'](true, [
                            {
                                model: expectedModel,
                                format: expectedFormat,
                                key: expectedModel,
                                omit: OMIT,
                                fields: 'data',
                                limit: 10,
                                entry: expectedEntryId,
                                query: {
                                    data: {
                                        sourceUrl: { $eq: '/c/docs/develop' },
                                    },
                                },
                            },
                        ])];
                case 1:
                    result = _a.sent();
                    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&includeRefs=true&limit=10&model=%22symbol%22&entry=%22123%22&query.data.sourceUrl=%7B%22%24eq%22%3A%22%2Fc%2Fdocs%2Fdevelop%22%7D", { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with query as the flattened object as the one passed in options.query if query does not contain $ mongo-operator', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, expectedFormat, expectedEntryId, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'symbol';
                    expectedFormat = 'email';
                    expectedEntryId = '123';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder['flushGetContentQueue'](true, [
                            {
                                model: expectedModel,
                                format: expectedFormat,
                                key: expectedModel,
                                omit: OMIT,
                                fields: 'data',
                                limit: 10,
                                entry: expectedEntryId,
                                query: {
                                    data: {
                                        sourceUrl: '/c/docs/develop',
                                    },
                                    name: {
                                        fullName: 'John Doe',
                                    },
                                },
                            },
                        ])];
                case 1:
                    result = _a.sent();
                    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&includeRefs=true&limit=10&model=%22symbol%22&entry=%22123%22&query.data.sourceUrl=%22%2Fc%2Fdocs%2Fdevelop%22&query.name.fullName=%22John%20Doe%22", { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
});
describe('get', function () {
    var API_KEY = '25608a566fbb654ea959c1b1729e370d';
    var MODEL = 'page';
    var AUTH_TOKEN = '82202e99f9fb4ed1da5940f7fa191e72';
    var builder;
    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) {
            return Promise.resolve({
                json: function () {
                    return Promise.resolve({});
                },
            });
        });
    });
    test('hits content url with includeRefs=false when passed in params and noTraverse=false', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, includeRefs;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    includeRefs = false;
                    builder.apiEndpoint = 'content';
                    builder.getLocation = jest.fn(function () { return ({
                        search: "?builder.params=includeRefs%3D".concat(includeRefs),
                    }); });
                    return [4 /*yield*/, builder.get(expectedModel, {})];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=false&userAttributes=%7B%22device%22%3A%22desktop%22%7D&includeRefs=").concat(includeRefs, "&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with includeRefs=true and noTraverse=false by default', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.get(expectedModel, {})];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=false&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with includeRefs=false when passed in options and noTraverse=false by default', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.get(expectedModel, {
                            includeRefs: false,
                        })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=false&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=false&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content API with locale=en-IN added to the locale query param and the userAttributes.locale param', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, expectedLocale;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    expectedLocale = 'en-IN';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.get(expectedModel, { locale: expectedLocale })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/page?omit=meta.componentsUsed&apiKey=".concat(API_KEY, "&locale=").concat(expectedLocale, "&noTraverse=false&userAttributes=%7B%22locale%22%3A%22").concat(expectedLocale, "%22%7D&includeRefs=true&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
});
describe('getAll', function () {
    var API_KEY = '25608a566fbb654ea959c1b1729e370d';
    var MODEL = 'page';
    var AUTH_TOKEN = '82202e99f9fb4ed1da5940f7fa191e72';
    var builder;
    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) {
            return Promise.resolve({
                json: function () {
                    return Promise.resolve({});
                },
            });
        });
    });
    test('hits content url with includeRefs=false when passed in params and noTraverse=true by default', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, includeRefs;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    includeRefs = false;
                    builder.apiEndpoint = 'content';
                    builder.getLocation = jest.fn(function () { return ({
                        search: "?builder.params=includeRefs%3D".concat(includeRefs),
                    }); });
                    return [4 /*yield*/, builder.getAll(expectedModel, {})];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=true&userAttributes=%7B%22device%22%3A%22desktop%22%7D&includeRefs=").concat(includeRefs, "&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with includeRefs=true and noTraverse=true by default', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll(expectedModel, {})];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=true&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with includeRefs=false when passed in options and noTraverse=true by default', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll(expectedModel, {
                            includeRefs: false,
                        })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/".concat(expectedModel, "?omit=meta.componentsUsed&apiKey=").concat(API_KEY, "&noTraverse=true&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=false&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content API with locale=en-IN added to the locale query param and NOT the userAttributes.locale param', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel, expectedLocale;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    expectedLocale = 'en-IN';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll(expectedModel, { locale: expectedLocale })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith("https://cdn.builder.io/api/v3/content/page?omit=meta.componentsUsed&apiKey=".concat(API_KEY, "&locale=").concat(expectedLocale, "&noTraverse=true&userAttributes=%7B%22urlPath%22%3A%22%2F%22%2C%22host%22%3A%22localhost%22%2C%22device%22%3A%22desktop%22%7D&includeRefs=true&limit=30&model=%22").concat(expectedModel, "%22"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits query url with enrich=true when passed in options', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    return [4 /*yield*/, builder.getAll(expectedModel, { enrich: true })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrich=true'), expect.anything());
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits query url with enrichOptions.enrichLevel when passed in options', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    return [4 /*yield*/, builder.getAll(expectedModel, {
                            enrich: true,
                            enrichOptions: { enrichLevel: 2 },
                        })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrich=true'), {
                        headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) },
                    });
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrichOptions.enrichLevel=2'), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with enrich=true when apiEndpoint is content', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll(expectedModel, { enrich: true })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrich=true'), {
                        headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) },
                    });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits content url with enrichOptions.enrichLevel when apiEndpoint is content', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll(expectedModel, {
                            enrich: true,
                            enrichOptions: { enrichLevel: 3 },
                        })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrich=true'), {
                        headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) },
                    });
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrichOptions.enrichLevel=3'), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('hits query url with enrichOptions.model when passed complex model options', function () { return __awaiter(void 0, void 0, void 0, function () {
        var expectedModel;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    expectedModel = 'page';
                    return [4 /*yield*/, builder.getAll(expectedModel, {
                            enrich: true,
                            enrichOptions: {
                                enrichLevel: 2,
                                model: {
                                    product: {
                                        fields: 'id,name,price',
                                        omit: 'data.internalNotes',
                                    },
                                    category: {
                                        fields: 'id,name',
                                    },
                                },
                            },
                        })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrichOptions.enrichLevel=2'), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrichOptions.model.product.fields=id%2Cname%2Cprice'), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrichOptions.model.product.omit=data.internalNotes'), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('enrichOptions.model.category.fields=id%2Cname'), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
                    return [2 /*return*/];
            }
        });
    }); });
    test('includes fetchTotalCount=true in URL when option is set', function () { return __awaiter(void 0, void 0, void 0, function () {
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll('blog-post', { fetchTotalCount: true })];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).toBeCalledWith(expect.stringContaining('fetchTotalCount=true'), expect.anything());
                    return [2 /*return*/];
            }
        });
    }); });
    test('does not include fetchTotalCount in URL when option is not set', function () { return __awaiter(void 0, void 0, void 0, function () {
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll('blog-post', {})];
                case 1:
                    _a.sent();
                    expect(builder['makeFetchApiCall']).not.toBeCalledWith(expect.stringContaining('fetchTotalCount'), expect.anything());
                    return [2 /*return*/];
            }
        });
    }); });
    test('resolves to { results, totalCount } when fetchTotalCount is true', function () { return __awaiter(void 0, void 0, void 0, function () {
        var mockResults, mockTotalCount, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    mockResults = [{ id: 'abc', data: {} }];
                    mockTotalCount = 99;
                    builder['makeFetchApiCall'] = jest.fn(function () {
                        return Promise.resolve({
                            json: function () { return Promise.resolve({ results: mockResults, totalCount: mockTotalCount }); },
                        });
                    });
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll('blog-post', { fetchTotalCount: true })];
                case 1:
                    result = _a.sent();
                    expect(result).toEqual({ results: mockResults, totalCount: mockTotalCount });
                    return [2 /*return*/];
            }
        });
    }); });
    test('resolves to BuilderContent[] (not wrapped) when fetchTotalCount is not set', function () { return __awaiter(void 0, void 0, void 0, function () {
        var mockResults, result;
        return __generator(this, function (_a) {
            switch (_a.label) {
                case 0:
                    mockResults = [{ id: 'abc', data: {} }];
                    builder['makeFetchApiCall'] = jest.fn(function () {
                        return Promise.resolve({
                            json: function () { return Promise.resolve({ results: mockResults }); },
                        });
                    });
                    builder.apiEndpoint = 'content';
                    return [4 /*yield*/, builder.getAll('blog-post', {})];
                case 1:
                    result = _a.sent();
                    expect(Array.isArray(result)).toBe(true);
                    expect(result).toEqual(mockResults);
                    return [2 /*return*/];
            }
        });
    }); });
});
//# sourceMappingURL=builder.class.test.js.map