@builder.io/sdk-solid 5.0.1 → 5.1.1
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.
- package/lib/browser/dev.js +409 -377
- package/lib/browser/dev.jsx +1097 -1065
- package/lib/browser/index.js +772 -740
- package/lib/browser/index.jsx +773 -741
- package/lib/edge/dev.js +409 -377
- package/lib/edge/dev.jsx +895 -863
- package/lib/edge/index.js +1170 -1138
- package/lib/edge/index.jsx +1172 -1140
- package/lib/node/dev.js +463 -433
- package/lib/node/dev.jsx +1007 -977
- package/lib/node/index.js +828 -798
- package/lib/node/index.jsx +829 -799
- package/package.json +1 -1
package/lib/node/dev.js
CHANGED
|
@@ -216,6 +216,279 @@ var getUserAttributes = () => {
|
|
|
216
216
|
};
|
|
217
217
|
};
|
|
218
218
|
|
|
219
|
+
// src/constants/sdk-version.ts
|
|
220
|
+
var SDK_VERSION = "5.1.1";
|
|
221
|
+
|
|
222
|
+
// src/helpers/sdk-headers.ts
|
|
223
|
+
var getSdkHeaders = () => ({
|
|
224
|
+
"X-Builder-SDK": TARGET,
|
|
225
|
+
"X-Builder-SDK-GEN": "2",
|
|
226
|
+
"X-Builder-SDK-Version": SDK_VERSION
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// src/helpers/nullable.ts
|
|
230
|
+
var checkIsDefined = (maybeT) => maybeT !== null && maybeT !== void 0;
|
|
231
|
+
|
|
232
|
+
// src/helpers/url.ts
|
|
233
|
+
var getTopLevelDomain = (host) => {
|
|
234
|
+
if (host === "localhost" || host === "127.0.0.1") {
|
|
235
|
+
return host;
|
|
236
|
+
}
|
|
237
|
+
const parts = host.split(".");
|
|
238
|
+
if (parts.length > 2) {
|
|
239
|
+
return parts.slice(1).join(".");
|
|
240
|
+
}
|
|
241
|
+
return host;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/helpers/cookie.ts
|
|
245
|
+
var getCookieSync = ({
|
|
246
|
+
name,
|
|
247
|
+
canTrack
|
|
248
|
+
}) => {
|
|
249
|
+
try {
|
|
250
|
+
if (!canTrack) {
|
|
251
|
+
return void 0;
|
|
252
|
+
}
|
|
253
|
+
return document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))?.split("=")[1];
|
|
254
|
+
} catch (err) {
|
|
255
|
+
logger.warn("[COOKIE] GET error: ", err?.message || err);
|
|
256
|
+
return void 0;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
var getCookie = async (args) => getCookieSync(args);
|
|
260
|
+
var stringifyCookie = (cookie) => cookie.map(([key, value]) => value ? `${key}=${value}` : key).filter(checkIsDefined).join("; ");
|
|
261
|
+
var SECURE_CONFIG = [["secure", ""], ["SameSite", "None"]];
|
|
262
|
+
var createCookieString = ({
|
|
263
|
+
name,
|
|
264
|
+
value,
|
|
265
|
+
expires
|
|
266
|
+
}) => {
|
|
267
|
+
const secure = isBrowser() ? location.protocol === "https:" : true;
|
|
268
|
+
const secureObj = secure ? SECURE_CONFIG : [[]];
|
|
269
|
+
const expiresObj = expires ? [["expires", expires.toUTCString()]] : [[]];
|
|
270
|
+
const cookieValue = [[name, value], ...expiresObj, ["path", "/"], ["domain", getTopLevelDomain(window.location.hostname)], ...secureObj];
|
|
271
|
+
const cookie = stringifyCookie(cookieValue);
|
|
272
|
+
return cookie;
|
|
273
|
+
};
|
|
274
|
+
var setCookie = async ({
|
|
275
|
+
name,
|
|
276
|
+
value,
|
|
277
|
+
expires,
|
|
278
|
+
canTrack
|
|
279
|
+
}) => {
|
|
280
|
+
try {
|
|
281
|
+
if (!canTrack) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const cookie = createCookieString({
|
|
285
|
+
name,
|
|
286
|
+
value,
|
|
287
|
+
expires
|
|
288
|
+
});
|
|
289
|
+
document.cookie = cookie;
|
|
290
|
+
} catch (err) {
|
|
291
|
+
logger.warn("[COOKIE] SET error: ", err?.message || err);
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
// src/helpers/uuid.ts
|
|
296
|
+
function uuidv4() {
|
|
297
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
|
|
298
|
+
const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
|
|
299
|
+
return v.toString(16);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function uuid() {
|
|
303
|
+
return uuidv4().replace(/-/g, "");
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// src/helpers/sessionId.ts
|
|
307
|
+
var SESSION_LOCAL_STORAGE_KEY = "builderSessionId";
|
|
308
|
+
var getSessionId = async ({
|
|
309
|
+
canTrack
|
|
310
|
+
}) => {
|
|
311
|
+
if (!canTrack) {
|
|
312
|
+
return void 0;
|
|
313
|
+
}
|
|
314
|
+
const sessionId = await getCookie({
|
|
315
|
+
name: SESSION_LOCAL_STORAGE_KEY,
|
|
316
|
+
canTrack
|
|
317
|
+
});
|
|
318
|
+
if (checkIsDefined(sessionId)) {
|
|
319
|
+
return sessionId;
|
|
320
|
+
} else {
|
|
321
|
+
const newSessionId = createSessionId();
|
|
322
|
+
setSessionId({
|
|
323
|
+
id: newSessionId,
|
|
324
|
+
canTrack
|
|
325
|
+
});
|
|
326
|
+
return newSessionId;
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
var createSessionId = () => uuid();
|
|
330
|
+
var setSessionId = ({
|
|
331
|
+
id,
|
|
332
|
+
canTrack
|
|
333
|
+
}) => setCookie({
|
|
334
|
+
name: SESSION_LOCAL_STORAGE_KEY,
|
|
335
|
+
value: id,
|
|
336
|
+
canTrack
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// src/helpers/localStorage.ts
|
|
340
|
+
var getLocalStorage = () => isBrowser() && typeof localStorage !== "undefined" ? localStorage : void 0;
|
|
341
|
+
var getLocalStorageItem = ({
|
|
342
|
+
key,
|
|
343
|
+
canTrack
|
|
344
|
+
}) => {
|
|
345
|
+
try {
|
|
346
|
+
if (canTrack) {
|
|
347
|
+
return getLocalStorage()?.getItem(key);
|
|
348
|
+
}
|
|
349
|
+
return void 0;
|
|
350
|
+
} catch (err) {
|
|
351
|
+
console.debug("[LocalStorage] GET error: ", err);
|
|
352
|
+
return void 0;
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
var setLocalStorageItem = ({
|
|
356
|
+
key,
|
|
357
|
+
canTrack,
|
|
358
|
+
value
|
|
359
|
+
}) => {
|
|
360
|
+
try {
|
|
361
|
+
if (canTrack) {
|
|
362
|
+
getLocalStorage()?.setItem(key, value);
|
|
363
|
+
}
|
|
364
|
+
} catch (err) {
|
|
365
|
+
console.debug("[LocalStorage] SET error: ", err);
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
// src/helpers/visitorId.ts
|
|
370
|
+
var VISITOR_LOCAL_STORAGE_KEY = "builderVisitorId";
|
|
371
|
+
var getVisitorId = ({
|
|
372
|
+
canTrack
|
|
373
|
+
}) => {
|
|
374
|
+
if (!canTrack) {
|
|
375
|
+
return void 0;
|
|
376
|
+
}
|
|
377
|
+
const visitorId = getLocalStorageItem({
|
|
378
|
+
key: VISITOR_LOCAL_STORAGE_KEY,
|
|
379
|
+
canTrack
|
|
380
|
+
});
|
|
381
|
+
if (checkIsDefined(visitorId)) {
|
|
382
|
+
return visitorId;
|
|
383
|
+
} else {
|
|
384
|
+
const newVisitorId = createVisitorId();
|
|
385
|
+
setVisitorId({
|
|
386
|
+
id: newVisitorId,
|
|
387
|
+
canTrack
|
|
388
|
+
});
|
|
389
|
+
return newVisitorId;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
var createVisitorId = () => uuid();
|
|
393
|
+
var setVisitorId = ({
|
|
394
|
+
id,
|
|
395
|
+
canTrack
|
|
396
|
+
}) => setLocalStorageItem({
|
|
397
|
+
key: VISITOR_LOCAL_STORAGE_KEY,
|
|
398
|
+
value: id,
|
|
399
|
+
canTrack
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
// src/functions/log-fetch.ts
|
|
403
|
+
function logFetch(url) {
|
|
404
|
+
if (typeof process !== "undefined" && process.env?.DEBUG) {
|
|
405
|
+
if (String(process.env.DEBUG) == "true") {
|
|
406
|
+
logger.log(url);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// src/functions/track/index.ts
|
|
412
|
+
var getTrackingEventData = async ({
|
|
413
|
+
canTrack
|
|
414
|
+
}) => {
|
|
415
|
+
if (!canTrack) {
|
|
416
|
+
return {
|
|
417
|
+
visitorId: void 0,
|
|
418
|
+
sessionId: void 0
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
const sessionId = await getSessionId({
|
|
422
|
+
canTrack
|
|
423
|
+
});
|
|
424
|
+
const visitorId = getVisitorId({
|
|
425
|
+
canTrack
|
|
426
|
+
});
|
|
427
|
+
return {
|
|
428
|
+
sessionId,
|
|
429
|
+
visitorId
|
|
430
|
+
};
|
|
431
|
+
};
|
|
432
|
+
var createEvent = async ({
|
|
433
|
+
type: eventType,
|
|
434
|
+
canTrack,
|
|
435
|
+
apiKey,
|
|
436
|
+
metadata,
|
|
437
|
+
...properties
|
|
438
|
+
}) => ({
|
|
439
|
+
type: eventType,
|
|
440
|
+
data: {
|
|
441
|
+
...properties,
|
|
442
|
+
metadata: {
|
|
443
|
+
url: location.href,
|
|
444
|
+
...metadata
|
|
445
|
+
},
|
|
446
|
+
...await getTrackingEventData({
|
|
447
|
+
canTrack
|
|
448
|
+
}),
|
|
449
|
+
userAttributes: getUserAttributes(),
|
|
450
|
+
ownerId: apiKey
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
async function _track({
|
|
454
|
+
apiHost,
|
|
455
|
+
...eventProps
|
|
456
|
+
}) {
|
|
457
|
+
if (!eventProps.apiKey) {
|
|
458
|
+
logger.error("Missing API key for track call. Please provide your API key.");
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
if (!eventProps.canTrack) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
if (isEditing()) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
if (!(isBrowser() || TARGET === "reactNative")) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const baseUrl = apiHost || "https://cdn.builder.io";
|
|
471
|
+
const url = `${baseUrl}/api/v1/track`;
|
|
472
|
+
logFetch(url);
|
|
473
|
+
return fetch(url, {
|
|
474
|
+
method: "POST",
|
|
475
|
+
body: JSON.stringify({
|
|
476
|
+
events: [await createEvent(eventProps)]
|
|
477
|
+
}),
|
|
478
|
+
headers: {
|
|
479
|
+
"content-type": "application/json",
|
|
480
|
+
...getSdkHeaders()
|
|
481
|
+
},
|
|
482
|
+
mode: "cors"
|
|
483
|
+
}).catch((err) => {
|
|
484
|
+
console.error("Failed to track: ", err);
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
var track = (args) => _track({
|
|
488
|
+
...args,
|
|
489
|
+
canTrack: true
|
|
490
|
+
});
|
|
491
|
+
|
|
219
492
|
// src/functions/evaluate/helpers.ts
|
|
220
493
|
var getFunctionArguments = ({
|
|
221
494
|
builder,
|
|
@@ -232,11 +505,29 @@ var getFunctionArguments = ({
|
|
|
232
505
|
event
|
|
233
506
|
});
|
|
234
507
|
};
|
|
235
|
-
var getBuilderGlobals = () => ({
|
|
508
|
+
var getBuilderGlobals = (trackingContext) => ({
|
|
236
509
|
isEditing: isEditing(),
|
|
237
510
|
isBrowser: isBrowser(),
|
|
238
511
|
isServer: !isBrowser(),
|
|
239
|
-
getUserAttributes: () => getUserAttributes()
|
|
512
|
+
getUserAttributes: () => getUserAttributes(),
|
|
513
|
+
trackConversion: (amount, customProperties) => {
|
|
514
|
+
if (!trackingContext?.apiKey || trackingContext?.canTrack === false) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
_track({
|
|
518
|
+
type: "conversion",
|
|
519
|
+
apiKey: trackingContext.apiKey,
|
|
520
|
+
canTrack: trackingContext.canTrack ?? true,
|
|
521
|
+
contentId: trackingContext.contentId,
|
|
522
|
+
variationId: trackingContext.variationId !== trackingContext.contentId ? trackingContext.variationId : void 0,
|
|
523
|
+
metadata: {
|
|
524
|
+
...customProperties || {},
|
|
525
|
+
...amount !== void 0 ? {
|
|
526
|
+
amount
|
|
527
|
+
} : {}
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
}
|
|
240
531
|
});
|
|
241
532
|
var parseCode = (code, {
|
|
242
533
|
isExpression = true
|
|
@@ -395,7 +686,9 @@ if (typeof output === 'object' && output !== null) {
|
|
|
395
686
|
`;
|
|
396
687
|
};
|
|
397
688
|
var IVM_INSTANCE = null;
|
|
398
|
-
var
|
|
689
|
+
var IVM_OPTIONS = {
|
|
690
|
+
memoryLimit: 128
|
|
691
|
+
};
|
|
399
692
|
var SHOULD_MENTION_INITIALIZE_SCRIPT = SDK_NAME === "@builder.io/sdk-react-nextjs" || SDK_NAME === "@builder.io/sdk-react" || SDK_NAME === "@builder.io/sdk-qwik" || SDK_NAME === "@builder.io/sdk-vue";
|
|
400
693
|
var getIvm = () => {
|
|
401
694
|
try {
|
|
@@ -417,26 +710,6 @@ var getIvm = () => {
|
|
|
417
710
|
For more information, visit https://builder.io/c/docs/integration-tips#enabling-data-bindings-in-node-environments`;
|
|
418
711
|
throw new Error(ERROR_MESSAGE);
|
|
419
712
|
};
|
|
420
|
-
function setIsolateContext(options = {
|
|
421
|
-
memoryLimit: 128
|
|
422
|
-
}) {
|
|
423
|
-
if (IVM_CONTEXT)
|
|
424
|
-
return IVM_CONTEXT;
|
|
425
|
-
const ivm = getIvm();
|
|
426
|
-
const isolate = new ivm.Isolate(options);
|
|
427
|
-
const context = isolate.createContextSync();
|
|
428
|
-
const jail = context.global;
|
|
429
|
-
jail.setSync("global", jail.derefInto());
|
|
430
|
-
jail.setSync("log", function(...logArgs) {
|
|
431
|
-
console.log(...logArgs);
|
|
432
|
-
});
|
|
433
|
-
jail.setSync(INJECTED_IVM_GLOBAL, ivm);
|
|
434
|
-
IVM_CONTEXT = context;
|
|
435
|
-
return context;
|
|
436
|
-
}
|
|
437
|
-
var getIsolateContext = () => {
|
|
438
|
-
return setIsolateContext();
|
|
439
|
-
};
|
|
440
713
|
var runInNode = ({
|
|
441
714
|
code,
|
|
442
715
|
builder,
|
|
@@ -447,48 +720,61 @@ var runInNode = ({
|
|
|
447
720
|
rootState
|
|
448
721
|
}) => {
|
|
449
722
|
const ivm = getIvm();
|
|
450
|
-
|
|
451
|
-
...rootState,
|
|
452
|
-
...localState
|
|
453
|
-
});
|
|
454
|
-
const args = getFunctionArguments({
|
|
455
|
-
builder,
|
|
456
|
-
context,
|
|
457
|
-
event,
|
|
458
|
-
state
|
|
459
|
-
});
|
|
460
|
-
const isolateContext = getIsolateContext();
|
|
461
|
-
const jail = isolateContext.global;
|
|
462
|
-
jail.setSync(BUILDER_SET_STATE_NAME, function(key, value) {
|
|
463
|
-
set(rootState, key, value);
|
|
464
|
-
rootSetState?.(rootState);
|
|
465
|
-
});
|
|
466
|
-
args.forEach(([key, arg]) => {
|
|
467
|
-
const val = typeof arg === "object" ? new ivm.Reference(
|
|
468
|
-
// workaround: methods with default values for arguments is not being cloned over
|
|
469
|
-
key === "builder" ? {
|
|
470
|
-
...arg,
|
|
471
|
-
getUserAttributes: () => arg.getUserAttributes()
|
|
472
|
-
} : arg
|
|
473
|
-
) : null;
|
|
474
|
-
jail.setSync(getSyncValName(key), val);
|
|
475
|
-
});
|
|
476
|
-
const evalStr = processCode({
|
|
477
|
-
code,
|
|
478
|
-
args
|
|
479
|
-
});
|
|
480
|
-
const resultStr = isolateContext.evalClosureSync(evalStr);
|
|
723
|
+
let isolate;
|
|
481
724
|
try {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
725
|
+
isolate = new ivm.Isolate(IVM_OPTIONS);
|
|
726
|
+
const isolateContext = isolate.createContextSync();
|
|
727
|
+
const jail = isolateContext.global;
|
|
728
|
+
jail.setSync("global", jail.derefInto());
|
|
729
|
+
jail.setSync("log", function(...logArgs) {
|
|
730
|
+
console.log(...logArgs);
|
|
731
|
+
});
|
|
732
|
+
jail.setSync(INJECTED_IVM_GLOBAL, ivm);
|
|
733
|
+
const state = fastClone({
|
|
734
|
+
...rootState,
|
|
735
|
+
...localState
|
|
736
|
+
});
|
|
737
|
+
const args = getFunctionArguments({
|
|
738
|
+
builder,
|
|
739
|
+
context,
|
|
740
|
+
event,
|
|
741
|
+
state
|
|
742
|
+
});
|
|
743
|
+
jail.setSync(BUILDER_SET_STATE_NAME, function(key, value) {
|
|
744
|
+
set(rootState, key, value);
|
|
745
|
+
rootSetState?.(rootState);
|
|
746
|
+
});
|
|
747
|
+
args.forEach(([key, arg]) => {
|
|
748
|
+
const val = typeof arg === "object" ? new ivm.Reference(
|
|
749
|
+
// workaround: methods with default values for arguments is not being cloned over
|
|
750
|
+
key === "builder" ? {
|
|
751
|
+
...arg,
|
|
752
|
+
getUserAttributes: () => arg.getUserAttributes()
|
|
753
|
+
} : arg
|
|
754
|
+
) : null;
|
|
755
|
+
jail.setSync(getSyncValName(key), val);
|
|
756
|
+
});
|
|
757
|
+
const evalStr = processCode({
|
|
758
|
+
code,
|
|
759
|
+
args
|
|
760
|
+
});
|
|
761
|
+
const resultStr = isolateContext.evalClosureSync(evalStr);
|
|
762
|
+
try {
|
|
763
|
+
const res = JSON.parse(resultStr);
|
|
764
|
+
return res;
|
|
765
|
+
} catch (_error) {
|
|
766
|
+
return resultStr;
|
|
767
|
+
}
|
|
768
|
+
} finally {
|
|
769
|
+
if (isolate) {
|
|
770
|
+
try {
|
|
771
|
+
isolate.dispose();
|
|
772
|
+
} catch (e) {
|
|
773
|
+
}
|
|
774
|
+
}
|
|
486
775
|
}
|
|
487
776
|
};
|
|
488
777
|
|
|
489
|
-
// src/helpers/nullable.ts
|
|
490
|
-
var checkIsDefined = (maybeT) => maybeT !== null && maybeT !== void 0;
|
|
491
|
-
|
|
492
778
|
// src/functions/is-node-runtime.ts
|
|
493
779
|
function isNodeRuntime() {
|
|
494
780
|
return typeof process !== "undefined" && checkIsDefined(process?.versions?.node);
|
|
@@ -533,7 +819,8 @@ function evaluate({
|
|
|
533
819
|
rootState,
|
|
534
820
|
rootSetState,
|
|
535
821
|
event,
|
|
536
|
-
isExpression = true
|
|
822
|
+
isExpression = true,
|
|
823
|
+
trackingContext
|
|
537
824
|
}) {
|
|
538
825
|
if (code.trim() === "") {
|
|
539
826
|
return void 0;
|
|
@@ -549,7 +836,7 @@ function evaluate({
|
|
|
549
836
|
code: parseCode(code, {
|
|
550
837
|
isExpression
|
|
551
838
|
}),
|
|
552
|
-
builder: getBuilderGlobals(),
|
|
839
|
+
builder: getBuilderGlobals(trackingContext),
|
|
553
840
|
context,
|
|
554
841
|
event,
|
|
555
842
|
rootSetState,
|
|
@@ -1124,7 +1411,8 @@ var createEventHandler = (value, options) => (event) => evaluate({
|
|
|
1124
1411
|
rootState: options.rootState,
|
|
1125
1412
|
rootSetState: options.rootSetState,
|
|
1126
1413
|
event,
|
|
1127
|
-
isExpression: false
|
|
1414
|
+
isExpression: false,
|
|
1415
|
+
trackingContext: options.trackingContext
|
|
1128
1416
|
});
|
|
1129
1417
|
|
|
1130
1418
|
// src/functions/get-block-actions.ts
|
|
@@ -1205,395 +1493,131 @@ function BlockWrapper(props) {
|
|
|
1205
1493
|
rootSetState: props.context.rootSetState,
|
|
1206
1494
|
localState: props.context.localState,
|
|
1207
1495
|
context: props.context.context,
|
|
1208
|
-
stripPrefix: true
|
|
1496
|
+
stripPrefix: true,
|
|
1497
|
+
trackingContext: {
|
|
1498
|
+
apiKey: props.context.apiKey,
|
|
1499
|
+
canTrack: props.context.canTrack ?? true,
|
|
1500
|
+
contentId: props.context.content?.id,
|
|
1501
|
+
variationId: props.context.content?.testVariationId
|
|
1502
|
+
}
|
|
1209
1503
|
});
|
|
1210
1504
|
},
|
|
1211
1505
|
get children() {
|
|
1212
1506
|
return props.children;
|
|
1213
|
-
}
|
|
1214
|
-
});
|
|
1215
|
-
}
|
|
1216
|
-
var block_wrapper_default = BlockWrapper;
|
|
1217
|
-
|
|
1218
|
-
// src/functions/is-previewing.ts
|
|
1219
|
-
function isPreviewing(search) {
|
|
1220
|
-
const searchToUse = search || (isBrowser() ? window.location.search : void 0);
|
|
1221
|
-
if (!searchToUse) {
|
|
1222
|
-
return false;
|
|
1223
|
-
}
|
|
1224
|
-
const normalizedSearch = getSearchString(searchToUse);
|
|
1225
|
-
return Boolean(normalizedSearch.indexOf("builder.preview=") !== -1);
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
// src/functions/register-component.ts
|
|
1229
|
-
var createRegisterComponentMessage = (info) => ({
|
|
1230
|
-
type: "builder.registerComponent",
|
|
1231
|
-
data: serializeIncludingFunctions(info)
|
|
1232
|
-
});
|
|
1233
|
-
var serializeFn = (fnValue) => {
|
|
1234
|
-
const fnStr = fnValue.toString().trim();
|
|
1235
|
-
const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
|
|
1236
|
-
const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
|
|
1237
|
-
return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
|
|
1238
|
-
};
|
|
1239
|
-
function serializeIncludingFunctions(info) {
|
|
1240
|
-
return JSON.parse(JSON.stringify(info, (key, value) => {
|
|
1241
|
-
if (typeof value === "function") {
|
|
1242
|
-
return serializeFn(value);
|
|
1243
|
-
}
|
|
1244
|
-
return value;
|
|
1245
|
-
}));
|
|
1246
|
-
}
|
|
1247
|
-
|
|
1248
|
-
// src/functions/register.ts
|
|
1249
|
-
var registry = {};
|
|
1250
|
-
function register(type, info) {
|
|
1251
|
-
if (type === "plugin") {
|
|
1252
|
-
info = serializeIncludingFunctions(info);
|
|
1253
|
-
}
|
|
1254
|
-
let typeList = registry[type];
|
|
1255
|
-
if (!typeList) {
|
|
1256
|
-
typeList = registry[type] = [];
|
|
1257
|
-
}
|
|
1258
|
-
typeList.push(info);
|
|
1259
|
-
if (isBrowser()) {
|
|
1260
|
-
const message = {
|
|
1261
|
-
type: "builder.register",
|
|
1262
|
-
data: {
|
|
1263
|
-
type,
|
|
1264
|
-
info
|
|
1265
|
-
}
|
|
1266
|
-
};
|
|
1267
|
-
try {
|
|
1268
|
-
parent.postMessage(message, "*");
|
|
1269
|
-
if (parent !== window) {
|
|
1270
|
-
window.postMessage(message, "*");
|
|
1271
|
-
}
|
|
1272
|
-
} catch (err) {
|
|
1273
|
-
console.debug("Could not postmessage", err);
|
|
1274
|
-
}
|
|
1275
|
-
}
|
|
1276
|
-
}
|
|
1277
|
-
function registerAction(action) {
|
|
1278
|
-
if (isBrowser()) {
|
|
1279
|
-
const actionClone = JSON.parse(JSON.stringify(action));
|
|
1280
|
-
if (action.action) {
|
|
1281
|
-
actionClone.action = action.action.toString();
|
|
1282
|
-
}
|
|
1283
|
-
window.parent?.postMessage({
|
|
1284
|
-
type: "builder.registerAction",
|
|
1285
|
-
data: actionClone
|
|
1286
|
-
}, "*");
|
|
1287
|
-
}
|
|
1288
|
-
}
|
|
1289
|
-
|
|
1290
|
-
// src/functions/set-editor-settings.ts
|
|
1291
|
-
var settings = {};
|
|
1292
|
-
function setEditorSettings(newSettings) {
|
|
1293
|
-
if (isBrowser()) {
|
|
1294
|
-
Object.assign(settings, newSettings);
|
|
1295
|
-
const message = {
|
|
1296
|
-
type: "builder.settingsChange",
|
|
1297
|
-
data: settings
|
|
1298
|
-
};
|
|
1299
|
-
parent.postMessage(message, "*");
|
|
1300
|
-
}
|
|
1301
|
-
}
|
|
1302
|
-
|
|
1303
|
-
// src/functions/get-builder-search-params/index.ts
|
|
1304
|
-
var BUILDER_SEARCHPARAMS_PREFIX = "builder.";
|
|
1305
|
-
var BUILDER_OPTIONS_PREFIX = "options.";
|
|
1306
|
-
var getBuilderSearchParams = (_options) => {
|
|
1307
|
-
if (!_options) {
|
|
1308
|
-
return {};
|
|
1309
|
-
}
|
|
1310
|
-
const options = normalizeSearchParams(_options);
|
|
1311
|
-
const newOptions = {};
|
|
1312
|
-
Object.keys(options).forEach((key) => {
|
|
1313
|
-
if (key.startsWith(BUILDER_SEARCHPARAMS_PREFIX)) {
|
|
1314
|
-
const trimmedKey = key.replace(BUILDER_SEARCHPARAMS_PREFIX, "").replace(BUILDER_OPTIONS_PREFIX, "");
|
|
1315
|
-
newOptions[trimmedKey] = options[key];
|
|
1316
|
-
}
|
|
1317
|
-
});
|
|
1318
|
-
return newOptions;
|
|
1319
|
-
};
|
|
1320
|
-
var getBuilderSearchParamsFromWindow = () => {
|
|
1321
|
-
if (!isBrowser()) {
|
|
1322
|
-
return {};
|
|
1323
|
-
}
|
|
1324
|
-
const searchParams = new URLSearchParams(window.location.search);
|
|
1325
|
-
return getBuilderSearchParams(searchParams);
|
|
1326
|
-
};
|
|
1327
|
-
|
|
1328
|
-
// src/constants/sdk-version.ts
|
|
1329
|
-
var SDK_VERSION = "5.0.1";
|
|
1330
|
-
|
|
1331
|
-
// src/helpers/sdk-headers.ts
|
|
1332
|
-
var getSdkHeaders = () => ({
|
|
1333
|
-
"X-Builder-SDK": TARGET,
|
|
1334
|
-
"X-Builder-SDK-GEN": "2",
|
|
1335
|
-
"X-Builder-SDK-Version": SDK_VERSION
|
|
1336
|
-
});
|
|
1337
|
-
|
|
1338
|
-
// src/helpers/url.ts
|
|
1339
|
-
var getTopLevelDomain = (host) => {
|
|
1340
|
-
if (host === "localhost" || host === "127.0.0.1") {
|
|
1341
|
-
return host;
|
|
1342
|
-
}
|
|
1343
|
-
const parts = host.split(".");
|
|
1344
|
-
if (parts.length > 2) {
|
|
1345
|
-
return parts.slice(1).join(".");
|
|
1346
|
-
}
|
|
1347
|
-
return host;
|
|
1348
|
-
};
|
|
1349
|
-
|
|
1350
|
-
// src/helpers/cookie.ts
|
|
1351
|
-
var getCookieSync = ({
|
|
1352
|
-
name,
|
|
1353
|
-
canTrack
|
|
1354
|
-
}) => {
|
|
1355
|
-
try {
|
|
1356
|
-
if (!canTrack) {
|
|
1357
|
-
return void 0;
|
|
1358
|
-
}
|
|
1359
|
-
return document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))?.split("=")[1];
|
|
1360
|
-
} catch (err) {
|
|
1361
|
-
logger.warn("[COOKIE] GET error: ", err?.message || err);
|
|
1362
|
-
return void 0;
|
|
1363
|
-
}
|
|
1364
|
-
};
|
|
1365
|
-
var getCookie = async (args) => getCookieSync(args);
|
|
1366
|
-
var stringifyCookie = (cookie) => cookie.map(([key, value]) => value ? `${key}=${value}` : key).filter(checkIsDefined).join("; ");
|
|
1367
|
-
var SECURE_CONFIG = [["secure", ""], ["SameSite", "None"]];
|
|
1368
|
-
var createCookieString = ({
|
|
1369
|
-
name,
|
|
1370
|
-
value,
|
|
1371
|
-
expires
|
|
1372
|
-
}) => {
|
|
1373
|
-
const secure = isBrowser() ? location.protocol === "https:" : true;
|
|
1374
|
-
const secureObj = secure ? SECURE_CONFIG : [[]];
|
|
1375
|
-
const expiresObj = expires ? [["expires", expires.toUTCString()]] : [[]];
|
|
1376
|
-
const cookieValue = [[name, value], ...expiresObj, ["path", "/"], ["domain", getTopLevelDomain(window.location.hostname)], ...secureObj];
|
|
1377
|
-
const cookie = stringifyCookie(cookieValue);
|
|
1378
|
-
return cookie;
|
|
1379
|
-
};
|
|
1380
|
-
var setCookie = async ({
|
|
1381
|
-
name,
|
|
1382
|
-
value,
|
|
1383
|
-
expires,
|
|
1384
|
-
canTrack
|
|
1385
|
-
}) => {
|
|
1386
|
-
try {
|
|
1387
|
-
if (!canTrack) {
|
|
1388
|
-
return;
|
|
1389
|
-
}
|
|
1390
|
-
const cookie = createCookieString({
|
|
1391
|
-
name,
|
|
1392
|
-
value,
|
|
1393
|
-
expires
|
|
1394
|
-
});
|
|
1395
|
-
document.cookie = cookie;
|
|
1396
|
-
} catch (err) {
|
|
1397
|
-
logger.warn("[COOKIE] SET error: ", err?.message || err);
|
|
1398
|
-
}
|
|
1399
|
-
};
|
|
1400
|
-
|
|
1401
|
-
// src/helpers/uuid.ts
|
|
1402
|
-
function uuidv4() {
|
|
1403
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
|
|
1404
|
-
const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
|
|
1405
|
-
return v.toString(16);
|
|
1406
|
-
});
|
|
1407
|
-
}
|
|
1408
|
-
function uuid() {
|
|
1409
|
-
return uuidv4().replace(/-/g, "");
|
|
1410
|
-
}
|
|
1411
|
-
|
|
1412
|
-
// src/helpers/sessionId.ts
|
|
1413
|
-
var SESSION_LOCAL_STORAGE_KEY = "builderSessionId";
|
|
1414
|
-
var getSessionId = async ({
|
|
1415
|
-
canTrack
|
|
1416
|
-
}) => {
|
|
1417
|
-
if (!canTrack) {
|
|
1418
|
-
return void 0;
|
|
1419
|
-
}
|
|
1420
|
-
const sessionId = await getCookie({
|
|
1421
|
-
name: SESSION_LOCAL_STORAGE_KEY,
|
|
1422
|
-
canTrack
|
|
1507
|
+
}
|
|
1423
1508
|
});
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
} else {
|
|
1427
|
-
const newSessionId = createSessionId();
|
|
1428
|
-
setSessionId({
|
|
1429
|
-
id: newSessionId,
|
|
1430
|
-
canTrack
|
|
1431
|
-
});
|
|
1432
|
-
return newSessionId;
|
|
1433
|
-
}
|
|
1434
|
-
};
|
|
1435
|
-
var createSessionId = () => uuid();
|
|
1436
|
-
var setSessionId = ({
|
|
1437
|
-
id,
|
|
1438
|
-
canTrack
|
|
1439
|
-
}) => setCookie({
|
|
1440
|
-
name: SESSION_LOCAL_STORAGE_KEY,
|
|
1441
|
-
value: id,
|
|
1442
|
-
canTrack
|
|
1443
|
-
});
|
|
1509
|
+
}
|
|
1510
|
+
var block_wrapper_default = BlockWrapper;
|
|
1444
1511
|
|
|
1445
|
-
// src/
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
}) => {
|
|
1451
|
-
try {
|
|
1452
|
-
if (canTrack) {
|
|
1453
|
-
return getLocalStorage()?.getItem(key);
|
|
1454
|
-
}
|
|
1455
|
-
return void 0;
|
|
1456
|
-
} catch (err) {
|
|
1457
|
-
console.debug("[LocalStorage] GET error: ", err);
|
|
1458
|
-
return void 0;
|
|
1512
|
+
// src/functions/is-previewing.ts
|
|
1513
|
+
function isPreviewing(search) {
|
|
1514
|
+
const searchToUse = search || (isBrowser() ? window.location.search : void 0);
|
|
1515
|
+
if (!searchToUse) {
|
|
1516
|
+
return false;
|
|
1459
1517
|
}
|
|
1518
|
+
const normalizedSearch = getSearchString(searchToUse);
|
|
1519
|
+
return Boolean(normalizedSearch.indexOf("builder.preview=") !== -1);
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
// src/functions/register-component.ts
|
|
1523
|
+
var createRegisterComponentMessage = (info) => ({
|
|
1524
|
+
type: "builder.registerComponent",
|
|
1525
|
+
data: serializeIncludingFunctions(info)
|
|
1526
|
+
});
|
|
1527
|
+
var serializeFn = (fnValue) => {
|
|
1528
|
+
const fnStr = fnValue.toString().trim();
|
|
1529
|
+
const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
|
|
1530
|
+
const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
|
|
1531
|
+
return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
|
|
1460
1532
|
};
|
|
1461
|
-
|
|
1462
|
-
key,
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
}) => {
|
|
1466
|
-
try {
|
|
1467
|
-
if (canTrack) {
|
|
1468
|
-
getLocalStorage()?.setItem(key, value);
|
|
1533
|
+
function serializeIncludingFunctions(info) {
|
|
1534
|
+
return JSON.parse(JSON.stringify(info, (key, value) => {
|
|
1535
|
+
if (typeof value === "function") {
|
|
1536
|
+
return serializeFn(value);
|
|
1469
1537
|
}
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
};
|
|
1538
|
+
return value;
|
|
1539
|
+
}));
|
|
1540
|
+
}
|
|
1474
1541
|
|
|
1475
|
-
// src/
|
|
1476
|
-
var
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
if (!canTrack) {
|
|
1481
|
-
return void 0;
|
|
1542
|
+
// src/functions/register.ts
|
|
1543
|
+
var registry = {};
|
|
1544
|
+
function register(type, info) {
|
|
1545
|
+
if (type === "plugin") {
|
|
1546
|
+
info = serializeIncludingFunctions(info);
|
|
1482
1547
|
}
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
});
|
|
1487
|
-
if (checkIsDefined(visitorId)) {
|
|
1488
|
-
return visitorId;
|
|
1489
|
-
} else {
|
|
1490
|
-
const newVisitorId = createVisitorId();
|
|
1491
|
-
setVisitorId({
|
|
1492
|
-
id: newVisitorId,
|
|
1493
|
-
canTrack
|
|
1494
|
-
});
|
|
1495
|
-
return newVisitorId;
|
|
1548
|
+
let typeList = registry[type];
|
|
1549
|
+
if (!typeList) {
|
|
1550
|
+
typeList = registry[type] = [];
|
|
1496
1551
|
}
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1552
|
+
typeList.push(info);
|
|
1553
|
+
if (isBrowser()) {
|
|
1554
|
+
const message = {
|
|
1555
|
+
type: "builder.register",
|
|
1556
|
+
data: {
|
|
1557
|
+
type,
|
|
1558
|
+
info
|
|
1559
|
+
}
|
|
1560
|
+
};
|
|
1561
|
+
try {
|
|
1562
|
+
parent.postMessage(message, "*");
|
|
1563
|
+
if (parent !== window) {
|
|
1564
|
+
window.postMessage(message, "*");
|
|
1565
|
+
}
|
|
1566
|
+
} catch (err) {
|
|
1567
|
+
console.debug("Could not postmessage", err);
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
function registerAction(action) {
|
|
1572
|
+
if (isBrowser()) {
|
|
1573
|
+
const actionClone = JSON.parse(JSON.stringify(action));
|
|
1574
|
+
if (action.action) {
|
|
1575
|
+
actionClone.action = action.action.toString();
|
|
1513
1576
|
}
|
|
1577
|
+
window.parent?.postMessage({
|
|
1578
|
+
type: "builder.registerAction",
|
|
1579
|
+
data: actionClone
|
|
1580
|
+
}, "*");
|
|
1514
1581
|
}
|
|
1515
1582
|
}
|
|
1516
1583
|
|
|
1517
|
-
// src/functions/
|
|
1518
|
-
var
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1584
|
+
// src/functions/set-editor-settings.ts
|
|
1585
|
+
var settings = {};
|
|
1586
|
+
function setEditorSettings(newSettings) {
|
|
1587
|
+
if (isBrowser()) {
|
|
1588
|
+
Object.assign(settings, newSettings);
|
|
1589
|
+
const message = {
|
|
1590
|
+
type: "builder.settingsChange",
|
|
1591
|
+
data: settings
|
|
1525
1592
|
};
|
|
1593
|
+
parent.postMessage(message, "*");
|
|
1526
1594
|
}
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
// src/functions/get-builder-search-params/index.ts
|
|
1598
|
+
var BUILDER_SEARCHPARAMS_PREFIX = "builder.";
|
|
1599
|
+
var BUILDER_OPTIONS_PREFIX = "options.";
|
|
1600
|
+
var getBuilderSearchParams = (_options) => {
|
|
1601
|
+
if (!_options) {
|
|
1602
|
+
return {};
|
|
1603
|
+
}
|
|
1604
|
+
const options = normalizeSearchParams(_options);
|
|
1605
|
+
const newOptions = {};
|
|
1606
|
+
Object.keys(options).forEach((key) => {
|
|
1607
|
+
if (key.startsWith(BUILDER_SEARCHPARAMS_PREFIX)) {
|
|
1608
|
+
const trimmedKey = key.replace(BUILDER_SEARCHPARAMS_PREFIX, "").replace(BUILDER_OPTIONS_PREFIX, "");
|
|
1609
|
+
newOptions[trimmedKey] = options[key];
|
|
1610
|
+
}
|
|
1532
1611
|
});
|
|
1533
|
-
return
|
|
1534
|
-
sessionId,
|
|
1535
|
-
visitorId
|
|
1536
|
-
};
|
|
1612
|
+
return newOptions;
|
|
1537
1613
|
};
|
|
1538
|
-
var
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
apiKey,
|
|
1542
|
-
metadata,
|
|
1543
|
-
...properties
|
|
1544
|
-
}) => ({
|
|
1545
|
-
type: eventType,
|
|
1546
|
-
data: {
|
|
1547
|
-
...properties,
|
|
1548
|
-
metadata: {
|
|
1549
|
-
url: location.href,
|
|
1550
|
-
...metadata
|
|
1551
|
-
},
|
|
1552
|
-
...await getTrackingEventData({
|
|
1553
|
-
canTrack
|
|
1554
|
-
}),
|
|
1555
|
-
userAttributes: getUserAttributes(),
|
|
1556
|
-
ownerId: apiKey
|
|
1557
|
-
}
|
|
1558
|
-
});
|
|
1559
|
-
async function _track({
|
|
1560
|
-
apiHost,
|
|
1561
|
-
...eventProps
|
|
1562
|
-
}) {
|
|
1563
|
-
if (!eventProps.apiKey) {
|
|
1564
|
-
logger.error("Missing API key for track call. Please provide your API key.");
|
|
1565
|
-
return;
|
|
1566
|
-
}
|
|
1567
|
-
if (!eventProps.canTrack) {
|
|
1568
|
-
return;
|
|
1569
|
-
}
|
|
1570
|
-
if (isEditing()) {
|
|
1571
|
-
return;
|
|
1572
|
-
}
|
|
1573
|
-
if (!(isBrowser() || TARGET === "reactNative")) {
|
|
1574
|
-
return;
|
|
1614
|
+
var getBuilderSearchParamsFromWindow = () => {
|
|
1615
|
+
if (!isBrowser()) {
|
|
1616
|
+
return {};
|
|
1575
1617
|
}
|
|
1576
|
-
const
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
return fetch(url, {
|
|
1580
|
-
method: "POST",
|
|
1581
|
-
body: JSON.stringify({
|
|
1582
|
-
events: [await createEvent(eventProps)]
|
|
1583
|
-
}),
|
|
1584
|
-
headers: {
|
|
1585
|
-
"content-type": "application/json",
|
|
1586
|
-
...getSdkHeaders()
|
|
1587
|
-
},
|
|
1588
|
-
mode: "cors"
|
|
1589
|
-
}).catch((err) => {
|
|
1590
|
-
console.error("Failed to track: ", err);
|
|
1591
|
-
});
|
|
1592
|
-
}
|
|
1593
|
-
var track = (args) => _track({
|
|
1594
|
-
...args,
|
|
1595
|
-
canTrack: true
|
|
1596
|
-
});
|
|
1618
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
1619
|
+
return getBuilderSearchParams(searchParams);
|
|
1620
|
+
};
|
|
1597
1621
|
|
|
1598
1622
|
// src/functions/is-from-trusted-host.ts
|
|
1599
1623
|
var DEFAULT_TRUSTED_HOSTS = ["*.beta.builder.io", "beta.builder.io", "builder.io", "localhost", "qa.builder.io"];
|
|
@@ -2336,7 +2360,13 @@ function InteractiveElement(props) {
|
|
|
2336
2360
|
rootState: props.context.rootState,
|
|
2337
2361
|
rootSetState: props.context.rootSetState,
|
|
2338
2362
|
localState: props.context.localState,
|
|
2339
|
-
context: props.context.context
|
|
2363
|
+
context: props.context.context,
|
|
2364
|
+
trackingContext: {
|
|
2365
|
+
apiKey: props.context.apiKey,
|
|
2366
|
+
canTrack: props.context.canTrack ?? true,
|
|
2367
|
+
contentId: props.context.content?.id,
|
|
2368
|
+
variationId: props.context.content?.testVariationId
|
|
2369
|
+
}
|
|
2340
2370
|
})
|
|
2341
2371
|
} : {};
|
|
2342
2372
|
});
|