@builder.io/sdk-solid 2.0.31 → 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.js CHANGED
@@ -120,7 +120,8 @@ var builder_context_default = createContext({
120
120
  inheritedStyles: {},
121
121
  BlocksWrapper: "div",
122
122
  BlocksWrapperProps: {},
123
- nonce: ""
123
+ nonce: "",
124
+ model: ""
124
125
  });
125
126
  var components_context_default = createContext({ registeredComponents: {} });
126
127
 
@@ -3584,6 +3585,77 @@ function evaluate({
3584
3585
  }
3585
3586
  }
3586
3587
 
3588
+ // src/functions/traverse.ts
3589
+ function traverse(obj, callback, parent2 = null, key = null, visited = /* @__PURE__ */ new WeakSet()) {
3590
+ if (obj == null || typeof obj !== "object") {
3591
+ callback(obj, (newValue) => {
3592
+ if (parent2 !== null && key !== null) {
3593
+ parent2[key] = newValue;
3594
+ }
3595
+ });
3596
+ return;
3597
+ }
3598
+ if (visited.has(obj)) {
3599
+ return;
3600
+ }
3601
+ visited.add(obj);
3602
+ if (Array.isArray(obj)) {
3603
+ obj.forEach((item, index) => {
3604
+ const update = (newValue) => {
3605
+ obj[index] = newValue;
3606
+ };
3607
+ callback(item, update);
3608
+ traverse(item, callback, obj, index, visited);
3609
+ });
3610
+ } else {
3611
+ Object.entries(obj).forEach(([key2, value]) => {
3612
+ const update = (newValue) => {
3613
+ obj[key2] = newValue;
3614
+ };
3615
+ callback(value, update);
3616
+ traverse(value, callback, obj, key2, visited);
3617
+ });
3618
+ }
3619
+ }
3620
+
3621
+ // src/functions/extract-localized-values.ts
3622
+ function isLocalizedField(value) {
3623
+ return value && typeof value === "object" && value["@type"] === "@builder.io/core:LocalizedValue";
3624
+ }
3625
+ function containsLocalizedValues(data) {
3626
+ if (!data || !Object.getOwnPropertyNames(data).length) {
3627
+ return false;
3628
+ }
3629
+ let hasLocalizedValues = false;
3630
+ traverse(data, (value) => {
3631
+ if (isLocalizedField(value)) {
3632
+ hasLocalizedValues = true;
3633
+ return;
3634
+ }
3635
+ });
3636
+ return hasLocalizedValues;
3637
+ }
3638
+ function extractLocalizedValues(data, locale) {
3639
+ if (!data || !Object.getOwnPropertyNames(data).length) {
3640
+ return {};
3641
+ }
3642
+ traverse(data, (value, update) => {
3643
+ if (isLocalizedField(value)) {
3644
+ update(value[locale] ?? void 0);
3645
+ }
3646
+ });
3647
+ return data;
3648
+ }
3649
+ function resolveLocalizedValues(block, locale) {
3650
+ if (block.component?.options && containsLocalizedValues(block.component?.options)) {
3651
+ if (!locale) {
3652
+ 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");
3653
+ }
3654
+ block.component.options = extractLocalizedValues(block.component.options, locale ?? "Default");
3655
+ }
3656
+ return block;
3657
+ }
3658
+
3587
3659
  // src/functions/fast-clone.ts
3588
3660
  var fastClone = (obj) => JSON.parse(JSON.stringify(obj));
3589
3661
 
@@ -3682,7 +3754,8 @@ function getProcessedBlock({
3682
3754
  rootState,
3683
3755
  rootSetState
3684
3756
  }) {
3685
- const transformedBlock = transformBlock(block);
3757
+ let transformedBlock = resolveLocalizedValues(block, rootState.locale);
3758
+ transformedBlock = transformBlock(transformedBlock);
3686
3759
  if (shouldEvaluateBindings) {
3687
3760
  return evaluateBindings({
3688
3761
  block: transformedBlock,
@@ -3940,16 +4013,24 @@ function mapStyleObjToStrIfNeeded(style) {
3940
4013
  }
3941
4014
 
3942
4015
  // src/components/block/block.helpers.ts
4016
+ var checkIsComponentRestricted = (component, model) => {
4017
+ if (!component)
4018
+ return true;
4019
+ if (!model)
4020
+ return false;
4021
+ return component.models && component.models.length > 0 && !component.models.includes(model);
4022
+ };
3943
4023
  var getComponent = ({
3944
4024
  block,
3945
- registeredComponents
4025
+ registeredComponents,
4026
+ model
3946
4027
  }) => {
3947
4028
  const componentName = block.component?.name;
3948
4029
  if (!componentName) {
3949
4030
  return null;
3950
4031
  }
3951
4032
  const ref = registeredComponents[componentName];
3952
- if (!ref) {
4033
+ if (!ref || checkIsComponentRestricted(ref, model)) {
3953
4034
  console.warn(`
3954
4035
  Could not find a registered component named "${componentName}".
3955
4036
  If you registered it, is the file that registered it imported by the file that needs to render it?`);
@@ -4003,11 +4084,15 @@ var provideLinkComponent = (block, linkComponent) => {
4003
4084
  };
4004
4085
  return {};
4005
4086
  };
4006
- var provideRegisteredComponents = (block, registeredComponents) => {
4007
- if (block?.shouldReceiveBuilderProps?.builderComponents)
4087
+ var provideRegisteredComponents = (block, registeredComponents, model) => {
4088
+ if (block?.shouldReceiveBuilderProps?.builderComponents) {
4089
+ const filteredRegisteredComponents = Object.fromEntries(Object.entries(registeredComponents).filter(([_, component]) => {
4090
+ return !checkIsComponentRestricted(component, model);
4091
+ }));
4008
4092
  return {
4009
- builderComponents: registeredComponents
4093
+ builderComponents: filteredRegisteredComponents
4010
4094
  };
4095
+ }
4011
4096
  return {};
4012
4097
  };
4013
4098
  var provideBuilderBlock = (block, builderBlock) => {
@@ -4469,7 +4554,8 @@ function Block(props) {
4469
4554
  const blockComponent = createMemo(() => {
4470
4555
  return getComponent({
4471
4556
  block: processedBlock(),
4472
- registeredComponents: props.registeredComponents
4557
+ registeredComponents: props.registeredComponents,
4558
+ model: props.context.model
4473
4559
  });
4474
4560
  });
4475
4561
  const Tag = createMemo(() => {
@@ -4502,7 +4588,7 @@ function Block(props) {
4502
4588
  ...provideBuilderBlock(blockComponent(), processedBlock()),
4503
4589
  ...provideBuilderContext(blockComponent(), props.context),
4504
4590
  ...provideLinkComponent(blockComponent(), props.linkComponent),
4505
- ...provideRegisteredComponents(blockComponent(), props.registeredComponents)
4591
+ ...provideRegisteredComponents(blockComponent(), props.registeredComponents, props.context.model)
4506
4592
  },
4507
4593
  context: props.context,
4508
4594
  linkComponent: props.linkComponent,
@@ -5100,16 +5186,16 @@ function getSrcSet(url) {
5100
5186
  // src/blocks/image/image.tsx
5101
5187
  var _tmpl$5 = /* @__PURE__ */ template(`<source type=image/webp>`);
5102
5188
  var _tmpl$23 = /* @__PURE__ */ template(`<picture><img>`);
5103
- var _tmpl$32 = /* @__PURE__ */ template(`<div class="builder-image-sizer div-7e6ffddc">`);
5104
- var _tmpl$42 = /* @__PURE__ */ template(`<div class=div-7e6ffddc-2>`);
5105
- var _tmpl$52 = /* @__PURE__ */ template(`<style>.img-7e6ffddc {
5189
+ var _tmpl$32 = /* @__PURE__ */ template(`<div class="builder-image-sizer div-070d7e88">`);
5190
+ var _tmpl$42 = /* @__PURE__ */ template(`<div class=div-070d7e88-2>`);
5191
+ var _tmpl$52 = /* @__PURE__ */ template(`<style>.img-070d7e88 {
5106
5192
  opacity: 1;
5107
5193
  transition: opacity 0.2s ease-in-out;
5108
- }.div-7e6ffddc {
5194
+ }.div-070d7e88 {
5109
5195
  width: 100%;
5110
5196
  pointer-events: none;
5111
5197
  font-size: 0;
5112
- }.div-7e6ffddc-2 {
5198
+ }.div-070d7e88-2 {
5113
5199
  display: flex;
5114
5200
  flex-direction: column;
5115
5201
  align-items: stretch;
@@ -5125,7 +5211,7 @@ function Image(props) {
5125
5211
  const url = imageToUse;
5126
5212
  if (!url || // We can auto add srcset for cdn.builder.io and shopify
5127
5213
  // images, otherwise you can supply this prop manually
5128
- !(url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/))) {
5214
+ !(typeof url === "string" && (url.match(/builder\.io/) || url.match(/cdn\.shopify\.com/)))) {
5129
5215
  return props.srcset;
5130
5216
  }
5131
5217
  if (props.noWebp) {
@@ -5174,7 +5260,7 @@ function Image(props) {
5174
5260
  }
5175
5261
  }), _el$3);
5176
5262
  effect((_p$) => {
5177
- 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 = {
5263
+ 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 = {
5178
5264
  "object-position": props.backgroundPosition || "center",
5179
5265
  "object-fit": props.backgroundSize || "cover",
5180
5266
  ...aspectRatioCss()
@@ -6040,6 +6126,10 @@ var componentInfo4 = {
6040
6126
  noWrap: true
6041
6127
  };
6042
6128
 
6129
+ // src/constants/file-types.ts
6130
+ 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"];
6131
+ 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"];
6132
+
6043
6133
  // src/blocks/image/component-info.ts
6044
6134
  var componentInfo5 = {
6045
6135
  name: "Image",
@@ -6056,7 +6146,7 @@ var componentInfo5 = {
6056
6146
  name: "image",
6057
6147
  type: "file",
6058
6148
  bubble: true,
6059
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "webp"],
6149
+ allowedFileTypes: IMAGE_FILE_TYPES,
6060
6150
  required: true,
6061
6151
  defaultValue: "https://cdn.builder.io/api/v1/image/assets%2FYJIGb4i01jvw0SRdL5Bt%2F72c80f114dc149019051b6852a9e3b7a",
6062
6152
  onChange: (options) => {
@@ -7588,7 +7678,7 @@ var componentInfo18 = {
7588
7678
  name: "image",
7589
7679
  bubble: true,
7590
7680
  type: "file",
7591
- allowedFileTypes: ["jpeg", "jpg", "png", "svg", "gif", "webp"],
7681
+ allowedFileTypes: IMAGE_FILE_TYPES,
7592
7682
  required: true
7593
7683
  }],
7594
7684
  noWrap: true,
@@ -7632,14 +7722,14 @@ var componentInfo19 = {
7632
7722
  inputs: [{
7633
7723
  name: "video",
7634
7724
  type: "file",
7635
- allowedFileTypes: ["mp4"],
7725
+ allowedFileTypes: VIDEO_FILE_TYPES,
7636
7726
  bubble: true,
7637
7727
  defaultValue: "https://cdn.builder.io/o/assets%2FYJIGb4i01jvw0SRdL5Bt%2Fd27731a526464deba0016216f5f9e570%2Fcompressed?apiKey=YJIGb4i01jvw0SRdL5Bt&token=d27731a526464deba0016216f5f9e570&alt=media&optimized=true",
7638
7728
  required: true
7639
7729
  }, {
7640
7730
  name: "posterImage",
7641
7731
  type: "file",
7642
- allowedFileTypes: ["jpeg", "png"],
7732
+ allowedFileTypes: IMAGE_FILE_TYPES,
7643
7733
  helperText: "Image to show before the video plays"
7644
7734
  }, {
7645
7735
  name: "autoPlay",
@@ -7895,7 +7985,7 @@ var createRegisterComponentMessage = (info) => ({
7895
7985
  var serializeFn = (fnValue) => {
7896
7986
  const fnStr = fnValue.toString().trim();
7897
7987
  const isArrowWithoutParens = /^[a-zA-Z0-9_]+\s*=>/i.test(fnStr);
7898
- const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("(") && !isArrowWithoutParens;
7988
+ const appendFunction = !fnStr.startsWith("function") && !fnStr.startsWith("async") && !fnStr.startsWith("(") && !isArrowWithoutParens;
7899
7989
  return `return (${appendFunction ? "function " : ""}${fnStr}).apply(this, arguments)`;
7900
7990
  };
7901
7991
  function serializeIncludingFunctions(info) {
@@ -7978,7 +8068,7 @@ function getPreviewContent(_searchParams) {
7978
8068
  }
7979
8069
 
7980
8070
  // src/constants/sdk-version.ts
7981
- var SDK_VERSION = "2.0.31";
8071
+ var SDK_VERSION = "3.0.1";
7982
8072
 
7983
8073
  // src/helpers/sdk-headers.ts
7984
8074
  var getSdkHeaders = () => ({
@@ -8219,22 +8309,17 @@ var _processContentResult = async (options, content, url = generateContentUrl(op
8219
8309
  return content.results;
8220
8310
  };
8221
8311
  async function fetchEntries(options) {
8222
- try {
8223
- const url = generateContentUrl(options);
8224
- const content = await _fetchContent(options);
8225
- if (!checkContentHasResults(content)) {
8226
- logger.error("Error fetching data. ", {
8227
- url,
8228
- content,
8229
- options
8230
- });
8231
- return null;
8232
- }
8233
- return _processContentResult(options, content);
8234
- } catch (error) {
8235
- logger.error("Error fetching data. ", error);
8236
- return null;
8312
+ const url = generateContentUrl(options);
8313
+ const content = await _fetchContent(options);
8314
+ if (!checkContentHasResults(content)) {
8315
+ logger.error("Error fetching data. ", {
8316
+ url,
8317
+ content,
8318
+ options
8319
+ });
8320
+ throw content;
8237
8321
  }
8322
+ return _processContentResult(options, content);
8238
8323
  }
8239
8324
 
8240
8325
  // src/functions/is-previewing.ts
@@ -8701,6 +8786,12 @@ var subscribeToEditor = (model, callback, options) => {
8701
8786
  };
8702
8787
  };
8703
8788
 
8789
+ // src/components/content/components/enable-editor.helpers.ts
8790
+ var SDKS_USING_ELEMENT_REF_APPROACH = ["svelte", "qwik", "vue"];
8791
+ var needsElementRefDivForEditing = () => {
8792
+ return SDKS_USING_ELEMENT_REF_APPROACH.includes(TARGET) && (isEditing() || isPreviewing());
8793
+ };
8794
+
8704
8795
  // src/components/content/components/styles.helpers.ts
8705
8796
  var getCssFromFont = (font) => {
8706
8797
  const family = font.family + (font.kind && !font.kind.includes("#") ? ", " + font.kind : "");
@@ -8936,8 +9027,10 @@ function EnableEditor(props) {
8936
9027
  } : {}
8937
9028
  });
8938
9029
  Object.values(props.builderContextSignal.componentInfos).forEach((registeredComponent) => {
8939
- const message = createRegisterComponentMessage(registeredComponent);
8940
- window.parent?.postMessage(message, "*");
9030
+ if (!props.model || !registeredComponent.models?.length || registeredComponent.models.includes(props.model)) {
9031
+ const message = createRegisterComponentMessage(registeredComponent);
9032
+ window.parent?.postMessage(message, "*");
9033
+ }
8941
9034
  });
8942
9035
  window.addEventListener("builder:component:stateChangeListenerActivated", emitStateUpdate);
8943
9036
  }
@@ -9009,7 +9102,7 @@ function EnableEditor(props) {
9009
9102
  get children() {
9010
9103
  return createComponent(Show, {
9011
9104
  get when() {
9012
- return props.builderContextSignal.content;
9105
+ return props.builderContextSignal.content || needsElementRefDivForEditing();
9013
9106
  },
9014
9107
  get children() {
9015
9108
  return createComponent(Dynamic, mergeProps({
@@ -9027,6 +9120,11 @@ function EnableEditor(props) {
9027
9120
  },
9028
9121
  get ["builder-model"]() {
9029
9122
  return props.model;
9123
+ },
9124
+ get style() {
9125
+ return {
9126
+ display: !props.builderContextSignal.content && needsElementRefDivForEditing() ? "none" : void 0
9127
+ };
9030
9128
  }
9031
9129
  }, {}, showContentProps, () => props.contentWrapperProps, {
9032
9130
  get component() {
@@ -9109,15 +9207,7 @@ function ContentComponent(props) {
9109
9207
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain
9110
9208
  contentId: props.content?.id
9111
9209
  }));
9112
- const [registeredComponents, setRegisteredComponents] = createSignal([...getDefaultRegisteredComponents(), ...props.customComponents?.filter(({
9113
- models
9114
- }) => {
9115
- if (!models?.length)
9116
- return true;
9117
- if (!props.model)
9118
- return true;
9119
- return models.includes(props.model);
9120
- }) || []].reduce((acc, {
9210
+ const [registeredComponents, setRegisteredComponents] = createSignal([...getDefaultRegisteredComponents(), ...props.customComponents || []].reduce((acc, {
9121
9211
  component,
9122
9212
  ...info
9123
9213
  }) => ({
@@ -9143,15 +9233,7 @@ function ContentComponent(props) {
9143
9233
  canTrack: props.canTrack,
9144
9234
  apiKey: props.apiKey,
9145
9235
  apiVersion: props.apiVersion,
9146
- componentInfos: [...getDefaultRegisteredComponents(), ...props.customComponents?.filter(({
9147
- models
9148
- }) => {
9149
- if (!models?.length)
9150
- return true;
9151
- if (!props.model)
9152
- return true;
9153
- return models.includes(props.model);
9154
- }) || []].reduce((acc, {
9236
+ componentInfos: [...getDefaultRegisteredComponents(), ...props.customComponents || []].reduce((acc, {
9155
9237
  component: _,
9156
9238
  ...info
9157
9239
  }) => ({
@@ -9161,7 +9243,8 @@ function ContentComponent(props) {
9161
9243
  inheritedStyles: {},
9162
9244
  BlocksWrapper: props.blocksWrapper || "div",
9163
9245
  BlocksWrapperProps: props.blocksWrapperProps || {},
9164
- nonce: props.nonce || ""
9246
+ nonce: props.nonce || "",
9247
+ model: props.model || ""
9165
9248
  });
9166
9249
  function contentSetState(newRootState) {
9167
9250
  setBuilderContextSignal((PREVIOUS_VALUE) => ({