@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/node/dev.js CHANGED
@@ -115,7 +115,8 @@ var builder_context_default = createContext({
115
115
  inheritedStyles: {},
116
116
  BlocksWrapper: "div",
117
117
  BlocksWrapperProps: {},
118
- nonce: ""
118
+ nonce: "",
119
+ model: ""
119
120
  });
120
121
  var components_context_default = createContext({ registeredComponents: {} });
121
122
 
@@ -583,6 +584,77 @@ function evaluate({
583
584
  }
584
585
  }
585
586
 
587
+ // src/functions/traverse.ts
588
+ function traverse(obj, callback, parent2 = null, key = null, visited = /* @__PURE__ */ new WeakSet()) {
589
+ if (obj == null || typeof obj !== "object") {
590
+ callback(obj, (newValue) => {
591
+ if (parent2 !== null && key !== null) {
592
+ parent2[key] = newValue;
593
+ }
594
+ });
595
+ return;
596
+ }
597
+ if (visited.has(obj)) {
598
+ return;
599
+ }
600
+ visited.add(obj);
601
+ if (Array.isArray(obj)) {
602
+ obj.forEach((item, index) => {
603
+ const update = (newValue) => {
604
+ obj[index] = newValue;
605
+ };
606
+ callback(item, update);
607
+ traverse(item, callback, obj, index, visited);
608
+ });
609
+ } else {
610
+ Object.entries(obj).forEach(([key2, value]) => {
611
+ const update = (newValue) => {
612
+ obj[key2] = newValue;
613
+ };
614
+ callback(value, update);
615
+ traverse(value, callback, obj, key2, visited);
616
+ });
617
+ }
618
+ }
619
+
620
+ // src/functions/extract-localized-values.ts
621
+ function isLocalizedField(value) {
622
+ return value && typeof value === "object" && value["@type"] === "@builder.io/core:LocalizedValue";
623
+ }
624
+ function containsLocalizedValues(data) {
625
+ if (!data || !Object.getOwnPropertyNames(data).length) {
626
+ return false;
627
+ }
628
+ let hasLocalizedValues = false;
629
+ traverse(data, (value) => {
630
+ if (isLocalizedField(value)) {
631
+ hasLocalizedValues = true;
632
+ return;
633
+ }
634
+ });
635
+ return hasLocalizedValues;
636
+ }
637
+ function extractLocalizedValues(data, locale) {
638
+ if (!data || !Object.getOwnPropertyNames(data).length) {
639
+ return {};
640
+ }
641
+ traverse(data, (value, update) => {
642
+ if (isLocalizedField(value)) {
643
+ update(value[locale] ?? void 0);
644
+ }
645
+ });
646
+ return data;
647
+ }
648
+ function resolveLocalizedValues(block, locale) {
649
+ if (block.component?.options && containsLocalizedValues(block.component?.options)) {
650
+ if (!locale) {
651
+ 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");
652
+ }
653
+ block.component.options = extractLocalizedValues(block.component.options, locale ?? "Default");
654
+ }
655
+ return block;
656
+ }
657
+
586
658
  // src/functions/transform-block.ts
587
659
  function transformBlock(block) {
588
660
  return block;
@@ -668,7 +740,8 @@ function getProcessedBlock({
668
740
  rootState,
669
741
  rootSetState
670
742
  }) {
671
- const transformedBlock = transformBlock(block);
743
+ let transformedBlock = resolveLocalizedValues(block, rootState.locale);
744
+ transformedBlock = transformBlock(transformedBlock);
672
745
  if (shouldEvaluateBindings) {
673
746
  return evaluateBindings({
674
747
  block: transformedBlock,
@@ -926,16 +999,24 @@ function mapStyleObjToStrIfNeeded(style) {
926
999
  }
927
1000
 
928
1001
  // src/components/block/block.helpers.ts
1002
+ var checkIsComponentRestricted = (component, model) => {
1003
+ if (!component)
1004
+ return true;
1005
+ if (!model)
1006
+ return false;
1007
+ return component.models && component.models.length > 0 && !component.models.includes(model);
1008
+ };
929
1009
  var getComponent = ({
930
1010
  block,
931
- registeredComponents
1011
+ registeredComponents,
1012
+ model
932
1013
  }) => {
933
1014
  const componentName = block.component?.name;
934
1015
  if (!componentName) {
935
1016
  return null;
936
1017
  }
937
1018
  const ref = registeredComponents[componentName];
938
- if (!ref) {
1019
+ if (!ref || checkIsComponentRestricted(ref, model)) {
939
1020
  console.warn(`
940
1021
  Could not find a registered component named "${componentName}".
941
1022
  If you registered it, is the file that registered it imported by the file that needs to render it?`);
@@ -989,11 +1070,15 @@ var provideLinkComponent = (block, linkComponent) => {
989
1070
  };
990
1071
  return {};
991
1072
  };
992
- var provideRegisteredComponents = (block, registeredComponents) => {
993
- if (block?.shouldReceiveBuilderProps?.builderComponents)
1073
+ var provideRegisteredComponents = (block, registeredComponents, model) => {
1074
+ if (block?.shouldReceiveBuilderProps?.builderComponents) {
1075
+ const filteredRegisteredComponents = Object.fromEntries(Object.entries(registeredComponents).filter(([_, component]) => {
1076
+ return !checkIsComponentRestricted(component, model);
1077
+ }));
994
1078
  return {
995
- builderComponents: registeredComponents
1079
+ builderComponents: filteredRegisteredComponents
996
1080
  };
1081
+ }
997
1082
  return {};
998
1083
  };
999
1084
  var provideBuilderBlock = (block, builderBlock) => {
@@ -1455,7 +1540,8 @@ function Block(props) {
1455
1540
  const blockComponent = createMemo(() => {
1456
1541
  return getComponent({
1457
1542
  block: processedBlock(),
1458
- registeredComponents: props.registeredComponents
1543
+ registeredComponents: props.registeredComponents,
1544
+ model: props.context.model
1459
1545
  });
1460
1546
  });
1461
1547
  const Tag = createMemo(() => {
@@ -1488,7 +1574,7 @@ function Block(props) {
1488
1574
  ...provideBuilderBlock(blockComponent(), processedBlock()),
1489
1575
  ...provideBuilderContext(blockComponent(), props.context),
1490
1576
  ...provideLinkComponent(blockComponent(), props.linkComponent),
1491
- ...provideRegisteredComponents(blockComponent(), props.registeredComponents)
1577
+ ...provideRegisteredComponents(blockComponent(), props.registeredComponents, props.context.model)
1492
1578
  },
1493
1579
  context: props.context,
1494
1580
  linkComponent: props.linkComponent,
@@ -2086,16 +2172,16 @@ function getSrcSet(url) {
2086
2172
  // src/blocks/image/image.tsx
2087
2173
  var _tmpl$5 = /* @__PURE__ */ template(`<source type=image/webp>`);
2088
2174
  var _tmpl$23 = /* @__PURE__ */ template(`<picture><img>`);
2089
- var _tmpl$32 = /* @__PURE__ */ template(`<div class="builder-image-sizer div-7e6ffddc">`);
2090
- var _tmpl$42 = /* @__PURE__ */ template(`<div class=div-7e6ffddc-2>`);
2091
- var _tmpl$52 = /* @__PURE__ */ template(`<style>.img-7e6ffddc {
2175
+ var _tmpl$32 = /* @__PURE__ */ template(`<div class="builder-image-sizer div-070d7e88">`);
2176
+ var _tmpl$42 = /* @__PURE__ */ template(`<div class=div-070d7e88-2>`);
2177
+ var _tmpl$52 = /* @__PURE__ */ template(`<style>.img-070d7e88 {
2092
2178
  opacity: 1;
2093
2179
  transition: opacity 0.2s ease-in-out;
2094
- }.div-7e6ffddc {
2180
+ }.div-070d7e88 {
2095
2181
  width: 100%;
2096
2182
  pointer-events: none;
2097
2183
  font-size: 0;
2098
- }.div-7e6ffddc-2 {
2184
+ }.div-070d7e88-2 {
2099
2185
  display: flex;
2100
2186
  flex-direction: column;
2101
2187
  align-items: stretch;
@@ -2111,7 +2197,7 @@ function Image(props) {
2111
2197
  const url = imageToUse;
2112
2198
  if (!url || // We can auto add srcset for cdn.builder.io and shopify
2113
2199
  // images, otherwise you can supply this prop manually
2114
- !(url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/))) {
2200
+ !(typeof url === "string" && (url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/)))) {
2115
2201
  return props.srcset;
2116
2202
  }
2117
2203
  if (props.noWebp) {
@@ -2160,7 +2246,7 @@ function Image(props) {
2160
2246
  }
2161
2247
  }), _el$3);
2162
2248
  effect((_p$) => {
2163
- const _v$ = "builder-image" + (props.className ? " " + props.className : "") + " img-7e6ffddc", _v$2 = props.highPriority ? "eager" : "lazy", _v$3 = props.highPriority ? "high" : "auto", _v$4 = props.altText, _v$5 = props.altText ? void 0 : "presentation", _v$6 = {
2249
+ const _v$ = "builder-image" + (props.className ? " " + props.className : "") + " img-070d7e88", _v$2 = props.highPriority ? "eager" : "lazy", _v$3 = props.highPriority ? "high" : "auto", _v$4 = props.altText, _v$5 = props.altText ? void 0 : "presentation", _v$6 = {
2164
2250
  "object-position": props.backgroundPosition || "center",
2165
2251
  "object-fit": props.backgroundSize || "cover",
2166
2252
  ...aspectRatioCss()
@@ -3026,6 +3112,10 @@ var componentInfo4 = {
3026
3112
  noWrap: true
3027
3113
  };
3028
3114
 
3115
+ // src/constants/file-types.ts
3116
+ 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"];
3117
+ 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"];
3118
+
3029
3119
  // src/blocks/image/component-info.ts
3030
3120
  var componentInfo5 = {
3031
3121
  name: "Image",
@@ -3042,7 +3132,7 @@ var componentInfo5 = {
3042
3132
  name: "image",
3043
3133
  type: "file",
3044
3134
  bubble: true,
3045
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "webp"],
3135
+ allowedFileTypes: IMAGE_FILE_TYPES,
3046
3136
  required: true,
3047
3137
  defaultValue: "https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F72c80f114dc149019051b6852a9e3b7a",
3048
3138
  onChange: (options) => {
@@ -4574,7 +4664,7 @@ var componentInfo18 = {
4574
4664
  name: "image",
4575
4665
  bubble: true,
4576
4666
  type: "file",
4577
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "gif", "webp"],
4667
+ allowedFileTypes: IMAGE_FILE_TYPES,
4578
4668
  required: true
4579
4669
  }],
4580
4670
  noWrap: true,
@@ -4618,14 +4708,14 @@ var componentInfo19 = {
4618
4708
  inputs: [{
4619
4709
  name: "video",
4620
4710
  type: "file",
4621
- allowedFileTypes: ["mp4"],
4711
+ allowedFileTypes: VIDEO_FILE_TYPES,
4622
4712
  bubble: true,
4623
4713
  defaultValue: "https://cdn.builder.io/o/assets%2FYJIGb4i01jvw0SRdL5Bt%2Fd27731a526464deba0016216f5f9e570%2Fcompressed?apiKey=YJIGb4i01jvw0SRdL5Bt&token=d27731a526464deba0016216f5f9e570&alt=media&optimized=true",
4624
4714
  required: true
4625
4715
  }, {
4626
4716
  name: "posterImage",
4627
4717
  type: "file",
4628
- allowedFileTypes: ["jpeg", "png"],
4718
+ allowedFileTypes: IMAGE_FILE_TYPES,
4629
4719
  helperText: "Image to show before the video plays"
4630
4720
  }, {
4631
4721
  name: "autoPlay",
@@ -4881,7 +4971,7 @@ var createRegisterComponentMessage = (info) => ({
4881
4971
  var serializeFn = (fnValue) => {
4882
4972
  const fnStr = fnValue.toString().trim();
4883
4973
  const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
4884
- const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("(") && !isArrowWithoutParens;
4974
+ const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
4885
4975
  return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
4886
4976
  };
4887
4977
  function serializeIncludingFunctions(info) {
@@ -4964,7 +5054,7 @@ function getPreviewContent(_searchParams) {
4964
5054
  }
4965
5055
 
4966
5056
  // src/constants/sdk-version.ts
4967
- var SDK_VERSION = "3.0.0";
5057
+ var SDK_VERSION = "3.0.1";
4968
5058
 
4969
5059
  // src/helpers/sdk-headers.ts
4970
5060
  var getSdkHeaders = () => ({
@@ -5682,6 +5772,12 @@ var subscribeToEditor = (model, callback, options) => {
5682
5772
  };
5683
5773
  };
5684
5774
 
5775
+ // src/components/content/components/enable-editor.helpers.ts
5776
+ var SDKS_USING_ELEMENT_REF_APPROACH = ["svelte", "qwik", "vue"];
5777
+ var needsElementRefDivForEditing = () => {
5778
+ return SDKS_USING_ELEMENT_REF_APPROACH.includes(TARGET) && (isEditing() || isPreviewing());
5779
+ };
5780
+
5685
5781
  // src/components/content/components/styles.helpers.ts
5686
5782
  var getCssFromFont = (font) => {
5687
5783
  const family = font.family + (font.kind && !font.kind.includes("#") ? ", " + font.kind : "");
@@ -5917,8 +6013,10 @@ function EnableEditor(props) {
5917
6013
  } : {}
5918
6014
  });
5919
6015
  Object.values(props.builderContextSignal.componentInfos).forEach((registeredComponent) => {
5920
- const message = createRegisterComponentMessage(registeredComponent);
5921
- window.parent?.postMessage(message, "*");
6016
+ if (!props.model || !registeredComponent.models?.length || registeredComponent.models.includes(props.model)) {
6017
+ const message = createRegisterComponentMessage(registeredComponent);
6018
+ window.parent?.postMessage(message, "*");
6019
+ }
5922
6020
  });
5923
6021
  window.addEventListener("builder:component:stateChangeListenerActivated", emitStateUpdate);
5924
6022
  }
@@ -5990,7 +6088,7 @@ function EnableEditor(props) {
5990
6088
  get children() {
5991
6089
  return createComponent(Show, {
5992
6090
  get when() {
5993
- return props.builderContextSignal.content;
6091
+ return props.builderContextSignal.content || needsElementRefDivForEditing();
5994
6092
  },
5995
6093
  get children() {
5996
6094
  return createComponent(Dynamic, mergeProps({
@@ -6008,6 +6106,11 @@ function EnableEditor(props) {
6008
6106
  },
6009
6107
  get ["builder-model"]() {
6010
6108
  return props.model;
6109
+ },
6110
+ get style() {
6111
+ return {
6112
+ display: !props.builderContextSignal.content && needsElementRefDivForEditing() ? "none" : void 0
6113
+ };
6011
6114
  }
6012
6115
  }, {}, showContentProps, () => props.contentWrapperProps, {
6013
6116
  get component() {
@@ -6090,15 +6193,7 @@ function ContentComponent(props) {
6090
6193
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain
6091
6194
  contentId: props.content?.id
6092
6195
  }));
6093
- const [registeredComponents, setRegisteredComponents] = createSignal([...getDefaultRegisteredComponents(), ...props.customComponents?.filter(({
6094
- models
6095
- }) => {
6096
- if (!models?.length)
6097
- return true;
6098
- if (!props.model)
6099
- return true;
6100
- return models.includes(props.model);
6101
- }) || []].reduce((acc, {
6196
+ const [registeredComponents, setRegisteredComponents] = createSignal([...getDefaultRegisteredComponents(), ...props.customComponents || []].reduce((acc, {
6102
6197
  component,
6103
6198
  ...info
6104
6199
  }) => ({
@@ -6124,15 +6219,7 @@ function ContentComponent(props) {
6124
6219
  canTrack: props.canTrack,
6125
6220
  apiKey: props.apiKey,
6126
6221
  apiVersion: props.apiVersion,
6127
- componentInfos: [...getDefaultRegisteredComponents(), ...props.customComponents?.filter(({
6128
- models
6129
- }) => {
6130
- if (!models?.length)
6131
- return true;
6132
- if (!props.model)
6133
- return true;
6134
- return models.includes(props.model);
6135
- }) || []].reduce((acc, {
6222
+ componentInfos: [...getDefaultRegisteredComponents(), ...props.customComponents || []].reduce((acc, {
6136
6223
  component: _,
6137
6224
  ...info
6138
6225
  }) => ({
@@ -6142,7 +6229,8 @@ function ContentComponent(props) {
6142
6229
  inheritedStyles: {},
6143
6230
  BlocksWrapper: props.blocksWrapper || "div",
6144
6231
  BlocksWrapperProps: props.blocksWrapperProps || {},
6145
- nonce: props.nonce || ""
6232
+ nonce: props.nonce || "",
6233
+ model: props.model || ""
6146
6234
  });
6147
6235
  function contentSetState(newRootState) {
6148
6236
  setBuilderContextSignal((PREVIOUS_VALUE) => ({