@builder.io/sdk-svelte 2.0.25 → 2.0.28

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 (63) hide show
  1. package/lib/browser/blocks/columns/columns.svelte +23 -15
  2. package/lib/browser/components/content/components/enable-editor.svelte +5 -1
  3. package/lib/browser/components/content/components/enable-editor.svelte.d.ts +3 -1
  4. package/lib/browser/components/content/content.svelte +4 -1
  5. package/lib/browser/components/content/content.svelte.d.ts +2 -1
  6. package/lib/browser/components/content-variants/content-variants.svelte +3 -0
  7. package/lib/browser/components/content-variants/content-variants.svelte.d.ts +1 -0
  8. package/lib/browser/components/content-variants/content-variants.types.d.ts +4 -0
  9. package/lib/browser/constants/sdk-version.d.ts +1 -1
  10. package/lib/browser/constants/sdk-version.js +1 -1
  11. package/lib/browser/functions/evaluate/node-runtime/node-runtime.js +5 -4
  12. package/lib/browser/functions/evaluate/node-runtime/setIvm.d.ts +1 -0
  13. package/lib/browser/functions/evaluate/node-runtime/setIvm.js +1 -0
  14. package/lib/browser/functions/get-content/generate-content-url.js +3 -2
  15. package/lib/browser/functions/get-content/types.d.ts +4 -0
  16. package/lib/browser/functions/track/index.d.ts +3 -1
  17. package/lib/browser/functions/track/index.js +3 -2
  18. package/lib/edge/blocks/columns/columns.svelte +23 -15
  19. package/lib/edge/components/content/components/enable-editor.svelte +5 -1
  20. package/lib/edge/components/content/components/enable-editor.svelte.d.ts +3 -1
  21. package/lib/edge/components/content/content.svelte +4 -1
  22. package/lib/edge/components/content/content.svelte.d.ts +2 -1
  23. package/lib/edge/components/content-variants/content-variants.svelte +3 -0
  24. package/lib/edge/components/content-variants/content-variants.svelte.d.ts +1 -0
  25. package/lib/edge/components/content-variants/content-variants.types.d.ts +4 -0
  26. package/lib/edge/constants/sdk-version.d.ts +1 -1
  27. package/lib/edge/constants/sdk-version.js +1 -1
  28. package/lib/edge/functions/evaluate/node-runtime/node-runtime.js +5 -4
  29. package/lib/edge/functions/evaluate/node-runtime/setIvm.d.ts +1 -0
  30. package/lib/edge/functions/evaluate/node-runtime/setIvm.js +1 -0
  31. package/lib/edge/functions/get-content/generate-content-url.js +3 -2
  32. package/lib/edge/functions/get-content/types.d.ts +4 -0
  33. package/lib/edge/functions/track/index.d.ts +3 -1
  34. package/lib/edge/functions/track/index.js +3 -2
  35. package/lib/node/blocks/columns/columns.svelte +23 -15
  36. package/lib/node/components/content/components/enable-editor.svelte +5 -1
  37. package/lib/node/components/content/components/enable-editor.svelte.d.ts +3 -1
  38. package/lib/node/components/content/content.svelte +4 -1
  39. package/lib/node/components/content/content.svelte.d.ts +2 -1
  40. package/lib/node/components/content-variants/content-variants.svelte +3 -0
  41. package/lib/node/components/content-variants/content-variants.svelte.d.ts +1 -0
  42. package/lib/node/components/content-variants/content-variants.types.d.ts +4 -0
  43. package/lib/node/constants/sdk-version.d.ts +1 -1
  44. package/lib/node/constants/sdk-version.js +1 -1
  45. package/lib/node/functions/evaluate/node-runtime/node-runtime.js +5 -4
  46. package/lib/node/functions/evaluate/node-runtime/setIvm.d.ts +1 -0
  47. package/lib/node/functions/evaluate/node-runtime/setIvm.js +1 -0
  48. package/lib/node/functions/get-content/generate-content-url.js +3 -2
  49. package/lib/node/functions/get-content/types.d.ts +4 -0
  50. package/lib/node/functions/track/index.d.ts +3 -1
  51. package/lib/node/functions/track/index.js +3 -2
  52. package/package.json +1 -1
  53. package/src/blocks/columns/columns.svelte +19 -13
  54. package/src/components/content/components/enable-editor.svelte +5 -2
  55. package/src/components/content/content.svelte +4 -1
  56. package/src/components/content-variants/content-variants.svelte +3 -0
  57. package/src/components/content-variants/content-variants.types.ts +5 -0
  58. package/src/constants/sdk-version.ts +1 -1
  59. package/src/functions/evaluate/node-runtime/node-runtime.ts +3 -3
  60. package/src/functions/evaluate/node-runtime/setIvm.ts +1 -0
  61. package/src/functions/get-content/generate-content-url.ts +4 -2
  62. package/src/functions/get-content/types.ts +5 -0
  63. package/src/functions/track/index.ts +8 -2
@@ -39,7 +39,7 @@ const createEvent = async ({ type: eventType, canTrack, apiKey, metadata, ...pro
39
39
  ownerId: apiKey
40
40
  }
41
41
  });
42
- export async function _track(eventProps) {
42
+ export async function _track({ apiHost, ...eventProps }) {
43
43
  if (!eventProps.apiKey) {
44
44
  logger.error('Missing API key for track call. Please provide your API key.');
45
45
  return;
@@ -53,7 +53,8 @@ export async function _track(eventProps) {
53
53
  if (!(isBrowser() || TARGET === 'reactNative')) {
54
54
  return;
55
55
  }
56
- return fetch(`https://cdn.builder.io/api/v1/track`, {
56
+ const baseUrl = apiHost || 'https://cdn.builder.io';
57
+ return fetch(`${baseUrl}/api/v1/track`, {
57
58
  method: 'POST',
58
59
  body: JSON.stringify({
59
60
  events: [await createEvent(eventProps)]
@@ -32,30 +32,30 @@ function getTagName(column) {
32
32
  return column.link ? builderLinkComponent || "a" : "div";
33
33
  }
34
34
  function getWidth(index) {
35
- return cols[index]?.width || 100 / cols.length;
35
+ return cols()[index]?.width || 100 / cols().length;
36
36
  }
37
37
  function getColumnCssWidth(index) {
38
38
  const width = getWidth(index);
39
- const subtractWidth = gutterSize * (cols.length - 1) * (width / 100);
39
+ const subtractWidth = gutterSize() * (cols().length - 1) * (width / 100);
40
40
  return `calc(${width}% - ${subtractWidth}px)`;
41
41
  }
42
42
  function getTabletStyle({ stackedStyle, desktopStyle, }) {
43
- return stackAt === "tablet" ? stackedStyle : desktopStyle;
43
+ return stackAt() === "tablet" ? stackedStyle : desktopStyle;
44
44
  }
45
45
  function getMobileStyle({ stackedStyle, desktopStyle, }) {
46
- return stackAt === "never" ? desktopStyle : stackedStyle;
46
+ return stackAt() === "never" ? desktopStyle : stackedStyle;
47
47
  }
48
48
  function columnsCssVars() {
49
49
  return {
50
- "--flex-dir": flexDir,
50
+ "--flex-dir": flexDir(),
51
51
  "--flex-dir-tablet": getTabletStyle({
52
- stackedStyle: flexDir,
52
+ stackedStyle: flexDir(),
53
53
  desktopStyle: "row",
54
54
  }),
55
55
  };
56
56
  }
57
57
  function columnCssVars(index) {
58
- const gutter = index === 0 ? 0 : gutterSize;
58
+ const gutter = index === 0 ? 0 : gutterSize();
59
59
  const width = getColumnCssWidth(index);
60
60
  const gutterPixels = `${gutter}px`;
61
61
  const mobileWidth = "100%";
@@ -132,14 +132,22 @@ function getAttributes(column, index) {
132
132
  style: mapStyleObjToStrIfNeeded(columnCssVars(index)),
133
133
  };
134
134
  }
135
- let gutterSize = typeof space === "number" ? space || 0 : 20;
136
- let cols = columns || [];
137
- let stackAt = stackColumnsAt || "tablet";
138
- let flexDir = stackColumnsAt === "never"
139
- ? "row"
140
- : reverseColumnsWhenStacked
141
- ? "column-reverse"
142
- : "column";
135
+ $: gutterSize = () => {
136
+ return typeof space === "number" ? space || 0 : 20;
137
+ };
138
+ $: cols = () => {
139
+ return columns || [];
140
+ };
141
+ $: stackAt = () => {
142
+ return stackColumnsAt || "tablet";
143
+ };
144
+ $: flexDir = () => {
145
+ return stackColumnsAt === "never"
146
+ ? "row"
147
+ : reverseColumnsWhenStacked
148
+ ? "column-reverse"
149
+ : "column";
150
+ };
143
151
  </script>
144
152
 
145
153
  <div
@@ -18,9 +18,11 @@ import { registerInsertMenu, setupBrowserForEditing, } from "../../../scripts/in
18
18
  import { triggerAnimation } from "../../block/animator";
19
19
  import "../../dynamic-div.svelte";
20
20
  import { getWrapperClassName } from "./styles.helpers";
21
+ export let isNestedRender = undefined;
21
22
  export let builderContextSignal;
22
23
  export let canTrack = undefined;
23
24
  export let apiKey;
25
+ export let apiHost = undefined;
24
26
  export let locale = undefined;
25
27
  export let enrich = undefined;
26
28
  export let trustedHosts = undefined;
@@ -92,6 +94,7 @@ function onClick(event) {
92
94
  const variationId = $builderContextSignal.content?.testVariationId;
93
95
  const contentId = $builderContextSignal.content?.id;
94
96
  _track({
97
+ apiHost: apiHost,
95
98
  type: "click",
96
99
  canTrack: getDefaultCanTrack(canTrack),
97
100
  contentId,
@@ -223,7 +226,7 @@ runHttpRequests();
223
226
  emitStateUpdate();
224
227
  onMount(() => {
225
228
  if (isBrowser()) {
226
- if (isEditing()) {
229
+ if (isEditing() && !isNestedRender) {
227
230
  if (elementRef) {
228
231
  elementRef.dispatchEvent(new CustomEvent("initeditingbldr"));
229
232
  }
@@ -234,6 +237,7 @@ onMount(() => {
234
237
  const contentId = $builderContextSignal.content?.id;
235
238
  const apiKeyProp = apiKey;
236
239
  _track({
240
+ apiHost: apiHost,
237
241
  type: "impression",
238
242
  canTrack: true,
239
243
  contentId,
@@ -1,5 +1,5 @@
1
1
  import { SvelteComponent } from "svelte";
2
- type BuilderEditorProps = Omit<ContentProps, "customComponents" | "apiVersion" | "isSsrAbTest" | "blocksWrapper" | "blocksWrapperProps" | "isNestedRender" | "linkComponent"> & {
2
+ type BuilderEditorProps = Omit<ContentProps, "customComponents" | "apiVersion" | "isSsrAbTest" | "blocksWrapper" | "blocksWrapperProps" | "linkComponent"> & {
3
3
  builderContextSignal: Writable<BuilderContextInterface>;
4
4
  setBuilderContextSignal?: (signal: any) => any;
5
5
  children?: any;
@@ -9,9 +9,11 @@ import type { ContentProps } from "../content.types";
9
9
  import type { Writable } from "svelte/store";
10
10
  declare const __propDef: {
11
11
  props: {
12
+ isNestedRender?: BuilderEditorProps["isNestedRender"];
12
13
  builderContextSignal: BuilderEditorProps["builderContextSignal"];
13
14
  canTrack?: BuilderEditorProps["canTrack"];
14
15
  apiKey: BuilderEditorProps["apiKey"];
16
+ apiHost?: BuilderEditorProps["apiHost"];
15
17
  locale?: BuilderEditorProps["locale"];
16
18
  enrich?: BuilderEditorProps["enrich"];
17
19
  trustedHosts?: BuilderEditorProps["trustedHosts"];
@@ -26,13 +26,14 @@ export let apiVersion = undefined;
26
26
  export let blocksWrapper = undefined;
27
27
  export let blocksWrapperProps = undefined;
28
28
  export let nonce = undefined;
29
+ export let apiHost = undefined;
29
30
  export let enrich = undefined;
30
31
  export let showContent;
31
32
  export let contentWrapper = undefined;
32
33
  export let contentWrapperProps = undefined;
33
34
  export let trustedHosts = undefined;
34
- export let isSsrAbTest;
35
35
  export let isNestedRender = undefined;
36
+ export let isSsrAbTest;
36
37
  export let linkComponent = undefined;
37
38
  function contentSetState(newRootState) {
38
39
  $builderContextSignal.rootState = newRootState;
@@ -116,6 +117,7 @@ setContext(ComponentsContext.key, {
116
117
  </script>
117
118
 
118
119
  <EnableEditor
120
+ {apiHost}
119
121
  {nonce}
120
122
  {content}
121
123
  {data}
@@ -130,6 +132,7 @@ setContext(ComponentsContext.key, {
130
132
  {contentWrapper}
131
133
  {contentWrapperProps}
132
134
  {trustedHosts}
135
+ {isNestedRender}
133
136
  {...{}}
134
137
  >
135
138
  {#if isSsrAbTest}
@@ -14,13 +14,14 @@ declare const __propDef: {
14
14
  blocksWrapper?: ContentProps["blocksWrapper"];
15
15
  blocksWrapperProps?: ContentProps["blocksWrapperProps"];
16
16
  nonce?: ContentProps["nonce"];
17
+ apiHost?: ContentProps["apiHost"];
17
18
  enrich?: ContentProps["enrich"];
18
19
  showContent: ContentProps["showContent"];
19
20
  contentWrapper?: ContentProps["contentWrapper"];
20
21
  contentWrapperProps?: ContentProps["contentWrapperProps"];
21
22
  trustedHosts?: ContentProps["trustedHosts"];
22
- isSsrAbTest: ContentProps["isSsrAbTest"];
23
23
  isNestedRender?: ContentProps["isNestedRender"];
24
+ isSsrAbTest: ContentProps["isSsrAbTest"];
24
25
  linkComponent?: ContentProps["linkComponent"];
25
26
  };
26
27
  events: {
@@ -12,6 +12,7 @@ export let canTrack = undefined;
12
12
  export let content = undefined;
13
13
  export let isNestedRender = undefined;
14
14
  export let nonce = undefined;
15
+ export let apiHost = undefined;
15
16
  export let model = undefined;
16
17
  export let data = undefined;
17
18
  export let context = undefined;
@@ -82,6 +83,7 @@ onMount(() => {
82
83
 
83
84
  {#each getVariants(content) as variant (variant.testVariationId)}
84
85
  <ContentComponent
86
+ {apiHost}
85
87
  {isNestedRender}
86
88
  {nonce}
87
89
  content={variant}
@@ -107,6 +109,7 @@ onMount(() => {
107
109
  {/each}
108
110
  {/if}
109
111
  <ContentComponent
112
+ {apiHost}
110
113
  {nonce}
111
114
  {isNestedRender}
112
115
  {...{}}
@@ -12,6 +12,7 @@ declare const __propDef: {
12
12
  content?: VariantsProviderProps["content"];
13
13
  isNestedRender?: VariantsProviderProps["isNestedRender"];
14
14
  nonce?: VariantsProviderProps["nonce"];
15
+ apiHost?: VariantsProviderProps["apiHost"];
15
16
  model?: VariantsProviderProps["model"];
16
17
  data?: VariantsProviderProps["data"];
17
18
  context?: VariantsProviderProps["context"];
@@ -26,6 +26,10 @@ export interface ContentVariantsPrps extends ExtraFrameworkProps {
26
26
  * Your API Key: needed to enable visual editing, and to dynamically fetch symbols (required).
27
27
  */
28
28
  apiKey: string;
29
+ /**
30
+ * Sets the host of Builder API calls. (Defaults to global `https://cdn.builder.io`)
31
+ */
32
+ apiHost?: string;
29
33
  apiVersion?: ApiVersion;
30
34
  /**
31
35
  * An array of custom components to register (optional).
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "2.0.25";
1
+ export declare const SDK_VERSION = "2.0.28";
@@ -1 +1 @@
1
- export const SDK_VERSION = "2.0.25";
1
+ export const SDK_VERSION = "2.0.28";
@@ -63,6 +63,8 @@ let IVM_CONTEXT = null;
63
63
  * `safeDynamicRequire` trick to import the `isolated-vm` package.
64
64
  */
65
65
  export const setIvm = (ivm, options = {}) => {
66
+ if (IVM_INSTANCE)
67
+ return;
66
68
  IVM_INSTANCE = ivm;
67
69
  setIsolateContext(options);
68
70
  };
@@ -92,6 +94,8 @@ const getIvm = () => {
92
94
  function setIsolateContext(options = {
93
95
  memoryLimit: 128
94
96
  }) {
97
+ if (IVM_CONTEXT)
98
+ return IVM_CONTEXT;
95
99
  const ivm = getIvm();
96
100
  const isolate = new ivm.Isolate(options);
97
101
  const context = isolate.createContextSync();
@@ -108,10 +112,7 @@ function setIsolateContext(options = {
108
112
  return context;
109
113
  }
110
114
  const getIsolateContext = () => {
111
- if (IVM_CONTEXT)
112
- return IVM_CONTEXT;
113
- const context = setIsolateContext();
114
- return context;
115
+ return setIsolateContext();
115
116
  };
116
117
  export const runInNode = ({ code, builder, context, event, localState, rootSetState, rootState }) => {
117
118
  const ivm = getIvm();
@@ -0,0 +1 @@
1
+ export { setIvm } from './node-runtime';
@@ -0,0 +1 @@
1
+ export { setIvm } from './node-runtime';
@@ -4,7 +4,7 @@ import { DEFAULT_API_VERSION } from '../../types/api-version';
4
4
  import { getBuilderSearchParamsFromWindow } from '../get-builder-search-params/index';
5
5
  const isPositiveNumber = (thing) => typeof thing === 'number' && !isNaN(thing) && thing >= 0;
6
6
  export const generateContentUrl = (options) => {
7
- const { limit = 30, userAttributes, query, model, apiKey, enrich, locale, apiVersion = DEFAULT_API_VERSION, fields, omit, offset, cacheSeconds, staleCacheSeconds, sort, includeUnpublished } = options;
7
+ const { limit = 30, userAttributes, query, model, apiKey, enrich, locale, apiVersion = DEFAULT_API_VERSION, fields, omit, offset, cacheSeconds, staleCacheSeconds, sort, includeUnpublished, apiHost } = options;
8
8
  if (!apiKey) {
9
9
  throw new Error('Missing API key');
10
10
  }
@@ -13,7 +13,8 @@ export const generateContentUrl = (options) => {
13
13
  }
14
14
  // if we are fetching an array of content, we disable noTraverse for perf reasons.
15
15
  const noTraverse = limit !== 1;
16
- const url = new URL(`https://cdn.builder.io/api/${apiVersion}/content/${model}`);
16
+ const baseUrl = apiHost || 'https://cdn.builder.io';
17
+ const url = new URL(`${baseUrl}/api/${apiVersion}/content/${model}`);
17
18
  url.searchParams.set('apiKey', apiKey);
18
19
  url.searchParams.set('limit', String(limit));
19
20
  url.searchParams.set('noTraverse', String(noTraverse));
@@ -136,4 +136,8 @@ export interface GetContentOptions {
136
136
  * Optional fetch options to be passed as the second argument to the `fetch` function.
137
137
  */
138
138
  fetchOptions?: object;
139
+ /**
140
+ * Sets the host of Builder API calls. (Defaults to global `https://cdn.builder.io`)
141
+ */
142
+ apiHost?: string;
139
143
  }
@@ -46,6 +46,8 @@ type EventProperties = Pick<Event, 'type'> & Pick<Event['data'], 'contentId' | '
46
46
  [index: string]: any;
47
47
  };
48
48
  export type EventProps = EventProperties & CanTrack;
49
- export declare function _track(eventProps: EventProps): Promise<void | Response>;
49
+ export declare function _track({ apiHost, ...eventProps }: EventProps & {
50
+ apiHost?: string;
51
+ }): Promise<void | Response>;
50
52
  export declare const track: (args: EventProperties) => Promise<void | Response>;
51
53
  export {};
@@ -39,7 +39,7 @@ const createEvent = async ({ type: eventType, canTrack, apiKey, metadata, ...pro
39
39
  ownerId: apiKey
40
40
  }
41
41
  });
42
- export async function _track(eventProps) {
42
+ export async function _track({ apiHost, ...eventProps }) {
43
43
  if (!eventProps.apiKey) {
44
44
  logger.error('Missing API key for track call. Please provide your API key.');
45
45
  return;
@@ -53,7 +53,8 @@ export async function _track(eventProps) {
53
53
  if (!(isBrowser() || TARGET === 'reactNative')) {
54
54
  return;
55
55
  }
56
- return fetch(`https://cdn.builder.io/api/v1/track`, {
56
+ const baseUrl = apiHost || 'https://cdn.builder.io';
57
+ return fetch(`${baseUrl}/api/v1/track`, {
57
58
  method: 'POST',
58
59
  body: JSON.stringify({
59
60
  events: [await createEvent(eventProps)]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@builder.io/sdk-svelte",
3
3
  "description": "Builder.io SDK for Svelte",
4
- "version": "2.0.25",
4
+ "version": "2.0.28",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "lib",
@@ -42,11 +42,11 @@
42
42
  return column.link ? builderLinkComponent || "a" : "div";
43
43
  }
44
44
  function getWidth(index: number) {
45
- return cols[index]?.width || 100 / cols.length;
45
+ return cols()[index]?.width || 100 / cols().length;
46
46
  }
47
47
  function getColumnCssWidth(index: number) {
48
48
  const width = getWidth(index);
49
- const subtractWidth = gutterSize * (cols.length - 1) * (width / 100);
49
+ const subtractWidth = gutterSize() * (cols().length - 1) * (width / 100);
50
50
  return `calc(${width}% - ${subtractWidth}px)`;
51
51
  }
52
52
  function getTabletStyle({
@@ -56,7 +56,7 @@
56
56
  stackedStyle: CSSVal;
57
57
  desktopStyle: CSSVal;
58
58
  }) {
59
- return stackAt === "tablet" ? stackedStyle : desktopStyle;
59
+ return stackAt() === "tablet" ? stackedStyle : desktopStyle;
60
60
  }
61
61
  function getMobileStyle({
62
62
  stackedStyle,
@@ -65,19 +65,19 @@
65
65
  stackedStyle: CSSVal;
66
66
  desktopStyle: CSSVal;
67
67
  }) {
68
- return stackAt === "never" ? desktopStyle : stackedStyle;
68
+ return stackAt() === "never" ? desktopStyle : stackedStyle;
69
69
  }
70
70
  function columnsCssVars() {
71
71
  return {
72
- "--flex-dir": flexDir,
72
+ "--flex-dir": flexDir(),
73
73
  "--flex-dir-tablet": getTabletStyle({
74
- stackedStyle: flexDir,
74
+ stackedStyle: flexDir(),
75
75
  desktopStyle: "row",
76
76
  }),
77
77
  } as Dictionary<string>;
78
78
  }
79
79
  function columnCssVars(index: number) {
80
- const gutter = index === 0 ? 0 : gutterSize;
80
+ const gutter = index === 0 ? 0 : gutterSize();
81
81
  const width = getColumnCssWidth(index);
82
82
  const gutterPixels = `${gutter}px`;
83
83
  const mobileWidth = "100%";
@@ -156,16 +156,22 @@
156
156
  style: mapStyleObjToStrIfNeeded(columnCssVars(index)),
157
157
  };
158
158
  }
159
-
160
- let gutterSize = typeof space === "number" ? space || 0 : 20;
161
- let cols = columns || [];
162
- let stackAt = stackColumnsAt || "tablet";
163
- let flexDir =
164
- stackColumnsAt === "never"
159
+ $: gutterSize = () => {
160
+ return typeof space === "number" ? space || 0 : 20;
161
+ };
162
+ $: cols = () => {
163
+ return columns || [];
164
+ };
165
+ $: stackAt = () => {
166
+ return stackColumnsAt || "tablet";
167
+ };
168
+ $: flexDir = () => {
169
+ return stackColumnsAt === "never"
165
170
  ? "row"
166
171
  : reverseColumnsWhenStacked
167
172
  ? "column-reverse"
168
173
  : "column";
174
+ };
169
175
  </script>
170
176
 
171
177
  <div
@@ -6,7 +6,6 @@
6
6
  | "isSsrAbTest"
7
7
  | "blocksWrapper"
8
8
  | "blocksWrapperProps"
9
- | "isNestedRender"
10
9
  | "linkComponent"
11
10
  > & {
12
11
  builderContextSignal: Writable<BuilderContextInterface>;
@@ -48,9 +47,11 @@
48
47
  import { getWrapperClassName } from "./styles.helpers";
49
48
  import type { Writable } from "svelte/store";
50
49
 
50
+ export let isNestedRender: BuilderEditorProps["isNestedRender"] = undefined;
51
51
  export let builderContextSignal: BuilderEditorProps["builderContextSignal"];
52
52
  export let canTrack: BuilderEditorProps["canTrack"] = undefined;
53
53
  export let apiKey: BuilderEditorProps["apiKey"];
54
+ export let apiHost: BuilderEditorProps["apiHost"] = undefined;
54
55
  export let locale: BuilderEditorProps["locale"] = undefined;
55
56
  export let enrich: BuilderEditorProps["enrich"] = undefined;
56
57
  export let trustedHosts: BuilderEditorProps["trustedHosts"] = undefined;
@@ -124,6 +125,7 @@
124
125
  const variationId = $builderContextSignal.content?.testVariationId;
125
126
  const contentId = $builderContextSignal.content?.id;
126
127
  _track({
128
+ apiHost: apiHost,
127
129
  type: "click",
128
130
  canTrack: getDefaultCanTrack(canTrack),
129
131
  contentId,
@@ -279,7 +281,7 @@
279
281
 
280
282
  onMount(() => {
281
283
  if (isBrowser()) {
282
- if (isEditing()) {
284
+ if (isEditing() && !isNestedRender) {
283
285
  if (elementRef) {
284
286
  elementRef.dispatchEvent(new CustomEvent("initeditingbldr"));
285
287
  }
@@ -291,6 +293,7 @@
291
293
  const contentId = $builderContextSignal.content?.id;
292
294
  const apiKeyProp = apiKey;
293
295
  _track({
296
+ apiHost: apiHost,
294
297
  type: "impression",
295
298
  canTrack: true,
296
299
  contentId,
@@ -40,14 +40,15 @@
40
40
  export let blocksWrapper: ContentProps["blocksWrapper"] = undefined;
41
41
  export let blocksWrapperProps: ContentProps["blocksWrapperProps"] = undefined;
42
42
  export let nonce: ContentProps["nonce"] = undefined;
43
+ export let apiHost: ContentProps["apiHost"] = undefined;
43
44
  export let enrich: ContentProps["enrich"] = undefined;
44
45
  export let showContent: ContentProps["showContent"];
45
46
  export let contentWrapper: ContentProps["contentWrapper"] = undefined;
46
47
  export let contentWrapperProps: ContentProps["contentWrapperProps"] =
47
48
  undefined;
48
49
  export let trustedHosts: ContentProps["trustedHosts"] = undefined;
49
- export let isSsrAbTest: ContentProps["isSsrAbTest"];
50
50
  export let isNestedRender: ContentProps["isNestedRender"] = undefined;
51
+ export let isSsrAbTest: ContentProps["isSsrAbTest"];
51
52
  export let linkComponent: ContentProps["linkComponent"] = undefined;
52
53
 
53
54
  function contentSetState(newRootState: BuilderRenderState) {
@@ -139,6 +140,7 @@
139
140
  </script>
140
141
 
141
142
  <EnableEditor
143
+ {apiHost}
142
144
  {nonce}
143
145
  {content}
144
146
  {data}
@@ -153,6 +155,7 @@
153
155
  {contentWrapper}
154
156
  {contentWrapperProps}
155
157
  {trustedHosts}
158
+ {isNestedRender}
156
159
  {...{}}
157
160
  >
158
161
  {#if isSsrAbTest}
@@ -29,6 +29,7 @@
29
29
  export let isNestedRender: VariantsProviderProps["isNestedRender"] =
30
30
  undefined;
31
31
  export let nonce: VariantsProviderProps["nonce"] = undefined;
32
+ export let apiHost: VariantsProviderProps["apiHost"] = undefined;
32
33
  export let model: VariantsProviderProps["model"] = undefined;
33
34
  export let data: VariantsProviderProps["data"] = undefined;
34
35
  export let context: VariantsProviderProps["context"] = undefined;
@@ -109,6 +110,7 @@
109
110
 
110
111
  {#each getVariants(content) as variant (variant.testVariationId)}
111
112
  <ContentComponent
113
+ {apiHost}
112
114
  {isNestedRender}
113
115
  {nonce}
114
116
  content={variant}
@@ -134,6 +136,7 @@
134
136
  {/each}
135
137
  {/if}
136
138
  <ContentComponent
139
+ {apiHost}
137
140
  {nonce}
138
141
  {isNestedRender}
139
142
  {...{}}
@@ -30,6 +30,11 @@ export interface ContentVariantsPrps extends ExtraFrameworkProps {
30
30
  * Your API Key: needed to enable visual editing, and to dynamically fetch symbols (required).
31
31
  */
32
32
  apiKey: string;
33
+
34
+ /**
35
+ * Sets the host of Builder API calls. (Defaults to global `https://cdn.builder.io`)
36
+ */
37
+ apiHost?: string;
33
38
  apiVersion?: ApiVersion;
34
39
 
35
40
  /**
@@ -1 +1 @@
1
- export const SDK_VERSION = "2.0.25"
1
+ export const SDK_VERSION = "2.0.28"
@@ -75,6 +75,7 @@ let IVM_CONTEXT: Context | null = null;
75
75
  * `safeDynamicRequire` trick to import the `isolated-vm` package.
76
76
  */
77
77
  export const setIvm = (ivm: IsolatedVMImport, options: IsolateOptions = {}) => {
78
+ if (IVM_INSTANCE) return;
78
79
  IVM_INSTANCE = ivm;
79
80
  setIsolateContext(options);
80
81
  };
@@ -102,6 +103,7 @@ const getIvm = (): IsolatedVMImport => {
102
103
  function setIsolateContext(options: IsolateOptions = {
103
104
  memoryLimit: 128
104
105
  }) {
106
+ if (IVM_CONTEXT) return IVM_CONTEXT;
105
107
  const ivm = getIvm();
106
108
  const isolate = new ivm.Isolate(options);
107
109
  const context = isolate.createContextSync();
@@ -120,9 +122,7 @@ function setIsolateContext(options: IsolateOptions = {
120
122
  return context;
121
123
  }
122
124
  const getIsolateContext = () => {
123
- if (IVM_CONTEXT) return IVM_CONTEXT;
124
- const context = setIsolateContext();
125
- return context;
125
+ return setIsolateContext();
126
126
  };
127
127
  export const runInNode = ({
128
128
  code,
@@ -0,0 +1 @@
1
+ export { setIvm } from './node-runtime'
@@ -20,7 +20,8 @@ export const generateContentUrl = (options: GetContentOptions): URL => {
20
20
  cacheSeconds,
21
21
  staleCacheSeconds,
22
22
  sort,
23
- includeUnpublished
23
+ includeUnpublished,
24
+ apiHost
24
25
  } = options;
25
26
  if (!apiKey) {
26
27
  throw new Error('Missing API key');
@@ -31,7 +32,8 @@ export const generateContentUrl = (options: GetContentOptions): URL => {
31
32
 
32
33
  // if we are fetching an array of content, we disable noTraverse for perf reasons.
33
34
  const noTraverse = limit !== 1;
34
- const url = new URL(`https://cdn.builder.io/api/${apiVersion}/content/${model}`);
35
+ const baseUrl = apiHost || 'https://cdn.builder.io';
36
+ const url = new URL(`${baseUrl}/api/${apiVersion}/content/${model}`);
35
37
  url.searchParams.set('apiKey', apiKey);
36
38
  url.searchParams.set('limit', String(limit));
37
39
  url.searchParams.set('noTraverse', String(noTraverse));
@@ -154,4 +154,9 @@ export interface GetContentOptions {
154
154
  * Optional fetch options to be passed as the second argument to the `fetch` function.
155
155
  */
156
156
  fetchOptions?: object;
157
+
158
+ /**
159
+ * Sets the host of Builder API calls. (Defaults to global `https://cdn.builder.io`)
160
+ */
161
+ apiHost?: string;
157
162
  }
@@ -99,7 +99,12 @@ const createEvent = async ({
99
99
  ownerId: apiKey
100
100
  }
101
101
  });
102
- export async function _track(eventProps: EventProps) {
102
+ export async function _track({
103
+ apiHost,
104
+ ...eventProps
105
+ }: EventProps & {
106
+ apiHost?: string;
107
+ }) {
103
108
  if (!eventProps.apiKey) {
104
109
  logger.error('Missing API key for track call. Please provide your API key.');
105
110
  return;
@@ -113,7 +118,8 @@ export async function _track(eventProps: EventProps) {
113
118
  if (!(isBrowser() || TARGET === 'reactNative')) {
114
119
  return;
115
120
  }
116
- return fetch(`https://cdn.builder.io/api/v1/track`, {
121
+ const baseUrl = apiHost || 'https://cdn.builder.io';
122
+ return fetch(`${baseUrl}/api/v1/track`, {
117
123
  method: 'POST',
118
124
  body: JSON.stringify({
119
125
  events: [await createEvent(eventProps)]