@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.
@@ -2317,8 +2317,8 @@ var DEFAULT_INDEX = "default";
2317
2317
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2318
2318
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2319
2319
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2320
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2321
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2320
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2321
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2322
2322
  function checkShouldRenderVariants(variants, canTrack) {
2323
2323
  const hasVariants = variants && variants.length > 0;
2324
2324
  if (TARGET === "reactNative")
@@ -2576,6 +2576,11 @@ var handleABTesting = async ({
2576
2576
  };
2577
2577
  };
2578
2578
 
2579
+ // src/helpers/no-serialize-wrapper.ts
2580
+ function noSerializeWrapper(fn) {
2581
+ return fn;
2582
+ }
2583
+
2579
2584
  // src/helpers/user-attributes.ts
2580
2585
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2581
2586
  function createUserAttributesService() {
@@ -2606,18 +2611,32 @@ function createUserAttributesService() {
2606
2611
  canTrack
2607
2612
  }) || "{}");
2608
2613
  },
2609
- subscribeOnUserAttributesChange(callback) {
2614
+ subscribeOnUserAttributesChange(callback, {
2615
+ fireImmediately
2616
+ } = {}) {
2610
2617
  subscribers.add(callback);
2611
- return () => {
2618
+ if (fireImmediately) {
2619
+ callback(this.getUserAttributes());
2620
+ }
2621
+ return noSerializeWrapper(function() {
2612
2622
  subscribers.delete(callback);
2613
- };
2623
+ });
2614
2624
  },
2615
2625
  setCanTrack(value) {
2616
2626
  canTrack = value;
2617
2627
  }
2618
2628
  };
2619
2629
  }
2620
- var userAttributesService = createUserAttributesService();
2630
+ var _userAttributesService;
2631
+ if (isBrowser() && TARGET === "qwik") {
2632
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2633
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2634
+ }
2635
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2636
+ } else {
2637
+ _userAttributesService = createUserAttributesService();
2638
+ }
2639
+ var userAttributesService = _userAttributesService;
2621
2640
  var setClientUserAttributes = (attributes) => {
2622
2641
  userAttributesService.setUserAttributes(attributes);
2623
2642
  };
@@ -3473,6 +3492,8 @@ function PersonalizationContainer(props) {
3473
3492
  setShouldResetVariants(true);
3474
3493
  const unsub = userAttributesService.subscribeOnUserAttributesChange((attrs2) => {
3475
3494
  setUserAttributes(attrs2);
3495
+ }, {
3496
+ fireImmediately: TARGET === "qwik"
3476
3497
  });
3477
3498
  if (!(isEditing() || isPreviewing())) {
3478
3499
  const variant = filteredVariants()[0];
@@ -4490,9 +4511,9 @@ function logFetch(url) {
4490
4511
  }
4491
4512
 
4492
4513
  // src/blocks/form/form/form.tsx
4493
- var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-04a43b72">`);
4514
+ var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-7430044e">`);
4494
4515
  var _tmpl$26 = /* @__PURE__ */ template(`<form>`);
4495
- var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-04a43b72 {
4516
+ var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-7430044e {
4496
4517
  padding: 10px;
4497
4518
  color: red;
4498
4519
  text-align: center;
@@ -4604,6 +4625,15 @@ function FormComponent(props) {
4604
4625
  }
4605
4626
  }
4606
4627
  setFormState("sending");
4628
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4629
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4630
+ console.error(message);
4631
+ setFormState("error");
4632
+ mergeNewRootState({
4633
+ formErrorMessage: message
4634
+ });
4635
+ return;
4636
+ }
4607
4637
  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 || "")}`;
4608
4638
  const url = props.sendSubmissionsTo === "email" ? formUrl : props.action;
4609
4639
  logFetch(url);
@@ -4619,17 +4649,30 @@ function FormComponent(props) {
4619
4649
  } else {
4620
4650
  body2 = await res.text();
4621
4651
  }
4622
- if (!res.ok && props.errorMessagePath) {
4623
- let message = get(body2, props.errorMessagePath);
4624
- if (message) {
4625
- if (typeof message !== "string") {
4626
- message = JSON.stringify(message);
4652
+ if (!res.ok) {
4653
+ const submitErrorEvent = new CustomEvent("submit:error", {
4654
+ detail: {
4655
+ error: body2,
4656
+ status: res.status
4627
4657
  }
4628
- setFormErrorMessage(message);
4629
- mergeNewRootState({
4630
- formErrorMessage: message
4631
- });
4658
+ });
4659
+ if (formRef?.nativeElement) {
4660
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4661
+ if (submitErrorEvent.defaultPrevented) {
4662
+ return;
4663
+ }
4664
+ }
4665
+ setResponseData(body2);
4666
+ setFormState("error");
4667
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4668
+ if (typeof message !== "string") {
4669
+ message = JSON.stringify(message);
4632
4670
  }
4671
+ setFormErrorMessage(message);
4672
+ mergeNewRootState({
4673
+ formErrorMessage: message
4674
+ });
4675
+ return;
4633
4676
  }
4634
4677
  setResponseData(body2);
4635
4678
  setFormState(res.ok ? "success" : "error");
@@ -5445,7 +5488,7 @@ function getPreviewContent(_searchParams) {
5445
5488
  }
5446
5489
 
5447
5490
  // src/constants/sdk-version.ts
5448
- var SDK_VERSION = "4.0.9";
5491
+ var SDK_VERSION = "4.0.10";
5449
5492
 
5450
5493
  // src/helpers/sdk-headers.ts
5451
5494
  var getSdkHeaders = () => ({
@@ -2076,8 +2076,8 @@ var DEFAULT_INDEX = "default";
2076
2076
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2077
2077
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2078
2078
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2079
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2080
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2079
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2080
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2081
2081
  function checkShouldRenderVariants(variants, canTrack) {
2082
2082
  const hasVariants = variants && variants.length > 0;
2083
2083
  if (TARGET === "reactNative")
@@ -2335,6 +2335,11 @@ var handleABTesting = async ({
2335
2335
  };
2336
2336
  };
2337
2337
 
2338
+ // src/helpers/no-serialize-wrapper.ts
2339
+ function noSerializeWrapper(fn) {
2340
+ return fn;
2341
+ }
2342
+
2338
2343
  // src/helpers/user-attributes.ts
2339
2344
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2340
2345
  function createUserAttributesService() {
@@ -2365,18 +2370,32 @@ function createUserAttributesService() {
2365
2370
  canTrack
2366
2371
  }) || "{}");
2367
2372
  },
2368
- subscribeOnUserAttributesChange(callback) {
2373
+ subscribeOnUserAttributesChange(callback, {
2374
+ fireImmediately
2375
+ } = {}) {
2369
2376
  subscribers.add(callback);
2370
- return () => {
2377
+ if (fireImmediately) {
2378
+ callback(this.getUserAttributes());
2379
+ }
2380
+ return noSerializeWrapper(function() {
2371
2381
  subscribers.delete(callback);
2372
- };
2382
+ });
2373
2383
  },
2374
2384
  setCanTrack(value) {
2375
2385
  canTrack = value;
2376
2386
  }
2377
2387
  };
2378
2388
  }
2379
- var userAttributesService = createUserAttributesService();
2389
+ var _userAttributesService;
2390
+ if (isBrowser() && TARGET === "qwik") {
2391
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2392
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2393
+ }
2394
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2395
+ } else {
2396
+ _userAttributesService = createUserAttributesService();
2397
+ }
2398
+ var userAttributesService = _userAttributesService;
2380
2399
  var setClientUserAttributes = (attributes) => {
2381
2400
  userAttributesService.setUserAttributes(attributes);
2382
2401
  };
@@ -3219,6 +3238,9 @@ function PersonalizationContainer(props) {
3219
3238
  const unsub = userAttributesService.subscribeOnUserAttributesChange(
3220
3239
  (attrs2) => {
3221
3240
  setUserAttributes(attrs2);
3241
+ },
3242
+ {
3243
+ fireImmediately: TARGET === "qwik"
3222
3244
  }
3223
3245
  );
3224
3246
  if (!(isEditing() || isPreviewing())) {
@@ -4199,6 +4221,15 @@ function FormComponent(props) {
4199
4221
  }
4200
4222
  }
4201
4223
  setFormState("sending");
4224
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4225
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4226
+ console.error(message);
4227
+ setFormState("error");
4228
+ mergeNewRootState({
4229
+ formErrorMessage: message
4230
+ });
4231
+ return;
4232
+ }
4202
4233
  const formUrl = `${getEnv() === "dev" ? "http://localhost:5000" : "https://builder.io"}/api/v1/form-submit?apiKey=${props.builderContext.apiKey}&to=${btoa(
4203
4234
  props.sendSubmissionsToEmail || ""
4204
4235
  )}&name=${encodeURIComponent(props.name || "")}`;
@@ -4217,17 +4248,30 @@ function FormComponent(props) {
4217
4248
  } else {
4218
4249
  body2 = await res.text();
4219
4250
  }
4220
- if (!res.ok && props.errorMessagePath) {
4221
- let message = get(body2, props.errorMessagePath);
4222
- if (message) {
4223
- if (typeof message !== "string") {
4224
- message = JSON.stringify(message);
4251
+ if (!res.ok) {
4252
+ const submitErrorEvent = new CustomEvent("submit:error", {
4253
+ detail: {
4254
+ error: body2,
4255
+ status: res.status
4225
4256
  }
4226
- setFormErrorMessage(message);
4227
- mergeNewRootState({
4228
- formErrorMessage: message
4229
- });
4257
+ });
4258
+ if (formRef?.nativeElement) {
4259
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4260
+ if (submitErrorEvent.defaultPrevented) {
4261
+ return;
4262
+ }
4263
+ }
4264
+ setResponseData(body2);
4265
+ setFormState("error");
4266
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4267
+ if (typeof message !== "string") {
4268
+ message = JSON.stringify(message);
4230
4269
  }
4270
+ setFormErrorMessage(message);
4271
+ mergeNewRootState({
4272
+ formErrorMessage: message
4273
+ });
4274
+ return;
4231
4275
  }
4232
4276
  setResponseData(body2);
4233
4277
  setFormState(res.ok ? "success" : "error");
@@ -4306,14 +4350,14 @@ function FormComponent(props) {
4306
4350
  blocks={props.sendingMessage}
4307
4351
  context={props.builderContext}
4308
4352
  /></Show12>
4309
- <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-04a43b72">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4353
+ <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-7430044e">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4310
4354
  <Show12 when={submissionState() === "success"}><Blocks_default
4311
4355
  path="successMessage"
4312
4356
  blocks={props.successMessage}
4313
4357
  context={props.builderContext}
4314
4358
  /></Show12>
4315
4359
  </form>
4316
- <style>{`.pre-04a43b72 {
4360
+ <style>{`.pre-7430044e {
4317
4361
  padding: 10px;
4318
4362
  color: red;
4319
4363
  text-align: center;
@@ -4936,7 +4980,7 @@ function getPreviewContent(_searchParams) {
4936
4980
  }
4937
4981
 
4938
4982
  // src/constants/sdk-version.ts
4939
- var SDK_VERSION = "4.0.9";
4983
+ var SDK_VERSION = "4.0.10";
4940
4984
 
4941
4985
  // src/helpers/sdk-headers.ts
4942
4986
  var getSdkHeaders = () => ({
@@ -2307,8 +2307,8 @@ var DEFAULT_INDEX = "default";
2307
2307
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2308
2308
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2309
2309
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2310
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2311
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2310
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2311
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2312
2312
  function checkShouldRenderVariants(variants, canTrack) {
2313
2313
  const hasVariants = variants && variants.length > 0;
2314
2314
  if (TARGET === "reactNative")
@@ -2566,6 +2566,11 @@ var handleABTesting = async ({
2566
2566
  };
2567
2567
  };
2568
2568
 
2569
+ // src/helpers/no-serialize-wrapper.ts
2570
+ function noSerializeWrapper(fn) {
2571
+ return fn;
2572
+ }
2573
+
2569
2574
  // src/helpers/user-attributes.ts
2570
2575
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2571
2576
  function createUserAttributesService() {
@@ -2596,18 +2601,32 @@ function createUserAttributesService() {
2596
2601
  canTrack
2597
2602
  }) || "{}");
2598
2603
  },
2599
- subscribeOnUserAttributesChange(callback) {
2604
+ subscribeOnUserAttributesChange(callback, {
2605
+ fireImmediately
2606
+ } = {}) {
2600
2607
  subscribers.add(callback);
2601
- return () => {
2608
+ if (fireImmediately) {
2609
+ callback(this.getUserAttributes());
2610
+ }
2611
+ return noSerializeWrapper(function() {
2602
2612
  subscribers.delete(callback);
2603
- };
2613
+ });
2604
2614
  },
2605
2615
  setCanTrack(value) {
2606
2616
  canTrack = value;
2607
2617
  }
2608
2618
  };
2609
2619
  }
2610
- var userAttributesService = createUserAttributesService();
2620
+ var _userAttributesService;
2621
+ if (isBrowser() && TARGET === "qwik") {
2622
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2623
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2624
+ }
2625
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2626
+ } else {
2627
+ _userAttributesService = createUserAttributesService();
2628
+ }
2629
+ var userAttributesService = _userAttributesService;
2611
2630
  var setClientUserAttributes = (attributes) => {
2612
2631
  userAttributesService.setUserAttributes(attributes);
2613
2632
  };
@@ -3462,6 +3481,8 @@ function PersonalizationContainer(props) {
3462
3481
  setShouldResetVariants(true);
3463
3482
  const unsub = userAttributesService.subscribeOnUserAttributesChange((attrs2) => {
3464
3483
  setUserAttributes(attrs2);
3484
+ }, {
3485
+ fireImmediately: TARGET === "qwik"
3465
3486
  });
3466
3487
  if (!(isEditing() || isPreviewing())) {
3467
3488
  const variant = filteredVariants()[0];
@@ -4479,9 +4500,9 @@ function logFetch(url) {
4479
4500
  }
4480
4501
 
4481
4502
  // src/blocks/form/form/form.tsx
4482
- var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-04a43b72">`);
4503
+ var _tmpl$15 = /* @__PURE__ */ template(`<pre class="builder-form-error-text pre-7430044e">`);
4483
4504
  var _tmpl$26 = /* @__PURE__ */ template(`<form>`);
4484
- var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-04a43b72 {
4505
+ var _tmpl$34 = /* @__PURE__ */ template(`<style>.pre-7430044e {
4485
4506
  padding: 10px;
4486
4507
  color: red;
4487
4508
  text-align: center;
@@ -4593,6 +4614,14 @@ function FormComponent(props) {
4593
4614
  }
4594
4615
  }
4595
4616
  setFormState("sending");
4617
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4618
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4619
+ setFormState("error");
4620
+ mergeNewRootState({
4621
+ formErrorMessage: message
4622
+ });
4623
+ return;
4624
+ }
4596
4625
  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 || "")}`;
4597
4626
  const url = props.sendSubmissionsTo === "email" ? formUrl : props.action;
4598
4627
  logFetch(url);
@@ -4608,17 +4637,30 @@ function FormComponent(props) {
4608
4637
  } else {
4609
4638
  body2 = await res.text();
4610
4639
  }
4611
- if (!res.ok && props.errorMessagePath) {
4612
- let message = get(body2, props.errorMessagePath);
4613
- if (message) {
4614
- if (typeof message !== "string") {
4615
- message = JSON.stringify(message);
4640
+ if (!res.ok) {
4641
+ const submitErrorEvent = new CustomEvent("submit:error", {
4642
+ detail: {
4643
+ error: body2,
4644
+ status: res.status
4616
4645
  }
4617
- setFormErrorMessage(message);
4618
- mergeNewRootState({
4619
- formErrorMessage: message
4620
- });
4646
+ });
4647
+ if (formRef?.nativeElement) {
4648
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4649
+ if (submitErrorEvent.defaultPrevented) {
4650
+ return;
4651
+ }
4652
+ }
4653
+ setResponseData(body2);
4654
+ setFormState("error");
4655
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4656
+ if (typeof message !== "string") {
4657
+ message = JSON.stringify(message);
4621
4658
  }
4659
+ setFormErrorMessage(message);
4660
+ mergeNewRootState({
4661
+ formErrorMessage: message
4662
+ });
4663
+ return;
4622
4664
  }
4623
4665
  setResponseData(body2);
4624
4666
  setFormState(res.ok ? "success" : "error");
@@ -5433,7 +5475,7 @@ function getPreviewContent(_searchParams) {
5433
5475
  }
5434
5476
 
5435
5477
  // src/constants/sdk-version.ts
5436
- var SDK_VERSION = "4.0.9";
5478
+ var SDK_VERSION = "4.0.10";
5437
5479
 
5438
5480
  // src/helpers/sdk-headers.ts
5439
5481
  var getSdkHeaders = () => ({
@@ -2068,8 +2068,8 @@ var DEFAULT_INDEX = "default";
2068
2068
  var FILTER_WITH_CUSTOM_TARGETING_SCRIPT_FN_NAME = "filterWithCustomTargeting";
2069
2069
  var BUILDER_IO_PERSONALIZATION_SCRIPT_FN_NAME = "builderIoPersonalization";
2070
2070
  var UPDATE_VARIANT_VISIBILITY_SCRIPT_FN_NAME = "updateVisibilityStylesScript";
2071
- var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte"];
2072
- var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte"];
2071
+ var SDKS_SUPPORTING_PERSONALIZATION = ["react", "vue", "svelte", "qwik"];
2072
+ var SDKS_REQUIRING_RESET_APPROACH = ["vue", "svelte", "qwik"];
2073
2073
  function checkShouldRenderVariants(variants, canTrack) {
2074
2074
  const hasVariants = variants && variants.length > 0;
2075
2075
  if (TARGET === "reactNative")
@@ -2327,6 +2327,11 @@ var handleABTesting = async ({
2327
2327
  };
2328
2328
  };
2329
2329
 
2330
+ // src/helpers/no-serialize-wrapper.ts
2331
+ function noSerializeWrapper(fn) {
2332
+ return fn;
2333
+ }
2334
+
2330
2335
  // src/helpers/user-attributes.ts
2331
2336
  var USER_ATTRIBUTES_COOKIE_NAME = "builder.userAttributes";
2332
2337
  function createUserAttributesService() {
@@ -2357,18 +2362,32 @@ function createUserAttributesService() {
2357
2362
  canTrack
2358
2363
  }) || "{}");
2359
2364
  },
2360
- subscribeOnUserAttributesChange(callback) {
2365
+ subscribeOnUserAttributesChange(callback, {
2366
+ fireImmediately
2367
+ } = {}) {
2361
2368
  subscribers.add(callback);
2362
- return () => {
2369
+ if (fireImmediately) {
2370
+ callback(this.getUserAttributes());
2371
+ }
2372
+ return noSerializeWrapper(function() {
2363
2373
  subscribers.delete(callback);
2364
- };
2374
+ });
2365
2375
  },
2366
2376
  setCanTrack(value) {
2367
2377
  canTrack = value;
2368
2378
  }
2369
2379
  };
2370
2380
  }
2371
- var userAttributesService = createUserAttributesService();
2381
+ var _userAttributesService;
2382
+ if (isBrowser() && TARGET === "qwik") {
2383
+ if (!window.__BUILDER_USER_ATTRIBUTES_SERVICE__) {
2384
+ window.__BUILDER_USER_ATTRIBUTES_SERVICE__ = createUserAttributesService();
2385
+ }
2386
+ _userAttributesService = window.__BUILDER_USER_ATTRIBUTES_SERVICE__;
2387
+ } else {
2388
+ _userAttributesService = createUserAttributesService();
2389
+ }
2390
+ var userAttributesService = _userAttributesService;
2372
2391
  var setClientUserAttributes = (attributes) => {
2373
2392
  userAttributesService.setUserAttributes(attributes);
2374
2393
  };
@@ -3210,6 +3229,9 @@ function PersonalizationContainer(props) {
3210
3229
  const unsub = userAttributesService.subscribeOnUserAttributesChange(
3211
3230
  (attrs2) => {
3212
3231
  setUserAttributes(attrs2);
3232
+ },
3233
+ {
3234
+ fireImmediately: TARGET === "qwik"
3213
3235
  }
3214
3236
  );
3215
3237
  if (!(isEditing() || isPreviewing())) {
@@ -4190,6 +4212,14 @@ function FormComponent(props) {
4190
4212
  }
4191
4213
  }
4192
4214
  setFormState("sending");
4215
+ if (props.sendSubmissionsTo === "email" && (props.sendSubmissionsToEmail === "your@email.com" || !props.sendSubmissionsToEmail)) {
4216
+ const message = "SubmissionsToEmail is required when sendSubmissionsTo is set to email";
4217
+ setFormState("error");
4218
+ mergeNewRootState({
4219
+ formErrorMessage: message
4220
+ });
4221
+ return;
4222
+ }
4193
4223
  const formUrl = `${getEnv() === "dev" ? "http://localhost:5000" : "https://builder.io"}/api/v1/form-submit?apiKey=${props.builderContext.apiKey}&to=${btoa(
4194
4224
  props.sendSubmissionsToEmail || ""
4195
4225
  )}&name=${encodeURIComponent(props.name || "")}`;
@@ -4208,17 +4238,30 @@ function FormComponent(props) {
4208
4238
  } else {
4209
4239
  body2 = await res.text();
4210
4240
  }
4211
- if (!res.ok && props.errorMessagePath) {
4212
- let message = get(body2, props.errorMessagePath);
4213
- if (message) {
4214
- if (typeof message !== "string") {
4215
- message = JSON.stringify(message);
4241
+ if (!res.ok) {
4242
+ const submitErrorEvent = new CustomEvent("submit:error", {
4243
+ detail: {
4244
+ error: body2,
4245
+ status: res.status
4216
4246
  }
4217
- setFormErrorMessage(message);
4218
- mergeNewRootState({
4219
- formErrorMessage: message
4220
- });
4247
+ });
4248
+ if (formRef?.nativeElement) {
4249
+ formRef?.nativeElement.dispatchEvent(submitErrorEvent);
4250
+ if (submitErrorEvent.defaultPrevented) {
4251
+ return;
4252
+ }
4253
+ }
4254
+ setResponseData(body2);
4255
+ setFormState("error");
4256
+ let message = props.errorMessagePath ? get(body2, props.errorMessagePath) : body2.message || body2.error || body2;
4257
+ if (typeof message !== "string") {
4258
+ message = JSON.stringify(message);
4221
4259
  }
4260
+ setFormErrorMessage(message);
4261
+ mergeNewRootState({
4262
+ formErrorMessage: message
4263
+ });
4264
+ return;
4222
4265
  }
4223
4266
  setResponseData(body2);
4224
4267
  setFormState(res.ok ? "success" : "error");
@@ -4297,14 +4340,14 @@ function FormComponent(props) {
4297
4340
  blocks={props.sendingMessage}
4298
4341
  context={props.builderContext}
4299
4342
  /></Show12>
4300
- <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-04a43b72">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4343
+ <Show12 when={submissionState() === "error" && responseData()}><pre class="builder-form-error-text pre-7430044e">{JSON.stringify(responseData(), null, 2)}</pre></Show12>
4301
4344
  <Show12 when={submissionState() === "success"}><Blocks_default
4302
4345
  path="successMessage"
4303
4346
  blocks={props.successMessage}
4304
4347
  context={props.builderContext}
4305
4348
  /></Show12>
4306
4349
  </form>
4307
- <style>{`.pre-04a43b72 {
4350
+ <style>{`.pre-7430044e {
4308
4351
  padding: 10px;
4309
4352
  color: red;
4310
4353
  text-align: center;
@@ -4926,7 +4969,7 @@ function getPreviewContent(_searchParams) {
4926
4969
  }
4927
4970
 
4928
4971
  // src/constants/sdk-version.ts
4929
- var SDK_VERSION = "4.0.9";
4972
+ var SDK_VERSION = "4.0.10";
4930
4973
 
4931
4974
  // src/helpers/sdk-headers.ts
4932
4975
  var getSdkHeaders = () => ({