@builder.io/sdk-solid 3.0.0 → 3.0.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.
@@ -103,7 +103,8 @@ var builder_context_default = createContext({
103
103
  inheritedStyles: {},
104
104
  BlocksWrapper: "div",
105
105
  BlocksWrapperProps: {},
106
- nonce: ""
106
+ nonce: "",
107
+ model: ""
107
108
  });
108
109
 
109
110
  // src/context/components.context.ts
@@ -3577,6 +3578,76 @@ function evaluate({
3577
3578
  }
3578
3579
  }
3579
3580
 
3581
+ // src/functions/traverse.ts
3582
+ function traverse(obj, callback, parent2 = null, key = null, visited = /* @__PURE__ */ new WeakSet()) {
3583
+ if (obj == null || typeof obj !== "object") {
3584
+ callback(obj, (newValue) => {
3585
+ if (parent2 !== null && key !== null) {
3586
+ parent2[key] = newValue;
3587
+ }
3588
+ });
3589
+ return;
3590
+ }
3591
+ if (visited.has(obj)) {
3592
+ return;
3593
+ }
3594
+ visited.add(obj);
3595
+ if (Array.isArray(obj)) {
3596
+ obj.forEach((item, index) => {
3597
+ const update = (newValue) => {
3598
+ obj[index] = newValue;
3599
+ };
3600
+ callback(item, update);
3601
+ traverse(item, callback, obj, index, visited);
3602
+ });
3603
+ } else {
3604
+ Object.entries(obj).forEach(([key2, value]) => {
3605
+ const update = (newValue) => {
3606
+ obj[key2] = newValue;
3607
+ };
3608
+ callback(value, update);
3609
+ traverse(value, callback, obj, key2, visited);
3610
+ });
3611
+ }
3612
+ }
3613
+
3614
+ // src/functions/extract-localized-values.ts
3615
+ function isLocalizedField(value) {
3616
+ return value && typeof value === "object" && value["@type"] === "@builder.io/core:LocalizedValue";
3617
+ }
3618
+ function containsLocalizedValues(data) {
3619
+ if (!data || !Object.getOwnPropertyNames(data).length) {
3620
+ return false;
3621
+ }
3622
+ let hasLocalizedValues = false;
3623
+ traverse(data, (value) => {
3624
+ if (isLocalizedField(value)) {
3625
+ hasLocalizedValues = true;
3626
+ return;
3627
+ }
3628
+ });
3629
+ return hasLocalizedValues;
3630
+ }
3631
+ function extractLocalizedValues(data, locale) {
3632
+ if (!data || !Object.getOwnPropertyNames(data).length) {
3633
+ return {};
3634
+ }
3635
+ traverse(data, (value, update) => {
3636
+ if (isLocalizedField(value)) {
3637
+ update(value[locale] ?? void 0);
3638
+ }
3639
+ });
3640
+ return data;
3641
+ }
3642
+ function resolveLocalizedValues(block, locale) {
3643
+ if (block.component?.options && containsLocalizedValues(block.component?.options)) {
3644
+ if (!locale) {
3645
+ }
3646
+ block.component.options = extractLocalizedValues(block.component.options, locale ?? "Default");
3647
+ }
3648
+ return block;
3649
+ }
3650
+
3580
3651
  // src/functions/fast-clone.ts
3581
3652
  var fastClone = (obj) => JSON.parse(JSON.stringify(obj));
3582
3653
 
@@ -3675,7 +3746,8 @@ function getProcessedBlock({
3675
3746
  rootState,
3676
3747
  rootSetState
3677
3748
  }) {
3678
- const transformedBlock = transformBlock(block);
3749
+ let transformedBlock = resolveLocalizedValues(block, rootState.locale);
3750
+ transformedBlock = transformBlock(transformedBlock);
3679
3751
  if (shouldEvaluateBindings) {
3680
3752
  return evaluateBindings({
3681
3753
  block: transformedBlock,
@@ -3932,16 +4004,24 @@ function mapStyleObjToStrIfNeeded(style) {
3932
4004
  }
3933
4005
 
3934
4006
  // src/components/block/block.helpers.ts
4007
+ var checkIsComponentRestricted = (component, model) => {
4008
+ if (!component)
4009
+ return true;
4010
+ if (!model)
4011
+ return false;
4012
+ return component.models && component.models.length > 0 && !component.models.includes(model);
4013
+ };
3935
4014
  var getComponent = ({
3936
4015
  block,
3937
- registeredComponents
4016
+ registeredComponents,
4017
+ model
3938
4018
  }) => {
3939
4019
  const componentName = block.component?.name;
3940
4020
  if (!componentName) {
3941
4021
  return null;
3942
4022
  }
3943
4023
  const ref = registeredComponents[componentName];
3944
- if (!ref) {
4024
+ if (!ref || checkIsComponentRestricted(ref, model)) {
3945
4025
  return void 0;
3946
4026
  } else {
3947
4027
  return ref;
@@ -3992,11 +4072,15 @@ var provideLinkComponent = (block, linkComponent) => {
3992
4072
  };
3993
4073
  return {};
3994
4074
  };
3995
- var provideRegisteredComponents = (block, registeredComponents) => {
3996
- if (block?.shouldReceiveBuilderProps?.builderComponents)
4075
+ var provideRegisteredComponents = (block, registeredComponents, model) => {
4076
+ if (block?.shouldReceiveBuilderProps?.builderComponents) {
4077
+ const filteredRegisteredComponents = Object.fromEntries(Object.entries(registeredComponents).filter(([_, component]) => {
4078
+ return !checkIsComponentRestricted(component, model);
4079
+ }));
3997
4080
  return {
3998
- builderComponents: registeredComponents
4081
+ builderComponents: filteredRegisteredComponents
3999
4082
  };
4083
+ }
4000
4084
  return {};
4001
4085
  };
4002
4086
  var provideBuilderBlock = (block, builderBlock) => {
@@ -4400,7 +4484,8 @@ function Block(props) {
4400
4484
  const blockComponent = createMemo5(() => {
4401
4485
  return getComponent({
4402
4486
  block: processedBlock(),
4403
- registeredComponents: props.registeredComponents
4487
+ registeredComponents: props.registeredComponents,
4488
+ model: props.context.model
4404
4489
  });
4405
4490
  });
4406
4491
  const Tag = createMemo5(() => {
@@ -4435,7 +4520,8 @@ function Block(props) {
4435
4520
  ...provideLinkComponent(blockComponent(), props.linkComponent),
4436
4521
  ...provideRegisteredComponents(
4437
4522
  blockComponent(),
4438
- props.registeredComponents
4523
+ props.registeredComponents,
4524
+ props.context.model
4439
4525
  )
4440
4526
  },
4441
4527
  context: props.context,
@@ -4859,7 +4945,7 @@ function Image(props) {
4859
4945
  const url = imageToUse;
4860
4946
  if (!url || // We can auto add srcset for cdn.builder.io and shopify
4861
4947
  // images, otherwise you can supply this prop manually
4862
- !(url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/))) {
4948
+ !(typeof url === "string" && (url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/)))) {
4863
4949
  return props.srcset;
4864
4950
  }
4865
4951
  if (props.noWebp) {
@@ -4899,7 +4985,7 @@ function Image(props) {
4899
4985
  <picture>
4900
4986
  <Show8 when={webpSrcSet()}><source type="image/webp" srcset={webpSrcSet()} /></Show8>
4901
4987
  <img
4902
- class={"builder-image" + (props.className ? " " + props.className : "") + " img-7e6ffddc"}
4988
+ class={"builder-image" + (props.className ? " " + props.className : "") + " img-070d7e88"}
4903
4989
  loading={props.highPriority ? "eager" : "lazy"}
4904
4990
  fetchpriority={props.highPriority ? "high" : "auto"}
4905
4991
  alt={props.altText}
@@ -4917,22 +5003,22 @@ function Image(props) {
4917
5003
  <Show8
4918
5004
  when={props.aspectRatio && !(props.builderBlock?.children?.length && props.fitContent)}
4919
5005
  ><div
4920
- class="builder-image-sizer div-7e6ffddc"
5006
+ class="builder-image-sizer div-070d7e88"
4921
5007
  style={{
4922
5008
  "padding-top": props.aspectRatio * 100 + "%"
4923
5009
  }}
4924
5010
  /></Show8>
4925
5011
  <Show8 when={props.builderBlock?.children?.length && props.fitContent}>{props.children}</Show8>
4926
- <Show8 when={!props.fitContent && props.builderBlock?.children?.length}><div class="div-7e6ffddc-2">{props.children}</div></Show8>
5012
+ <Show8 when={!props.fitContent && props.builderBlock?.children?.length}><div class="div-070d7e88-2">{props.children}</div></Show8>
4927
5013
  </>
4928
- <style>{`.img-7e6ffddc {
5014
+ <style>{`.img-070d7e88 {
4929
5015
  opacity: 1;
4930
5016
  transition: opacity 0.2s ease-in-out;
4931
- }.div-7e6ffddc {
5017
+ }.div-070d7e88 {
4932
5018
  width: 100%;
4933
5019
  pointer-events: none;
4934
5020
  font-size: 0;
4935
- }.div-7e6ffddc-2 {
5021
+ }.div-070d7e88-2 {
4936
5022
  display: flex;
4937
5023
  flex-direction: column;
4938
5024
  align-items: stretch;
@@ -5725,6 +5811,10 @@ var componentInfo4 = {
5725
5811
  noWrap: true
5726
5812
  };
5727
5813
 
5814
+ // src/constants/file-types.ts
5815
+ var IMAGE_FILE_TYPES = ["jpeg", "jpg", "png", "svg", "webp", "gif", "jfif", "pjpeg", "pjp", "apng", "avif", "tif", "tiff", "heif", "bmp", "eps", "raw", "cr2", "nef", "orf", "sr2", "psd", "heic", "dib", "ai"];
5816
+ var VIDEO_FILE_TYPES = ["mp4", "webm", "mkv", "flv", "vob", "ogv", "ogg", "drc", "gif", "gifv", "mng", "avi", "mov", "qt", "mts", "m2ts", "ts", "wmv", "yuv", "rm", "rmvb", "viv", "asf", "amv", "m4p", "mpeg", "mpe", "m2v", "m4v", "svi", "3gp", "3g2", "mxf", "roq", "nsv", "f4v", "f4p", "f4a", "f4b"];
5817
+
5728
5818
  // src/blocks/image/component-info.ts
5729
5819
  var componentInfo5 = {
5730
5820
  name: "Image",
@@ -5741,7 +5831,7 @@ var componentInfo5 = {
5741
5831
  name: "image",
5742
5832
  type: "file",
5743
5833
  bubble: true,
5744
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "webp"],
5834
+ allowedFileTypes: IMAGE_FILE_TYPES,
5745
5835
  required: true,
5746
5836
  defaultValue: "https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F72c80f114dc149019051b6852a9e3b7a",
5747
5837
  onChange: (options) => {
@@ -7098,7 +7188,7 @@ var componentInfo18 = {
7098
7188
  name: "image",
7099
7189
  bubble: true,
7100
7190
  type: "file",
7101
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "gif", "webp"],
7191
+ allowedFileTypes: IMAGE_FILE_TYPES,
7102
7192
  required: true
7103
7193
  }],
7104
7194
  noWrap: true,
@@ -7133,14 +7223,14 @@ var componentInfo19 = {
7133
7223
  inputs: [{
7134
7224
  name: "video",
7135
7225
  type: "file",
7136
- allowedFileTypes: ["mp4"],
7226
+ allowedFileTypes: VIDEO_FILE_TYPES,
7137
7227
  bubble: true,
7138
7228
  defaultValue: "https://cdn.builder.io/o/assets%2FYJIGb4i01jvw0SRdL5Bt%2Fd27731a526464deba0016216f5f9e570%2Fcompressed?apiKey=YJIGb4i01jvw0SRdL5Bt&token=d27731a526464deba0016216f5f9e570&alt=media&optimized=true",
7139
7229
  required: true
7140
7230
  }, {
7141
7231
  name: "posterImage",
7142
7232
  type: "file",
7143
- allowedFileTypes: ["jpeg", "png"],
7233
+ allowedFileTypes: IMAGE_FILE_TYPES,
7144
7234
  helperText: "Image to show before the video plays"
7145
7235
  }, {
7146
7236
  name: "autoPlay",
@@ -7366,7 +7456,7 @@ var createRegisterComponentMessage = (info) => ({
7366
7456
  var serializeFn = (fnValue) => {
7367
7457
  const fnStr = fnValue.toString().trim();
7368
7458
  const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
7369
- const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("(") && !isArrowWithoutParens;
7459
+ const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
7370
7460
  return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
7371
7461
  };
7372
7462
  function serializeIncludingFunctions(info) {
@@ -7451,7 +7541,7 @@ function getPreviewContent(_searchParams) {
7451
7541
  }
7452
7542
 
7453
7543
  // src/constants/sdk-version.ts
7454
- var SDK_VERSION = "3.0.0";
7544
+ var SDK_VERSION = "3.0.1";
7455
7545
 
7456
7546
  // src/helpers/sdk-headers.ts
7457
7547
  var getSdkHeaders = () => ({
@@ -8163,6 +8253,12 @@ var subscribeToEditor = (model, callback, options) => {
8163
8253
  };
8164
8254
  };
8165
8255
 
8256
+ // src/components/content/components/enable-editor.helpers.ts
8257
+ var SDKS_USING_ELEMENT_REF_APPROACH = ["svelte", "qwik", "vue"];
8258
+ var needsElementRefDivForEditing = () => {
8259
+ return SDKS_USING_ELEMENT_REF_APPROACH.includes(TARGET) && (isEditing() || isPreviewing());
8260
+ };
8261
+
8166
8262
  // src/components/content/components/styles.helpers.ts
8167
8263
  var getCssFromFont = (font) => {
8168
8264
  const family = font.family + (font.kind && !font.kind.includes("#") ? ", " + font.kind : "");
@@ -8408,8 +8504,10 @@ function EnableEditor(props) {
8408
8504
  Object.values(
8409
8505
  props.builderContextSignal.componentInfos
8410
8506
  ).forEach((registeredComponent) => {
8411
- const message = createRegisterComponentMessage(registeredComponent);
8412
- window.parent?.postMessage(message, "*");
8507
+ if (!props.model || !registeredComponent.models?.length || registeredComponent.models.includes(props.model)) {
8508
+ const message = createRegisterComponentMessage(registeredComponent);
8509
+ window.parent?.postMessage(message, "*");
8510
+ }
8413
8511
  });
8414
8512
  window.addEventListener(
8415
8513
  "builder:component:stateChangeListenerActivated",
@@ -8486,7 +8584,9 @@ function EnableEditor(props) {
8486
8584
  }
8487
8585
  }
8488
8586
  createEffect3(on3(() => [onUpdateFn_3_props_locale()], onUpdateFn_3));
8489
- return <><builder_context_default.Provider value={props.builderContextSignal}><Show13 when={props.builderContextSignal.content}><Dynamic5
8587
+ return <><builder_context_default.Provider value={props.builderContextSignal}><Show13
8588
+ when={props.builderContextSignal.content || needsElementRefDivForEditing()}
8589
+ ><Dynamic5
8490
8590
  class={getWrapperClassName(
8491
8591
  props.content?.testVariationId || props.content?.id
8492
8592
  )}
@@ -8495,6 +8595,9 @@ function EnableEditor(props) {
8495
8595
  onClick={(event) => onClick(event)}
8496
8596
  builder-content-id={props.builderContextSignal.content?.id}
8497
8597
  builder-model={props.model}
8598
+ style={{
8599
+ display: !props.builderContextSignal.content && needsElementRefDivForEditing() ? "none" : void 0
8600
+ }}
8498
8601
  {...{}}
8499
8602
  {...showContentProps()}
8500
8603
  {...props.contentWrapperProps}
@@ -8575,13 +8678,7 @@ function ContentComponent(props) {
8575
8678
  const [registeredComponents, setRegisteredComponents] = createSignal18(
8576
8679
  [
8577
8680
  ...getDefaultRegisteredComponents(),
8578
- ...props.customComponents?.filter(({ models }) => {
8579
- if (!models?.length)
8580
- return true;
8581
- if (!props.model)
8582
- return true;
8583
- return models.includes(props.model);
8584
- }) || []
8681
+ ...props.customComponents || []
8585
8682
  ].reduce(
8586
8683
  (acc, { component, ...info }) => ({
8587
8684
  ...acc,
@@ -8611,13 +8708,7 @@ function ContentComponent(props) {
8611
8708
  apiVersion: props.apiVersion,
8612
8709
  componentInfos: [
8613
8710
  ...getDefaultRegisteredComponents(),
8614
- ...props.customComponents?.filter(({ models }) => {
8615
- if (!models?.length)
8616
- return true;
8617
- if (!props.model)
8618
- return true;
8619
- return models.includes(props.model);
8620
- }) || []
8711
+ ...props.customComponents || []
8621
8712
  ].reduce(
8622
8713
  (acc, { component: _, ...info }) => ({
8623
8714
  ...acc,
@@ -8628,7 +8719,8 @@ function ContentComponent(props) {
8628
8719
  inheritedStyles: {},
8629
8720
  BlocksWrapper: props.blocksWrapper || "div",
8630
8721
  BlocksWrapperProps: props.blocksWrapperProps || {},
8631
- nonce: props.nonce || ""
8722
+ nonce: props.nonce || "",
8723
+ model: props.model || ""
8632
8724
  });
8633
8725
  function contentSetState(newRootState) {
8634
8726
  setBuilderContextSignal((PREVIOUS_VALUE) => ({