@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.
@@ -207,145 +207,433 @@ var getUserAttributes = () => {
207
207
  };
208
208
  };
209
209
 
210
- // src/functions/evaluate/helpers.ts
211
- var getFunctionArguments = ({
212
- builder,
213
- context,
214
- event,
215
- state
210
+ // src/constants/sdk-version.ts
211
+ var SDK_VERSION = "5.1.1";
212
+
213
+ // src/helpers/sdk-headers.ts
214
+ var getSdkHeaders = () => ({
215
+ "X-Builder-SDK": TARGET,
216
+ "X-Builder-SDK-GEN": "2",
217
+ "X-Builder-SDK-Version": SDK_VERSION
218
+ });
219
+
220
+ // src/helpers/nullable.ts
221
+ var checkIsDefined = (maybeT) => maybeT !== null && maybeT !== void 0;
222
+
223
+ // src/helpers/url.ts
224
+ var getTopLevelDomain = (host) => {
225
+ if (host === "localhost" || host === "127.0.0.1") {
226
+ return host;
227
+ }
228
+ const parts = host.split(".");
229
+ if (parts.length > 2) {
230
+ return parts.slice(1).join(".");
231
+ }
232
+ return host;
233
+ };
234
+
235
+ // src/helpers/cookie.ts
236
+ var getCookieSync = ({
237
+ name,
238
+ canTrack
216
239
  }) => {
217
- return Object.entries({
218
- state,
219
- Builder: builder,
220
- // legacy
221
- builder,
222
- context,
223
- event
224
- });
240
+ try {
241
+ if (!canTrack) {
242
+ return void 0;
243
+ }
244
+ return document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))?.split("=")[1];
245
+ } catch (err) {
246
+ logger.warn("[COOKIE] GET error: ", err?.message || err);
247
+ return void 0;
248
+ }
225
249
  };
226
- var getBuilderGlobals = () => ({
227
- isEditing: isEditing(),
228
- isBrowser: isBrowser(),
229
- isServer: !isBrowser(),
230
- getUserAttributes: () => getUserAttributes()
231
- });
232
- var parseCode = (code, {
233
- isExpression = true
250
+ var getCookie = async (args) => getCookieSync(args);
251
+ var stringifyCookie = (cookie) => cookie.map(([key, value]) => value ? `${key}=${value}` : key).filter(checkIsDefined).join("; ");
252
+ var SECURE_CONFIG = [["secure", ""], ["SameSite", "None"]];
253
+ var createCookieString = ({
254
+ name,
255
+ value,
256
+ expires
234
257
  }) => {
235
- const useReturn = (
236
- // we disable this for cases where we definitely don't want a return
237
- isExpression && !(code.includes(";") || code.includes(" return ") || code.trim().startsWith("return "))
238
- );
239
- const useCode = useReturn ? `return (${code});` : code;
240
- return useCode;
258
+ const secure = isBrowser() ? location.protocol === "https:" : true;
259
+ const secureObj = secure ? SECURE_CONFIG : [[]];
260
+ const expiresObj = expires ? [["expires", expires.toUTCString()]] : [[]];
261
+ const cookieValue = [[name, value], ...expiresObj, ["path", "/"], ["domain", getTopLevelDomain(window.location.hostname)], ...secureObj];
262
+ const cookie = stringifyCookie(cookieValue);
263
+ return cookie;
241
264
  };
242
- function flattenState({
243
- rootState,
244
- localState,
245
- rootSetState
246
- }) {
247
- return new Proxy(rootState, {
248
- get: (target, prop) => {
249
- if (localState && prop in localState) {
250
- return localState[prop];
251
- }
252
- const val = target[prop];
253
- if (typeof val === "object" && val !== null) {
254
- return flattenState({
255
- rootState: val,
256
- localState: void 0,
257
- rootSetState: rootSetState ? (subState) => {
258
- target[prop] = subState;
259
- rootSetState(target);
260
- } : void 0
261
- });
262
- }
263
- return val;
264
- },
265
- set: (target, prop, value) => {
266
- if (localState && prop in localState) {
267
- throw new Error("Writing to local state is not allowed as it is read-only.");
268
- }
269
- target[prop] = value;
270
- rootSetState?.(target);
271
- return true;
265
+ var setCookie = async ({
266
+ name,
267
+ value,
268
+ expires,
269
+ canTrack
270
+ }) => {
271
+ try {
272
+ if (!canTrack) {
273
+ return;
272
274
  }
275
+ const cookie = createCookieString({
276
+ name,
277
+ value,
278
+ expires
279
+ });
280
+ document.cookie = cookie;
281
+ } catch (err) {
282
+ logger.warn("[COOKIE] SET error: ", err?.message || err);
283
+ }
284
+ };
285
+
286
+ // src/helpers/uuid.ts
287
+ function uuidv4() {
288
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
289
+ const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
290
+ return v.toString(16);
273
291
  });
274
292
  }
293
+ function uuid() {
294
+ return uuidv4().replace(/-/g, "");
295
+ }
275
296
 
276
- // src/functions/evaluate/browser-runtime/browser.ts
277
- var runInBrowser = ({
278
- code,
279
- builder,
280
- context,
281
- event,
282
- localState,
283
- rootSetState,
284
- rootState
297
+ // src/helpers/sessionId.ts
298
+ var SESSION_LOCAL_STORAGE_KEY = "builderSessionId";
299
+ var getSessionId = async ({
300
+ canTrack
285
301
  }) => {
286
- const functionArgs = getFunctionArguments({
287
- builder,
288
- context,
289
- event,
290
- state: flattenState({
291
- rootState,
292
- localState,
293
- rootSetState
294
- })
295
- });
296
- return new Function(...functionArgs.map(([name]) => name), code)(...functionArgs.map(([, value]) => value));
297
- };
298
-
299
- // src/constants/sdk-name.ts
300
- var SDK_NAME_FOR_TARGET = (() => {
301
- switch (TARGET) {
302
- case "rsc":
303
- return "react-nextjs";
304
- case "reactNative":
305
- return "react-native";
306
- default:
307
- return TARGET;
302
+ if (!canTrack) {
303
+ return void 0;
308
304
  }
309
- })();
310
- var SDK_NAME = `@builder.io/sdk-${SDK_NAME_FOR_TARGET}`;
311
-
312
- // src/functions/fast-clone.ts
313
- var fastClone = (obj) => JSON.parse(JSON.stringify(obj));
314
-
315
- // src/functions/set.ts
316
- var set = (obj, _path, value) => {
317
- if (Object(obj) !== obj) {
318
- return obj;
305
+ const sessionId = await getCookie({
306
+ name: SESSION_LOCAL_STORAGE_KEY,
307
+ canTrack
308
+ });
309
+ if (checkIsDefined(sessionId)) {
310
+ return sessionId;
311
+ } else {
312
+ const newSessionId = createSessionId();
313
+ setSessionId({
314
+ id: newSessionId,
315
+ canTrack
316
+ });
317
+ return newSessionId;
319
318
  }
320
- const path = Array.isArray(_path) ? _path : _path.toString().match(/[^.[\]]+/g);
321
- path.slice(0, -1).reduce((a, c, i) => Object(a[c]) === a[c] ? a[c] : a[c] = Math.abs(Number(path[i + 1])) >> 0 === +path[i + 1] ? [] : {}, obj)[path[path.length - 1]] = value;
322
- return obj;
323
319
  };
320
+ var createSessionId = () => uuid();
321
+ var setSessionId = ({
322
+ id,
323
+ canTrack
324
+ }) => setCookie({
325
+ name: SESSION_LOCAL_STORAGE_KEY,
326
+ value: id,
327
+ canTrack
328
+ });
324
329
 
325
- // src/functions/evaluate/node-runtime/safeDynamicRequire.ts
326
- import { createRequire } from "node:module";
327
- var noop = () => {
330
+ // src/helpers/localStorage.ts
331
+ var getLocalStorage = () => isBrowser() && typeof localStorage !== "undefined" ? localStorage : void 0;
332
+ var getLocalStorageItem = ({
333
+ key,
334
+ canTrack
335
+ }) => {
336
+ try {
337
+ if (canTrack) {
338
+ return getLocalStorage()?.getItem(key);
339
+ }
340
+ return void 0;
341
+ } catch (err) {
342
+ return void 0;
343
+ }
328
344
  };
329
- var safeDynamicRequire = noop;
330
- try {
331
- safeDynamicRequire = createRequire(import.meta.url);
332
- } catch (error) {
345
+ var setLocalStorageItem = ({
346
+ key,
347
+ canTrack,
348
+ value
349
+ }) => {
333
350
  try {
334
- safeDynamicRequire = eval("require");
335
- } catch (error2) {
351
+ if (canTrack) {
352
+ getLocalStorage()?.setItem(key, value);
353
+ }
354
+ } catch (err) {
336
355
  }
337
- }
356
+ };
338
357
 
339
- // src/functions/evaluate/node-runtime/node-runtime.ts
340
- var getSyncValName = (key) => `bldr_${key}_sync`;
341
- var BUILDER_SET_STATE_NAME = "BUILDER_SET_STATE";
342
- var INJECTED_IVM_GLOBAL = "BUILDER_IVM";
343
- var REF_TO_PROXY_FN = `
344
- var refToProxy = (obj) => {
345
- if (typeof obj !== 'object' || obj === null) {
346
- return obj;
358
+ // src/helpers/visitorId.ts
359
+ var VISITOR_LOCAL_STORAGE_KEY = "builderVisitorId";
360
+ var getVisitorId = ({
361
+ canTrack
362
+ }) => {
363
+ if (!canTrack) {
364
+ return void 0;
347
365
  }
348
- return new Proxy({}, {
366
+ const visitorId = getLocalStorageItem({
367
+ key: VISITOR_LOCAL_STORAGE_KEY,
368
+ canTrack
369
+ });
370
+ if (checkIsDefined(visitorId)) {
371
+ return visitorId;
372
+ } else {
373
+ const newVisitorId = createVisitorId();
374
+ setVisitorId({
375
+ id: newVisitorId,
376
+ canTrack
377
+ });
378
+ return newVisitorId;
379
+ }
380
+ };
381
+ var createVisitorId = () => uuid();
382
+ var setVisitorId = ({
383
+ id,
384
+ canTrack
385
+ }) => setLocalStorageItem({
386
+ key: VISITOR_LOCAL_STORAGE_KEY,
387
+ value: id,
388
+ canTrack
389
+ });
390
+
391
+ // src/functions/log-fetch.ts
392
+ function logFetch(url) {
393
+ if (typeof process !== "undefined" && process.env?.DEBUG) {
394
+ if (String(process.env.DEBUG) == "true") {
395
+ logger.log(url);
396
+ }
397
+ }
398
+ }
399
+
400
+ // src/functions/track/index.ts
401
+ var getTrackingEventData = async ({
402
+ canTrack
403
+ }) => {
404
+ if (!canTrack) {
405
+ return {
406
+ visitorId: void 0,
407
+ sessionId: void 0
408
+ };
409
+ }
410
+ const sessionId = await getSessionId({
411
+ canTrack
412
+ });
413
+ const visitorId = getVisitorId({
414
+ canTrack
415
+ });
416
+ return {
417
+ sessionId,
418
+ visitorId
419
+ };
420
+ };
421
+ var createEvent = async ({
422
+ type: eventType,
423
+ canTrack,
424
+ apiKey,
425
+ metadata,
426
+ ...properties
427
+ }) => ({
428
+ type: eventType,
429
+ data: {
430
+ ...properties,
431
+ metadata: {
432
+ url: location.href,
433
+ ...metadata
434
+ },
435
+ ...await getTrackingEventData({
436
+ canTrack
437
+ }),
438
+ userAttributes: getUserAttributes(),
439
+ ownerId: apiKey
440
+ }
441
+ });
442
+ async function _track({
443
+ apiHost,
444
+ ...eventProps
445
+ }) {
446
+ if (!eventProps.apiKey) {
447
+ logger.error("Missing API key for track call. Please provide your API key.");
448
+ return;
449
+ }
450
+ if (!eventProps.canTrack) {
451
+ return;
452
+ }
453
+ if (isEditing()) {
454
+ return;
455
+ }
456
+ if (!(isBrowser() || TARGET === "reactNative")) {
457
+ return;
458
+ }
459
+ const baseUrl = apiHost || "https://cdn.builder.io";
460
+ const url = `${baseUrl}/api/v1/track`;
461
+ logFetch(url);
462
+ return fetch(url, {
463
+ method: "POST",
464
+ body: JSON.stringify({
465
+ events: [await createEvent(eventProps)]
466
+ }),
467
+ headers: {
468
+ "content-type": "application/json",
469
+ ...getSdkHeaders()
470
+ },
471
+ mode: "cors"
472
+ }).catch((err) => {
473
+ });
474
+ }
475
+ var track = (args) => _track({
476
+ ...args,
477
+ canTrack: true
478
+ });
479
+
480
+ // src/functions/evaluate/helpers.ts
481
+ var getFunctionArguments = ({
482
+ builder,
483
+ context,
484
+ event,
485
+ state
486
+ }) => {
487
+ return Object.entries({
488
+ state,
489
+ Builder: builder,
490
+ // legacy
491
+ builder,
492
+ context,
493
+ event
494
+ });
495
+ };
496
+ var getBuilderGlobals = (trackingContext) => ({
497
+ isEditing: isEditing(),
498
+ isBrowser: isBrowser(),
499
+ isServer: !isBrowser(),
500
+ getUserAttributes: () => getUserAttributes(),
501
+ trackConversion: (amount, customProperties) => {
502
+ if (!trackingContext?.apiKey || trackingContext?.canTrack === false) {
503
+ return;
504
+ }
505
+ _track({
506
+ type: "conversion",
507
+ apiKey: trackingContext.apiKey,
508
+ canTrack: trackingContext.canTrack ?? true,
509
+ contentId: trackingContext.contentId,
510
+ variationId: trackingContext.variationId !== trackingContext.contentId ? trackingContext.variationId : void 0,
511
+ metadata: {
512
+ ...customProperties || {},
513
+ ...amount !== void 0 ? {
514
+ amount
515
+ } : {}
516
+ }
517
+ });
518
+ }
519
+ });
520
+ var parseCode = (code, {
521
+ isExpression = true
522
+ }) => {
523
+ const useReturn = (
524
+ // we disable this for cases where we definitely don't want a return
525
+ isExpression && !(code.includes(";") || code.includes(" return ") || code.trim().startsWith("return "))
526
+ );
527
+ const useCode = useReturn ? `return (${code});` : code;
528
+ return useCode;
529
+ };
530
+ function flattenState({
531
+ rootState,
532
+ localState,
533
+ rootSetState
534
+ }) {
535
+ return new Proxy(rootState, {
536
+ get: (target, prop) => {
537
+ if (localState && prop in localState) {
538
+ return localState[prop];
539
+ }
540
+ const val = target[prop];
541
+ if (typeof val === "object" && val !== null) {
542
+ return flattenState({
543
+ rootState: val,
544
+ localState: void 0,
545
+ rootSetState: rootSetState ? (subState) => {
546
+ target[prop] = subState;
547
+ rootSetState(target);
548
+ } : void 0
549
+ });
550
+ }
551
+ return val;
552
+ },
553
+ set: (target, prop, value) => {
554
+ if (localState && prop in localState) {
555
+ throw new Error("Writing to local state is not allowed as it is read-only.");
556
+ }
557
+ target[prop] = value;
558
+ rootSetState?.(target);
559
+ return true;
560
+ }
561
+ });
562
+ }
563
+
564
+ // src/functions/evaluate/browser-runtime/browser.ts
565
+ var runInBrowser = ({
566
+ code,
567
+ builder,
568
+ context,
569
+ event,
570
+ localState,
571
+ rootSetState,
572
+ rootState
573
+ }) => {
574
+ const functionArgs = getFunctionArguments({
575
+ builder,
576
+ context,
577
+ event,
578
+ state: flattenState({
579
+ rootState,
580
+ localState,
581
+ rootSetState
582
+ })
583
+ });
584
+ return new Function(...functionArgs.map(([name]) => name), code)(...functionArgs.map(([, value]) => value));
585
+ };
586
+
587
+ // src/constants/sdk-name.ts
588
+ var SDK_NAME_FOR_TARGET = (() => {
589
+ switch (TARGET) {
590
+ case "rsc":
591
+ return "react-nextjs";
592
+ case "reactNative":
593
+ return "react-native";
594
+ default:
595
+ return TARGET;
596
+ }
597
+ })();
598
+ var SDK_NAME = `@builder.io/sdk-${SDK_NAME_FOR_TARGET}`;
599
+
600
+ // src/functions/fast-clone.ts
601
+ var fastClone = (obj) => JSON.parse(JSON.stringify(obj));
602
+
603
+ // src/functions/set.ts
604
+ var set = (obj, _path, value) => {
605
+ if (Object(obj) !== obj) {
606
+ return obj;
607
+ }
608
+ const path = Array.isArray(_path) ? _path : _path.toString().match(/[^.[\]]+/g);
609
+ path.slice(0, -1).reduce((a, c, i) => Object(a[c]) === a[c] ? a[c] : a[c] = Math.abs(Number(path[i + 1])) >> 0 === +path[i + 1] ? [] : {}, obj)[path[path.length - 1]] = value;
610
+ return obj;
611
+ };
612
+
613
+ // src/functions/evaluate/node-runtime/safeDynamicRequire.ts
614
+ import { createRequire } from "node:module";
615
+ var noop = () => {
616
+ };
617
+ var safeDynamicRequire = noop;
618
+ try {
619
+ safeDynamicRequire = createRequire(import.meta.url);
620
+ } catch (error) {
621
+ try {
622
+ safeDynamicRequire = eval("require");
623
+ } catch (error2) {
624
+ }
625
+ }
626
+
627
+ // src/functions/evaluate/node-runtime/node-runtime.ts
628
+ var getSyncValName = (key) => `bldr_${key}_sync`;
629
+ var BUILDER_SET_STATE_NAME = "BUILDER_SET_STATE";
630
+ var INJECTED_IVM_GLOBAL = "BUILDER_IVM";
631
+ var REF_TO_PROXY_FN = `
632
+ var refToProxy = (obj) => {
633
+ if (typeof obj !== 'object' || obj === null) {
634
+ return obj;
635
+ }
636
+ return new Proxy({}, {
349
637
  get(target, key) {
350
638
  if (key === 'copySync') {
351
639
  return () => obj.copySync();
@@ -389,7 +677,9 @@ if (typeof output === 'object' && output !== null) {
389
677
  `;
390
678
  };
391
679
  var IVM_INSTANCE = null;
392
- var IVM_CONTEXT = null;
680
+ var IVM_OPTIONS = {
681
+ memoryLimit: 128
682
+ };
393
683
  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";
394
684
  var getIvm = () => {
395
685
  try {
@@ -411,25 +701,6 @@ var getIvm = () => {
411
701
  For more information, visit https://builder.io/c/docs/integration-tips#enabling-data-bindings-in-node-environments`;
412
702
  throw new Error(ERROR_MESSAGE);
413
703
  };
414
- function setIsolateContext(options = {
415
- memoryLimit: 128
416
- }) {
417
- if (IVM_CONTEXT)
418
- return IVM_CONTEXT;
419
- const ivm = getIvm();
420
- const isolate = new ivm.Isolate(options);
421
- const context = isolate.createContextSync();
422
- const jail = context.global;
423
- jail.setSync("global", jail.derefInto());
424
- jail.setSync("log", function(...logArgs) {
425
- });
426
- jail.setSync(INJECTED_IVM_GLOBAL, ivm);
427
- IVM_CONTEXT = context;
428
- return context;
429
- }
430
- var getIsolateContext = () => {
431
- return setIsolateContext();
432
- };
433
704
  var runInNode = ({
434
705
  code,
435
706
  builder,
@@ -440,48 +711,60 @@ var runInNode = ({
440
711
  rootState
441
712
  }) => {
442
713
  const ivm = getIvm();
443
- const state = fastClone({
444
- ...rootState,
445
- ...localState
446
- });
447
- const args = getFunctionArguments({
448
- builder,
449
- context,
450
- event,
451
- state
452
- });
453
- const isolateContext = getIsolateContext();
454
- const jail = isolateContext.global;
455
- jail.setSync(BUILDER_SET_STATE_NAME, function(key, value) {
456
- set(rootState, key, value);
457
- rootSetState?.(rootState);
458
- });
459
- args.forEach(([key, arg]) => {
460
- const val = typeof arg === "object" ? new ivm.Reference(
461
- // workaround: methods with default values for arguments is not being cloned over
462
- key === "builder" ? {
463
- ...arg,
464
- getUserAttributes: () => arg.getUserAttributes()
465
- } : arg
466
- ) : null;
467
- jail.setSync(getSyncValName(key), val);
468
- });
469
- const evalStr = processCode({
470
- code,
471
- args
472
- });
473
- const resultStr = isolateContext.evalClosureSync(evalStr);
714
+ let isolate;
474
715
  try {
475
- const res = JSON.parse(resultStr);
476
- return res;
477
- } catch (_error) {
478
- return resultStr;
716
+ isolate = new ivm.Isolate(IVM_OPTIONS);
717
+ const isolateContext = isolate.createContextSync();
718
+ const jail = isolateContext.global;
719
+ jail.setSync("global", jail.derefInto());
720
+ jail.setSync("log", function(...logArgs) {
721
+ });
722
+ jail.setSync(INJECTED_IVM_GLOBAL, ivm);
723
+ const state = fastClone({
724
+ ...rootState,
725
+ ...localState
726
+ });
727
+ const args = getFunctionArguments({
728
+ builder,
729
+ context,
730
+ event,
731
+ state
732
+ });
733
+ jail.setSync(BUILDER_SET_STATE_NAME, function(key, value) {
734
+ set(rootState, key, value);
735
+ rootSetState?.(rootState);
736
+ });
737
+ args.forEach(([key, arg]) => {
738
+ const val = typeof arg === "object" ? new ivm.Reference(
739
+ // workaround: methods with default values for arguments is not being cloned over
740
+ key === "builder" ? {
741
+ ...arg,
742
+ getUserAttributes: () => arg.getUserAttributes()
743
+ } : arg
744
+ ) : null;
745
+ jail.setSync(getSyncValName(key), val);
746
+ });
747
+ const evalStr = processCode({
748
+ code,
749
+ args
750
+ });
751
+ const resultStr = isolateContext.evalClosureSync(evalStr);
752
+ try {
753
+ const res = JSON.parse(resultStr);
754
+ return res;
755
+ } catch (_error) {
756
+ return resultStr;
757
+ }
758
+ } finally {
759
+ if (isolate) {
760
+ try {
761
+ isolate.dispose();
762
+ } catch (e) {
763
+ }
764
+ }
479
765
  }
480
766
  };
481
767
 
482
- // src/helpers/nullable.ts
483
- var checkIsDefined = (maybeT) => maybeT !== null && maybeT !== void 0;
484
-
485
768
  // src/functions/is-node-runtime.ts
486
769
  function isNodeRuntime() {
487
770
  return typeof process !== "undefined" && checkIsDefined(process?.versions?.node);
@@ -526,7 +809,8 @@ function evaluate({
526
809
  rootState,
527
810
  rootSetState,
528
811
  event,
529
- isExpression = true
812
+ isExpression = true,
813
+ trackingContext
530
814
  }) {
531
815
  if (code.trim() === "") {
532
816
  return void 0;
@@ -542,7 +826,7 @@ function evaluate({
542
826
  code: parseCode(code, {
543
827
  isExpression
544
828
  }),
545
- builder: getBuilderGlobals(),
829
+ builder: getBuilderGlobals(trackingContext),
546
830
  context,
547
831
  event,
548
832
  rootSetState,
@@ -922,661 +1206,401 @@ function bindScrollInViewAnimation(animation) {
922
1206
  const defaultState = animation.steps[0].styles;
923
1207
  function attachDefaultState() {
924
1208
  assign(element.style, defaultState);
925
- }
926
- attachDefaultState();
927
- setTimeout(() => {
928
- element.style.transition = `all ${animation.duration}s ${camelToKebabCase(animation.easing)}`;
929
- if (animation.delay) {
930
- element.style.transitionDelay = animation.delay + "s";
931
- }
932
- });
933
- document.addEventListener("scroll", onScroll, {
934
- capture: true,
935
- passive: true
936
- });
937
- immediateOnScroll();
938
- });
939
- }
940
-
941
- // src/helpers/css.ts
942
- var convertStyleMapToCSSArray = (style) => {
943
- const cssProps = Object.entries(style).map(([key, value]) => {
944
- if (typeof value === "string") {
945
- return `${camelToKebabCase(key)}: ${value};`;
946
- } else {
947
- return void 0;
948
- }
949
- });
950
- return cssProps.filter(checkIsDefined);
951
- };
952
- var convertStyleMapToCSS = (style) => convertStyleMapToCSSArray(style).join("\n");
953
- var createCssClass = ({
954
- mediaQuery,
955
- className,
956
- styles
957
- }) => {
958
- const cssClass = `.${className} {
959
- ${convertStyleMapToCSS(styles)}
960
- }`;
961
- if (mediaQuery) {
962
- return `${mediaQuery} {
963
- ${cssClass}
964
- }`;
965
- } else {
966
- return cssClass;
967
- }
968
- };
969
-
970
- // src/functions/transform-style-property.ts
971
- function transformStyleProperty({
972
- style
973
- }) {
974
- return style;
975
- }
976
-
977
- // src/functions/get-style.ts
978
- var getStyle = ({
979
- block,
980
- context
981
- }) => {
982
- return mapStyleObjToStrIfNeeded(transformStyleProperty({
983
- style: block.style || {},
984
- context,
985
- block
986
- }));
987
- };
988
- function mapStyleObjToStrIfNeeded(style) {
989
- switch (TARGET) {
990
- case "svelte":
991
- case "vue":
992
- case "solid":
993
- case "angular":
994
- return convertStyleMapToCSSArray(style).join(" ");
995
- case "qwik":
996
- case "reactNative":
997
- case "react":
998
- case "rsc":
999
- return style;
1000
- }
1001
- }
1002
-
1003
- // src/components/block/block.helpers.ts
1004
- var checkIsComponentRestricted = (component, model) => {
1005
- if (!component)
1006
- return true;
1007
- if (!model)
1008
- return false;
1009
- return component.models && component.models.length > 0 && !component.models.includes(model);
1010
- };
1011
- var getComponent = ({
1012
- block,
1013
- registeredComponents,
1014
- model
1015
- }) => {
1016
- const componentName = block.component?.name;
1017
- if (!componentName) {
1018
- return null;
1019
- }
1020
- const ref = registeredComponents[componentName];
1021
- if (!ref || checkIsComponentRestricted(ref, model)) {
1022
- return void 0;
1023
- } else {
1024
- return ref;
1025
- }
1026
- };
1027
- var getRepeatItemData = ({
1028
- block,
1029
- context
1030
- }) => {
1031
- const {
1032
- repeat,
1033
- ...blockWithoutRepeat
1034
- } = block;
1035
- if (!repeat?.collection) {
1036
- return void 0;
1037
- }
1038
- const itemsArray = evaluate({
1039
- code: repeat.collection,
1040
- localState: context.localState,
1041
- rootState: context.rootState,
1042
- rootSetState: context.rootSetState,
1043
- context: context.context
1044
- });
1045
- if (!Array.isArray(itemsArray)) {
1046
- return void 0;
1047
- }
1048
- const collectionName = repeat.collection.split(".").pop();
1049
- const itemNameToUse = repeat.itemName || (collectionName ? collectionName + "Item" : "item");
1050
- const repeatArray = itemsArray.map((item, index) => ({
1051
- context: {
1052
- ...context,
1053
- localState: {
1054
- ...context.localState,
1055
- $index: index,
1056
- $item: item,
1057
- [itemNameToUse]: item,
1058
- [`$${itemNameToUse}Index`]: index
1059
- }
1060
- },
1061
- block: blockWithoutRepeat
1062
- }));
1063
- return repeatArray;
1064
- };
1065
- var provideLinkComponent = (block, linkComponent) => {
1066
- if (block?.shouldReceiveBuilderProps?.builderLinkComponent)
1067
- return {
1068
- builderLinkComponent: linkComponent
1069
- };
1070
- return {};
1071
- };
1072
- var provideRegisteredComponents = (block, registeredComponents, model) => {
1073
- if (block?.shouldReceiveBuilderProps?.builderComponents) {
1074
- const filteredRegisteredComponents = Object.fromEntries(Object.entries(registeredComponents).filter(([_, component]) => {
1075
- return !checkIsComponentRestricted(component, model);
1076
- }));
1077
- return {
1078
- builderComponents: filteredRegisteredComponents
1079
- };
1080
- }
1081
- return {};
1082
- };
1083
- var provideBuilderBlock = (block, builderBlock) => {
1084
- if (block?.shouldReceiveBuilderProps?.builderBlock)
1085
- return {
1086
- builderBlock
1087
- };
1088
- return {};
1089
- };
1090
- var provideBuilderContext = (block, context) => {
1091
- if (block?.shouldReceiveBuilderProps?.builderContext)
1092
- return {
1093
- builderContext: context
1094
- };
1095
- return {};
1096
- };
1097
- var generateKey = (index) => {
1098
- return index.toString();
1099
- };
1100
-
1101
- // src/functions/event-handler-name.ts
1102
- function capitalizeFirstLetter(string) {
1103
- return string.charAt(0).toUpperCase() + string.slice(1);
1104
- }
1105
- var getEventHandlerName = (key) => `on${capitalizeFirstLetter(key)}`;
1106
-
1107
- // src/functions/get-block-actions-handler.ts
1108
- var createEventHandler = (value, options) => (event) => evaluate({
1109
- code: value,
1110
- context: options.context,
1111
- localState: options.localState,
1112
- rootState: options.rootState,
1113
- rootSetState: options.rootSetState,
1114
- event,
1115
- isExpression: false
1116
- });
1117
-
1118
- // src/functions/get-block-actions.ts
1119
- function getBlockActions(options) {
1120
- const obj = {};
1121
- const optionActions = options.block.actions ?? {};
1122
- for (const key in optionActions) {
1123
- if (!optionActions.hasOwnProperty(key)) {
1124
- continue;
1125
- }
1126
- const value = optionActions[key];
1127
- let eventHandlerName = getEventHandlerName(key);
1128
- if (options.stripPrefix) {
1129
- switch (TARGET) {
1130
- case "vue":
1131
- eventHandlerName = eventHandlerName.replace("v-on:", "");
1132
- break;
1133
- case "svelte":
1134
- eventHandlerName = eventHandlerName.replace("on:", "");
1135
- break;
1136
- }
1137
- }
1138
- obj[eventHandlerName] = createEventHandler(value, options);
1139
- }
1140
- return obj;
1141
- }
1142
-
1143
- // src/functions/transform-block-properties.ts
1144
- function transformBlockProperties({
1145
- properties
1146
- }) {
1147
- return properties;
1148
- }
1149
-
1150
- // src/functions/get-block-properties.ts
1151
- var extractRelevantRootBlockProperties = (block) => {
1152
- return {
1153
- href: block.href
1154
- };
1155
- };
1156
- function getBlockProperties({
1157
- block,
1158
- context
1159
- }) {
1160
- const properties = {
1161
- ...extractRelevantRootBlockProperties(block),
1162
- ...block.properties,
1163
- "builder-id": block.id,
1164
- style: getStyle({
1165
- block,
1166
- context
1167
- }),
1168
- [getClassPropName()]: [block.id, "builder-block", block.class, block.properties?.class].filter(Boolean).join(" ")
1169
- };
1170
- return transformBlockProperties({
1171
- properties,
1172
- context,
1173
- block
1174
- });
1175
- }
1176
-
1177
- // src/components/block/components/block-wrapper.tsx
1178
- function BlockWrapper(props) {
1179
- return <><Dynamic_renderer_default
1180
- TagName={props.Wrapper}
1181
- attributes={getBlockProperties({
1182
- block: props.block,
1183
- context: props.context
1184
- })}
1185
- actionAttributes={getBlockActions({
1186
- block: props.block,
1187
- rootState: props.context.rootState,
1188
- rootSetState: props.context.rootSetState,
1189
- localState: props.context.localState,
1190
- context: props.context.context,
1191
- stripPrefix: true
1192
- })}
1193
- >{props.children}</Dynamic_renderer_default></>;
1194
- }
1195
- var Block_wrapper_default = BlockWrapper;
1196
-
1197
- // src/components/block/components/component-ref/component-ref.tsx
1198
- import { Show as Show3, For, createSignal as createSignal3 } from "solid-js";
1199
- import { Dynamic as Dynamic4 } from "solid-js/web";
1200
-
1201
- // src/components/block/components/interactive-element.tsx
1202
- import { Show as Show2, on, createEffect, createMemo as createMemo2, createSignal as createSignal2 } from "solid-js";
1203
- import { Dynamic as Dynamic3 } from "solid-js/web";
1204
-
1205
- // src/functions/is-previewing.ts
1206
- function isPreviewing(search) {
1207
- const searchToUse = search || (isBrowser() ? window.location.search : void 0);
1208
- if (!searchToUse) {
1209
- return false;
1210
- }
1211
- const normalizedSearch = getSearchString(searchToUse);
1212
- return Boolean(normalizedSearch.indexOf("builder.preview=") !== -1);
1213
- }
1214
-
1215
- // src/functions/register-component.ts
1216
- var createRegisterComponentMessage = (info) => ({
1217
- type: "builder.registerComponent",
1218
- data: serializeIncludingFunctions(info)
1219
- });
1220
- var serializeFn = (fnValue) => {
1221
- const fnStr = fnValue.toString().trim();
1222
- const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
1223
- const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
1224
- return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
1225
- };
1226
- function serializeIncludingFunctions(info) {
1227
- return JSON.parse(JSON.stringify(info, (key, value) => {
1228
- if (typeof value === "function") {
1229
- return serializeFn(value);
1230
- }
1231
- return value;
1232
- }));
1233
- }
1234
-
1235
- // src/functions/register.ts
1236
- var registry = {};
1237
- function register(type, info) {
1238
- if (type === "plugin") {
1239
- info = serializeIncludingFunctions(info);
1240
- }
1241
- let typeList = registry[type];
1242
- if (!typeList) {
1243
- typeList = registry[type] = [];
1244
- }
1245
- typeList.push(info);
1246
- if (isBrowser()) {
1247
- const message = {
1248
- type: "builder.register",
1249
- data: {
1250
- type,
1251
- info
1252
- }
1253
- };
1254
- try {
1255
- parent.postMessage(message, "*");
1256
- if (parent !== window) {
1257
- window.postMessage(message, "*");
1258
- }
1259
- } catch (err) {
1260
- }
1261
- }
1262
- }
1263
- function registerAction(action) {
1264
- if (isBrowser()) {
1265
- const actionClone = JSON.parse(JSON.stringify(action));
1266
- if (action.action) {
1267
- actionClone.action = action.action.toString();
1268
- }
1269
- window.parent?.postMessage({
1270
- type: "builder.registerAction",
1271
- data: actionClone
1272
- }, "*");
1273
- }
1274
- }
1275
-
1276
- // src/functions/set-editor-settings.ts
1277
- var settings = {};
1278
- function setEditorSettings(newSettings) {
1279
- if (isBrowser()) {
1280
- Object.assign(settings, newSettings);
1281
- const message = {
1282
- type: "builder.settingsChange",
1283
- data: settings
1284
- };
1285
- parent.postMessage(message, "*");
1286
- }
1287
- }
1288
-
1289
- // src/functions/get-builder-search-params/index.ts
1290
- var BUILDER_SEARCHPARAMS_PREFIX = "builder.";
1291
- var BUILDER_OPTIONS_PREFIX = "options.";
1292
- var getBuilderSearchParams = (_options) => {
1293
- if (!_options) {
1294
- return {};
1295
- }
1296
- const options = normalizeSearchParams(_options);
1297
- const newOptions = {};
1298
- Object.keys(options).forEach((key) => {
1299
- if (key.startsWith(BUILDER_SEARCHPARAMS_PREFIX)) {
1300
- const trimmedKey = key.replace(BUILDER_SEARCHPARAMS_PREFIX, "").replace(BUILDER_OPTIONS_PREFIX, "");
1301
- newOptions[trimmedKey] = options[key];
1302
- }
1303
- });
1304
- return newOptions;
1305
- };
1306
- var getBuilderSearchParamsFromWindow = () => {
1307
- if (!isBrowser()) {
1308
- return {};
1309
- }
1310
- const searchParams = new URLSearchParams(window.location.search);
1311
- return getBuilderSearchParams(searchParams);
1312
- };
1313
-
1314
- // src/constants/sdk-version.ts
1315
- var SDK_VERSION = "5.0.1";
1316
-
1317
- // src/helpers/sdk-headers.ts
1318
- var getSdkHeaders = () => ({
1319
- "X-Builder-SDK": TARGET,
1320
- "X-Builder-SDK-GEN": "2",
1321
- "X-Builder-SDK-Version": SDK_VERSION
1322
- });
1323
-
1324
- // src/helpers/url.ts
1325
- var getTopLevelDomain = (host) => {
1326
- if (host === "localhost" || host === "127.0.0.1") {
1327
- return host;
1328
- }
1329
- const parts = host.split(".");
1330
- if (parts.length > 2) {
1331
- return parts.slice(1).join(".");
1332
- }
1333
- return host;
1334
- };
1335
-
1336
- // src/helpers/cookie.ts
1337
- var getCookieSync = ({
1338
- name,
1339
- canTrack
1340
- }) => {
1341
- try {
1342
- if (!canTrack) {
1343
- return void 0;
1344
- }
1345
- return document.cookie.split("; ").find((row) => row.startsWith(`${name}=`))?.split("=")[1];
1346
- } catch (err) {
1347
- logger.warn("[COOKIE] GET error: ", err?.message || err);
1348
- return void 0;
1349
- }
1350
- };
1351
- var getCookie = async (args) => getCookieSync(args);
1352
- var stringifyCookie = (cookie) => cookie.map(([key, value]) => value ? `${key}=${value}` : key).filter(checkIsDefined).join("; ");
1353
- var SECURE_CONFIG = [["secure", ""], ["SameSite", "None"]];
1354
- var createCookieString = ({
1355
- name,
1356
- value,
1357
- expires
1358
- }) => {
1359
- const secure = isBrowser() ? location.protocol === "https:" : true;
1360
- const secureObj = secure ? SECURE_CONFIG : [[]];
1361
- const expiresObj = expires ? [["expires", expires.toUTCString()]] : [[]];
1362
- const cookieValue = [[name, value], ...expiresObj, ["path", "/"], ["domain", getTopLevelDomain(window.location.hostname)], ...secureObj];
1363
- const cookie = stringifyCookie(cookieValue);
1364
- return cookie;
1365
- };
1366
- var setCookie = async ({
1367
- name,
1368
- value,
1369
- expires,
1370
- canTrack
1371
- }) => {
1372
- try {
1373
- if (!canTrack) {
1374
- return;
1375
- }
1376
- const cookie = createCookieString({
1377
- name,
1378
- value,
1379
- expires
1209
+ }
1210
+ attachDefaultState();
1211
+ setTimeout(() => {
1212
+ element.style.transition = `all ${animation.duration}s ${camelToKebabCase(animation.easing)}`;
1213
+ if (animation.delay) {
1214
+ element.style.transitionDelay = animation.delay + "s";
1215
+ }
1380
1216
  });
1381
- document.cookie = cookie;
1382
- } catch (err) {
1383
- logger.warn("[COOKIE] SET error: ", err?.message || err);
1384
- }
1385
- };
1386
-
1387
- // src/helpers/uuid.ts
1388
- function uuidv4() {
1389
- return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
1390
- const r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8;
1391
- return v.toString(16);
1217
+ document.addEventListener("scroll", onScroll, {
1218
+ capture: true,
1219
+ passive: true
1220
+ });
1221
+ immediateOnScroll();
1392
1222
  });
1393
1223
  }
1394
- function uuid() {
1395
- return uuidv4().replace(/-/g, "");
1396
- }
1397
1224
 
1398
- // src/helpers/sessionId.ts
1399
- var SESSION_LOCAL_STORAGE_KEY = "builderSessionId";
1400
- var getSessionId = async ({
1401
- canTrack
1402
- }) => {
1403
- if (!canTrack) {
1404
- return void 0;
1405
- }
1406
- const sessionId = await getCookie({
1407
- name: SESSION_LOCAL_STORAGE_KEY,
1408
- canTrack
1225
+ // src/helpers/css.ts
1226
+ var convertStyleMapToCSSArray = (style) => {
1227
+ const cssProps = Object.entries(style).map(([key, value]) => {
1228
+ if (typeof value === "string") {
1229
+ return `${camelToKebabCase(key)}: ${value};`;
1230
+ } else {
1231
+ return void 0;
1232
+ }
1409
1233
  });
1410
- if (checkIsDefined(sessionId)) {
1411
- return sessionId;
1234
+ return cssProps.filter(checkIsDefined);
1235
+ };
1236
+ var convertStyleMapToCSS = (style) => convertStyleMapToCSSArray(style).join("\n");
1237
+ var createCssClass = ({
1238
+ mediaQuery,
1239
+ className,
1240
+ styles
1241
+ }) => {
1242
+ const cssClass = `.${className} {
1243
+ ${convertStyleMapToCSS(styles)}
1244
+ }`;
1245
+ if (mediaQuery) {
1246
+ return `${mediaQuery} {
1247
+ ${cssClass}
1248
+ }`;
1412
1249
  } else {
1413
- const newSessionId = createSessionId();
1414
- setSessionId({
1415
- id: newSessionId,
1416
- canTrack
1417
- });
1418
- return newSessionId;
1250
+ return cssClass;
1419
1251
  }
1420
1252
  };
1421
- var createSessionId = () => uuid();
1422
- var setSessionId = ({
1423
- id,
1424
- canTrack
1425
- }) => setCookie({
1426
- name: SESSION_LOCAL_STORAGE_KEY,
1427
- value: id,
1428
- canTrack
1429
- });
1430
1253
 
1431
- // src/helpers/localStorage.ts
1432
- var getLocalStorage = () => isBrowser() && typeof localStorage !== "undefined" ? localStorage : void 0;
1433
- var getLocalStorageItem = ({
1434
- key,
1435
- canTrack
1254
+ // src/functions/transform-style-property.ts
1255
+ function transformStyleProperty({
1256
+ style
1257
+ }) {
1258
+ return style;
1259
+ }
1260
+
1261
+ // src/functions/get-style.ts
1262
+ var getStyle = ({
1263
+ block,
1264
+ context
1436
1265
  }) => {
1437
- try {
1438
- if (canTrack) {
1439
- return getLocalStorage()?.getItem(key);
1440
- }
1441
- return void 0;
1442
- } catch (err) {
1443
- return void 0;
1266
+ return mapStyleObjToStrIfNeeded(transformStyleProperty({
1267
+ style: block.style || {},
1268
+ context,
1269
+ block
1270
+ }));
1271
+ };
1272
+ function mapStyleObjToStrIfNeeded(style) {
1273
+ switch (TARGET) {
1274
+ case "svelte":
1275
+ case "vue":
1276
+ case "solid":
1277
+ case "angular":
1278
+ return convertStyleMapToCSSArray(style).join(" ");
1279
+ case "qwik":
1280
+ case "reactNative":
1281
+ case "react":
1282
+ case "rsc":
1283
+ return style;
1444
1284
  }
1285
+ }
1286
+
1287
+ // src/components/block/block.helpers.ts
1288
+ var checkIsComponentRestricted = (component, model) => {
1289
+ if (!component)
1290
+ return true;
1291
+ if (!model)
1292
+ return false;
1293
+ return component.models && component.models.length > 0 && !component.models.includes(model);
1445
1294
  };
1446
- var setLocalStorageItem = ({
1447
- key,
1448
- canTrack,
1449
- value
1295
+ var getComponent = ({
1296
+ block,
1297
+ registeredComponents,
1298
+ model
1450
1299
  }) => {
1451
- try {
1452
- if (canTrack) {
1453
- getLocalStorage()?.setItem(key, value);
1454
- }
1455
- } catch (err) {
1300
+ const componentName = block.component?.name;
1301
+ if (!componentName) {
1302
+ return null;
1303
+ }
1304
+ const ref = registeredComponents[componentName];
1305
+ if (!ref || checkIsComponentRestricted(ref, model)) {
1306
+ return void 0;
1307
+ } else {
1308
+ return ref;
1456
1309
  }
1457
1310
  };
1458
-
1459
- // src/helpers/visitorId.ts
1460
- var VISITOR_LOCAL_STORAGE_KEY = "builderVisitorId";
1461
- var getVisitorId = ({
1462
- canTrack
1311
+ var getRepeatItemData = ({
1312
+ block,
1313
+ context
1463
1314
  }) => {
1464
- if (!canTrack) {
1315
+ const {
1316
+ repeat,
1317
+ ...blockWithoutRepeat
1318
+ } = block;
1319
+ if (!repeat?.collection) {
1465
1320
  return void 0;
1466
1321
  }
1467
- const visitorId = getLocalStorageItem({
1468
- key: VISITOR_LOCAL_STORAGE_KEY,
1469
- canTrack
1322
+ const itemsArray = evaluate({
1323
+ code: repeat.collection,
1324
+ localState: context.localState,
1325
+ rootState: context.rootState,
1326
+ rootSetState: context.rootSetState,
1327
+ context: context.context
1470
1328
  });
1471
- if (checkIsDefined(visitorId)) {
1472
- return visitorId;
1473
- } else {
1474
- const newVisitorId = createVisitorId();
1475
- setVisitorId({
1476
- id: newVisitorId,
1477
- canTrack
1478
- });
1479
- return newVisitorId;
1329
+ if (!Array.isArray(itemsArray)) {
1330
+ return void 0;
1331
+ }
1332
+ const collectionName = repeat.collection.split(".").pop();
1333
+ const itemNameToUse = repeat.itemName || (collectionName ? collectionName + "Item" : "item");
1334
+ const repeatArray = itemsArray.map((item, index) => ({
1335
+ context: {
1336
+ ...context,
1337
+ localState: {
1338
+ ...context.localState,
1339
+ $index: index,
1340
+ $item: item,
1341
+ [itemNameToUse]: item,
1342
+ [`$${itemNameToUse}Index`]: index
1343
+ }
1344
+ },
1345
+ block: blockWithoutRepeat
1346
+ }));
1347
+ return repeatArray;
1348
+ };
1349
+ var provideLinkComponent = (block, linkComponent) => {
1350
+ if (block?.shouldReceiveBuilderProps?.builderLinkComponent)
1351
+ return {
1352
+ builderLinkComponent: linkComponent
1353
+ };
1354
+ return {};
1355
+ };
1356
+ var provideRegisteredComponents = (block, registeredComponents, model) => {
1357
+ if (block?.shouldReceiveBuilderProps?.builderComponents) {
1358
+ const filteredRegisteredComponents = Object.fromEntries(Object.entries(registeredComponents).filter(([_, component]) => {
1359
+ return !checkIsComponentRestricted(component, model);
1360
+ }));
1361
+ return {
1362
+ builderComponents: filteredRegisteredComponents
1363
+ };
1480
1364
  }
1365
+ return {};
1481
1366
  };
1482
- var createVisitorId = () => uuid();
1483
- var setVisitorId = ({
1484
- id,
1485
- canTrack
1486
- }) => setLocalStorageItem({
1487
- key: VISITOR_LOCAL_STORAGE_KEY,
1488
- value: id,
1489
- canTrack
1367
+ var provideBuilderBlock = (block, builderBlock) => {
1368
+ if (block?.shouldReceiveBuilderProps?.builderBlock)
1369
+ return {
1370
+ builderBlock
1371
+ };
1372
+ return {};
1373
+ };
1374
+ var provideBuilderContext = (block, context) => {
1375
+ if (block?.shouldReceiveBuilderProps?.builderContext)
1376
+ return {
1377
+ builderContext: context
1378
+ };
1379
+ return {};
1380
+ };
1381
+ var generateKey = (index) => {
1382
+ return index.toString();
1383
+ };
1384
+
1385
+ // src/functions/event-handler-name.ts
1386
+ function capitalizeFirstLetter(string) {
1387
+ return string.charAt(0).toUpperCase() + string.slice(1);
1388
+ }
1389
+ var getEventHandlerName = (key) => `on${capitalizeFirstLetter(key)}`;
1390
+
1391
+ // src/functions/get-block-actions-handler.ts
1392
+ var createEventHandler = (value, options) => (event) => evaluate({
1393
+ code: value,
1394
+ context: options.context,
1395
+ localState: options.localState,
1396
+ rootState: options.rootState,
1397
+ rootSetState: options.rootSetState,
1398
+ event,
1399
+ isExpression: false,
1400
+ trackingContext: options.trackingContext
1490
1401
  });
1491
1402
 
1492
- // src/functions/log-fetch.ts
1493
- function logFetch(url) {
1494
- if (typeof process !== "undefined" && process.env?.DEBUG) {
1495
- if (String(process.env.DEBUG) == "true") {
1496
- logger.log(url);
1403
+ // src/functions/get-block-actions.ts
1404
+ function getBlockActions(options) {
1405
+ const obj = {};
1406
+ const optionActions = options.block.actions ?? {};
1407
+ for (const key in optionActions) {
1408
+ if (!optionActions.hasOwnProperty(key)) {
1409
+ continue;
1410
+ }
1411
+ const value = optionActions[key];
1412
+ let eventHandlerName = getEventHandlerName(key);
1413
+ if (options.stripPrefix) {
1414
+ switch (TARGET) {
1415
+ case "vue":
1416
+ eventHandlerName = eventHandlerName.replace("v-on:", "");
1417
+ break;
1418
+ case "svelte":
1419
+ eventHandlerName = eventHandlerName.replace("on:", "");
1420
+ break;
1421
+ }
1497
1422
  }
1423
+ obj[eventHandlerName] = createEventHandler(value, options);
1498
1424
  }
1425
+ return obj;
1499
1426
  }
1500
1427
 
1501
- // src/functions/track/index.ts
1502
- var getTrackingEventData = async ({
1503
- canTrack
1504
- }) => {
1505
- if (!canTrack) {
1506
- return {
1507
- visitorId: void 0,
1508
- sessionId: void 0
1509
- };
1510
- }
1511
- const sessionId = await getSessionId({
1512
- canTrack
1513
- });
1514
- const visitorId = getVisitorId({
1515
- canTrack
1516
- });
1428
+ // src/functions/transform-block-properties.ts
1429
+ function transformBlockProperties({
1430
+ properties
1431
+ }) {
1432
+ return properties;
1433
+ }
1434
+
1435
+ // src/functions/get-block-properties.ts
1436
+ var extractRelevantRootBlockProperties = (block) => {
1517
1437
  return {
1518
- sessionId,
1519
- visitorId
1438
+ href: block.href
1520
1439
  };
1521
1440
  };
1522
- var createEvent = async ({
1523
- type: eventType,
1524
- canTrack,
1525
- apiKey,
1526
- metadata,
1527
- ...properties
1528
- }) => ({
1529
- type: eventType,
1530
- data: {
1531
- ...properties,
1532
- metadata: {
1533
- url: location.href,
1534
- ...metadata
1535
- },
1536
- ...await getTrackingEventData({
1537
- canTrack
1441
+ function getBlockProperties({
1442
+ block,
1443
+ context
1444
+ }) {
1445
+ const properties = {
1446
+ ...extractRelevantRootBlockProperties(block),
1447
+ ...block.properties,
1448
+ "builder-id": block.id,
1449
+ style: getStyle({
1450
+ block,
1451
+ context
1538
1452
  }),
1539
- userAttributes: getUserAttributes(),
1540
- ownerId: apiKey
1453
+ [getClassPropName()]: [block.id, "builder-block", block.class, block.properties?.class].filter(Boolean).join(" ")
1454
+ };
1455
+ return transformBlockProperties({
1456
+ properties,
1457
+ context,
1458
+ block
1459
+ });
1460
+ }
1461
+
1462
+ // src/components/block/components/block-wrapper.tsx
1463
+ function BlockWrapper(props) {
1464
+ return <><Dynamic_renderer_default
1465
+ TagName={props.Wrapper}
1466
+ attributes={getBlockProperties({
1467
+ block: props.block,
1468
+ context: props.context
1469
+ })}
1470
+ actionAttributes={getBlockActions({
1471
+ block: props.block,
1472
+ rootState: props.context.rootState,
1473
+ rootSetState: props.context.rootSetState,
1474
+ localState: props.context.localState,
1475
+ context: props.context.context,
1476
+ stripPrefix: true,
1477
+ trackingContext: {
1478
+ apiKey: props.context.apiKey,
1479
+ canTrack: props.context.canTrack ?? true,
1480
+ contentId: props.context.content?.id,
1481
+ variationId: props.context.content?.testVariationId
1482
+ }
1483
+ })}
1484
+ >{props.children}</Dynamic_renderer_default></>;
1485
+ }
1486
+ var Block_wrapper_default = BlockWrapper;
1487
+
1488
+ // src/components/block/components/component-ref/component-ref.tsx
1489
+ import { Show as Show3, For, createSignal as createSignal3 } from "solid-js";
1490
+ import { Dynamic as Dynamic4 } from "solid-js/web";
1491
+
1492
+ // src/components/block/components/interactive-element.tsx
1493
+ import { Show as Show2, on, createEffect, createMemo as createMemo2, createSignal as createSignal2 } from "solid-js";
1494
+ import { Dynamic as Dynamic3 } from "solid-js/web";
1495
+
1496
+ // src/functions/is-previewing.ts
1497
+ function isPreviewing(search) {
1498
+ const searchToUse = search || (isBrowser() ? window.location.search : void 0);
1499
+ if (!searchToUse) {
1500
+ return false;
1541
1501
  }
1502
+ const normalizedSearch = getSearchString(searchToUse);
1503
+ return Boolean(normalizedSearch.indexOf("builder.preview=") !== -1);
1504
+ }
1505
+
1506
+ // src/functions/register-component.ts
1507
+ var createRegisterComponentMessage = (info) => ({
1508
+ type: "builder.registerComponent",
1509
+ data: serializeIncludingFunctions(info)
1542
1510
  });
1543
- async function _track({
1544
- apiHost,
1545
- ...eventProps
1546
- }) {
1547
- if (!eventProps.apiKey) {
1548
- logger.error("Missing API key for track call. Please provide your API key.");
1549
- return;
1511
+ var serializeFn = (fnValue) => {
1512
+ const fnStr = fnValue.toString().trim();
1513
+ const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
1514
+ const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
1515
+ return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
1516
+ };
1517
+ function serializeIncludingFunctions(info) {
1518
+ return JSON.parse(JSON.stringify(info, (key, value) => {
1519
+ if (typeof value === "function") {
1520
+ return serializeFn(value);
1521
+ }
1522
+ return value;
1523
+ }));
1524
+ }
1525
+
1526
+ // src/functions/register.ts
1527
+ var registry = {};
1528
+ function register(type, info) {
1529
+ if (type === "plugin") {
1530
+ info = serializeIncludingFunctions(info);
1550
1531
  }
1551
- if (!eventProps.canTrack) {
1552
- return;
1532
+ let typeList = registry[type];
1533
+ if (!typeList) {
1534
+ typeList = registry[type] = [];
1553
1535
  }
1554
- if (isEditing()) {
1555
- return;
1536
+ typeList.push(info);
1537
+ if (isBrowser()) {
1538
+ const message = {
1539
+ type: "builder.register",
1540
+ data: {
1541
+ type,
1542
+ info
1543
+ }
1544
+ };
1545
+ try {
1546
+ parent.postMessage(message, "*");
1547
+ if (parent !== window) {
1548
+ window.postMessage(message, "*");
1549
+ }
1550
+ } catch (err) {
1551
+ }
1556
1552
  }
1557
- if (!(isBrowser() || TARGET === "reactNative")) {
1558
- return;
1553
+ }
1554
+ function registerAction(action) {
1555
+ if (isBrowser()) {
1556
+ const actionClone = JSON.parse(JSON.stringify(action));
1557
+ if (action.action) {
1558
+ actionClone.action = action.action.toString();
1559
+ }
1560
+ window.parent?.postMessage({
1561
+ type: "builder.registerAction",
1562
+ data: actionClone
1563
+ }, "*");
1559
1564
  }
1560
- const baseUrl = apiHost || "https://cdn.builder.io";
1561
- const url = `${baseUrl}/api/v1/track`;
1562
- logFetch(url);
1563
- return fetch(url, {
1564
- method: "POST",
1565
- body: JSON.stringify({
1566
- events: [await createEvent(eventProps)]
1567
- }),
1568
- headers: {
1569
- "content-type": "application/json",
1570
- ...getSdkHeaders()
1571
- },
1572
- mode: "cors"
1573
- }).catch((err) => {
1574
- });
1575
1565
  }
1576
- var track = (args) => _track({
1577
- ...args,
1578
- canTrack: true
1579
- });
1566
+
1567
+ // src/functions/set-editor-settings.ts
1568
+ var settings = {};
1569
+ function setEditorSettings(newSettings) {
1570
+ if (isBrowser()) {
1571
+ Object.assign(settings, newSettings);
1572
+ const message = {
1573
+ type: "builder.settingsChange",
1574
+ data: settings
1575
+ };
1576
+ parent.postMessage(message, "*");
1577
+ }
1578
+ }
1579
+
1580
+ // src/functions/get-builder-search-params/index.ts
1581
+ var BUILDER_SEARCHPARAMS_PREFIX = "builder.";
1582
+ var BUILDER_OPTIONS_PREFIX = "options.";
1583
+ var getBuilderSearchParams = (_options) => {
1584
+ if (!_options) {
1585
+ return {};
1586
+ }
1587
+ const options = normalizeSearchParams(_options);
1588
+ const newOptions = {};
1589
+ Object.keys(options).forEach((key) => {
1590
+ if (key.startsWith(BUILDER_SEARCHPARAMS_PREFIX)) {
1591
+ const trimmedKey = key.replace(BUILDER_SEARCHPARAMS_PREFIX, "").replace(BUILDER_OPTIONS_PREFIX, "");
1592
+ newOptions[trimmedKey] = options[key];
1593
+ }
1594
+ });
1595
+ return newOptions;
1596
+ };
1597
+ var getBuilderSearchParamsFromWindow = () => {
1598
+ if (!isBrowser()) {
1599
+ return {};
1600
+ }
1601
+ const searchParams = new URLSearchParams(window.location.search);
1602
+ return getBuilderSearchParams(searchParams);
1603
+ };
1580
1604
 
1581
1605
  // src/functions/is-from-trusted-host.ts
1582
1606
  var DEFAULT_TRUSTED_HOSTS = ["*.beta.builder.io", "beta.builder.io", "builder.io", "localhost", "qa.builder.io"];
@@ -2318,7 +2342,13 @@ function InteractiveElement(props) {
2318
2342
  rootState: props.context.rootState,
2319
2343
  rootSetState: props.context.rootSetState,
2320
2344
  localState: props.context.localState,
2321
- context: props.context.context
2345
+ context: props.context.context,
2346
+ trackingContext: {
2347
+ apiKey: props.context.apiKey,
2348
+ canTrack: props.context.canTrack ?? true,
2349
+ contentId: props.context.content?.id,
2350
+ variationId: props.context.content?.testVariationId
2351
+ }
2322
2352
  })
2323
2353
  } : {};
2324
2354
  });