@builder.io/sdk-svelte 0.4.1 → 0.4.2

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.
Files changed (33) hide show
  1. package/package/--package.json +1 -1
  2. package/package/CHANGELOG.md +6 -0
  3. package/package/blocks/BaseText.svelte +3 -1
  4. package/package/blocks/columns/columns.svelte +1 -1
  5. package/package/blocks/embed/embed.svelte +1 -1
  6. package/package/blocks/img/component-info.js +1 -1
  7. package/package/blocks/symbol/symbol.svelte +9 -9
  8. package/package/components/render-block/render-block.svelte +18 -39
  9. package/package/components/render-block/render-block.svelte.d.ts +2 -1
  10. package/package/components/render-block/render-component.svelte +1 -1
  11. package/package/components/render-block/render-component.svelte.d.ts +2 -1
  12. package/package/components/render-block/render-repeated-block.svelte +5 -13
  13. package/package/components/render-block/render-repeated-block.svelte.d.ts +1 -1
  14. package/package/components/render-blocks.svelte +4 -1
  15. package/package/components/render-content/render-content.svelte +83 -95
  16. package/package/components/render-content/render-content.svelte.d.ts +5 -5
  17. package/package/constants/sdk-version.d.ts +1 -1
  18. package/package/constants/sdk-version.js +1 -1
  19. package/package/context/builder.context.d.ts +2 -2
  20. package/package/context/builder.context.js +3 -2
  21. package/package.json +1 -1
  22. package/src/blocks/BaseText.svelte +3 -1
  23. package/src/blocks/columns/columns.svelte +1 -1
  24. package/src/blocks/embed/embed.svelte +1 -1
  25. package/src/blocks/img/component-info.ts +1 -1
  26. package/src/blocks/symbol/symbol.svelte +9 -9
  27. package/src/components/render-block/render-block.svelte +19 -40
  28. package/src/components/render-block/render-component.svelte +3 -2
  29. package/src/components/render-block/render-repeated-block.svelte +6 -13
  30. package/src/components/render-blocks.svelte +4 -1
  31. package/src/components/render-content/render-content.svelte +94 -103
  32. package/src/constants/sdk-version.ts +1 -1
  33. package/src/context/builder.context.ts +3 -2
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { onDestroy, onMount, setContext } from "svelte";
3
+ import { writable } from "svelte/store";
3
4
 
4
5
  import { getDefaultRegisteredComponents } from "../../constants/builder-registered-components.js";
5
6
  import type {
@@ -74,49 +75,50 @@
74
75
  };
75
76
  };
76
77
 
77
- export let content: RenderContentProps["content"];
78
- export let data: RenderContentProps["data"];
79
78
  export let canTrack: RenderContentProps["canTrack"];
80
- export let locale: RenderContentProps["locale"];
81
- export let customComponents: RenderContentProps["customComponents"];
82
79
  export let model: RenderContentProps["model"];
83
80
  export let context: RenderContentProps["context"];
84
81
  export let apiKey: RenderContentProps["apiKey"];
82
+ export let content: RenderContentProps["content"];
85
83
  export let parentContentId: RenderContentProps["parentContentId"];
84
+ export let data: RenderContentProps["data"];
85
+ export let locale: RenderContentProps["locale"];
86
+ export let apiVersion: RenderContentProps["apiVersion"];
87
+ export let customComponents: RenderContentProps["customComponents"];
86
88
  export let hideContent: RenderContentProps["hideContent"];
87
89
  export let classNameProp: RenderContentProps["classNameProp"];
88
90
  export let isSsrAbTest: RenderContentProps["isSsrAbTest"];
89
91
  export let includeRefs: RenderContentProps["includeRefs"];
90
92
  export let enrich: RenderContentProps["enrich"];
91
- export let apiVersion: RenderContentProps["apiVersion"];
92
93
 
93
94
  function mergeNewContent(newContent: BuilderContent) {
94
- useContent = {
95
- ...useContent,
95
+ $builderContextSignal.content = {
96
+ ...$builderContextSignal.content,
96
97
  ...newContent,
97
98
  data: {
98
- ...useContent?.data,
99
+ ...$builderContextSignal.content?.data,
99
100
  ...newContent?.data,
100
101
  },
101
102
  meta: {
102
- ...useContent?.meta,
103
+ ...$builderContextSignal.content?.meta,
103
104
  ...newContent?.meta,
104
105
  breakpoints:
105
- newContent?.meta?.breakpoints || useContent?.meta?.breakpoints,
106
+ newContent?.meta?.breakpoints ||
107
+ $builderContextSignal.content?.meta?.breakpoints,
106
108
  },
107
109
  };
108
110
  }
109
111
  function setBreakpoints(breakpoints: Breakpoints) {
110
- useContent = {
111
- ...useContent,
112
+ $builderContextSignal.content = {
113
+ ...$builderContextSignal.content,
112
114
  meta: {
113
- ...useContent?.meta,
115
+ ...$builderContextSignal.content?.meta,
114
116
  breakpoints,
115
117
  },
116
118
  };
117
119
  }
118
120
  function contentSetState(newRootState: BuilderRenderState) {
119
- contentState = newRootState;
121
+ $builderContextSignal.rootState = newRootState;
120
122
  }
121
123
  function processMessage(event: MessageEvent) {
122
124
  const { data } = event;
@@ -125,7 +127,7 @@
125
127
  case "builder.configureSdk": {
126
128
  const messageContent = data.data;
127
129
  const { breakpoints, contentId } = messageContent;
128
- if (!contentId || contentId !== useContent?.id) {
130
+ if (!contentId || contentId !== $builderContextSignal.content?.id) {
129
131
  return;
130
132
  }
131
133
  if (breakpoints) {
@@ -158,21 +160,21 @@
158
160
  }
159
161
  function evaluateJsCode() {
160
162
  // run any dynamic JS code attached to content
161
- const jsCode = useContent?.data?.jsCode;
163
+ const jsCode = $builderContextSignal.content?.data?.jsCode;
162
164
  if (jsCode) {
163
165
  evaluate({
164
166
  code: jsCode,
165
167
  context: context || {},
166
168
  localState: undefined,
167
- rootState: contentState,
169
+ rootState: $builderContextSignal.rootState,
168
170
  rootSetState: contentSetState,
169
171
  });
170
172
  }
171
173
  }
172
174
  function onClick(event: any) {
173
- if (useContent) {
174
- const variationId = useContent?.testVariationId;
175
- const contentId = useContent?.id;
175
+ if ($builderContextSignal.content) {
176
+ const variationId = $builderContextSignal.content?.testVariationId;
177
+ const contentId = $builderContextSignal.content?.id;
176
178
  _track({
177
179
  type: "click",
178
180
  canTrack: canTrackToUse,
@@ -193,7 +195,7 @@
193
195
  code: group,
194
196
  context: context || {},
195
197
  localState: undefined,
196
- rootState: contentState,
198
+ rootState: $builderContextSignal.rootState,
197
199
  rootSetState: contentSetState,
198
200
  })
199
201
  );
@@ -203,7 +205,7 @@
203
205
  .then((response) => response.json())
204
206
  .then((json) => {
205
207
  const newState = {
206
- ...contentState,
208
+ ...$builderContextSignal.rootState,
207
209
  [key]: json,
208
210
  };
209
211
  contentSetState(newState);
@@ -215,7 +217,7 @@
215
217
  function runHttpRequests() {
216
218
  const requests: {
217
219
  [key: string]: string;
218
- } = useContent?.data?.httpRequests ?? {};
220
+ } = $builderContextSignal.content?.data?.httpRequests ?? {};
219
221
  Object.entries(requests).forEach(([key, url]) => {
220
222
  if (url && (!httpReqsData[key] || isEditing())) {
221
223
  const evaluatedUrl = evalExpression(url);
@@ -233,7 +235,7 @@
233
235
  "builder:component:stateChange",
234
236
  {
235
237
  detail: {
236
- state: contentState,
238
+ state: $builderContextSignal.rootState,
237
239
  ref: {
238
240
  name: model,
239
241
  },
@@ -248,36 +250,8 @@
248
250
 
249
251
  let forceReRenderCount = 0;
250
252
  let overrideContent = null;
251
- let useContent = getContentInitialValue({
252
- content: content,
253
- data: data,
254
- });
255
253
  let update = 0;
256
254
  let canTrackToUse = checkIsDefined(canTrack) ? canTrack : true;
257
- let contentState = getContextStateInitialValue({
258
- content: content,
259
- data: data,
260
- locale: locale,
261
- });
262
- let allRegisteredComponents = [
263
- ...getDefaultRegisteredComponents(),
264
- // While this `components` object is deprecated, we must maintain support for it.
265
- // Since users are able to override our default components, we need to make sure that we do not break such
266
- // existing usage.
267
- // This is why we spread `components` after the default Builder.io components, but before the `props.customComponents`,
268
- // which is the new standard way of providing custom components, and must therefore take precedence.
269
- ...components,
270
- ...(customComponents || []),
271
- ].reduce(
272
- (acc, { component, ...curr }) => ({
273
- ...acc,
274
- [curr.name]: {
275
- component: TARGET === "vue3" ? wrapComponentRef(component) : component,
276
- ...curr,
277
- },
278
- }),
279
- {} as RegisteredComponents
280
- );
281
255
  let httpReqsData = {};
282
256
  let clicked = false;
283
257
  let scriptStr = getRenderContentScriptString({
@@ -285,6 +259,43 @@
285
259
  contentId: content?.id!,
286
260
  parentContentId: parentContentId!,
287
261
  });
262
+ let builderContextSignal = writable({
263
+ content: getContentInitialValue({
264
+ content: content,
265
+ data: data,
266
+ }),
267
+ localState: undefined,
268
+ rootState: getContextStateInitialValue({
269
+ content: content,
270
+ data: data,
271
+ locale: locale,
272
+ }),
273
+ rootSetState: contentSetState,
274
+ context: context || {},
275
+ apiKey: apiKey,
276
+ apiVersion: apiVersion,
277
+ registeredComponents: [
278
+ ...getDefaultRegisteredComponents(),
279
+ // While this `components` object is deprecated, we must maintain support for it.
280
+ // Since users are able to override our default components, we need to make sure that we do not break such
281
+ // existing usage.
282
+ // This is why we spread `components` after the default Builder.io components, but before the `props.customComponents`,
283
+ // which is the new standard way of providing custom components, and must therefore take precedence.
284
+ ...components,
285
+ ...(customComponents || []),
286
+ ].reduce(
287
+ (acc, { component, ...curr }) => ({
288
+ ...acc,
289
+ [curr.name]: {
290
+ component:
291
+ TARGET === "vue3" ? wrapComponentRef(component) : component,
292
+ ...curr,
293
+ },
294
+ }),
295
+ {} as RegisteredComponents
296
+ ),
297
+ inheritedStyles: {},
298
+ });
288
299
 
289
300
  onMount(() => {
290
301
  if (!apiKey) {
@@ -313,21 +324,21 @@
313
324
  }
314
325
  : {}),
315
326
  });
316
- Object.values<RegisteredComponent>(allRegisteredComponents).forEach(
317
- (registeredComponent) => {
318
- const message = createRegisterComponentMessage(registeredComponent);
319
- window.parent?.postMessage(message, "*");
320
- }
321
- );
327
+ Object.values<RegisteredComponent>(
328
+ $builderContextSignal.registeredComponents
329
+ ).forEach((registeredComponent) => {
330
+ const message = createRegisterComponentMessage(registeredComponent);
331
+ window.parent?.postMessage(message, "*");
332
+ });
322
333
  window.addEventListener("message", processMessage);
323
334
  window.addEventListener(
324
335
  "builder:component:stateChangeListenerActivated",
325
336
  emitStateUpdate
326
337
  );
327
338
  }
328
- if (useContent) {
329
- const variationId = useContent?.testVariationId;
330
- const contentId = useContent?.id;
339
+ if ($builderContextSignal.content) {
340
+ const variationId = $builderContextSignal.content?.testVariationId;
341
+ const contentId = $builderContextSignal.content?.id;
331
342
  _track({
332
343
  type: "impression",
333
344
  canTrack: canTrackToUse,
@@ -378,54 +389,31 @@
378
389
  }
379
390
  });
380
391
 
381
- function onUpdateFn_0() {
392
+ function onUpdateFn_0(..._args: any[]) {
382
393
  if (content) {
383
394
  mergeNewContent(content);
384
395
  }
385
396
  }
386
397
  $: onUpdateFn_0(...[content]);
387
- function onUpdateFn_1() {
398
+ function onUpdateFn_1(..._args: any[]) {
388
399
  evaluateJsCode();
389
400
  }
390
- $: onUpdateFn_1(...[useContent?.data?.jsCode, contentState]);
391
- function onUpdateFn_2() {
401
+ $: onUpdateFn_1(
402
+ ...[
403
+ $builderContextSignal.content?.data?.jsCode,
404
+ $builderContextSignal.rootState,
405
+ ]
406
+ );
407
+ function onUpdateFn_2(..._args: any[]) {
392
408
  runHttpRequests();
393
409
  }
394
- $: onUpdateFn_2(...[useContent?.data?.httpRequests]);
395
- function onUpdateFn_3() {
410
+ $: onUpdateFn_2(...[$builderContextSignal.content?.data?.httpRequests]);
411
+ function onUpdateFn_3(..._args: any[]) {
396
412
  emitStateUpdate();
397
413
  }
398
- $: onUpdateFn_3(...[contentState]);
414
+ $: onUpdateFn_3(...[$builderContextSignal.rootState]);
399
415
 
400
- setContext(builderContext.key, {
401
- get content() {
402
- return useContent;
403
- },
404
- get localState() {
405
- return undefined;
406
- },
407
- get rootState() {
408
- return contentState;
409
- },
410
- get rootSetState() {
411
- return TARGET === "qwik" ? undefined : contentSetState;
412
- },
413
- get context() {
414
- return context || {};
415
- },
416
- get apiKey() {
417
- return apiKey;
418
- },
419
- get apiVersion() {
420
- return apiVersion;
421
- },
422
- get registeredComponents() {
423
- return allRegisteredComponents;
424
- },
425
- get inheritedStyles() {
426
- return {};
427
- },
428
- });
416
+ setContext(builderContext.key, builderContextSignal);
429
417
 
430
418
  onDestroy(() => {
431
419
  if (isBrowser()) {
@@ -438,13 +426,13 @@
438
426
  });
439
427
  </script>
440
428
 
441
- {#if useContent}
429
+ {#if $builderContextSignal.content}
442
430
  <div
443
431
  bind:this={elementRef}
444
432
  on:click={(event) => {
445
433
  onClick(event);
446
434
  }}
447
- builder-content-id={useContent?.id}
435
+ builder-content-id={$builderContextSignal.content?.id}
448
436
  builder-model={model}
449
437
  {...filterAttrs(
450
438
  TARGET === "reactNative"
@@ -484,11 +472,14 @@
484
472
 
485
473
  {#if TARGET !== "reactNative"}
486
474
  <RenderContentStyles
487
- contentId={useContent?.id}
488
- cssCode={useContent?.data?.cssCode}
489
- customFonts={useContent?.data?.customFonts}
475
+ contentId={$builderContextSignal.content?.id}
476
+ cssCode={$builderContextSignal.content?.data?.cssCode}
477
+ customFonts={$builderContextSignal.content?.data?.customFonts}
490
478
  />
491
479
  {/if}
492
- <RenderBlocks blocks={useContent?.data?.blocks} key={forceReRenderCount} />
480
+ <RenderBlocks
481
+ blocks={$builderContextSignal.content?.data?.blocks}
482
+ key={forceReRenderCount}
483
+ />
493
484
  </div>
494
485
  {/if}
@@ -1 +1 @@
1
- export const SDK_VERSION = "0.4.1"
1
+ export const SDK_VERSION = "0.4.2"
@@ -1,7 +1,8 @@
1
1
  const key = Symbol();
2
+ import { writable } from "svelte/store";
2
3
 
3
4
  export default {
4
- Builder: {
5
+ Builder: writable({
5
6
  content: null,
6
7
  context: {},
7
8
  localState: undefined,
@@ -11,6 +12,6 @@ export default {
11
12
  apiVersion: undefined,
12
13
  registeredComponents: {},
13
14
  inheritedStyles: {},
14
- },
15
+ }),
15
16
  key,
16
17
  };