@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/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 IVM_CONTEXT = null;
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
- const state = fastClone({
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
- const res = JSON.parse(resultStr);
483
- return res;
484
- } catch (_error) {
485
- return resultStr;
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
- if (checkIsDefined(sessionId)) {
1425
- return sessionId;
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/helpers/localStorage.ts
1446
- var getLocalStorage = () => isBrowser() && typeof localStorage !== "undefined" ? localStorage : void 0;
1447
- var getLocalStorageItem = ({
1448
- key,
1449
- canTrack
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
- var setLocalStorageItem = ({
1462
- key,
1463
- canTrack,
1464
- value
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
- } catch (err) {
1471
- console.debug("[LocalStorage] SET error: ", err);
1472
- }
1473
- };
1538
+ return value;
1539
+ }));
1540
+ }
1474
1541
 
1475
- // src/helpers/visitorId.ts
1476
- var VISITOR_LOCAL_STORAGE_KEY = "builderVisitorId";
1477
- var getVisitorId = ({
1478
- canTrack
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
- const visitorId = getLocalStorageItem({
1484
- key: VISITOR_LOCAL_STORAGE_KEY,
1485
- canTrack
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
- var createVisitorId = () => uuid();
1499
- var setVisitorId = ({
1500
- id,
1501
- canTrack
1502
- }) => setLocalStorageItem({
1503
- key: VISITOR_LOCAL_STORAGE_KEY,
1504
- value: id,
1505
- canTrack
1506
- });
1507
-
1508
- // src/functions/log-fetch.ts
1509
- function logFetch(url) {
1510
- if (typeof process !== "undefined" && process.env?.DEBUG) {
1511
- if (String(process.env.DEBUG) == "true") {
1512
- logger.log(url);
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/track/index.ts
1518
- var getTrackingEventData = async ({
1519
- canTrack
1520
- }) => {
1521
- if (!canTrack) {
1522
- return {
1523
- visitorId: void 0,
1524
- sessionId: void 0
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
- const sessionId = await getSessionId({
1528
- canTrack
1529
- });
1530
- const visitorId = getVisitorId({
1531
- canTrack
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 createEvent = async ({
1539
- type: eventType,
1540
- canTrack,
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 baseUrl = apiHost || "https://cdn.builder.io";
1577
- const url = `${baseUrl}/api/v1/track`;
1578
- logFetch(url);
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
  });