@builder.io/sdk 3.0.2-2 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.yarnrc.yml +1 -0
  2. package/CHANGELOG.md +13 -0
  3. package/dist/index.browser.js +71 -18
  4. package/dist/index.browser.js.map +1 -1
  5. package/dist/index.cjs.js +71 -18
  6. package/dist/index.cjs.js.map +1 -1
  7. package/dist/index.esm.js +71 -18
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/index.js +13 -49
  10. package/dist/index.umd.js +71 -18
  11. package/dist/index.umd.js.map +1 -1
  12. package/dist/package.json +1 -3
  13. package/dist/src/builder.class.d.ts +7 -0
  14. package/dist/src/builder.class.js +70 -17
  15. package/dist/src/builder.class.js.map +1 -1
  16. package/dist/src/builder.class.test.js +757 -170
  17. package/dist/src/builder.class.test.js.map +1 -1
  18. package/dist/src/classes/animator.class.js +195 -218
  19. package/dist/src/classes/observable.class.js +97 -102
  20. package/dist/src/classes/promise.class.js +154 -150
  21. package/dist/src/classes/query-string.class.js +74 -73
  22. package/dist/src/classes/query-string.class.test.js +20 -20
  23. package/dist/src/constants/builder.js +4 -4
  24. package/dist/src/functions/assign.function.js +19 -19
  25. package/dist/src/functions/fetch.function.js +75 -97
  26. package/dist/src/functions/finder.function.js +274 -389
  27. package/dist/src/functions/next-tick.function.js +23 -26
  28. package/dist/src/functions/omit.function.js +13 -13
  29. package/dist/src/functions/server-only-require.function.js +9 -10
  30. package/dist/src/functions/throttle.function.js +37 -35
  31. package/dist/src/functions/to-error.js +6 -5
  32. package/dist/src/functions/uuid.js +8 -9
  33. package/dist/src/types/api-version.js +3 -3
  34. package/dist/src/types/content.js +3 -3
  35. package/dist/src/types/element.js +3 -3
  36. package/dist/src/url.js +42 -41
  37. package/dist/src/url.test.js +118 -222
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +3 -6
  40. package/dist/src/functions/get-top-level-domain.d.ts +0 -6
  41. package/dist/src/functions/get-top-level-domain.js +0 -17
  42. package/dist/src/functions/get-top-level-domain.js.map +0 -1
@@ -1,177 +1,764 @@
1
- 'use strict';
2
- Object.defineProperty(exports, '__esModule', { value: true });
3
- var builder_class_1 = require('./builder.class');
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ 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;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ var builder_class_1 = require("./builder.class");
51
+ var observable_class_1 = require("./classes/observable.class");
4
52
  describe('Builder', function () {
5
- test('trustedHosts', function () {
6
- expect(builder_class_1.Builder.isTrustedHost('localhost')).toBe(true);
7
- expect(builder_class_1.Builder.isTrustedHost('builder.io')).toBe(true);
8
- expect(builder_class_1.Builder.isTrustedHost('beta.builder.io')).toBe(true);
9
- expect(builder_class_1.Builder.isTrustedHost('qa.builder.io')).toBe(true);
10
- expect(builder_class_1.Builder.isTrustedHost('123-review-build.beta.builder.io')).toBe(true);
11
- });
12
- test('arbitrary builder.io subdomains', function () {
13
- expect(builder_class_1.Builder.isTrustedHost('cdn.builder.io')).toBe(false);
14
- expect(builder_class_1.Builder.isTrustedHost('foo.builder.io')).toBe(false);
15
- expect(builder_class_1.Builder.isTrustedHost('evildomainbeta.builder.io')).toBe(false);
16
- });
17
- test('add trusted host', function () {
18
- expect(builder_class_1.Builder.isTrustedHost('example.com')).toBe(false);
19
- builder_class_1.Builder.registerTrustedHost('example.com');
20
- expect(builder_class_1.Builder.isTrustedHost('example.com')).toBe(true);
21
- });
53
+ test('trustedHosts', function () {
54
+ expect(builder_class_1.Builder.isTrustedHost('localhost')).toBe(true);
55
+ expect(builder_class_1.Builder.isTrustedHost('builder.io')).toBe(true);
56
+ expect(builder_class_1.Builder.isTrustedHost('beta.builder.io')).toBe(true);
57
+ expect(builder_class_1.Builder.isTrustedHost('qa.builder.io')).toBe(true);
58
+ expect(builder_class_1.Builder.isTrustedHost('123-review-build.beta.builder.io')).toBe(true);
59
+ });
60
+ test('arbitrary builder.io subdomains', function () {
61
+ expect(builder_class_1.Builder.isTrustedHost('cdn.builder.io')).toBe(false);
62
+ expect(builder_class_1.Builder.isTrustedHost('foo.builder.io')).toBe(false);
63
+ expect(builder_class_1.Builder.isTrustedHost('evildomainbeta.builder.io')).toBe(false);
64
+ });
65
+ test('add trusted host', function () {
66
+ expect(builder_class_1.Builder.isTrustedHost('example.com')).toBe(false);
67
+ builder_class_1.Builder.registerTrustedHost('example.com');
68
+ expect(builder_class_1.Builder.isTrustedHost('example.com')).toBe(true);
69
+ });
22
70
  });
23
71
  describe('serializeIncludingFunctions', function () {
24
- test('serializes functions in inputs', function () {
25
- var input = {
26
- name: 'TestComponent',
27
- inputs: [
28
- {
29
- name: 'text',
30
- type: 'string',
31
- onChange: function (value) {
32
- return value.toUpperCase();
33
- },
34
- },
35
- ],
36
- };
37
- var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
38
- expect(typeof result.inputs[0].onChange).toBe('string');
39
- expect(result.inputs[0].onChange).toContain('return value.toUpperCase()');
40
- });
41
- test('serializes arrow functions in inputs', function () {
42
- var input = {
43
- name: 'ArrowComponent',
44
- inputs: [
45
- {
46
- name: 'number',
47
- type: 'number',
48
- onChange: function (value) {
49
- return value * 2;
50
- },
51
- },
52
- ],
53
- };
54
- var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
55
- expect(typeof result.inputs[0].onChange).toBe('string');
56
- expect(result.inputs[0].onChange).toContain('value * 2');
57
- });
58
- test('does not modify non-function properties', function () {
59
- var input = {
60
- name: 'MixedComponent',
61
- inputs: [
62
- {
63
- name: 'text',
64
- type: 'string',
65
- defaultValue: 'hello',
66
- },
67
- ],
68
- };
69
- var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
70
- expect(result).toEqual(input);
71
- });
72
- test('handles multiple inputs with mixed properties', function () {
73
- var input = {
74
- name: 'ComplexComponent',
75
- inputs: [
76
- {
77
- name: 'text',
78
- type: 'string',
79
- onChange: function (value) {
80
- return value.trim();
81
- },
82
- },
83
- {
84
- name: 'number',
85
- type: 'number',
86
- defaultValue: 42,
87
- },
88
- {
89
- name: 'options',
90
- type: 'string',
91
- onChange: function (value) {
92
- return value.map(function (v) {
93
- return v.toLowerCase();
94
- });
95
- },
96
- },
97
- ],
98
- };
99
- var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
100
- expect(typeof result.inputs[0].onChange).toBe('string');
101
- expect(result.inputs[0].onChange).toContain('value.trim()');
102
- expect(result.inputs[1]).toEqual(input.inputs[1]);
103
- expect(typeof result.inputs[2].onChange).toBe('string');
104
- expect(result.inputs[2].onChange).toContain('v.toLowerCase()');
105
- });
72
+ test('serializes functions in inputs', function () {
73
+ var input = {
74
+ name: 'TestComponent',
75
+ inputs: [
76
+ {
77
+ name: 'text',
78
+ type: 'string',
79
+ onChange: function (value) {
80
+ return value.toUpperCase();
81
+ },
82
+ },
83
+ ],
84
+ };
85
+ var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
86
+ expect(typeof result.inputs[0].onChange).toBe('string');
87
+ expect(result.inputs[0].onChange).toContain('return value.toUpperCase()');
88
+ });
89
+ test('serializes arrow functions in inputs', function () {
90
+ var input = {
91
+ name: 'ArrowComponent',
92
+ inputs: [
93
+ {
94
+ name: 'number',
95
+ type: 'number',
96
+ onChange: function (value) { return value * 2; },
97
+ },
98
+ ],
99
+ };
100
+ var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
101
+ expect(typeof result.inputs[0].onChange).toBe('string');
102
+ expect(result.inputs[0].onChange).toContain('value * 2');
103
+ });
104
+ test('does not modify non-function properties', function () {
105
+ var input = {
106
+ name: 'MixedComponent',
107
+ inputs: [
108
+ {
109
+ name: 'text',
110
+ type: 'string',
111
+ defaultValue: 'hello',
112
+ },
113
+ ],
114
+ };
115
+ var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
116
+ expect(result).toEqual(input);
117
+ });
118
+ test('handles multiple inputs with mixed properties', function () {
119
+ var input = {
120
+ name: 'ComplexComponent',
121
+ inputs: [
122
+ {
123
+ name: 'text',
124
+ type: 'string',
125
+ onChange: function (value) { return value.trim(); },
126
+ },
127
+ {
128
+ name: 'number',
129
+ type: 'number',
130
+ defaultValue: 42,
131
+ },
132
+ {
133
+ name: 'options',
134
+ type: 'string',
135
+ onChange: function (value) {
136
+ return value.map(function (v) { return v.toLowerCase(); });
137
+ },
138
+ },
139
+ ],
140
+ };
141
+ var result = builder_class_1.Builder['serializeIncludingFunctions'](input);
142
+ expect(typeof result.inputs[0].onChange).toBe('string');
143
+ expect(result.inputs[0].onChange).toContain('value.trim()');
144
+ expect(result.inputs[1]).toEqual(input.inputs[1]);
145
+ expect(typeof result.inputs[2].onChange).toBe('string');
146
+ expect(result.inputs[2].onChange).toContain('v.toLowerCase()');
147
+ });
106
148
  });
107
149
  describe('prepareComponentSpecToSend', function () {
108
- test('removes class property and serializes functions in inputs', function () {
109
- var _a, _b;
110
- var input = {
111
- name: 'TestComponent',
112
- class: /** @class */ (function () {
113
- function TestClass() {}
114
- return TestClass;
115
- })(),
116
- inputs: [
117
- {
118
- name: 'text',
119
- type: 'string',
120
- onChange: function (value) {
121
- return value.toUpperCase();
122
- },
123
- },
124
- ],
125
- };
126
- var result = builder_class_1.Builder['prepareComponentSpecToSend'](input);
127
- expect(result.class).toBeUndefined();
128
- expect(typeof ((_a = result.inputs) === null || _a === void 0 ? void 0 : _a[0].onChange)).toBe(
129
- 'string'
130
- );
131
- expect((_b = result.inputs) === null || _b === void 0 ? void 0 : _b[0].onChange).toContain(
132
- 'value.toUpperCase()'
133
- );
134
- });
135
- test('preserves other properties', function () {
136
- var _a, _b, _c, _d, _e;
137
- var input = {
138
- name: 'ComplexComponent',
139
- class: /** @class */ (function () {
140
- function ComplexClass() {}
141
- return ComplexClass;
142
- })(),
143
- inputs: [
144
- {
145
- name: 'text',
146
- type: 'string',
147
- defaultValue: 'hello',
148
- onChange: function (value) {
149
- return value.trim();
150
- },
151
- },
152
- {
153
- name: 'number',
154
- type: 'number',
155
- defaultValue: 42,
156
- },
157
- ],
150
+ test('removes class property and serializes functions in inputs', function () {
151
+ var _a, _b;
152
+ var input = {
153
+ name: 'TestComponent',
154
+ class: /** @class */ (function () {
155
+ function TestClass() {
156
+ }
157
+ return TestClass;
158
+ }()),
159
+ inputs: [
160
+ {
161
+ name: 'text',
162
+ type: 'string',
163
+ onChange: function (value) {
164
+ return value.toUpperCase();
165
+ },
166
+ },
167
+ ],
168
+ };
169
+ var result = builder_class_1.Builder['prepareComponentSpecToSend'](input);
170
+ expect(result.class).toBeUndefined();
171
+ expect(typeof ((_a = result.inputs) === null || _a === void 0 ? void 0 : _a[0].onChange)).toBe('string');
172
+ expect((_b = result.inputs) === null || _b === void 0 ? void 0 : _b[0].onChange).toContain('value.toUpperCase()');
173
+ });
174
+ test('preserves other properties', function () {
175
+ var _a, _b, _c, _d, _e;
176
+ var input = {
177
+ name: 'ComplexComponent',
178
+ class: /** @class */ (function () {
179
+ function ComplexClass() {
180
+ }
181
+ return ComplexClass;
182
+ }()),
183
+ inputs: [
184
+ {
185
+ name: 'text',
186
+ type: 'string',
187
+ defaultValue: 'hello',
188
+ onChange: function (value) { return value.trim(); },
189
+ },
190
+ {
191
+ name: 'number',
192
+ type: 'number',
193
+ defaultValue: 42,
194
+ },
195
+ ],
196
+ };
197
+ var result = builder_class_1.Builder['prepareComponentSpecToSend'](input);
198
+ expect(result.class).toBeUndefined();
199
+ expect(result.name).toBe('ComplexComponent');
200
+ expect((_a = result.inputs) === null || _a === void 0 ? void 0 : _a.length).toBe(2);
201
+ expect(typeof ((_b = result.inputs) === null || _b === void 0 ? void 0 : _b[0].onChange)).toBe('string');
202
+ expect((_c = result.inputs) === null || _c === void 0 ? void 0 : _c[0].onChange).toContain('value.trim()');
203
+ expect((_d = result.inputs) === null || _d === void 0 ? void 0 : _d[0].defaultValue).toBe('hello');
204
+ expect((_e = result.inputs) === null || _e === void 0 ? void 0 : _e[1]).toEqual(input.inputs[1]);
205
+ });
206
+ });
207
+ describe('flushGetContentQueue', function () {
208
+ var _a;
209
+ var API_KEY = '25608a566fbb654ea959c1b1729e370d';
210
+ var MODEL = 'page';
211
+ var AUTH_TOKEN = '82202e99f9fb4ed1da5940f7fa191e72';
212
+ var OMIT = 'data.blocks';
213
+ var builder;
214
+ var codegenOrQueryApiResult = (_a = {},
215
+ _a[MODEL] = [
216
+ {
217
+ lastUpdatedBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2',
218
+ folders: [],
219
+ data: {
220
+ themeId: false,
221
+ title: 'test',
222
+ blocks: [
223
+ {
224
+ '@type': '@builder.io/sdk:Element',
225
+ '@version': 2,
226
+ id: 'builder-370f0829496c41d48b1fb77c1b4ea2b2',
227
+ component: {
228
+ name: 'Text',
229
+ options: {
230
+ text: 'A is selected',
231
+ },
232
+ },
233
+ responsiveStyles: {
234
+ large: {
235
+ display: 'flex',
236
+ flexDirection: 'column',
237
+ position: 'relative',
238
+ flexShrink: '0',
239
+ boxSizing: 'border-box',
240
+ marginTop: '20px',
241
+ lineHeight: 'normal',
242
+ height: 'auto',
243
+ },
244
+ },
245
+ },
246
+ {
247
+ id: 'builder-pixel-lrwo8ns32dg',
248
+ '@type': '@builder.io/sdk:Element',
249
+ tagName: 'img',
250
+ properties: {
251
+ src: 'https://cdn.builder.io/api/v1/pixel?apiKey=5271c255f7824802a30f12bdad90e347',
252
+ 'aria-hidden': 'true',
253
+ alt: '',
254
+ role: 'presentation',
255
+ width: '0',
256
+ height: '0',
257
+ },
258
+ responsiveStyles: {
259
+ large: {
260
+ height: '0',
261
+ width: '0',
262
+ display: 'inline-block',
263
+ opacity: '0',
264
+ overflow: 'hidden',
265
+ pointerEvents: 'none',
266
+ },
267
+ },
268
+ },
269
+ ],
270
+ url: '/test',
271
+ state: {
272
+ deviceSize: 'large',
273
+ location: {
274
+ pathname: '/test',
275
+ path: ['test'],
276
+ query: {},
277
+ },
278
+ },
279
+ },
280
+ modelId: '12518e35051e42dda999e91f1162f0bd',
281
+ query: [
282
+ {
283
+ '@type': '@builder.io/core:Query',
284
+ property: 'urlPath',
285
+ value: '/test',
286
+ operator: 'is',
287
+ },
288
+ {
289
+ '@type': '@builder.io/core:Query',
290
+ property: 'name',
291
+ value: ['a'],
292
+ operator: 'is',
293
+ },
294
+ ],
295
+ published: 'published',
296
+ firstPublished: 1725450385400,
297
+ testRatio: 1,
298
+ lastUpdated: 1725451287436,
299
+ createdDate: 1725450170945,
300
+ createdBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2',
301
+ meta: {
302
+ 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',
303
+ kind: 'page',
304
+ hasLinks: false,
305
+ },
306
+ variations: {},
307
+ name: 'test',
308
+ id: 'ad03bbebf34b49a9912aeae629571db7',
309
+ rev: '9inkgroan7l',
310
+ },
311
+ ],
312
+ _a);
313
+ var contentApiResult = {
314
+ results: [
315
+ {
316
+ lastUpdatedBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2',
317
+ folders: [],
318
+ data: {
319
+ themeId: false,
320
+ title: 'test',
321
+ blocks: [],
322
+ url: '/test',
323
+ state: {
324
+ deviceSize: 'large',
325
+ location: {
326
+ path: '',
327
+ query: {},
328
+ },
329
+ },
330
+ },
331
+ modelId: '12518e35051e42dda999e91f1162f0bd',
332
+ query: [
333
+ {
334
+ '@type': '@builder.io/core:Query',
335
+ property: 'urlPath',
336
+ value: '/test',
337
+ operator: 'is',
338
+ },
339
+ {
340
+ '@type': '@builder.io/core:Query',
341
+ property: 'name',
342
+ value: ['a'],
343
+ operator: 'is',
344
+ },
345
+ ],
346
+ published: 'published',
347
+ firstPublished: 1725450385400,
348
+ testRatio: 1,
349
+ lastUpdated: 1725451287436,
350
+ createdDate: 1725450170945,
351
+ createdBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2',
352
+ meta: {
353
+ 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',
354
+ kind: 'page',
355
+ hasLinks: false,
356
+ },
357
+ variations: {},
358
+ name: 'test',
359
+ id: 'ad03bbebf34b49a9912aeae629571db7',
360
+ rev: 'kvr9rrrklws',
361
+ },
362
+ {
363
+ createdDate: 1725363956284,
364
+ data: {
365
+ title: 'Builder + React Demo Page',
366
+ blocks: [],
367
+ url: ['/builder-demo'],
368
+ state: {
369
+ deviceSize: 'large',
370
+ location: {
371
+ path: '',
372
+ query: {},
373
+ },
374
+ },
375
+ },
376
+ modelId: '12518e35051e42dda999e91f1162f0bd',
377
+ query: [
378
+ {
379
+ property: 'urlPath',
380
+ value: ['/builder-demo'],
381
+ operator: 'is',
382
+ },
383
+ ],
384
+ name: 'Builder + React Demo Page',
385
+ id: '87853dcacee64c4a9b573faa46823e61',
386
+ published: 'published',
387
+ meta: {},
388
+ rev: 'kvr9rrrklws',
389
+ },
390
+ {
391
+ lastUpdatedBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2',
392
+ folders: [],
393
+ data: {
394
+ themeId: false,
395
+ title: 'Test Page',
396
+ blocks: [],
397
+ url: '/test-page',
398
+ state: {
399
+ deviceSize: 'large',
400
+ location: {
401
+ path: '',
402
+ query: {},
403
+ },
404
+ },
405
+ },
406
+ modelId: '12518e35051e42dda999e91f1162f0bd',
407
+ query: [
408
+ {
409
+ '@type': '@builder.io/core:Query',
410
+ property: 'urlPath',
411
+ value: '/test-page',
412
+ operator: 'is',
413
+ },
414
+ ],
415
+ published: 'published',
416
+ firstPublished: 1722527310201,
417
+ testRatio: 1,
418
+ lastUpdated: 1722528875919,
419
+ createdDate: 1722527254768,
420
+ createdBy: 'vkEwLBAcR1VHNUy7DDD366ffYjQ2',
421
+ meta: {
422
+ kind: 'page',
423
+ 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',
424
+ hasLinks: false,
425
+ },
426
+ variations: {},
427
+ name: 'Test Page',
428
+ id: 'e53863a02641455294ac59ab7e2be643',
429
+ rev: 'kvr9rrrklws',
430
+ },
431
+ ],
158
432
  };
159
- var result = builder_class_1.Builder['prepareComponentSpecToSend'](input);
160
- expect(result.class).toBeUndefined();
161
- expect(result.name).toBe('ComplexComponent');
162
- expect((_a = result.inputs) === null || _a === void 0 ? void 0 : _a.length).toBe(2);
163
- expect(typeof ((_b = result.inputs) === null || _b === void 0 ? void 0 : _b[0].onChange)).toBe(
164
- 'string'
165
- );
166
- expect((_c = result.inputs) === null || _c === void 0 ? void 0 : _c[0].onChange).toContain(
167
- 'value.trim()'
168
- );
169
- expect((_d = result.inputs) === null || _d === void 0 ? void 0 : _d[0].defaultValue).toBe(
170
- 'hello'
171
- );
172
- expect((_e = result.inputs) === null || _e === void 0 ? void 0 : _e[1]).toEqual(
173
- input.inputs[1]
174
- );
175
- });
433
+ beforeEach(function () {
434
+ builder = new builder_class_1.Builder(API_KEY, undefined, undefined, false, AUTH_TOKEN, 'v3');
435
+ var builderSubject = new observable_class_1.BehaviorSubject([]);
436
+ builderSubject.next = jest.fn(function () { });
437
+ builder.observersByKey[MODEL] = builderSubject;
438
+ builder['makeFetchApiCall'] = jest.fn(function (url) {
439
+ var result = url.includes('/codegen/') || url.includes('/query/')
440
+ ? codegenOrQueryApiResult
441
+ : contentApiResult;
442
+ return Promise.resolve({
443
+ json: function () {
444
+ return Promise.resolve(result);
445
+ },
446
+ });
447
+ });
448
+ });
449
+ test('throws error if apiKey is not defined', function () {
450
+ builder = new builder_class_1.Builder();
451
+ try {
452
+ builder['flushGetContentQueue']();
453
+ }
454
+ catch (err) {
455
+ expect(err.message).toBe('Fetching content failed, expected apiKey to be defined instead got: null');
456
+ }
457
+ });
458
+ test('throws error if apiVersion is not v3', function () {
459
+ builder = new builder_class_1.Builder(API_KEY, undefined, undefined, false, AUTH_TOKEN, 'v1');
460
+ try {
461
+ builder['flushGetContentQueue']();
462
+ }
463
+ catch (err) {
464
+ expect(err.message).toBe("Invalid apiVersion: expected 'v3', received 'v1'");
465
+ }
466
+ });
467
+ test("hits codegen url when format is 'solid'", function () { return __awaiter(void 0, void 0, void 0, function () {
468
+ var expectedFormat, result, observerNextMock;
469
+ var _a;
470
+ return __generator(this, function (_b) {
471
+ switch (_b.label) {
472
+ case 0:
473
+ expectedFormat = 'solid';
474
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
475
+ {
476
+ model: MODEL,
477
+ format: expectedFormat,
478
+ key: MODEL,
479
+ userAttributes: { respectScheduling: true },
480
+ omit: OMIT,
481
+ fields: 'data',
482
+ },
483
+ ])];
484
+ case 1:
485
+ result = _b.sent();
486
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
487
+ expect(observerNextMock).toBeCalledTimes(1);
488
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) }));
489
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
490
+ 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) } });
491
+ return [2 /*return*/];
492
+ }
493
+ });
494
+ }); });
495
+ test("hits codegen url when format is 'react'", function () { return __awaiter(void 0, void 0, void 0, function () {
496
+ var expectedFormat, result, observerNextMock;
497
+ var _a;
498
+ return __generator(this, function (_b) {
499
+ switch (_b.label) {
500
+ case 0:
501
+ expectedFormat = 'react';
502
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
503
+ {
504
+ model: MODEL,
505
+ format: expectedFormat,
506
+ key: MODEL,
507
+ userAttributes: { respectScheduling: true },
508
+ omit: OMIT,
509
+ fields: 'data',
510
+ },
511
+ ])];
512
+ case 1:
513
+ result = _b.sent();
514
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
515
+ expect(observerNextMock).toBeCalledTimes(1);
516
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) }));
517
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
518
+ 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) } });
519
+ return [2 /*return*/];
520
+ }
521
+ });
522
+ }); });
523
+ test("hits query url when apiEndpoint is undefined and format is 'html'", function () { return __awaiter(void 0, void 0, void 0, function () {
524
+ var expectedFormat, result, observerNextMock;
525
+ var _a;
526
+ return __generator(this, function (_b) {
527
+ switch (_b.label) {
528
+ case 0:
529
+ expectedFormat = 'html';
530
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
531
+ {
532
+ model: MODEL,
533
+ format: expectedFormat,
534
+ key: MODEL,
535
+ userAttributes: { respectScheduling: true },
536
+ omit: OMIT,
537
+ fields: 'data',
538
+ },
539
+ ])];
540
+ case 1:
541
+ result = _b.sent();
542
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
543
+ expect(observerNextMock).toBeCalledTimes(1);
544
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) }));
545
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
546
+ 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) } });
547
+ return [2 /*return*/];
548
+ }
549
+ });
550
+ }); });
551
+ test("hits content url when apiEndpoint is 'content' and format is 'html'", function () { return __awaiter(void 0, void 0, void 0, function () {
552
+ var expectedFormat, result, observerNextMock;
553
+ var _a;
554
+ return __generator(this, function (_b) {
555
+ switch (_b.label) {
556
+ case 0:
557
+ expectedFormat = 'html';
558
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
559
+ {
560
+ apiEndpoint: 'content',
561
+ model: MODEL,
562
+ format: expectedFormat,
563
+ key: MODEL,
564
+ userAttributes: { respectScheduling: true },
565
+ omit: OMIT,
566
+ fields: 'data',
567
+ limit: 10,
568
+ },
569
+ ])];
570
+ case 1:
571
+ result = _b.sent();
572
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
573
+ expect(observerNextMock).toBeCalledTimes(1);
574
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) }));
575
+ expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1]));
576
+ expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) }));
577
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
578
+ 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&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
579
+ return [2 /*return*/];
580
+ }
581
+ });
582
+ }); });
583
+ test("hits query url when apiEndpoint is undefined and format is 'amp'", function () { return __awaiter(void 0, void 0, void 0, function () {
584
+ var expectedFormat, result, observerNextMock;
585
+ var _a;
586
+ return __generator(this, function (_b) {
587
+ switch (_b.label) {
588
+ case 0:
589
+ expectedFormat = 'amp';
590
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
591
+ {
592
+ model: MODEL,
593
+ format: expectedFormat,
594
+ key: MODEL,
595
+ userAttributes: { respectScheduling: true },
596
+ omit: OMIT,
597
+ fields: 'data',
598
+ },
599
+ ])];
600
+ case 1:
601
+ result = _b.sent();
602
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
603
+ expect(observerNextMock).toBeCalledTimes(1);
604
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) }));
605
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
606
+ 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) } });
607
+ return [2 /*return*/];
608
+ }
609
+ });
610
+ }); });
611
+ test("hits content url when apiEndpoint is 'content' and format is 'amp'", function () { return __awaiter(void 0, void 0, void 0, function () {
612
+ var expectedFormat, result, observerNextMock;
613
+ var _a;
614
+ return __generator(this, function (_b) {
615
+ switch (_b.label) {
616
+ case 0:
617
+ expectedFormat = 'amp';
618
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
619
+ {
620
+ apiEndpoint: 'content',
621
+ model: MODEL,
622
+ format: expectedFormat,
623
+ key: MODEL,
624
+ userAttributes: { respectScheduling: true },
625
+ omit: OMIT,
626
+ fields: 'data',
627
+ limit: 10,
628
+ },
629
+ ])];
630
+ case 1:
631
+ result = _b.sent();
632
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
633
+ expect(observerNextMock).toBeCalledTimes(1);
634
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) }));
635
+ expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1]));
636
+ expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) }));
637
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
638
+ 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&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
639
+ return [2 /*return*/];
640
+ }
641
+ });
642
+ }); });
643
+ test("hits query url when apiEndpoint is undefined and format is 'email'", function () { return __awaiter(void 0, void 0, void 0, function () {
644
+ var expectedFormat, result, observerNextMock;
645
+ var _a;
646
+ return __generator(this, function (_b) {
647
+ switch (_b.label) {
648
+ case 0:
649
+ expectedFormat = 'email';
650
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
651
+ {
652
+ model: MODEL,
653
+ format: expectedFormat,
654
+ key: MODEL,
655
+ userAttributes: { respectScheduling: true },
656
+ omit: OMIT,
657
+ fields: 'data',
658
+ },
659
+ ])];
660
+ case 1:
661
+ result = _b.sent();
662
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
663
+ expect(observerNextMock).toBeCalledTimes(1);
664
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) }));
665
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
666
+ 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) } });
667
+ return [2 /*return*/];
668
+ }
669
+ });
670
+ }); });
671
+ 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 () {
672
+ var expectedFormat, result, observerNextMock;
673
+ var _a;
674
+ return __generator(this, function (_b) {
675
+ switch (_b.label) {
676
+ case 0:
677
+ expectedFormat = 'email';
678
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
679
+ {
680
+ model: MODEL,
681
+ format: expectedFormat,
682
+ key: MODEL,
683
+ url: '/test-page',
684
+ omit: OMIT,
685
+ fields: 'data',
686
+ },
687
+ ])];
688
+ case 1:
689
+ result = _b.sent();
690
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
691
+ expect(observerNextMock).toBeCalledTimes(1);
692
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, codegenOrQueryApiResult[MODEL][0]), { variationId: expect.any(String) }));
693
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
694
+ 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) } });
695
+ return [2 /*return*/];
696
+ }
697
+ });
698
+ }); });
699
+ test("hits content url when apiEndpoint is 'content' and format is 'email'", function () { return __awaiter(void 0, void 0, void 0, function () {
700
+ var expectedFormat, result, observerNextMock;
701
+ var _a;
702
+ return __generator(this, function (_b) {
703
+ switch (_b.label) {
704
+ case 0:
705
+ expectedFormat = 'email';
706
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
707
+ {
708
+ apiEndpoint: 'content',
709
+ model: MODEL,
710
+ format: expectedFormat,
711
+ key: MODEL,
712
+ userAttributes: { respectScheduling: true },
713
+ omit: OMIT,
714
+ fields: 'data',
715
+ limit: 10,
716
+ },
717
+ ])];
718
+ case 1:
719
+ result = _b.sent();
720
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
721
+ expect(observerNextMock).toBeCalledTimes(1);
722
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) }));
723
+ expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1]));
724
+ expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) }));
725
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
726
+ 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&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
727
+ return [2 /*return*/];
728
+ }
729
+ });
730
+ }); });
731
+ 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 () {
732
+ var expectedFormat, result, observerNextMock;
733
+ var _a;
734
+ return __generator(this, function (_b) {
735
+ switch (_b.label) {
736
+ case 0:
737
+ expectedFormat = 'email';
738
+ return [4 /*yield*/, builder['flushGetContentQueue'](true, [
739
+ {
740
+ apiEndpoint: 'content',
741
+ model: MODEL,
742
+ format: expectedFormat,
743
+ key: MODEL,
744
+ url: '/test-page',
745
+ omit: OMIT,
746
+ fields: 'data',
747
+ limit: 10,
748
+ },
749
+ ])];
750
+ case 1:
751
+ result = _b.sent();
752
+ observerNextMock = (_a = builder.observersByKey[MODEL]) === null || _a === void 0 ? void 0 : _a.next;
753
+ expect(observerNextMock).toBeCalledTimes(1);
754
+ expect(observerNextMock.mock.calls[0][0][0]).toStrictEqual(__assign(__assign({}, contentApiResult.results[0]), { variationId: expect.any(String) }));
755
+ expect(observerNextMock.mock.calls[0][0][1]).toStrictEqual(__assign({}, contentApiResult.results[1]));
756
+ expect(observerNextMock.mock.calls[0][0][2]).toStrictEqual(__assign(__assign({}, contentApiResult.results[2]), { variationId: expect.any(String) }));
757
+ expect(builder['makeFetchApiCall']).toBeCalledTimes(1);
758
+ 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&limit=10&model=%22").concat(MODEL, "%22&enrich=true"), { headers: { Authorization: "Bearer ".concat(AUTH_TOKEN) } });
759
+ return [2 /*return*/];
760
+ }
761
+ });
762
+ }); });
176
763
  });
177
- //# sourceMappingURL=builder.class.test.js.map
764
+ //# sourceMappingURL=builder.class.test.js.map