@builder.io/sdk-solid 4.0.9 → 4.0.10

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
@@ -2486,8 +2486,8 @@ var DEFAULT_INDEX = "default";
2486
2486
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2487
2487
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2488
2488
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2489
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2490
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2489
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2490
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2491
2491
  function checkShouldRenderVariants(variants, canTrack) {
2492
2492
  const hasVariants = variants && variants.length > 0;
2493
2493
  if (TARGET === "reactNative")
@@ -2745,6 +2745,11 @@ var handleABTesting = async ({
2745
2745
  };
2746
2746
  };
2747
2747
 
2748
+ // src/helpers/no-serialize-wrapper.ts
2749
+ function noSerializeWrapper(fn) {
2750
+ return fn;
2751
+ }
2752
+
2748
2753
  // src/helpers/user-attributes.ts
2749
2754
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2750
2755
  function createUserAttributesService() {
@@ -2775,18 +2780,32 @@ function createUserAttributesService() {
2775
2780
  canTrack
2776
2781
  }) || "{}");
2777
2782
  },
2778
- subscribeOnUserAttributesChange(callback) {
2783
+ subscribeOnUserAttributesChange(callback, {
2784
+ fireImmediately
2785
+ } = {}) {
2779
2786
  subscribers.add(callback);
2780
- return () => {
2787
+ if (fireImmediately) {
2788
+ callback(this.getUserAttributes());
2789
+ }
2790
+ return noSerializeWrapper(function() {
2781
2791
  subscribers.delete(callback);
2782
- };
2792
+ });
2783
2793
  },
2784
2794
  setCanTrack(value) {
2785
2795
  canTrack = value;
2786
2796
  }
2787
2797
  };
2788
2798
  }
2789
- var userAttributesService = createUserAttributesService();
2799
+ var _userAttributesService;
2800
+ if (isBrowser() && TARGET === "qwik") {
2801
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2802
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2803
+ }
2804
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2805
+ } else {
2806
+ _userAttributesService = createUserAttributesService();
2807
+ }
2808
+ var userAttributesService = _userAttributesService;
2790
2809
  var setClientUserAttributes = (attributes) => {
2791
2810
  userAttributesService.setUserAttributes(attributes);
2792
2811
  };
@@ -3642,6 +3661,8 @@ function PersonalizationContainer(props) {
3642
3661
  setShouldResetVariants(true);
3643
3662
  const unsub = userAttributesService.subscribeOnUserAttributesChange((attrs2) => {
3644
3663
  setUserAttributes(attrs2);
3664
+ }, {
3665
+ fireImmediately: TARGET === "qwik"
3645
3666
  });
3646
3667
  if (!(isEditing() || isPreviewing())) {
3647
3668
  const variant = filteredVariants()[0];
@@ -4659,9 +4680,9 @@ function logFetch(url) {
4659
4680
  }
4660
4681
 
4661
4682
  // src/blocks/form/form/form.tsx
4662
- var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-04a43b72">`);
4683
+ var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-7430044e">`);
4663
4684
  var _tmpl$26 = /* @__PURE__ */ template(`<form>`);
4664
- var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-04a43b72 {
4685
+ var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-7430044e {
4665
4686
  padding: 10px;
4666
4687
  color: red;
4667
4688
  text-align: center;
@@ -4773,6 +4794,15 @@ function FormComponent(props) {
4773
4794
  }
4774
4795
  }
4775
4796
  setFormState("sending");
4797
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4798
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4799
+ console.error(message);
4800
+ setFormState("error");
4801
+ mergeNewRootState({
4802
+ formErrorMessage: message
4803
+ });
4804
+ return;
4805
+ }
4776
4806
  const formUrl = `${getEnv() === "dev" ? "http://localhost:5000" : "https://builder.io"}/api/v1/form-submit?apiKey=${props.builderContext.apiKey}&to=${btoa(props.sendSubmissionsToEmail || "")}&name=${encodeURIComponent(props.name || "")}`;
4777
4807
  const url = props.sendSubmissionsTo === "email" ? formUrl : props.action;
4778
4808
  logFetch(url);
@@ -4788,17 +4818,30 @@ function FormComponent(props) {
4788
4818
  } else {
4789
4819
  body2 = await res.text();
4790
4820
  }
4791
- if (!res.ok && props.errorMessagePath) {
4792
- let message = get(body2, props.errorMessagePath);
4793
- if (message) {
4794
- if (typeof message !== "string") {
4795
- message = JSON.stringify(message);
4821
+ if (!res.ok) {
4822
+ const submitErrorEvent = new CustomEvent("submit:error", {
4823
+ detail: {
4824
+ error: body2,
4825
+ status: res.status
4796
4826
  }
4797
- setFormErrorMessage(message);
4798
- mergeNewRootState({
4799
- formErrorMessage: message
4800
- });
4827
+ });
4828
+ if (formRef?.nativeElement) {
4829
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4830
+ if (submitErrorEvent.defaultPrevented) {
4831
+ return;
4832
+ }
4833
+ }
4834
+ setResponseData(body2);
4835
+ setFormState("error");
4836
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4837
+ if (typeof message !== "string") {
4838
+ message = JSON.stringify(message);
4801
4839
  }
4840
+ setFormErrorMessage(message);
4841
+ mergeNewRootState({
4842
+ formErrorMessage: message
4843
+ });
4844
+ return;
4802
4845
  }
4803
4846
  setResponseData(body2);
4804
4847
  setFormState(res.ok ? "success" : "error");
@@ -5614,7 +5657,7 @@ function getPreviewContent(_searchParams) {
5614
5657
  }
5615
5658
 
5616
5659
  // src/constants/sdk-version.ts
5617
- var SDK_VERSION = "4.0.9";
5660
+ var SDK_VERSION = "4.0.10";
5618
5661
 
5619
5662
  // src/helpers/sdk-headers.ts
5620
5663
  var getSdkHeaders = () => ({
package/lib/node/dev.jsx CHANGED
@@ -2247,8 +2247,8 @@ var DEFAULT_INDEX = "default";
2247
2247
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2248
2248
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2249
2249
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2250
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2251
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2250
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2251
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2252
2252
  function checkShouldRenderVariants(variants, canTrack) {
2253
2253
  const hasVariants = variants && variants.length > 0;
2254
2254
  if (TARGET === "reactNative")
@@ -2506,6 +2506,11 @@ var handleABTesting = async ({
2506
2506
  };
2507
2507
  };
2508
2508
 
2509
+ // src/helpers/no-serialize-wrapper.ts
2510
+ function noSerializeWrapper(fn) {
2511
+ return fn;
2512
+ }
2513
+
2509
2514
  // src/helpers/user-attributes.ts
2510
2515
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2511
2516
  function createUserAttributesService() {
@@ -2536,18 +2541,32 @@ function createUserAttributesService() {
2536
2541
  canTrack
2537
2542
  }) || "{}");
2538
2543
  },
2539
- subscribeOnUserAttributesChange(callback) {
2544
+ subscribeOnUserAttributesChange(callback, {
2545
+ fireImmediately
2546
+ } = {}) {
2540
2547
  subscribers.add(callback);
2541
- return () => {
2548
+ if (fireImmediately) {
2549
+ callback(this.getUserAttributes());
2550
+ }
2551
+ return noSerializeWrapper(function() {
2542
2552
  subscribers.delete(callback);
2543
- };
2553
+ });
2544
2554
  },
2545
2555
  setCanTrack(value) {
2546
2556
  canTrack = value;
2547
2557
  }
2548
2558
  };
2549
2559
  }
2550
- var userAttributesService = createUserAttributesService();
2560
+ var _userAttributesService;
2561
+ if (isBrowser() && TARGET === "qwik") {
2562
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2563
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2564
+ }
2565
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2566
+ } else {
2567
+ _userAttributesService = createUserAttributesService();
2568
+ }
2569
+ var userAttributesService = _userAttributesService;
2551
2570
  var setClientUserAttributes = (attributes) => {
2552
2571
  userAttributesService.setUserAttributes(attributes);
2553
2572
  };
@@ -3390,6 +3409,9 @@ function PersonalizationContainer(props) {
3390
3409
  const unsub = userAttributesService.subscribeOnUserAttributesChange(
3391
3410
  (attrs2) => {
3392
3411
  setUserAttributes(attrs2);
3412
+ },
3413
+ {
3414
+ fireImmediately: TARGET === "qwik"
3393
3415
  }
3394
3416
  );
3395
3417
  if (!(isEditing() || isPreviewing())) {
@@ -4370,6 +4392,15 @@ function FormComponent(props) {
4370
4392
  }
4371
4393
  }
4372
4394
  setFormState("sending");
4395
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4396
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4397
+ console.error(message);
4398
+ setFormState("error");
4399
+ mergeNewRootState({
4400
+ formErrorMessage: message
4401
+ });
4402
+ return;
4403
+ }
4373
4404
  const formUrl = `${getEnv() === "dev" ? "http://localhost:5000" : "https://builder.io"}/api/v1/form-submit?apiKey=${props.builderContext.apiKey}&to=${btoa(
4374
4405
  props.sendSubmissionsToEmail || ""
4375
4406
  )}&name=${encodeURIComponent(props.name || "")}`;
@@ -4388,17 +4419,30 @@ function FormComponent(props) {
4388
4419
  } else {
4389
4420
  body2 = await res.text();
4390
4421
  }
4391
- if (!res.ok && props.errorMessagePath) {
4392
- let message = get(body2, props.errorMessagePath);
4393
- if (message) {
4394
- if (typeof message !== "string") {
4395
- message = JSON.stringify(message);
4422
+ if (!res.ok) {
4423
+ const submitErrorEvent = new CustomEvent("submit:error", {
4424
+ detail: {
4425
+ error: body2,
4426
+ status: res.status
4427
+ }
4428
+ });
4429
+ if (formRef?.nativeElement) {
4430
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4431
+ if (submitErrorEvent.defaultPrevented) {
4432
+ return;
4396
4433
  }
4397
- setFormErrorMessage(message);
4398
- mergeNewRootState({
4399
- formErrorMessage: message
4400
- });
4401
4434
  }
4435
+ setResponseData(body2);
4436
+ setFormState("error");
4437
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4438
+ if (typeof message !== "string") {
4439
+ message = JSON.stringify(message);
4440
+ }
4441
+ setFormErrorMessage(message);
4442
+ mergeNewRootState({
4443
+ formErrorMessage: message
4444
+ });
4445
+ return;
4402
4446
  }
4403
4447
  setResponseData(body2);
4404
4448
  setFormState(res.ok ? "success" : "error");
@@ -4477,14 +4521,14 @@ function FormComponent(props) {
4477
4521
  blocks={props.sendingMessage}
4478
4522
  context={props.builderContext}
4479
4523
  /></Show12>
4480
- <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-04a43b72">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4524
+ <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-7430044e">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4481
4525
  <Show12 when={submissionState() === "success"}><Blocks_default
4482
4526
  path="successMessage"
4483
4527
  blocks={props.successMessage}
4484
4528
  context={props.builderContext}
4485
4529
  /></Show12>
4486
4530
  </form>
4487
- <style>{`.pre-04a43b72 {
4531
+ <style>{`.pre-7430044e {
4488
4532
  padding: 10px;
4489
4533
  color: red;
4490
4534
  text-align: center;
@@ -5107,7 +5151,7 @@ function getPreviewContent(_searchParams) {
5107
5151
  }
5108
5152
 
5109
5153
  // src/constants/sdk-version.ts
5110
- var SDK_VERSION = "4.0.9";
5154
+ var SDK_VERSION = "4.0.10";
5111
5155
 
5112
5156
  // src/helpers/sdk-headers.ts
5113
5157
  var getSdkHeaders = () => ({
package/lib/node/index.js CHANGED
@@ -2476,8 +2476,8 @@ var DEFAULT_INDEX = "default";
2476
2476
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2477
2477
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2478
2478
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2479
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2480
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2479
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2480
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2481
2481
  function checkShouldRenderVariants(variants, canTrack) {
2482
2482
  const hasVariants = variants && variants.length > 0;
2483
2483
  if (TARGET === "reactNative")
@@ -2735,6 +2735,11 @@ var handleABTesting = async ({
2735
2735
  };
2736
2736
  };
2737
2737
 
2738
+ // src/helpers/no-serialize-wrapper.ts
2739
+ function noSerializeWrapper(fn) {
2740
+ return fn;
2741
+ }
2742
+
2738
2743
  // src/helpers/user-attributes.ts
2739
2744
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2740
2745
  function createUserAttributesService() {
@@ -2765,18 +2770,32 @@ function createUserAttributesService() {
2765
2770
  canTrack
2766
2771
  }) || "{}");
2767
2772
  },
2768
- subscribeOnUserAttributesChange(callback) {
2773
+ subscribeOnUserAttributesChange(callback, {
2774
+ fireImmediately
2775
+ } = {}) {
2769
2776
  subscribers.add(callback);
2770
- return () => {
2777
+ if (fireImmediately) {
2778
+ callback(this.getUserAttributes());
2779
+ }
2780
+ return noSerializeWrapper(function() {
2771
2781
  subscribers.delete(callback);
2772
- };
2782
+ });
2773
2783
  },
2774
2784
  setCanTrack(value) {
2775
2785
  canTrack = value;
2776
2786
  }
2777
2787
  };
2778
2788
  }
2779
- var userAttributesService = createUserAttributesService();
2789
+ var _userAttributesService;
2790
+ if (isBrowser() && TARGET === "qwik") {
2791
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2792
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2793
+ }
2794
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2795
+ } else {
2796
+ _userAttributesService = createUserAttributesService();
2797
+ }
2798
+ var userAttributesService = _userAttributesService;
2780
2799
  var setClientUserAttributes = (attributes) => {
2781
2800
  userAttributesService.setUserAttributes(attributes);
2782
2801
  };
@@ -3631,6 +3650,8 @@ function PersonalizationContainer(props) {
3631
3650
  setShouldResetVariants(true);
3632
3651
  const unsub = userAttributesService.subscribeOnUserAttributesChange((attrs2) => {
3633
3652
  setUserAttributes(attrs2);
3653
+ }, {
3654
+ fireImmediately: TARGET === "qwik"
3634
3655
  });
3635
3656
  if (!(isEditing() || isPreviewing())) {
3636
3657
  const variant = filteredVariants()[0];
@@ -4648,9 +4669,9 @@ function logFetch(url) {
4648
4669
  }
4649
4670
 
4650
4671
  // src/blocks/form/form/form.tsx
4651
- var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-04a43b72">`);
4672
+ var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-7430044e">`);
4652
4673
  var _tmpl$26 = /* @__PURE__ */ template(`<form>`);
4653
- var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-04a43b72 {
4674
+ var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-7430044e {
4654
4675
  padding: 10px;
4655
4676
  color: red;
4656
4677
  text-align: center;
@@ -4762,6 +4783,14 @@ function FormComponent(props) {
4762
4783
  }
4763
4784
  }
4764
4785
  setFormState("sending");
4786
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4787
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4788
+ setFormState("error");
4789
+ mergeNewRootState({
4790
+ formErrorMessage: message
4791
+ });
4792
+ return;
4793
+ }
4765
4794
  const formUrl = `${getEnv() === "dev" ? "http://localhost:5000" : "https://builder.io"}/api/v1/form-submit?apiKey=${props.builderContext.apiKey}&to=${btoa(props.sendSubmissionsToEmail || "")}&name=${encodeURIComponent(props.name || "")}`;
4766
4795
  const url = props.sendSubmissionsTo === "email" ? formUrl : props.action;
4767
4796
  logFetch(url);
@@ -4777,17 +4806,30 @@ function FormComponent(props) {
4777
4806
  } else {
4778
4807
  body2 = await res.text();
4779
4808
  }
4780
- if (!res.ok && props.errorMessagePath) {
4781
- let message = get(body2, props.errorMessagePath);
4782
- if (message) {
4783
- if (typeof message !== "string") {
4784
- message = JSON.stringify(message);
4809
+ if (!res.ok) {
4810
+ const submitErrorEvent = new CustomEvent("submit:error", {
4811
+ detail: {
4812
+ error: body2,
4813
+ status: res.status
4785
4814
  }
4786
- setFormErrorMessage(message);
4787
- mergeNewRootState({
4788
- formErrorMessage: message
4789
- });
4815
+ });
4816
+ if (formRef?.nativeElement) {
4817
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4818
+ if (submitErrorEvent.defaultPrevented) {
4819
+ return;
4820
+ }
4821
+ }
4822
+ setResponseData(body2);
4823
+ setFormState("error");
4824
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4825
+ if (typeof message !== "string") {
4826
+ message = JSON.stringify(message);
4790
4827
  }
4828
+ setFormErrorMessage(message);
4829
+ mergeNewRootState({
4830
+ formErrorMessage: message
4831
+ });
4832
+ return;
4791
4833
  }
4792
4834
  setResponseData(body2);
4793
4835
  setFormState(res.ok ? "success" : "error");
@@ -5602,7 +5644,7 @@ function getPreviewContent(_searchParams) {
5602
5644
  }
5603
5645
 
5604
5646
  // src/constants/sdk-version.ts
5605
- var SDK_VERSION = "4.0.9";
5647
+ var SDK_VERSION = "4.0.10";
5606
5648
 
5607
5649
  // src/helpers/sdk-headers.ts
5608
5650
  var getSdkHeaders = () => ({
@@ -2239,8 +2239,8 @@ var DEFAULT_INDEX = "default";
2239
2239
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2240
2240
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2241
2241
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2242
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2243
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2242
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2243
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2244
2244
  function checkShouldRenderVariants(variants, canTrack) {
2245
2245
  const hasVariants = variants && variants.length > 0;
2246
2246
  if (TARGET === "reactNative")
@@ -2498,6 +2498,11 @@ var handleABTesting = async ({
2498
2498
  };
2499
2499
  };
2500
2500
 
2501
+ // src/helpers/no-serialize-wrapper.ts
2502
+ function noSerializeWrapper(fn) {
2503
+ return fn;
2504
+ }
2505
+
2501
2506
  // src/helpers/user-attributes.ts
2502
2507
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2503
2508
  function createUserAttributesService() {
@@ -2528,18 +2533,32 @@ function createUserAttributesService() {
2528
2533
  canTrack
2529
2534
  }) || "{}");
2530
2535
  },
2531
- subscribeOnUserAttributesChange(callback) {
2536
+ subscribeOnUserAttributesChange(callback, {
2537
+ fireImmediately
2538
+ } = {}) {
2532
2539
  subscribers.add(callback);
2533
- return () => {
2540
+ if (fireImmediately) {
2541
+ callback(this.getUserAttributes());
2542
+ }
2543
+ return noSerializeWrapper(function() {
2534
2544
  subscribers.delete(callback);
2535
- };
2545
+ });
2536
2546
  },
2537
2547
  setCanTrack(value) {
2538
2548
  canTrack = value;
2539
2549
  }
2540
2550
  };
2541
2551
  }
2542
- var userAttributesService = createUserAttributesService();
2552
+ var _userAttributesService;
2553
+ if (isBrowser() && TARGET === "qwik") {
2554
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2555
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2556
+ }
2557
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2558
+ } else {
2559
+ _userAttributesService = createUserAttributesService();
2560
+ }
2561
+ var userAttributesService = _userAttributesService;
2543
2562
  var setClientUserAttributes = (attributes) => {
2544
2563
  userAttributesService.setUserAttributes(attributes);
2545
2564
  };
@@ -3381,6 +3400,9 @@ function PersonalizationContainer(props) {
3381
3400
  const unsub = userAttributesService.subscribeOnUserAttributesChange(
3382
3401
  (attrs2) => {
3383
3402
  setUserAttributes(attrs2);
3403
+ },
3404
+ {
3405
+ fireImmediately: TARGET === "qwik"
3384
3406
  }
3385
3407
  );
3386
3408
  if (!(isEditing() || isPreviewing())) {
@@ -4361,6 +4383,14 @@ function FormComponent(props) {
4361
4383
  }
4362
4384
  }
4363
4385
  setFormState("sending");
4386
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4387
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4388
+ setFormState("error");
4389
+ mergeNewRootState({
4390
+ formErrorMessage: message
4391
+ });
4392
+ return;
4393
+ }
4364
4394
  const formUrl = `${getEnv() === "dev" ? "http://localhost:5000" : "https://builder.io"}/api/v1/form-submit?apiKey=${props.builderContext.apiKey}&to=${btoa(
4365
4395
  props.sendSubmissionsToEmail || ""
4366
4396
  )}&name=${encodeURIComponent(props.name || "")}`;
@@ -4379,17 +4409,30 @@ function FormComponent(props) {
4379
4409
  } else {
4380
4410
  body2 = await res.text();
4381
4411
  }
4382
- if (!res.ok && props.errorMessagePath) {
4383
- let message = get(body2, props.errorMessagePath);
4384
- if (message) {
4385
- if (typeof message !== "string") {
4386
- message = JSON.stringify(message);
4412
+ if (!res.ok) {
4413
+ const submitErrorEvent = new CustomEvent("submit:error", {
4414
+ detail: {
4415
+ error: body2,
4416
+ status: res.status
4417
+ }
4418
+ });
4419
+ if (formRef?.nativeElement) {
4420
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4421
+ if (submitErrorEvent.defaultPrevented) {
4422
+ return;
4387
4423
  }
4388
- setFormErrorMessage(message);
4389
- mergeNewRootState({
4390
- formErrorMessage: message
4391
- });
4392
4424
  }
4425
+ setResponseData(body2);
4426
+ setFormState("error");
4427
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4428
+ if (typeof message !== "string") {
4429
+ message = JSON.stringify(message);
4430
+ }
4431
+ setFormErrorMessage(message);
4432
+ mergeNewRootState({
4433
+ formErrorMessage: message
4434
+ });
4435
+ return;
4393
4436
  }
4394
4437
  setResponseData(body2);
4395
4438
  setFormState(res.ok ? "success" : "error");
@@ -4468,14 +4511,14 @@ function FormComponent(props) {
4468
4511
  blocks={props.sendingMessage}
4469
4512
  context={props.builderContext}
4470
4513
  /></Show12>
4471
- <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-04a43b72">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4514
+ <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-7430044e">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4472
4515
  <Show12 when={submissionState() === "success"}><Blocks_default
4473
4516
  path="successMessage"
4474
4517
  blocks={props.successMessage}
4475
4518
  context={props.builderContext}
4476
4519
  /></Show12>
4477
4520
  </form>
4478
- <style>{`.pre-04a43b72 {
4521
+ <style>{`.pre-7430044e {
4479
4522
  padding: 10px;
4480
4523
  color: red;
4481
4524
  text-align: center;
@@ -5097,7 +5140,7 @@ function getPreviewContent(_searchParams) {
5097
5140
  }
5098
5141
 
5099
5142
  // src/constants/sdk-version.ts
5100
- var SDK_VERSION = "4.0.9";
5143
+ var SDK_VERSION = "4.0.10";
5101
5144
 
5102
5145
  // src/helpers/sdk-headers.ts
5103
5146
  var getSdkHeaders = () => ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@builder.io/sdk-solid",
3
- "version": "4.0.9",
3
+ "version": "4.0.10",
4
4
  "description": "",
5
5
  "files": [
6
6
  "dist",