@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.
package/lib/edge/dev.jsx CHANGED
@@ -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
@@ -3579,6 +3580,77 @@ function evaluate({
3579
3580
  }
3580
3581
  }
3581
3582
 
3583
+ // src/functions/traverse.ts
3584
+ function traverse(obj, callback, parent2 = null, key = null, visited = /* @__PURE__ */ new WeakSet()) {
3585
+ if (obj == null || typeof obj !== "object") {
3586
+ callback(obj, (newValue) => {
3587
+ if (parent2 !== null && key !== null) {
3588
+ parent2[key] = newValue;
3589
+ }
3590
+ });
3591
+ return;
3592
+ }
3593
+ if (visited.has(obj)) {
3594
+ return;
3595
+ }
3596
+ visited.add(obj);
3597
+ if (Array.isArray(obj)) {
3598
+ obj.forEach((item, index) => {
3599
+ const update = (newValue) => {
3600
+ obj[index] = newValue;
3601
+ };
3602
+ callback(item, update);
3603
+ traverse(item, callback, obj, index, visited);
3604
+ });
3605
+ } else {
3606
+ Object.entries(obj).forEach(([key2, value]) => {
3607
+ const update = (newValue) => {
3608
+ obj[key2] = newValue;
3609
+ };
3610
+ callback(value, update);
3611
+ traverse(value, callback, obj, key2, visited);
3612
+ });
3613
+ }
3614
+ }
3615
+
3616
+ // src/functions/extract-localized-values.ts
3617
+ function isLocalizedField(value) {
3618
+ return value && typeof value === "object" && value["@type"] === "@builder.io/core:LocalizedValue";
3619
+ }
3620
+ function containsLocalizedValues(data) {
3621
+ if (!data || !Object.getOwnPropertyNames(data).length) {
3622
+ return false;
3623
+ }
3624
+ let hasLocalizedValues = false;
3625
+ traverse(data, (value) => {
3626
+ if (isLocalizedField(value)) {
3627
+ hasLocalizedValues = true;
3628
+ return;
3629
+ }
3630
+ });
3631
+ return hasLocalizedValues;
3632
+ }
3633
+ function extractLocalizedValues(data, locale) {
3634
+ if (!data || !Object.getOwnPropertyNames(data).length) {
3635
+ return {};
3636
+ }
3637
+ traverse(data, (value, update) => {
3638
+ if (isLocalizedField(value)) {
3639
+ update(value[locale] ?? void 0);
3640
+ }
3641
+ });
3642
+ return data;
3643
+ }
3644
+ function resolveLocalizedValues(block, locale) {
3645
+ if (block.component?.options && containsLocalizedValues(block.component?.options)) {
3646
+ if (!locale) {
3647
+ console.warn("[Builder.io] In order to use localized fields in Builder, you must pass a locale prop to the BuilderComponent or to options object while fetching the content to resolve localized fields. Learn more: https://www.builder.io/c/docs/localization-inline#targeting-and-inline-localization");
3648
+ }
3649
+ block.component.options = extractLocalizedValues(block.component.options, locale ?? "Default");
3650
+ }
3651
+ return block;
3652
+ }
3653
+
3582
3654
  // src/functions/fast-clone.ts
3583
3655
  var fastClone = (obj) => JSON.parse(JSON.stringify(obj));
3584
3656
 
@@ -3677,7 +3749,8 @@ function getProcessedBlock({
3677
3749
  rootState,
3678
3750
  rootSetState
3679
3751
  }) {
3680
- const transformedBlock = transformBlock(block);
3752
+ let transformedBlock = resolveLocalizedValues(block, rootState.locale);
3753
+ transformedBlock = transformBlock(transformedBlock);
3681
3754
  if (shouldEvaluateBindings) {
3682
3755
  return evaluateBindings({
3683
3756
  block: transformedBlock,
@@ -3935,16 +4008,24 @@ function mapStyleObjToStrIfNeeded(style) {
3935
4008
  }
3936
4009
 
3937
4010
  // src/components/block/block.helpers.ts
4011
+ var checkIsComponentRestricted = (component, model) => {
4012
+ if (!component)
4013
+ return true;
4014
+ if (!model)
4015
+ return false;
4016
+ return component.models && component.models.length > 0 && !component.models.includes(model);
4017
+ };
3938
4018
  var getComponent = ({
3939
4019
  block,
3940
- registeredComponents
4020
+ registeredComponents,
4021
+ model
3941
4022
  }) => {
3942
4023
  const componentName = block.component?.name;
3943
4024
  if (!componentName) {
3944
4025
  return null;
3945
4026
  }
3946
4027
  const ref = registeredComponents[componentName];
3947
- if (!ref) {
4028
+ if (!ref || checkIsComponentRestricted(ref, model)) {
3948
4029
  console.warn(`
3949
4030
  Could not find a registered component named "${componentName}".
3950
4031
  If you registered it, is the file that registered it imported by the file that needs to render it?`);
@@ -3998,11 +4079,15 @@ var provideLinkComponent = (block, linkComponent) => {
3998
4079
  };
3999
4080
  return {};
4000
4081
  };
4001
- var provideRegisteredComponents = (block, registeredComponents) => {
4002
- if (block?.shouldReceiveBuilderProps?.builderComponents)
4082
+ var provideRegisteredComponents = (block, registeredComponents, model) => {
4083
+ if (block?.shouldReceiveBuilderProps?.builderComponents) {
4084
+ const filteredRegisteredComponents = Object.fromEntries(Object.entries(registeredComponents).filter(([_, component]) => {
4085
+ return !checkIsComponentRestricted(component, model);
4086
+ }));
4003
4087
  return {
4004
- builderComponents: registeredComponents
4088
+ builderComponents: filteredRegisteredComponents
4005
4089
  };
4090
+ }
4006
4091
  return {};
4007
4092
  };
4008
4093
  var provideBuilderBlock = (block, builderBlock) => {
@@ -4406,7 +4491,8 @@ function Block(props) {
4406
4491
  const blockComponent = createMemo5(() => {
4407
4492
  return getComponent({
4408
4493
  block: processedBlock(),
4409
- registeredComponents: props.registeredComponents
4494
+ registeredComponents: props.registeredComponents,
4495
+ model: props.context.model
4410
4496
  });
4411
4497
  });
4412
4498
  const Tag = createMemo5(() => {
@@ -4441,7 +4527,8 @@ function Block(props) {
4441
4527
  ...provideLinkComponent(blockComponent(), props.linkComponent),
4442
4528
  ...provideRegisteredComponents(
4443
4529
  blockComponent(),
4444
- props.registeredComponents
4530
+ props.registeredComponents,
4531
+ props.context.model
4445
4532
  )
4446
4533
  },
4447
4534
  context: props.context,
@@ -4865,7 +4952,7 @@ function Image(props) {
4865
4952
  const url = imageToUse;
4866
4953
  if (!url || // We can auto add srcset for cdn.builder.io and shopify
4867
4954
  // images, otherwise you can supply this prop manually
4868
- !(url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/))) {
4955
+ !(typeof url === "string" && (url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/)))) {
4869
4956
  return props.srcset;
4870
4957
  }
4871
4958
  if (props.noWebp) {
@@ -4906,7 +4993,7 @@ function Image(props) {
4906
4993
  <picture>
4907
4994
  <Show8 when={webpSrcSet()}><source type="image/webp" srcset={webpSrcSet()} /></Show8>
4908
4995
  <img
4909
- class={"builder-image" + (props.className ? " " + props.className : "") + " img-7e6ffddc"}
4996
+ class={"builder-image" + (props.className ? " " + props.className : "") + " img-070d7e88"}
4910
4997
  loading={props.highPriority ? "eager" : "lazy"}
4911
4998
  fetchpriority={props.highPriority ? "high" : "auto"}
4912
4999
  alt={props.altText}
@@ -4924,22 +5011,22 @@ function Image(props) {
4924
5011
  <Show8
4925
5012
  when={props.aspectRatio && !(props.builderBlock?.children?.length && props.fitContent)}
4926
5013
  ><div
4927
- class="builder-image-sizer div-7e6ffddc"
5014
+ class="builder-image-sizer div-070d7e88"
4928
5015
  style={{
4929
5016
  "padding-top": props.aspectRatio * 100 + "%"
4930
5017
  }}
4931
5018
  /></Show8>
4932
5019
  <Show8 when={props.builderBlock?.children?.length && props.fitContent}>{props.children}</Show8>
4933
- <Show8 when={!props.fitContent && props.builderBlock?.children?.length}><div class="div-7e6ffddc-2">{props.children}</div></Show8>
5020
+ <Show8 when={!props.fitContent && props.builderBlock?.children?.length}><div class="div-070d7e88-2">{props.children}</div></Show8>
4934
5021
  </>
4935
- <style>{`.img-7e6ffddc {
5022
+ <style>{`.img-070d7e88 {
4936
5023
  opacity: 1;
4937
5024
  transition: opacity 0.2s ease-in-out;
4938
- }.div-7e6ffddc {
5025
+ }.div-070d7e88 {
4939
5026
  width: 100%;
4940
5027
  pointer-events: none;
4941
5028
  font-size: 0;
4942
- }.div-7e6ffddc-2 {
5029
+ }.div-070d7e88-2 {
4943
5030
  display: flex;
4944
5031
  flex-direction: column;
4945
5032
  align-items: stretch;
@@ -5732,6 +5819,10 @@ var componentInfo4 = {
5732
5819
  noWrap: true
5733
5820
  };
5734
5821
 
5822
+ // src/constants/file-types.ts
5823
+ 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"];
5824
+ 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"];
5825
+
5735
5826
  // src/blocks/image/component-info.ts
5736
5827
  var componentInfo5 = {
5737
5828
  name: "Image",
@@ -5748,7 +5839,7 @@ var componentInfo5 = {
5748
5839
  name: "image",
5749
5840
  type: "file",
5750
5841
  bubble: true,
5751
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "webp"],
5842
+ allowedFileTypes: IMAGE_FILE_TYPES,
5752
5843
  required: true,
5753
5844
  defaultValue: "https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F72c80f114dc149019051b6852a9e3b7a",
5754
5845
  onChange: (options) => {
@@ -7108,7 +7199,7 @@ var componentInfo18 = {
7108
7199
  name: "image",
7109
7200
  bubble: true,
7110
7201
  type: "file",
7111
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "gif", "webp"],
7202
+ allowedFileTypes: IMAGE_FILE_TYPES,
7112
7203
  required: true
7113
7204
  }],
7114
7205
  noWrap: true,
@@ -7143,14 +7234,14 @@ var componentInfo19 = {
7143
7234
  inputs: [{
7144
7235
  name: "video",
7145
7236
  type: "file",
7146
- allowedFileTypes: ["mp4"],
7237
+ allowedFileTypes: VIDEO_FILE_TYPES,
7147
7238
  bubble: true,
7148
7239
  defaultValue: "https://cdn.builder.io/o/assets%2FYJIGb4i01jvw0SRdL5Bt%2Fd27731a526464deba0016216f5f9e570%2Fcompressed?apiKey=YJIGb4i01jvw0SRdL5Bt&token=d27731a526464deba0016216f5f9e570&alt=media&optimized=true",
7149
7240
  required: true
7150
7241
  }, {
7151
7242
  name: "posterImage",
7152
7243
  type: "file",
7153
- allowedFileTypes: ["jpeg", "png"],
7244
+ allowedFileTypes: IMAGE_FILE_TYPES,
7154
7245
  helperText: "Image to show before the video plays"
7155
7246
  }, {
7156
7247
  name: "autoPlay",
@@ -7376,7 +7467,7 @@ var createRegisterComponentMessage = (info) => ({
7376
7467
  var serializeFn = (fnValue) => {
7377
7468
  const fnStr = fnValue.toString().trim();
7378
7469
  const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
7379
- const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("(") && !isArrowWithoutParens;
7470
+ const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
7380
7471
  return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
7381
7472
  };
7382
7473
  function serializeIncludingFunctions(info) {
@@ -7461,7 +7552,7 @@ function getPreviewContent(_searchParams) {
7461
7552
  }
7462
7553
 
7463
7554
  // src/constants/sdk-version.ts
7464
- var SDK_VERSION = "3.0.0";
7555
+ var SDK_VERSION = "3.0.1";
7465
7556
 
7466
7557
  // src/helpers/sdk-headers.ts
7467
7558
  var getSdkHeaders = () => ({
@@ -8179,6 +8270,12 @@ var subscribeToEditor = (model, callback, options) => {
8179
8270
  };
8180
8271
  };
8181
8272
 
8273
+ // src/components/content/components/enable-editor.helpers.ts
8274
+ var SDKS_USING_ELEMENT_REF_APPROACH = ["svelte", "qwik", "vue"];
8275
+ var needsElementRefDivForEditing = () => {
8276
+ return SDKS_USING_ELEMENT_REF_APPROACH.includes(TARGET) && (isEditing() || isPreviewing());
8277
+ };
8278
+
8182
8279
  // src/components/content/components/styles.helpers.ts
8183
8280
  var getCssFromFont = (font) => {
8184
8281
  const family = font.family + (font.kind && !font.kind.includes("#") ? ", " + font.kind : "");
@@ -8425,8 +8522,10 @@ function EnableEditor(props) {
8425
8522
  Object.values(
8426
8523
  props.builderContextSignal.componentInfos
8427
8524
  ).forEach((registeredComponent) => {
8428
- const message = createRegisterComponentMessage(registeredComponent);
8429
- window.parent?.postMessage(message, "*");
8525
+ if (!props.model || !registeredComponent.models?.length || registeredComponent.models.includes(props.model)) {
8526
+ const message = createRegisterComponentMessage(registeredComponent);
8527
+ window.parent?.postMessage(message, "*");
8528
+ }
8430
8529
  });
8431
8530
  window.addEventListener(
8432
8531
  "builder:component:stateChangeListenerActivated",
@@ -8503,7 +8602,9 @@ function EnableEditor(props) {
8503
8602
  }
8504
8603
  }
8505
8604
  createEffect3(on3(() => [onUpdateFn_3_props_locale()], onUpdateFn_3));
8506
- return <><builder_context_default.Provider value={props.builderContextSignal}><Show13 when={props.builderContextSignal.content}><Dynamic5
8605
+ return <><builder_context_default.Provider value={props.builderContextSignal}><Show13
8606
+ when={props.builderContextSignal.content || needsElementRefDivForEditing()}
8607
+ ><Dynamic5
8507
8608
  class={getWrapperClassName(
8508
8609
  props.content?.testVariationId || props.content?.id
8509
8610
  )}
@@ -8512,6 +8613,9 @@ function EnableEditor(props) {
8512
8613
  onClick={(event) => onClick(event)}
8513
8614
  builder-content-id={props.builderContextSignal.content?.id}
8514
8615
  builder-model={props.model}
8616
+ style={{
8617
+ display: !props.builderContextSignal.content && needsElementRefDivForEditing() ? "none" : void 0
8618
+ }}
8515
8619
  {...{}}
8516
8620
  {...showContentProps()}
8517
8621
  {...props.contentWrapperProps}
@@ -8592,13 +8696,7 @@ function ContentComponent(props) {
8592
8696
  const [registeredComponents, setRegisteredComponents] = createSignal18(
8593
8697
  [
8594
8698
  ...getDefaultRegisteredComponents(),
8595
- ...props.customComponents?.filter(({ models }) => {
8596
- if (!models?.length)
8597
- return true;
8598
- if (!props.model)
8599
- return true;
8600
- return models.includes(props.model);
8601
- }) || []
8699
+ ...props.customComponents || []
8602
8700
  ].reduce(
8603
8701
  (acc, { component, ...info }) => ({
8604
8702
  ...acc,
@@ -8628,13 +8726,7 @@ function ContentComponent(props) {
8628
8726
  apiVersion: props.apiVersion,
8629
8727
  componentInfos: [
8630
8728
  ...getDefaultRegisteredComponents(),
8631
- ...props.customComponents?.filter(({ models }) => {
8632
- if (!models?.length)
8633
- return true;
8634
- if (!props.model)
8635
- return true;
8636
- return models.includes(props.model);
8637
- }) || []
8729
+ ...props.customComponents || []
8638
8730
  ].reduce(
8639
8731
  (acc, { component: _, ...info }) => ({
8640
8732
  ...acc,
@@ -8645,7 +8737,8 @@ function ContentComponent(props) {
8645
8737
  inheritedStyles: {},
8646
8738
  BlocksWrapper: props.blocksWrapper || "div",
8647
8739
  BlocksWrapperProps: props.blocksWrapperProps || {},
8648
- nonce: props.nonce || ""
8740
+ nonce: props.nonce || "",
8741
+ model: props.model || ""
8649
8742
  });
8650
8743
  function contentSetState(newRootState) {
8651
8744
  setBuilderContextSignal((PREVIOUS_VALUE) => ({