@builder.io/sdk-solid 5.1.0 → 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 +409 -377
- package/lib/node/dev.jsx +974 -942
- package/lib/node/index.js +775 -743
- package/lib/node/index.jsx +776 -744
- package/package.json +1 -1
package/lib/browser/dev.js
CHANGED
|
@@ -215,6 +215,279 @@ var getUserAttributes = () => {
|
|
|
215
215
|
};
|
|
216
216
|
};
|
|
217
217
|
|
|
218
|
+
// src/constants/sdk-version.ts
|
|
219
|
+
var SDK_VERSION = "5.1.1";
|
|
220
|
+
|
|
221
|
+
// src/helpers/sdk-headers.ts
|
|
222
|
+
var getSdkHeaders = () => ({
|
|
223
|
+
"X-Builder-SDK": TARGET,
|
|
224
|
+
"X-Builder-SDK-GEN": "2",
|
|
225
|
+
"X-Builder-SDK-Version": SDK_VERSION
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// src/helpers/nullable.ts
|
|
229
|
+
var checkIsDefined = (maybeT) => maybeT !== null && maybeT !== void 0;
|
|
230
|
+
|
|
231
|
+
// src/helpers/url.ts
|
|
232
|
+
var getTopLevelDomain = (host) => {
|
|
233
|
+
if (host === "localhost" || host === "127.0.0.1") {
|
|
234
|
+
return host;
|
|
235
|
+
}
|
|
236
|
+
const parts = host.split(".");
|
|
237
|
+
if (parts.length > 2) {
|
|
238
|
+
return parts.slice(1).join(".");
|
|
239
|
+
}
|
|
240
|
+
return host;
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// src/helpers/cookie.ts
|
|
244
|
+
var getCookieSync = ({
|
|
245
|
+
name,
|
|
246
|
+
canTrack
|
|
247
|
+
}) => {
|
|
248
|
+
try {
|
|
249
|
+
if (!canTrack) {
|
|
250
|
+
return void 0;
|
|
251
|
+
}
|
|
252
|
+
return document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))?.split("=")[1];
|
|
253
|
+
} catch (err) {
|
|
254
|
+
logger.warn("[COOKIE] GET error: ", err?.message || err);
|
|
255
|
+
return void 0;
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
var getCookie = async (args) => getCookieSync(args);
|
|
259
|
+
var stringifyCookie = (cookie) => cookie.map(([key, value]) => value ? `${key}=${value}` : key).filter(checkIsDefined).join("; ");
|
|
260
|
+
var SECURE_CONFIG = [["secure", ""], ["SameSite", "None"]];
|
|
261
|
+
var createCookieString = ({
|
|
262
|
+
name,
|
|
263
|
+
value,
|
|
264
|
+
expires
|
|
265
|
+
}) => {
|
|
266
|
+
const secure = isBrowser() ? location.protocol === "https:" : true;
|
|
267
|
+
const secureObj = secure ? SECURE_CONFIG : [[]];
|
|
268
|
+
const expiresObj = expires ? [["expires", expires.toUTCString()]] : [[]];
|
|
269
|
+
const cookieValue = [[name, value], ...expiresObj, ["path", "/"], ["domain", getTopLevelDomain(window.location.hostname)], ...secureObj];
|
|
270
|
+
const cookie = stringifyCookie(cookieValue);
|
|
271
|
+
return cookie;
|
|
272
|
+
};
|
|
273
|
+
var setCookie = async ({
|
|
274
|
+
name,
|
|
275
|
+
value,
|
|
276
|
+
expires,
|
|
277
|
+
canTrack
|
|
278
|
+
}) => {
|
|
279
|
+
try {
|
|
280
|
+
if (!canTrack) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const cookie = createCookieString({
|
|
284
|
+
name,
|
|
285
|
+
value,
|
|
286
|
+
expires
|
|
287
|
+
});
|
|
288
|
+
document.cookie = cookie;
|
|
289
|
+
} catch (err) {
|
|
290
|
+
logger.warn("[COOKIE] SET error: ", err?.message || err);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// src/helpers/uuid.ts
|
|
295
|
+
function uuidv4() {
|
|
296
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
|
|
297
|
+
const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
|
|
298
|
+
return v.toString(16);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function uuid() {
|
|
302
|
+
return uuidv4().replace(/-/g, "");
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/helpers/sessionId.ts
|
|
306
|
+
var SESSION_LOCAL_STORAGE_KEY = "builderSessionId";
|
|
307
|
+
var getSessionId = async ({
|
|
308
|
+
canTrack
|
|
309
|
+
}) => {
|
|
310
|
+
if (!canTrack) {
|
|
311
|
+
return void 0;
|
|
312
|
+
}
|
|
313
|
+
const sessionId = await getCookie({
|
|
314
|
+
name: SESSION_LOCAL_STORAGE_KEY,
|
|
315
|
+
canTrack
|
|
316
|
+
});
|
|
317
|
+
if (checkIsDefined(sessionId)) {
|
|
318
|
+
return sessionId;
|
|
319
|
+
} else {
|
|
320
|
+
const newSessionId = createSessionId();
|
|
321
|
+
setSessionId({
|
|
322
|
+
id: newSessionId,
|
|
323
|
+
canTrack
|
|
324
|
+
});
|
|
325
|
+
return newSessionId;
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
var createSessionId = () => uuid();
|
|
329
|
+
var setSessionId = ({
|
|
330
|
+
id,
|
|
331
|
+
canTrack
|
|
332
|
+
}) => setCookie({
|
|
333
|
+
name: SESSION_LOCAL_STORAGE_KEY,
|
|
334
|
+
value: id,
|
|
335
|
+
canTrack
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// src/helpers/localStorage.ts
|
|
339
|
+
var getLocalStorage = () => isBrowser() && typeof localStorage !== "undefined" ? localStorage : void 0;
|
|
340
|
+
var getLocalStorageItem = ({
|
|
341
|
+
key,
|
|
342
|
+
canTrack
|
|
343
|
+
}) => {
|
|
344
|
+
try {
|
|
345
|
+
if (canTrack) {
|
|
346
|
+
return getLocalStorage()?.getItem(key);
|
|
347
|
+
}
|
|
348
|
+
return void 0;
|
|
349
|
+
} catch (err) {
|
|
350
|
+
console.debug("[LocalStorage] GET error: ", err);
|
|
351
|
+
return void 0;
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
var setLocalStorageItem = ({
|
|
355
|
+
key,
|
|
356
|
+
canTrack,
|
|
357
|
+
value
|
|
358
|
+
}) => {
|
|
359
|
+
try {
|
|
360
|
+
if (canTrack) {
|
|
361
|
+
getLocalStorage()?.setItem(key, value);
|
|
362
|
+
}
|
|
363
|
+
} catch (err) {
|
|
364
|
+
console.debug("[LocalStorage] SET error: ", err);
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
// src/helpers/visitorId.ts
|
|
369
|
+
var VISITOR_LOCAL_STORAGE_KEY = "builderVisitorId";
|
|
370
|
+
var getVisitorId = ({
|
|
371
|
+
canTrack
|
|
372
|
+
}) => {
|
|
373
|
+
if (!canTrack) {
|
|
374
|
+
return void 0;
|
|
375
|
+
}
|
|
376
|
+
const visitorId = getLocalStorageItem({
|
|
377
|
+
key: VISITOR_LOCAL_STORAGE_KEY,
|
|
378
|
+
canTrack
|
|
379
|
+
});
|
|
380
|
+
if (checkIsDefined(visitorId)) {
|
|
381
|
+
return visitorId;
|
|
382
|
+
} else {
|
|
383
|
+
const newVisitorId = createVisitorId();
|
|
384
|
+
setVisitorId({
|
|
385
|
+
id: newVisitorId,
|
|
386
|
+
canTrack
|
|
387
|
+
});
|
|
388
|
+
return newVisitorId;
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
var createVisitorId = () => uuid();
|
|
392
|
+
var setVisitorId = ({
|
|
393
|
+
id,
|
|
394
|
+
canTrack
|
|
395
|
+
}) => setLocalStorageItem({
|
|
396
|
+
key: VISITOR_LOCAL_STORAGE_KEY,
|
|
397
|
+
value: id,
|
|
398
|
+
canTrack
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// src/functions/log-fetch.ts
|
|
402
|
+
function logFetch(url) {
|
|
403
|
+
if (typeof process !== "undefined" && process.env?.DEBUG) {
|
|
404
|
+
if (String(process.env.DEBUG) == "true") {
|
|
405
|
+
logger.log(url);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// src/functions/track/index.ts
|
|
411
|
+
var getTrackingEventData = async ({
|
|
412
|
+
canTrack
|
|
413
|
+
}) => {
|
|
414
|
+
if (!canTrack) {
|
|
415
|
+
return {
|
|
416
|
+
visitorId: void 0,
|
|
417
|
+
sessionId: void 0
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
const sessionId = await getSessionId({
|
|
421
|
+
canTrack
|
|
422
|
+
});
|
|
423
|
+
const visitorId = getVisitorId({
|
|
424
|
+
canTrack
|
|
425
|
+
});
|
|
426
|
+
return {
|
|
427
|
+
sessionId,
|
|
428
|
+
visitorId
|
|
429
|
+
};
|
|
430
|
+
};
|
|
431
|
+
var createEvent = async ({
|
|
432
|
+
type: eventType,
|
|
433
|
+
canTrack,
|
|
434
|
+
apiKey,
|
|
435
|
+
metadata,
|
|
436
|
+
...properties
|
|
437
|
+
}) => ({
|
|
438
|
+
type: eventType,
|
|
439
|
+
data: {
|
|
440
|
+
...properties,
|
|
441
|
+
metadata: {
|
|
442
|
+
url: location.href,
|
|
443
|
+
...metadata
|
|
444
|
+
},
|
|
445
|
+
...await getTrackingEventData({
|
|
446
|
+
canTrack
|
|
447
|
+
}),
|
|
448
|
+
userAttributes: getUserAttributes(),
|
|
449
|
+
ownerId: apiKey
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
async function _track({
|
|
453
|
+
apiHost,
|
|
454
|
+
...eventProps
|
|
455
|
+
}) {
|
|
456
|
+
if (!eventProps.apiKey) {
|
|
457
|
+
logger.error("Missing API key for track call. Please provide your API key.");
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
if (!eventProps.canTrack) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
if (isEditing()) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
if (!(isBrowser() || TARGET === "reactNative")) {
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
const baseUrl = apiHost || "https://cdn.builder.io";
|
|
470
|
+
const url = `${baseUrl}/api/v1/track`;
|
|
471
|
+
logFetch(url);
|
|
472
|
+
return fetch(url, {
|
|
473
|
+
method: "POST",
|
|
474
|
+
body: JSON.stringify({
|
|
475
|
+
events: [await createEvent(eventProps)]
|
|
476
|
+
}),
|
|
477
|
+
headers: {
|
|
478
|
+
"content-type": "application/json",
|
|
479
|
+
...getSdkHeaders()
|
|
480
|
+
},
|
|
481
|
+
mode: "cors"
|
|
482
|
+
}).catch((err) => {
|
|
483
|
+
console.error("Failed to track: ", err);
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
var track = (args) => _track({
|
|
487
|
+
...args,
|
|
488
|
+
canTrack: true
|
|
489
|
+
});
|
|
490
|
+
|
|
218
491
|
// src/functions/evaluate/helpers.ts
|
|
219
492
|
var getFunctionArguments = ({
|
|
220
493
|
builder,
|
|
@@ -231,11 +504,29 @@ var getFunctionArguments = ({
|
|
|
231
504
|
event
|
|
232
505
|
});
|
|
233
506
|
};
|
|
234
|
-
var getBuilderGlobals = () => ({
|
|
507
|
+
var getBuilderGlobals = (trackingContext) => ({
|
|
235
508
|
isEditing: isEditing(),
|
|
236
509
|
isBrowser: isBrowser(),
|
|
237
510
|
isServer: !isBrowser(),
|
|
238
|
-
getUserAttributes: () => getUserAttributes()
|
|
511
|
+
getUserAttributes: () => getUserAttributes(),
|
|
512
|
+
trackConversion: (amount, customProperties) => {
|
|
513
|
+
if (!trackingContext?.apiKey || trackingContext?.canTrack === false) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
_track({
|
|
517
|
+
type: "conversion",
|
|
518
|
+
apiKey: trackingContext.apiKey,
|
|
519
|
+
canTrack: trackingContext.canTrack ?? true,
|
|
520
|
+
contentId: trackingContext.contentId,
|
|
521
|
+
variationId: trackingContext.variationId !== trackingContext.contentId ? trackingContext.variationId : void 0,
|
|
522
|
+
metadata: {
|
|
523
|
+
...customProperties || {},
|
|
524
|
+
...amount !== void 0 ? {
|
|
525
|
+
amount
|
|
526
|
+
} : {}
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|
|
239
530
|
});
|
|
240
531
|
var parseCode = (code, {
|
|
241
532
|
isExpression = true
|
|
@@ -304,9 +595,6 @@ var runInBrowser = ({
|
|
|
304
595
|
return new Function(...functionArgs.map(([name]) => name), code)(...functionArgs.map(([, value]) => value));
|
|
305
596
|
};
|
|
306
597
|
|
|
307
|
-
// src/helpers/nullable.ts
|
|
308
|
-
var checkIsDefined = (maybeT) => maybeT !== null && maybeT !== void 0;
|
|
309
|
-
|
|
310
598
|
// src/functions/is-node-runtime.ts
|
|
311
599
|
function isNodeRuntime() {
|
|
312
600
|
return typeof process !== "undefined" && checkIsDefined(process?.versions?.node);
|
|
@@ -351,7 +639,8 @@ function evaluate({
|
|
|
351
639
|
rootState,
|
|
352
640
|
rootSetState,
|
|
353
641
|
event,
|
|
354
|
-
isExpression = true
|
|
642
|
+
isExpression = true,
|
|
643
|
+
trackingContext
|
|
355
644
|
}) {
|
|
356
645
|
if (code.trim() === "") {
|
|
357
646
|
return void 0;
|
|
@@ -367,7 +656,7 @@ function evaluate({
|
|
|
367
656
|
code: parseCode(code, {
|
|
368
657
|
isExpression
|
|
369
658
|
}),
|
|
370
|
-
builder: getBuilderGlobals(),
|
|
659
|
+
builder: getBuilderGlobals(trackingContext),
|
|
371
660
|
context,
|
|
372
661
|
event,
|
|
373
662
|
rootSetState,
|
|
@@ -955,7 +1244,8 @@ var createEventHandler = (value, options) => (event) => evaluate({
|
|
|
955
1244
|
rootState: options.rootState,
|
|
956
1245
|
rootSetState: options.rootSetState,
|
|
957
1246
|
event,
|
|
958
|
-
isExpression: false
|
|
1247
|
+
isExpression: false,
|
|
1248
|
+
trackingContext: options.trackingContext
|
|
959
1249
|
});
|
|
960
1250
|
|
|
961
1251
|
// src/functions/get-block-actions.ts
|
|
@@ -1036,395 +1326,131 @@ function BlockWrapper(props) {
|
|
|
1036
1326
|
rootSetState: props.context.rootSetState,
|
|
1037
1327
|
localState: props.context.localState,
|
|
1038
1328
|
context: props.context.context,
|
|
1039
|
-
stripPrefix: true
|
|
1329
|
+
stripPrefix: true,
|
|
1330
|
+
trackingContext: {
|
|
1331
|
+
apiKey: props.context.apiKey,
|
|
1332
|
+
canTrack: props.context.canTrack ?? true,
|
|
1333
|
+
contentId: props.context.content?.id,
|
|
1334
|
+
variationId: props.context.content?.testVariationId
|
|
1335
|
+
}
|
|
1040
1336
|
});
|
|
1041
1337
|
},
|
|
1042
1338
|
get children() {
|
|
1043
1339
|
return props.children;
|
|
1044
|
-
}
|
|
1045
|
-
});
|
|
1046
|
-
}
|
|
1047
|
-
var block_wrapper_default = BlockWrapper;
|
|
1048
|
-
|
|
1049
|
-
// src/functions/is-previewing.ts
|
|
1050
|
-
function isPreviewing(search) {
|
|
1051
|
-
const searchToUse = search || (isBrowser() ? window.location.search : void 0);
|
|
1052
|
-
if (!searchToUse) {
|
|
1053
|
-
return false;
|
|
1054
|
-
}
|
|
1055
|
-
const normalizedSearch = getSearchString(searchToUse);
|
|
1056
|
-
return Boolean(normalizedSearch.indexOf("builder.preview=") !== -1);
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1059
|
-
// src/functions/register-component.ts
|
|
1060
|
-
var createRegisterComponentMessage = (info) => ({
|
|
1061
|
-
type: "builder.registerComponent",
|
|
1062
|
-
data: serializeIncludingFunctions(info)
|
|
1063
|
-
});
|
|
1064
|
-
var serializeFn = (fnValue) => {
|
|
1065
|
-
const fnStr = fnValue.toString().trim();
|
|
1066
|
-
const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
|
|
1067
|
-
const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
|
|
1068
|
-
return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
|
|
1069
|
-
};
|
|
1070
|
-
function serializeIncludingFunctions(info) {
|
|
1071
|
-
return JSON.parse(JSON.stringify(info, (key, value) => {
|
|
1072
|
-
if (typeof value === "function") {
|
|
1073
|
-
return serializeFn(value);
|
|
1074
|
-
}
|
|
1075
|
-
return value;
|
|
1076
|
-
}));
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
|
-
// src/functions/register.ts
|
|
1080
|
-
var registry = {};
|
|
1081
|
-
function register(type, info) {
|
|
1082
|
-
if (type === "plugin") {
|
|
1083
|
-
info = serializeIncludingFunctions(info);
|
|
1084
|
-
}
|
|
1085
|
-
let typeList = registry[type];
|
|
1086
|
-
if (!typeList) {
|
|
1087
|
-
typeList = registry[type] = [];
|
|
1088
|
-
}
|
|
1089
|
-
typeList.push(info);
|
|
1090
|
-
if (isBrowser()) {
|
|
1091
|
-
const message = {
|
|
1092
|
-
type: "builder.register",
|
|
1093
|
-
data: {
|
|
1094
|
-
type,
|
|
1095
|
-
info
|
|
1096
|
-
}
|
|
1097
|
-
};
|
|
1098
|
-
try {
|
|
1099
|
-
parent.postMessage(message, "*");
|
|
1100
|
-
if (parent !== window) {
|
|
1101
|
-
window.postMessage(message, "*");
|
|
1102
|
-
}
|
|
1103
|
-
} catch (err) {
|
|
1104
|
-
console.debug("Could not postmessage", err);
|
|
1105
|
-
}
|
|
1106
|
-
}
|
|
1107
|
-
}
|
|
1108
|
-
function registerAction(action) {
|
|
1109
|
-
if (isBrowser()) {
|
|
1110
|
-
const actionClone = JSON.parse(JSON.stringify(action));
|
|
1111
|
-
if (action.action) {
|
|
1112
|
-
actionClone.action = action.action.toString();
|
|
1113
|
-
}
|
|
1114
|
-
window.parent?.postMessage({
|
|
1115
|
-
type: "builder.registerAction",
|
|
1116
|
-
data: actionClone
|
|
1117
|
-
}, "*");
|
|
1118
|
-
}
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
// src/functions/set-editor-settings.ts
|
|
1122
|
-
var settings = {};
|
|
1123
|
-
function setEditorSettings(newSettings) {
|
|
1124
|
-
if (isBrowser()) {
|
|
1125
|
-
Object.assign(settings, newSettings);
|
|
1126
|
-
const message = {
|
|
1127
|
-
type: "builder.settingsChange",
|
|
1128
|
-
data: settings
|
|
1129
|
-
};
|
|
1130
|
-
parent.postMessage(message, "*");
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
|
|
1134
|
-
// src/functions/get-builder-search-params/index.ts
|
|
1135
|
-
var BUILDER_SEARCHPARAMS_PREFIX = "builder.";
|
|
1136
|
-
var BUILDER_OPTIONS_PREFIX = "options.";
|
|
1137
|
-
var getBuilderSearchParams = (_options) => {
|
|
1138
|
-
if (!_options) {
|
|
1139
|
-
return {};
|
|
1140
|
-
}
|
|
1141
|
-
const options = normalizeSearchParams(_options);
|
|
1142
|
-
const newOptions = {};
|
|
1143
|
-
Object.keys(options).forEach((key) => {
|
|
1144
|
-
if (key.startsWith(BUILDER_SEARCHPARAMS_PREFIX)) {
|
|
1145
|
-
const trimmedKey = key.replace(BUILDER_SEARCHPARAMS_PREFIX, "").replace(BUILDER_OPTIONS_PREFIX, "");
|
|
1146
|
-
newOptions[trimmedKey] = options[key];
|
|
1147
|
-
}
|
|
1148
|
-
});
|
|
1149
|
-
return newOptions;
|
|
1150
|
-
};
|
|
1151
|
-
var getBuilderSearchParamsFromWindow = () => {
|
|
1152
|
-
if (!isBrowser()) {
|
|
1153
|
-
return {};
|
|
1154
|
-
}
|
|
1155
|
-
const searchParams = new URLSearchParams(window.location.search);
|
|
1156
|
-
return getBuilderSearchParams(searchParams);
|
|
1157
|
-
};
|
|
1158
|
-
|
|
1159
|
-
// src/constants/sdk-version.ts
|
|
1160
|
-
var SDK_VERSION = "5.1.0";
|
|
1161
|
-
|
|
1162
|
-
// src/helpers/sdk-headers.ts
|
|
1163
|
-
var getSdkHeaders = () => ({
|
|
1164
|
-
"X-Builder-SDK": TARGET,
|
|
1165
|
-
"X-Builder-SDK-GEN": "2",
|
|
1166
|
-
"X-Builder-SDK-Version": SDK_VERSION
|
|
1167
|
-
});
|
|
1168
|
-
|
|
1169
|
-
// src/helpers/url.ts
|
|
1170
|
-
var getTopLevelDomain = (host) => {
|
|
1171
|
-
if (host === "localhost" || host === "127.0.0.1") {
|
|
1172
|
-
return host;
|
|
1173
|
-
}
|
|
1174
|
-
const parts = host.split(".");
|
|
1175
|
-
if (parts.length > 2) {
|
|
1176
|
-
return parts.slice(1).join(".");
|
|
1177
|
-
}
|
|
1178
|
-
return host;
|
|
1179
|
-
};
|
|
1180
|
-
|
|
1181
|
-
// src/helpers/cookie.ts
|
|
1182
|
-
var getCookieSync = ({
|
|
1183
|
-
name,
|
|
1184
|
-
canTrack
|
|
1185
|
-
}) => {
|
|
1186
|
-
try {
|
|
1187
|
-
if (!canTrack) {
|
|
1188
|
-
return void 0;
|
|
1189
|
-
}
|
|
1190
|
-
return document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))?.split("=")[1];
|
|
1191
|
-
} catch (err) {
|
|
1192
|
-
logger.warn("[COOKIE] GET error: ", err?.message || err);
|
|
1193
|
-
return void 0;
|
|
1194
|
-
}
|
|
1195
|
-
};
|
|
1196
|
-
var getCookie = async (args) => getCookieSync(args);
|
|
1197
|
-
var stringifyCookie = (cookie) => cookie.map(([key, value]) => value ? `${key}=${value}` : key).filter(checkIsDefined).join("; ");
|
|
1198
|
-
var SECURE_CONFIG = [["secure", ""], ["SameSite", "None"]];
|
|
1199
|
-
var createCookieString = ({
|
|
1200
|
-
name,
|
|
1201
|
-
value,
|
|
1202
|
-
expires
|
|
1203
|
-
}) => {
|
|
1204
|
-
const secure = isBrowser() ? location.protocol === "https:" : true;
|
|
1205
|
-
const secureObj = secure ? SECURE_CONFIG : [[]];
|
|
1206
|
-
const expiresObj = expires ? [["expires", expires.toUTCString()]] : [[]];
|
|
1207
|
-
const cookieValue = [[name, value], ...expiresObj, ["path", "/"], ["domain", getTopLevelDomain(window.location.hostname)], ...secureObj];
|
|
1208
|
-
const cookie = stringifyCookie(cookieValue);
|
|
1209
|
-
return cookie;
|
|
1210
|
-
};
|
|
1211
|
-
var setCookie = async ({
|
|
1212
|
-
name,
|
|
1213
|
-
value,
|
|
1214
|
-
expires,
|
|
1215
|
-
canTrack
|
|
1216
|
-
}) => {
|
|
1217
|
-
try {
|
|
1218
|
-
if (!canTrack) {
|
|
1219
|
-
return;
|
|
1220
|
-
}
|
|
1221
|
-
const cookie = createCookieString({
|
|
1222
|
-
name,
|
|
1223
|
-
value,
|
|
1224
|
-
expires
|
|
1225
|
-
});
|
|
1226
|
-
document.cookie = cookie;
|
|
1227
|
-
} catch (err) {
|
|
1228
|
-
logger.warn("[COOKIE] SET error: ", err?.message || err);
|
|
1229
|
-
}
|
|
1230
|
-
};
|
|
1231
|
-
|
|
1232
|
-
// src/helpers/uuid.ts
|
|
1233
|
-
function uuidv4() {
|
|
1234
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
|
|
1235
|
-
const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
|
|
1236
|
-
return v.toString(16);
|
|
1237
|
-
});
|
|
1238
|
-
}
|
|
1239
|
-
function uuid() {
|
|
1240
|
-
return uuidv4().replace(/-/g, "");
|
|
1241
|
-
}
|
|
1242
|
-
|
|
1243
|
-
// src/helpers/sessionId.ts
|
|
1244
|
-
var SESSION_LOCAL_STORAGE_KEY = "builderSessionId";
|
|
1245
|
-
var getSessionId = async ({
|
|
1246
|
-
canTrack
|
|
1247
|
-
}) => {
|
|
1248
|
-
if (!canTrack) {
|
|
1249
|
-
return void 0;
|
|
1250
|
-
}
|
|
1251
|
-
const sessionId = await getCookie({
|
|
1252
|
-
name: SESSION_LOCAL_STORAGE_KEY,
|
|
1253
|
-
canTrack
|
|
1340
|
+
}
|
|
1254
1341
|
});
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
} else {
|
|
1258
|
-
const newSessionId = createSessionId();
|
|
1259
|
-
setSessionId({
|
|
1260
|
-
id: newSessionId,
|
|
1261
|
-
canTrack
|
|
1262
|
-
});
|
|
1263
|
-
return newSessionId;
|
|
1264
|
-
}
|
|
1265
|
-
};
|
|
1266
|
-
var createSessionId = () => uuid();
|
|
1267
|
-
var setSessionId = ({
|
|
1268
|
-
id,
|
|
1269
|
-
canTrack
|
|
1270
|
-
}) => setCookie({
|
|
1271
|
-
name: SESSION_LOCAL_STORAGE_KEY,
|
|
1272
|
-
value: id,
|
|
1273
|
-
canTrack
|
|
1274
|
-
});
|
|
1342
|
+
}
|
|
1343
|
+
var block_wrapper_default = BlockWrapper;
|
|
1275
1344
|
|
|
1276
|
-
// src/
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
}) => {
|
|
1282
|
-
try {
|
|
1283
|
-
if (canTrack) {
|
|
1284
|
-
return getLocalStorage()?.getItem(key);
|
|
1285
|
-
}
|
|
1286
|
-
return void 0;
|
|
1287
|
-
} catch (err) {
|
|
1288
|
-
console.debug("[LocalStorage] GET error: ", err);
|
|
1289
|
-
return void 0;
|
|
1345
|
+
// src/functions/is-previewing.ts
|
|
1346
|
+
function isPreviewing(search) {
|
|
1347
|
+
const searchToUse = search || (isBrowser() ? window.location.search : void 0);
|
|
1348
|
+
if (!searchToUse) {
|
|
1349
|
+
return false;
|
|
1290
1350
|
}
|
|
1351
|
+
const normalizedSearch = getSearchString(searchToUse);
|
|
1352
|
+
return Boolean(normalizedSearch.indexOf("builder.preview=") !== -1);
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
// src/functions/register-component.ts
|
|
1356
|
+
var createRegisterComponentMessage = (info) => ({
|
|
1357
|
+
type: "builder.registerComponent",
|
|
1358
|
+
data: serializeIncludingFunctions(info)
|
|
1359
|
+
});
|
|
1360
|
+
var serializeFn = (fnValue) => {
|
|
1361
|
+
const fnStr = fnValue.toString().trim();
|
|
1362
|
+
const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
|
|
1363
|
+
const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
|
|
1364
|
+
return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
|
|
1291
1365
|
};
|
|
1292
|
-
|
|
1293
|
-
key,
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
}) => {
|
|
1297
|
-
try {
|
|
1298
|
-
if (canTrack) {
|
|
1299
|
-
getLocalStorage()?.setItem(key, value);
|
|
1366
|
+
function serializeIncludingFunctions(info) {
|
|
1367
|
+
return JSON.parse(JSON.stringify(info, (key, value) => {
|
|
1368
|
+
if (typeof value === "function") {
|
|
1369
|
+
return serializeFn(value);
|
|
1300
1370
|
}
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
};
|
|
1371
|
+
return value;
|
|
1372
|
+
}));
|
|
1373
|
+
}
|
|
1305
1374
|
|
|
1306
|
-
// src/
|
|
1307
|
-
var
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
if (!canTrack) {
|
|
1312
|
-
return void 0;
|
|
1375
|
+
// src/functions/register.ts
|
|
1376
|
+
var registry = {};
|
|
1377
|
+
function register(type, info) {
|
|
1378
|
+
if (type === "plugin") {
|
|
1379
|
+
info = serializeIncludingFunctions(info);
|
|
1313
1380
|
}
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
});
|
|
1318
|
-
if (checkIsDefined(visitorId)) {
|
|
1319
|
-
return visitorId;
|
|
1320
|
-
} else {
|
|
1321
|
-
const newVisitorId = createVisitorId();
|
|
1322
|
-
setVisitorId({
|
|
1323
|
-
id: newVisitorId,
|
|
1324
|
-
canTrack
|
|
1325
|
-
});
|
|
1326
|
-
return newVisitorId;
|
|
1381
|
+
let typeList = registry[type];
|
|
1382
|
+
if (!typeList) {
|
|
1383
|
+
typeList = registry[type] = [];
|
|
1327
1384
|
}
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1385
|
+
typeList.push(info);
|
|
1386
|
+
if (isBrowser()) {
|
|
1387
|
+
const message = {
|
|
1388
|
+
type: "builder.register",
|
|
1389
|
+
data: {
|
|
1390
|
+
type,
|
|
1391
|
+
info
|
|
1392
|
+
}
|
|
1393
|
+
};
|
|
1394
|
+
try {
|
|
1395
|
+
parent.postMessage(message, "*");
|
|
1396
|
+
if (parent !== window) {
|
|
1397
|
+
window.postMessage(message, "*");
|
|
1398
|
+
}
|
|
1399
|
+
} catch (err) {
|
|
1400
|
+
console.debug("Could not postmessage", err);
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
function registerAction(action) {
|
|
1405
|
+
if (isBrowser()) {
|
|
1406
|
+
const actionClone = JSON.parse(JSON.stringify(action));
|
|
1407
|
+
if (action.action) {
|
|
1408
|
+
actionClone.action = action.action.toString();
|
|
1344
1409
|
}
|
|
1410
|
+
window.parent?.postMessage({
|
|
1411
|
+
type: "builder.registerAction",
|
|
1412
|
+
data: actionClone
|
|
1413
|
+
}, "*");
|
|
1345
1414
|
}
|
|
1346
1415
|
}
|
|
1347
1416
|
|
|
1348
|
-
// src/functions/
|
|
1349
|
-
var
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1417
|
+
// src/functions/set-editor-settings.ts
|
|
1418
|
+
var settings = {};
|
|
1419
|
+
function setEditorSettings(newSettings) {
|
|
1420
|
+
if (isBrowser()) {
|
|
1421
|
+
Object.assign(settings, newSettings);
|
|
1422
|
+
const message = {
|
|
1423
|
+
type: "builder.settingsChange",
|
|
1424
|
+
data: settings
|
|
1356
1425
|
};
|
|
1426
|
+
parent.postMessage(message, "*");
|
|
1357
1427
|
}
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
// src/functions/get-builder-search-params/index.ts
|
|
1431
|
+
var BUILDER_SEARCHPARAMS_PREFIX = "builder.";
|
|
1432
|
+
var BUILDER_OPTIONS_PREFIX = "options.";
|
|
1433
|
+
var getBuilderSearchParams = (_options) => {
|
|
1434
|
+
if (!_options) {
|
|
1435
|
+
return {};
|
|
1436
|
+
}
|
|
1437
|
+
const options = normalizeSearchParams(_options);
|
|
1438
|
+
const newOptions = {};
|
|
1439
|
+
Object.keys(options).forEach((key) => {
|
|
1440
|
+
if (key.startsWith(BUILDER_SEARCHPARAMS_PREFIX)) {
|
|
1441
|
+
const trimmedKey = key.replace(BUILDER_SEARCHPARAMS_PREFIX, "").replace(BUILDER_OPTIONS_PREFIX, "");
|
|
1442
|
+
newOptions[trimmedKey] = options[key];
|
|
1443
|
+
}
|
|
1363
1444
|
});
|
|
1364
|
-
return
|
|
1365
|
-
sessionId,
|
|
1366
|
-
visitorId
|
|
1367
|
-
};
|
|
1445
|
+
return newOptions;
|
|
1368
1446
|
};
|
|
1369
|
-
var
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
apiKey,
|
|
1373
|
-
metadata,
|
|
1374
|
-
...properties
|
|
1375
|
-
}) => ({
|
|
1376
|
-
type: eventType,
|
|
1377
|
-
data: {
|
|
1378
|
-
...properties,
|
|
1379
|
-
metadata: {
|
|
1380
|
-
url: location.href,
|
|
1381
|
-
...metadata
|
|
1382
|
-
},
|
|
1383
|
-
...await getTrackingEventData({
|
|
1384
|
-
canTrack
|
|
1385
|
-
}),
|
|
1386
|
-
userAttributes: getUserAttributes(),
|
|
1387
|
-
ownerId: apiKey
|
|
1388
|
-
}
|
|
1389
|
-
});
|
|
1390
|
-
async function _track({
|
|
1391
|
-
apiHost,
|
|
1392
|
-
...eventProps
|
|
1393
|
-
}) {
|
|
1394
|
-
if (!eventProps.apiKey) {
|
|
1395
|
-
logger.error("Missing API key for track call. Please provide your API key.");
|
|
1396
|
-
return;
|
|
1397
|
-
}
|
|
1398
|
-
if (!eventProps.canTrack) {
|
|
1399
|
-
return;
|
|
1400
|
-
}
|
|
1401
|
-
if (isEditing()) {
|
|
1402
|
-
return;
|
|
1403
|
-
}
|
|
1404
|
-
if (!(isBrowser() || TARGET === "reactNative")) {
|
|
1405
|
-
return;
|
|
1447
|
+
var getBuilderSearchParamsFromWindow = () => {
|
|
1448
|
+
if (!isBrowser()) {
|
|
1449
|
+
return {};
|
|
1406
1450
|
}
|
|
1407
|
-
const
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
return fetch(url, {
|
|
1411
|
-
method: "POST",
|
|
1412
|
-
body: JSON.stringify({
|
|
1413
|
-
events: [await createEvent(eventProps)]
|
|
1414
|
-
}),
|
|
1415
|
-
headers: {
|
|
1416
|
-
"content-type": "application/json",
|
|
1417
|
-
...getSdkHeaders()
|
|
1418
|
-
},
|
|
1419
|
-
mode: "cors"
|
|
1420
|
-
}).catch((err) => {
|
|
1421
|
-
console.error("Failed to track: ", err);
|
|
1422
|
-
});
|
|
1423
|
-
}
|
|
1424
|
-
var track = (args) => _track({
|
|
1425
|
-
...args,
|
|
1426
|
-
canTrack: true
|
|
1427
|
-
});
|
|
1451
|
+
const searchParams = new URLSearchParams(window.location.search);
|
|
1452
|
+
return getBuilderSearchParams(searchParams);
|
|
1453
|
+
};
|
|
1428
1454
|
|
|
1429
1455
|
// src/functions/is-from-trusted-host.ts
|
|
1430
1456
|
var DEFAULT_TRUSTED_HOSTS = ["*.beta.builder.io", "beta.builder.io", "builder.io", "localhost", "qa.builder.io"];
|
|
@@ -2167,7 +2193,13 @@ function InteractiveElement(props) {
|
|
|
2167
2193
|
rootState: props.context.rootState,
|
|
2168
2194
|
rootSetState: props.context.rootSetState,
|
|
2169
2195
|
localState: props.context.localState,
|
|
2170
|
-
context: props.context.context
|
|
2196
|
+
context: props.context.context,
|
|
2197
|
+
trackingContext: {
|
|
2198
|
+
apiKey: props.context.apiKey,
|
|
2199
|
+
canTrack: props.context.canTrack ?? true,
|
|
2200
|
+
contentId: props.context.content?.id,
|
|
2201
|
+
variationId: props.context.content?.testVariationId
|
|
2202
|
+
}
|
|
2171
2203
|
})
|
|
2172
2204
|
} : {};
|
|
2173
2205
|
});
|