@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.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 = "3.0.0";
8071
+ var SDK_VERSION = "3.0.1";
7982
8072
 
7983
8073
  // src/helpers/sdk-headers.ts
7984
8074
  var getSdkHeaders = () => ({
@@ -8696,6 +8786,12 @@ var subscribeToEditor = (model, callback, options) => {
8696
8786
  };
8697
8787
  };
8698
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
+
8699
8795
  // src/components/content/components/styles.helpers.ts
8700
8796
  var getCssFromFont = (font) => {
8701
8797
  const family = font.family + (font.kind && !font.kind.includes("#") ? ", " + font.kind : "");
@@ -8931,8 +9027,10 @@ function EnableEditor(props) {
8931
9027
  } : {}
8932
9028
  });
8933
9029
  Object.values(props.builderContextSignal.componentInfos).forEach((registeredComponent) => {
8934
- const message = createRegisterComponentMessage(registeredComponent);
8935
- 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
+ }
8936
9034
  });
8937
9035
  window.addEventListener("builder:component:stateChangeListenerActivated", emitStateUpdate);
8938
9036
  }
@@ -9004,7 +9102,7 @@ function EnableEditor(props) {
9004
9102
  get children() {
9005
9103
  return createComponent(Show, {
9006
9104
  get when() {
9007
- return props.builderContextSignal.content;
9105
+ return props.builderContextSignal.content || needsElementRefDivForEditing();
9008
9106
  },
9009
9107
  get children() {
9010
9108
  return createComponent(Dynamic, mergeProps({
@@ -9022,6 +9120,11 @@ function EnableEditor(props) {
9022
9120
  },
9023
9121
  get ["builder-model"]() {
9024
9122
  return props.model;
9123
+ },
9124
+ get style() {
9125
+ return {
9126
+ display: !props.builderContextSignal.content && needsElementRefDivForEditing() ? "none" : void 0
9127
+ };
9025
9128
  }
9026
9129
  }, {}, showContentProps, () => props.contentWrapperProps, {
9027
9130
  get component() {
@@ -9104,15 +9207,7 @@ function ContentComponent(props) {
9104
9207
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-non-null-asserted-optional-chain
9105
9208
  contentId: props.content?.id
9106
9209
  }));
9107
- const [registeredComponents, setRegisteredComponents] = createSignal([...getDefaultRegisteredComponents(), ...props.customComponents?.filter(({
9108
- models
9109
- }) => {
9110
- if (!models?.length)
9111
- return true;
9112
- if (!props.model)
9113
- return true;
9114
- return models.includes(props.model);
9115
- }) || []].reduce((acc, {
9210
+ const [registeredComponents, setRegisteredComponents] = createSignal([...getDefaultRegisteredComponents(), ...props.customComponents || []].reduce((acc, {
9116
9211
  component,
9117
9212
  ...info
9118
9213
  }) => ({
@@ -9138,15 +9233,7 @@ function ContentComponent(props) {
9138
9233
  canTrack: props.canTrack,
9139
9234
  apiKey: props.apiKey,
9140
9235
  apiVersion: props.apiVersion,
9141
- componentInfos: [...getDefaultRegisteredComponents(), ...props.customComponents?.filter(({
9142
- models
9143
- }) => {
9144
- if (!models?.length)
9145
- return true;
9146
- if (!props.model)
9147
- return true;
9148
- return models.includes(props.model);
9149
- }) || []].reduce((acc, {
9236
+ componentInfos: [...getDefaultRegisteredComponents(), ...props.customComponents || []].reduce((acc, {
9150
9237
  component: _,
9151
9238
  ...info
9152
9239
  }) => ({
@@ -9156,7 +9243,8 @@ function ContentComponent(props) {
9156
9243
  inheritedStyles: {},
9157
9244
  BlocksWrapper: props.blocksWrapper || "div",
9158
9245
  BlocksWrapperProps: props.blocksWrapperProps || {},
9159
- nonce: props.nonce || ""
9246
+ nonce: props.nonce || "",
9247
+ model: props.model || ""
9160
9248
  });
9161
9249
  function contentSetState(newRootState) {
9162
9250
  setBuilderContextSignal((PREVIOUS_VALUE) => ({