@weaverse/core 0.7.71 → 1.0.0

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/dist/index.d.ts CHANGED
@@ -40,7 +40,7 @@ declare let stichesUtils: {
40
40
  };
41
41
  };
42
42
 
43
- interface ProjectDataType {
43
+ interface WeaverseProjectDataType {
44
44
  items: ElementData[];
45
45
  rootId: string;
46
46
  script: {
@@ -55,11 +55,12 @@ interface BreakPoints {
55
55
  }
56
56
  interface WeaverseType {
57
57
  mediaBreakPoints?: BreakPoints;
58
- appUrl?: string;
59
- projectKey?: string;
60
- projectData?: ProjectDataType;
58
+ weaverseHost?: string;
59
+ projectId?: string;
60
+ data?: WeaverseProjectDataType;
61
61
  isDesignMode?: boolean;
62
62
  ssrMode?: boolean;
63
+ elementSchemas?: ElementSchema[];
63
64
  }
64
65
  interface WeaverseElement {
65
66
  Component: ForwardRefExoticComponent<any>;
@@ -250,17 +251,17 @@ declare class Weaverse {
250
251
  * Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
251
252
  * @type {string}
252
253
  */
253
- appUrl: string;
254
+ weaverseHost: string;
254
255
  /**
255
256
  * Weaverse project key to access project data via API
256
257
  * @type {string}
257
258
  */
258
- projectKey: string;
259
+ projectId: string;
259
260
  /**
260
261
  * Weaverse project data, by default, user can provide project data via React Component:
261
- * <WeaverseRoot defaultData={projectData} /> it will be used to server-side rendering
262
+ * <WeaverseRoot data={data} /> it will be used to server-side rendering
262
263
  */
263
- projectData: ProjectDataType;
264
+ data: WeaverseProjectDataType;
264
265
  /**
265
266
  * Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot
266
267
  * @type {Map<string, (data: any) => void>}
@@ -288,19 +289,21 @@ declare class Weaverse {
288
289
  */
289
290
  stitchesInstance: Stitches$1 | any;
290
291
  studioBridge?: any;
292
+ elementSchemas?: ElementSchema[];
291
293
  static WeaverseItemStore: typeof WeaverseItemStore;
292
294
  mediaBreakPoints: BreakPoints;
293
295
  /**
294
296
  * constructor
295
- * @param appUrl {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
296
- * @param projectKey {string} Weaverse project key to access project data via API
297
- * @param projectData {ProjectDataType} Weaverse project data, by default, user can provide project data via React Component.
297
+ * @param weaverseHost {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
298
+ * @param projectId {string} Weaverse project key to access project data via API
299
+ * @param data {WeaverseProjectDataType} Weaverse project data, by default, user can provide project data via React Component.
298
300
  * @param mediaBreakPoints {object} Pass down custom media query breakpoints or just use the default.
299
301
  * @param isDesignMode {boolean} check whether the sdk is isDesignMode or not
300
302
  * @param ssrMode {boolean} Use in element to optionally render special HTML for hydration
303
+ * @param elementSchemas {Array<ElementSchema>} List of element schemas
301
304
  */
302
- constructor({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode }?: WeaverseType);
303
- init({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode }?: WeaverseType): void;
305
+ constructor({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas }?: WeaverseType);
306
+ init({ weaverseHost, elementSchemas, projectId, data, mediaBreakPoints, isDesignMode, ssrMode }?: WeaverseType): void;
304
307
  initialized: boolean;
305
308
  initializeData: (data: any) => void;
306
309
  loadStudio(version?: string): void;
@@ -313,18 +316,7 @@ declare class Weaverse {
313
316
  subscribe(fn: any): void;
314
317
  unsubscribe(fn: any): void;
315
318
  triggerUpdate(): void;
316
- /**
317
- * Fetch data from Weaverse API (https://weaverse.io/api/v1/project/:projectKey)
318
- * @param fetch {fetch} custom fetch function, pass in custom fetch function if you want to use your own fetch function
319
- * @param appUrl
320
- * @param projectKey
321
- */
322
- static fetchProjectData({ fetch, appUrl, projectKey, }: {
323
- fetch?: any;
324
- appUrl?: string;
325
- projectKey?: string;
326
- }): any;
327
- setProjectData(projectData: ProjectDataType): void;
319
+ setProjectData(data: WeaverseProjectDataType): void;
328
320
  initProjectItemData(): void;
329
321
  }
330
322
 
@@ -340,4 +332,4 @@ declare function merge(target: Record<string, any>, source: Record<string, any>)
340
332
  [x: string]: any;
341
333
  };
342
334
 
343
- export { AdditionalInputConfigs, AdvancedGroup, AdvancedGroupType, BasicGroup, BasicInput, BreakPoints, CatalogGroup, ChildElement, ChildElementCSS, ChildElementSelector, ElementCSS, ElementCatalog, ElementData, ElementDataInCatalog, ElementFlags, ElementInspector, ElementSchema, FlagType, GridSize, InputType, ParentType, ProjectDataType, RangeInputConfigs, SelectInputConfigs, SortableInputConfigs, SortableItemAction, ToggleGroupConfigs, ToolbarAction, Weaverse, WeaverseCSSProperties, WeaverseElement, WeaverseItemStore, WeaverseType, isBrowser, isIframe, isReactNative, merge };
335
+ export { AdditionalInputConfigs, AdvancedGroup, AdvancedGroupType, BasicGroup, BasicInput, BreakPoints, CatalogGroup, ChildElement, ChildElementCSS, ChildElementSelector, ElementCSS, ElementCatalog, ElementData, ElementDataInCatalog, ElementFlags, ElementInspector, ElementSchema, FlagType, GridSize, InputType, ParentType, RangeInputConfigs, SelectInputConfigs, SortableInputConfigs, SortableItemAction, ToggleGroupConfigs, ToolbarAction, Weaverse, WeaverseCSSProperties, WeaverseElement, WeaverseItemStore, WeaverseProjectDataType, WeaverseType, isBrowser, isIframe, isReactNative, merge };
package/dist/index.js CHANGED
@@ -155,14 +155,15 @@ var WeaverseItemStore = class {
155
155
  var Weaverse = class {
156
156
  /**
157
157
  * constructor
158
- * @param appUrl {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
159
- * @param projectKey {string} Weaverse project key to access project data via API
160
- * @param projectData {ProjectDataType} Weaverse project data, by default, user can provide project data via React Component.
158
+ * @param weaverseHost {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
159
+ * @param projectId {string} Weaverse project key to access project data via API
160
+ * @param data {WeaverseProjectDataType} Weaverse project data, by default, user can provide project data via React Component.
161
161
  * @param mediaBreakPoints {object} Pass down custom media query breakpoints or just use the default.
162
162
  * @param isDesignMode {boolean} check whether the sdk is isDesignMode or not
163
163
  * @param ssrMode {boolean} Use in element to optionally render special HTML for hydration
164
+ * @param elementSchemas {Array<ElementSchema>} List of element schemas
164
165
  */
165
- constructor({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode } = {}) {
166
+ constructor({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas } = {}) {
166
167
  /**
167
168
  * For storing, registering element React component from Weaverse or created by user/developer
168
169
  */
@@ -175,17 +176,17 @@ var Weaverse = class {
175
176
  * Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
176
177
  * @type {string}
177
178
  */
178
- this.appUrl = process.env.NODE_ENV === "development" ? "http://localhost:3000" : "https://studio.weaverse.io";
179
+ this.weaverseHost = process.env.NODE_ENV === "development" ? "http://localhost:3000" : "https://studio.weaverse.io";
179
180
  /**
180
181
  * Weaverse project key to access project data via API
181
182
  * @type {string}
182
183
  */
183
- this.projectKey = "";
184
+ this.projectId = "";
184
185
  /**
185
186
  * Weaverse project data, by default, user can provide project data via React Component:
186
- * <WeaverseRoot defaultData={projectData} /> it will be used to server-side rendering
187
+ * <WeaverseRoot data={data} /> it will be used to server-side rendering
187
188
  */
188
- this.projectData = {
189
+ this.data = {
189
190
  rootId: "",
190
191
  items: [],
191
192
  script: { css: "", js: "" }
@@ -220,12 +221,13 @@ var Weaverse = class {
220
221
  };
221
222
  this.initialized = false;
222
223
  this.initializeData = (data) => {
224
+ console.log("initializeData", data);
223
225
  if (!this.initialized) {
224
- let { projectData, published, id, projectKey, studioUrl } = data;
225
- this.projectKey = projectKey || this.projectKey;
226
- this.appUrl = studioUrl || this.appUrl;
227
- this.projectData = { ...projectData, pageId: id };
228
- this.isDesignMode = !published;
226
+ let { data: d, isDesignMode, id, projectId, weaverseHost } = data;
227
+ this.projectId = projectId || this.projectId;
228
+ this.weaverseHost = weaverseHost || this.weaverseHost;
229
+ this.data = { ...d, pageId: id };
230
+ this.isDesignMode = isDesignMode;
229
231
  this.initProjectItemData();
230
232
  if (this.isDesignMode) {
231
233
  this.initStitches();
@@ -242,15 +244,16 @@ var Weaverse = class {
242
244
  utils: stichesUtils
243
245
  });
244
246
  };
245
- this.init({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode });
247
+ this.init({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas });
246
248
  }
247
- init({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode } = {}) {
248
- this.appUrl = appUrl || this.appUrl;
249
- this.projectKey = projectKey || this.projectKey;
249
+ init({ weaverseHost, elementSchemas, projectId, data, mediaBreakPoints, isDesignMode, ssrMode } = {}) {
250
+ this.elementSchemas = elementSchemas || this.elementSchemas;
251
+ this.weaverseHost = weaverseHost || this.weaverseHost;
252
+ this.projectId = projectId || this.projectId;
250
253
  this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints;
251
254
  this.isDesignMode = isDesignMode || this.isDesignMode;
252
255
  this.ssrMode = ssrMode || this.ssrMode;
253
- this.projectData = projectData || this.projectData;
256
+ this.data = data || this.data;
254
257
  this.initStitches();
255
258
  this.initProjectItemData();
256
259
  }
@@ -266,7 +269,7 @@ var Weaverse = class {
266
269
  let i = setInterval(() => {
267
270
  if (!window.WeaverseStudioBridge) {
268
271
  let studioBridgeScript = document.createElement("script");
269
- studioBridgeScript.src = `${this.appUrl}/assets/studio/studio-bridge.js?v=${version}`;
272
+ studioBridgeScript.src = `${this.weaverseHost}/assets/studio/studio-bridge.js?v=${version}`;
270
273
  studioBridgeScript.type = "module";
271
274
  studioBridgeScript.onload = initStudio;
272
275
  document.body.appendChild(studioBridgeScript);
@@ -299,26 +302,13 @@ var Weaverse = class {
299
302
  triggerUpdate() {
300
303
  this.listeners.forEach((fn) => fn());
301
304
  }
302
- /**
303
- * Fetch data from Weaverse API (https://weaverse.io/api/v1/project/:projectKey)
304
- * @param fetch {fetch} custom fetch function, pass in custom fetch function if you want to use your own fetch function
305
- * @param appUrl
306
- * @param projectKey
307
- */
308
- static fetchProjectData({
309
- fetch = globalThis.fetch,
310
- appUrl,
311
- projectKey
312
- }) {
313
- return fetch(appUrl + `/api/public/project/${projectKey}`).then((res) => res.json()).catch((err) => console.log("Error fetching project data:", err));
314
- }
315
- setProjectData(projectData) {
316
- this.projectData = projectData;
305
+ setProjectData(data) {
306
+ this.data = data;
317
307
  this.initProjectItemData();
318
308
  this.triggerUpdate();
319
309
  }
320
310
  initProjectItemData() {
321
- const data = this.projectData;
311
+ const data = this.data;
322
312
  if (data?.items) {
323
313
  data.items.forEach((item) => {
324
314
  if (!this.itemInstances.get(item.id)) {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/core.ts","../src/utils/index.ts","../src/utils/styles.ts"],"sourcesContent":["export * from \"./types\"\nexport * from \"./core\"\nexport * from \"./utils\"\n","// TODO: Implement Weaverse SDK class\n// Only core code is implemented here, avoid importing other packages,\n// the core code should be framework agnostic, no react, vue, angular, etc.\n// noinspection JSUnusedGlobalSymbols\n\n// using stitches core only for framework-agnostic code\nimport * as stitches from \"@stitches/core\"\nimport type Stitches from \"@stitches/core/types/stitches\"\nimport type { RefObject } from \"react\"\nimport type {\n BreakPoints,\n ElementData,\n ElementFlags,\n WeaverseProjectDataType,\n WeaverseElement,\n WeaverseType,\n ElementSchema\n} from './types'\nimport { isIframe, merge } from \"./utils\"\nimport { stichesUtils } from \"./utils/styles\"\n\n/**\n * WeaverseItemStore is a store for Weaverse item, it can be used to subscribe/update the item data\n * @param itemData {ElementData} Weaverse item data\n * @param weaverse {Weaverse} Weaverse instance\n * @example\n * useEffect(() => {\n * let handleUpdate = (update: any) => {\n * setData({...update})\n * }\n * itemInstance.subscribe(handleUpdate)\n * return () => {\n * itemInstance.unsubscribe(handleUpdate)\n * }\n * }, [])\n */\nexport class WeaverseItemStore {\n listeners: Set<any> = new Set()\n ref: RefObject<HTMLElement> = {\n current: null,\n }\n weaverse: Weaverse\n stitchesClass = \"\"\n _data: ElementData = { id: \"\", type: \"\" }\n _flags: ElementFlags = {}\n\n constructor(itemData: ElementData, weaverse: Weaverse) {\n let { type, id } = itemData\n this.weaverse = weaverse\n if (id && type) {\n weaverse.itemInstances.set(id, this)\n this.data = { ...itemData }\n }\n }\n\n get _id() {\n return this._data.id\n }\n get _element() {\n return this.ref.current\n }\n\n get Element() {\n return this.weaverse.elementInstances.get(this._data.type!)\n }\n\n set data(data: Omit<ElementData, \"id\" | \"type\">) {\n this._data = { ...this.data, ...data }\n }\n\n get data(): ElementData {\n let defaultCss = this.Element?.defaultCss || {}\n let currentCss = this._data.css || {}\n let css = merge(defaultCss, currentCss)\n let defaultData = { ...this.Element?.Component?.defaultProps }\n return { ...defaultData, ...this._data, css }\n }\n\n setData = (data: Omit<ElementData, \"id\" | \"type\">) => {\n this.data = Object.assign(this.data, data)\n this.triggerUpdate()\n return this.data\n }\n\n subscribe = (fn: any) => {\n this.listeners.add(fn)\n }\n\n unsubscribe = (fn: any) => {\n this.listeners.delete(fn)\n }\n\n triggerUpdate = () => {\n this.listeners.forEach((fn) => {\n return fn(this.data)\n })\n }\n}\n\nexport class Weaverse {\n /**\n * The `weaverse-content-root` element of Weaverse SDK\n */\n contentRootElement: HTMLElement | undefined\n /**\n * For storing, registering element React component from Weaverse or created by user/developer\n */\n elementInstances = new Map<string, WeaverseElement>()\n /**\n * list of element/items store to provide data, handle state update, state sharing, etc.\n */\n itemInstances = new Map<string | number, WeaverseItemStore>()\n /**\n * Weaverse base URL that can provide by user/developer. for local development, use localhost:3000\n * @type {string}\n */\n weaverseHost: string = process.env.NODE_ENV === \"development\" ? \"http://localhost:3000\" : \"https://studio.weaverse.io\"\n /**\n * Weaverse project key to access project data via API\n * @type {string}\n */\n projectId = \"\"\n /**\n * Weaverse project data, by default, user can provide project data via React Component:\n * <WeaverseRoot data={data} /> it will be used to server-side rendering\n */\n data: WeaverseProjectDataType = {\n rootId: \"\",\n items: [],\n script: { css: \"\", js: \"\" },\n }\n /**\n * Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot\n * @type {Map<string, (data: any) => void>}\n */\n listeners: Set<any> = new Set()\n /**\n * Check whether the sdk is in editor or not.\n * If isDesignMode is true, it means the sdk is isDesignMode mode, render the editor UI,\n * else render the preview UI, plain HTML + CSS + React hydrate\n * @type {boolean}\n */\n isDesignMode = false\n\n /**\n * Check whether the sdk is in preview mode or not\n * @type {boolean}\n */\n isPreviewMode = false\n\n /**\n * Use in element to optionally render special HTML for hydration\n * @type {boolean}\n */\n ssrMode = false\n /**\n * Stitches instance for handling CSS stylesheet, media, theme for Weaverse project\n */\n stitchesInstance: Stitches | any\n\n studioBridge?: any\n elementSchemas?: ElementSchema[]\n static WeaverseItemStore: typeof WeaverseItemStore = WeaverseItemStore\n\n mediaBreakPoints: BreakPoints = {\n desktop: \"all\",\n // max-width need to subtract 0.02px to prevent bug https://getbootstrap.com/docs/5.1/layout/breakpoints/#max-width\n // tablet: \"(max-width: 1023.98px)\", // to set css for tablet, {'@tablet' : { // css }},\n mobile: \"(max-width: 767.98px)\",\n }\n\n /**\n * constructor\n * @param weaverseHost {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000\n * @param projectId {string} Weaverse project key to access project data via API\n * @param data {WeaverseProjectDataType} Weaverse project data, by default, user can provide project data via React Component.\n * @param mediaBreakPoints {object} Pass down custom media query breakpoints or just use the default.\n * @param isDesignMode {boolean} check whether the sdk is isDesignMode or not\n * @param ssrMode {boolean} Use in element to optionally render special HTML for hydration\n * @param elementSchemas {Array<ElementSchema>} List of element schemas\n */\n constructor({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas }: WeaverseType = {}) {\n this.init({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas })\n }\n\n init({ weaverseHost,elementSchemas, projectId, data, mediaBreakPoints, isDesignMode, ssrMode }: WeaverseType = {}) {\n this.elementSchemas = elementSchemas || this.elementSchemas\n this.weaverseHost = weaverseHost || this.weaverseHost\n this.projectId = projectId || this.projectId\n this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints\n this.isDesignMode = isDesignMode || this.isDesignMode\n this.ssrMode = ssrMode || this.ssrMode\n this.data = data || this.data\n this.initStitches()\n this.initProjectItemData()\n }\n\n initialized = false\n initializeData = (data: any) => {\n console.log(\"initializeData\", data)\n if (!this.initialized) {\n let { data: d, isDesignMode, id, projectId, weaverseHost } = data\n this.projectId = projectId || this.projectId\n this.weaverseHost = weaverseHost || this.weaverseHost\n this.data = { ...d, pageId: id }\n this.isDesignMode = isDesignMode\n this.initProjectItemData()\n if (this.isDesignMode) {\n this.initStitches()\n this.triggerUpdate()\n this.loadStudio()\n }\n }\n this.initialized = true\n }\n\n loadStudio(version?: string) {\n console.log(\"load studio\")\n if (isIframe && this.isDesignMode && !this.studioBridge) {\n const initStudio = () => {\n this.studioBridge = new window.WeaverseStudioBridge(this)\n // Make event listeners from studio work\n this.triggerUpdate()\n console.log(\"Studio loaded\", this)\n clearInterval(i)\n }\n let i = setInterval(() => {\n if (!window.WeaverseStudioBridge) {\n // Studio bridge script source -> https://weaverse.io/assets/studio/studio-bridge.js\n let studioBridgeScript = document.createElement(\"script\")\n studioBridgeScript.src = `${this.weaverseHost}/assets/studio/studio-bridge.js?v=${version}`\n studioBridgeScript.type = \"module\"\n studioBridgeScript.onload = initStudio\n document.body.appendChild(studioBridgeScript)\n } else {\n initStudio()\n }\n }, 2000)\n }\n }\n\n /**\n * Register the custom React Component to Weaverse, store it into Weaverse.elementInstances\n * @param element {WeaverseElement} custom React Component\n */\n registerElement(element: WeaverseElement) {\n if (element?.type) {\n if (this.elementInstances.has(element.type)) {\n throw new Error(`Weaverse: Element '${element.type}' already registered`)\n }\n this.elementInstances.set(element?.type, element)\n } else {\n throw new Error(\"Weaverse: registerElement: `type` is required\")\n }\n }\n\n initStitches = () => {\n this.stitchesInstance =\n this.stitchesInstance ||\n stitches.createStitches({\n prefix: \"weaverse\",\n media: this.mediaBreakPoints,\n utils: stichesUtils,\n })\n }\n\n subscribe(fn: any) {\n this.listeners.add(fn)\n }\n\n unsubscribe(fn: any) {\n this.listeners.delete(fn)\n }\n\n triggerUpdate() {\n this.listeners.forEach((fn) => fn())\n }\n\n\n setProjectData(data: WeaverseProjectDataType) {\n this.data = data\n this.initProjectItemData()\n this.triggerUpdate()\n }\n\n initProjectItemData() {\n const data = this.data\n if (data?.items) {\n data.items.forEach((item) => {\n if (!this.itemInstances.get(item.id as string | number)) {\n new WeaverseItemStore(item, this)\n }\n })\n }\n }\n}\n","export let isReactNative = typeof navigator === \"object\" && navigator.product === \"ReactNative\"\nexport let isBrowser = typeof window !== \"undefined\" && !isReactNative\nexport let isIframe = isBrowser && window.top !== window.self\n\n/**\n * Deep merge two objects.\n * @param target\n * @param source\n */\nexport function merge(target: Record<string, any>, source: Record<string, any>) {\n let t = { ...(target || {}) }\n // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties\n for (let key of Object.keys(source)) {\n if (source[key] instanceof Object && !Array.isArray(source[key])) {\n Object.assign(source[key], merge(t[key], source[key]))\n }\n }\n\n // Join `target` and modified `source`\n Object.assign(t || {}, source)\n return t\n}\n","export let stichesUtils = {\n // Abbreviated margin properties\n m: (value: string) => ({\n margin: value,\n }),\n mt: (value: string) => ({\n marginTop: value,\n }),\n mr: (value: string) => ({\n marginRight: value,\n }),\n mb: (value: string) => ({\n marginBottom: value,\n }),\n ml: (value: string) => ({\n marginLeft: value,\n }),\n mx: (value: string) => ({\n marginLeft: value,\n marginRight: value,\n }),\n my: (value: string) => ({\n marginTop: value,\n marginBottom: value,\n }),\n\n // A property for applying width/height together\n size: (value: string) => ({\n width: value,\n height: value,\n }),\n // Abbreviated padding properties\n px: (value: string) => ({\n paddingLeft: value,\n paddingRight: value,\n }),\n py: (value: string) => ({\n paddingTop: value,\n paddingBottom: value,\n }),\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -114,14 +114,15 @@ var WeaverseItemStore = class {
114
114
  var Weaverse = class {
115
115
  /**
116
116
  * constructor
117
- * @param appUrl {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
118
- * @param projectKey {string} Weaverse project key to access project data via API
119
- * @param projectData {ProjectDataType} Weaverse project data, by default, user can provide project data via React Component.
117
+ * @param weaverseHost {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
118
+ * @param projectId {string} Weaverse project key to access project data via API
119
+ * @param data {WeaverseProjectDataType} Weaverse project data, by default, user can provide project data via React Component.
120
120
  * @param mediaBreakPoints {object} Pass down custom media query breakpoints or just use the default.
121
121
  * @param isDesignMode {boolean} check whether the sdk is isDesignMode or not
122
122
  * @param ssrMode {boolean} Use in element to optionally render special HTML for hydration
123
+ * @param elementSchemas {Array<ElementSchema>} List of element schemas
123
124
  */
124
- constructor({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode } = {}) {
125
+ constructor({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas } = {}) {
125
126
  /**
126
127
  * For storing, registering element React component from Weaverse or created by user/developer
127
128
  */
@@ -134,17 +135,17 @@ var Weaverse = class {
134
135
  * Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
135
136
  * @type {string}
136
137
  */
137
- this.appUrl = process.env.NODE_ENV === "development" ? "http://localhost:3000" : "https://studio.weaverse.io";
138
+ this.weaverseHost = process.env.NODE_ENV === "development" ? "http://localhost:3000" : "https://studio.weaverse.io";
138
139
  /**
139
140
  * Weaverse project key to access project data via API
140
141
  * @type {string}
141
142
  */
142
- this.projectKey = "";
143
+ this.projectId = "";
143
144
  /**
144
145
  * Weaverse project data, by default, user can provide project data via React Component:
145
- * <WeaverseRoot defaultData={projectData} /> it will be used to server-side rendering
146
+ * <WeaverseRoot data={data} /> it will be used to server-side rendering
146
147
  */
147
- this.projectData = {
148
+ this.data = {
148
149
  rootId: "",
149
150
  items: [],
150
151
  script: { css: "", js: "" }
@@ -179,12 +180,13 @@ var Weaverse = class {
179
180
  };
180
181
  this.initialized = false;
181
182
  this.initializeData = (data) => {
183
+ console.log("initializeData", data);
182
184
  if (!this.initialized) {
183
- let { projectData, published, id, projectKey, studioUrl } = data;
184
- this.projectKey = projectKey || this.projectKey;
185
- this.appUrl = studioUrl || this.appUrl;
186
- this.projectData = { ...projectData, pageId: id };
187
- this.isDesignMode = !published;
185
+ let { data: d, isDesignMode, id, projectId, weaverseHost } = data;
186
+ this.projectId = projectId || this.projectId;
187
+ this.weaverseHost = weaverseHost || this.weaverseHost;
188
+ this.data = { ...d, pageId: id };
189
+ this.isDesignMode = isDesignMode;
188
190
  this.initProjectItemData();
189
191
  if (this.isDesignMode) {
190
192
  this.initStitches();
@@ -201,15 +203,16 @@ var Weaverse = class {
201
203
  utils: stichesUtils
202
204
  });
203
205
  };
204
- this.init({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode });
206
+ this.init({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas });
205
207
  }
206
- init({ appUrl, projectKey, projectData, mediaBreakPoints, isDesignMode, ssrMode } = {}) {
207
- this.appUrl = appUrl || this.appUrl;
208
- this.projectKey = projectKey || this.projectKey;
208
+ init({ weaverseHost, elementSchemas, projectId, data, mediaBreakPoints, isDesignMode, ssrMode } = {}) {
209
+ this.elementSchemas = elementSchemas || this.elementSchemas;
210
+ this.weaverseHost = weaverseHost || this.weaverseHost;
211
+ this.projectId = projectId || this.projectId;
209
212
  this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints;
210
213
  this.isDesignMode = isDesignMode || this.isDesignMode;
211
214
  this.ssrMode = ssrMode || this.ssrMode;
212
- this.projectData = projectData || this.projectData;
215
+ this.data = data || this.data;
213
216
  this.initStitches();
214
217
  this.initProjectItemData();
215
218
  }
@@ -225,7 +228,7 @@ var Weaverse = class {
225
228
  let i = setInterval(() => {
226
229
  if (!window.WeaverseStudioBridge) {
227
230
  let studioBridgeScript = document.createElement("script");
228
- studioBridgeScript.src = `${this.appUrl}/assets/studio/studio-bridge.js?v=${version}`;
231
+ studioBridgeScript.src = `${this.weaverseHost}/assets/studio/studio-bridge.js?v=${version}`;
229
232
  studioBridgeScript.type = "module";
230
233
  studioBridgeScript.onload = initStudio;
231
234
  document.body.appendChild(studioBridgeScript);
@@ -258,26 +261,13 @@ var Weaverse = class {
258
261
  triggerUpdate() {
259
262
  this.listeners.forEach((fn) => fn());
260
263
  }
261
- /**
262
- * Fetch data from Weaverse API (https://weaverse.io/api/v1/project/:projectKey)
263
- * @param fetch {fetch} custom fetch function, pass in custom fetch function if you want to use your own fetch function
264
- * @param appUrl
265
- * @param projectKey
266
- */
267
- static fetchProjectData({
268
- fetch = globalThis.fetch,
269
- appUrl,
270
- projectKey
271
- }) {
272
- return fetch(appUrl + `/api/public/project/${projectKey}`).then((res) => res.json()).catch((err) => console.log("Error fetching project data:", err));
273
- }
274
- setProjectData(projectData) {
275
- this.projectData = projectData;
264
+ setProjectData(data) {
265
+ this.data = data;
276
266
  this.initProjectItemData();
277
267
  this.triggerUpdate();
278
268
  }
279
269
  initProjectItemData() {
280
- const data = this.projectData;
270
+ const data = this.data;
281
271
  if (data?.items) {
282
272
  data.items.forEach((item) => {
283
273
  if (!this.itemInstances.get(item.id)) {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core.ts","../src/utils/index.ts","../src/utils/styles.ts"],"sourcesContent":["// TODO: Implement Weaverse SDK class\n// Only core code is implemented here, avoid importing other packages,\n// the core code should be framework agnostic, no react, vue, angular, etc.\n// noinspection JSUnusedGlobalSymbols\n\n// using stitches core only for framework-agnostic code\nimport * as stitches from \"@stitches/core\"\nimport type Stitches from \"@stitches/core/types/stitches\"\nimport type { RefObject } from \"react\"\nimport type {\n BreakPoints,\n ElementData,\n ElementFlags,\n WeaverseProjectDataType,\n WeaverseElement,\n WeaverseType,\n ElementSchema\n} from './types'\nimport { isIframe, merge } from \"./utils\"\nimport { stichesUtils } from \"./utils/styles\"\n\n/**\n * WeaverseItemStore is a store for Weaverse item, it can be used to subscribe/update the item data\n * @param itemData {ElementData} Weaverse item data\n * @param weaverse {Weaverse} Weaverse instance\n * @example\n * useEffect(() => {\n * let handleUpdate = (update: any) => {\n * setData({...update})\n * }\n * itemInstance.subscribe(handleUpdate)\n * return () => {\n * itemInstance.unsubscribe(handleUpdate)\n * }\n * }, [])\n */\nexport class WeaverseItemStore {\n listeners: Set<any> = new Set()\n ref: RefObject<HTMLElement> = {\n current: null,\n }\n weaverse: Weaverse\n stitchesClass = \"\"\n _data: ElementData = { id: \"\", type: \"\" }\n _flags: ElementFlags = {}\n\n constructor(itemData: ElementData, weaverse: Weaverse) {\n let { type, id } = itemData\n this.weaverse = weaverse\n if (id && type) {\n weaverse.itemInstances.set(id, this)\n this.data = { ...itemData }\n }\n }\n\n get _id() {\n return this._data.id\n }\n get _element() {\n return this.ref.current\n }\n\n get Element() {\n return this.weaverse.elementInstances.get(this._data.type!)\n }\n\n set data(data: Omit<ElementData, \"id\" | \"type\">) {\n this._data = { ...this.data, ...data }\n }\n\n get data(): ElementData {\n let defaultCss = this.Element?.defaultCss || {}\n let currentCss = this._data.css || {}\n let css = merge(defaultCss, currentCss)\n let defaultData = { ...this.Element?.Component?.defaultProps }\n return { ...defaultData, ...this._data, css }\n }\n\n setData = (data: Omit<ElementData, \"id\" | \"type\">) => {\n this.data = Object.assign(this.data, data)\n this.triggerUpdate()\n return this.data\n }\n\n subscribe = (fn: any) => {\n this.listeners.add(fn)\n }\n\n unsubscribe = (fn: any) => {\n this.listeners.delete(fn)\n }\n\n triggerUpdate = () => {\n this.listeners.forEach((fn) => {\n return fn(this.data)\n })\n }\n}\n\nexport class Weaverse {\n /**\n * The `weaverse-content-root` element of Weaverse SDK\n */\n contentRootElement: HTMLElement | undefined\n /**\n * For storing, registering element React component from Weaverse or created by user/developer\n */\n elementInstances = new Map<string, WeaverseElement>()\n /**\n * list of element/items store to provide data, handle state update, state sharing, etc.\n */\n itemInstances = new Map<string | number, WeaverseItemStore>()\n /**\n * Weaverse base URL that can provide by user/developer. for local development, use localhost:3000\n * @type {string}\n */\n weaverseHost: string = process.env.NODE_ENV === \"development\" ? \"http://localhost:3000\" : \"https://studio.weaverse.io\"\n /**\n * Weaverse project key to access project data via API\n * @type {string}\n */\n projectId = \"\"\n /**\n * Weaverse project data, by default, user can provide project data via React Component:\n * <WeaverseRoot data={data} /> it will be used to server-side rendering\n */\n data: WeaverseProjectDataType = {\n rootId: \"\",\n items: [],\n script: { css: \"\", js: \"\" },\n }\n /**\n * Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot\n * @type {Map<string, (data: any) => void>}\n */\n listeners: Set<any> = new Set()\n /**\n * Check whether the sdk is in editor or not.\n * If isDesignMode is true, it means the sdk is isDesignMode mode, render the editor UI,\n * else render the preview UI, plain HTML + CSS + React hydrate\n * @type {boolean}\n */\n isDesignMode = false\n\n /**\n * Check whether the sdk is in preview mode or not\n * @type {boolean}\n */\n isPreviewMode = false\n\n /**\n * Use in element to optionally render special HTML for hydration\n * @type {boolean}\n */\n ssrMode = false\n /**\n * Stitches instance for handling CSS stylesheet, media, theme for Weaverse project\n */\n stitchesInstance: Stitches | any\n\n studioBridge?: any\n elementSchemas?: ElementSchema[]\n static WeaverseItemStore: typeof WeaverseItemStore = WeaverseItemStore\n\n mediaBreakPoints: BreakPoints = {\n desktop: \"all\",\n // max-width need to subtract 0.02px to prevent bug https://getbootstrap.com/docs/5.1/layout/breakpoints/#max-width\n // tablet: \"(max-width: 1023.98px)\", // to set css for tablet, {'@tablet' : { // css }},\n mobile: \"(max-width: 767.98px)\",\n }\n\n /**\n * constructor\n * @param weaverseHost {string} Weaverse base URL that can provide by user/developer. for local development, use localhost:3000\n * @param projectId {string} Weaverse project key to access project data via API\n * @param data {WeaverseProjectDataType} Weaverse project data, by default, user can provide project data via React Component.\n * @param mediaBreakPoints {object} Pass down custom media query breakpoints or just use the default.\n * @param isDesignMode {boolean} check whether the sdk is isDesignMode or not\n * @param ssrMode {boolean} Use in element to optionally render special HTML for hydration\n * @param elementSchemas {Array<ElementSchema>} List of element schemas\n */\n constructor({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas }: WeaverseType = {}) {\n this.init({ weaverseHost, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, elementSchemas })\n }\n\n init({ weaverseHost,elementSchemas, projectId, data, mediaBreakPoints, isDesignMode, ssrMode }: WeaverseType = {}) {\n this.elementSchemas = elementSchemas || this.elementSchemas\n this.weaverseHost = weaverseHost || this.weaverseHost\n this.projectId = projectId || this.projectId\n this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints\n this.isDesignMode = isDesignMode || this.isDesignMode\n this.ssrMode = ssrMode || this.ssrMode\n this.data = data || this.data\n this.initStitches()\n this.initProjectItemData()\n }\n\n initialized = false\n initializeData = (data: any) => {\n console.log(\"initializeData\", data)\n if (!this.initialized) {\n let { data: d, isDesignMode, id, projectId, weaverseHost } = data\n this.projectId = projectId || this.projectId\n this.weaverseHost = weaverseHost || this.weaverseHost\n this.data = { ...d, pageId: id }\n this.isDesignMode = isDesignMode\n this.initProjectItemData()\n if (this.isDesignMode) {\n this.initStitches()\n this.triggerUpdate()\n this.loadStudio()\n }\n }\n this.initialized = true\n }\n\n loadStudio(version?: string) {\n console.log(\"load studio\")\n if (isIframe && this.isDesignMode && !this.studioBridge) {\n const initStudio = () => {\n this.studioBridge = new window.WeaverseStudioBridge(this)\n // Make event listeners from studio work\n this.triggerUpdate()\n console.log(\"Studio loaded\", this)\n clearInterval(i)\n }\n let i = setInterval(() => {\n if (!window.WeaverseStudioBridge) {\n // Studio bridge script source -> https://weaverse.io/assets/studio/studio-bridge.js\n let studioBridgeScript = document.createElement(\"script\")\n studioBridgeScript.src = `${this.weaverseHost}/assets/studio/studio-bridge.js?v=${version}`\n studioBridgeScript.type = \"module\"\n studioBridgeScript.onload = initStudio\n document.body.appendChild(studioBridgeScript)\n } else {\n initStudio()\n }\n }, 2000)\n }\n }\n\n /**\n * Register the custom React Component to Weaverse, store it into Weaverse.elementInstances\n * @param element {WeaverseElement} custom React Component\n */\n registerElement(element: WeaverseElement) {\n if (element?.type) {\n if (this.elementInstances.has(element.type)) {\n throw new Error(`Weaverse: Element '${element.type}' already registered`)\n }\n this.elementInstances.set(element?.type, element)\n } else {\n throw new Error(\"Weaverse: registerElement: `type` is required\")\n }\n }\n\n initStitches = () => {\n this.stitchesInstance =\n this.stitchesInstance ||\n stitches.createStitches({\n prefix: \"weaverse\",\n media: this.mediaBreakPoints,\n utils: stichesUtils,\n })\n }\n\n subscribe(fn: any) {\n this.listeners.add(fn)\n }\n\n unsubscribe(fn: any) {\n this.listeners.delete(fn)\n }\n\n triggerUpdate() {\n this.listeners.forEach((fn) => fn())\n }\n\n\n setProjectData(data: WeaverseProjectDataType) {\n this.data = data\n this.initProjectItemData()\n this.triggerUpdate()\n }\n\n initProjectItemData() {\n const data = this.data\n if (data?.items) {\n data.items.forEach((item) => {\n if (!this.itemInstances.get(item.id as string | number)) {\n new WeaverseItemStore(item, this)\n }\n })\n }\n }\n}\n","export let isReactNative = typeof navigator === \"object\" && navigator.product === \"ReactNative\"\nexport let isBrowser = typeof window !== \"undefined\" && !isReactNative\nexport let isIframe = isBrowser && window.top !== window.self\n\n/**\n * Deep merge two objects.\n * @param target\n * @param source\n */\nexport function merge(target: Record<string, any>, source: Record<string, any>) {\n let t = { ...(target || {}) }\n // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties\n for (let key of Object.keys(source)) {\n if (source[key] instanceof Object && !Array.isArray(source[key])) {\n Object.assign(source[key], merge(t[key], source[key]))\n }\n }\n\n // Join `target` and modified `source`\n Object.assign(t || {}, source)\n return t\n}\n","export let stichesUtils = {\n // Abbreviated margin properties\n m: (value: string) => ({\n margin: value,\n }),\n mt: (value: string) => ({\n marginTop: value,\n }),\n mr: (value: string) => ({\n marginRight: value,\n }),\n mb: (value: string) => ({\n marginBottom: value,\n }),\n ml: (value: string) => ({\n marginLeft: value,\n }),\n mx: (value: string) => ({\n marginLeft: value,\n marginRight: value,\n }),\n my: (value: string) => ({\n marginTop: value,\n marginBottom: value,\n }),\n\n // A property for applying width/height together\n size: (value: string) => ({\n width: value,\n height: value,\n }),\n // Abbreviated padding properties\n px: (value: string) => ({\n paddingLeft: value,\n paddingRight: value,\n }),\n py: (value: string) => ({\n paddingTop: value,\n paddingBottom: value,\n }),\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.71",
2
+ "version": "1.0.0",
3
3
  "license": "MIT",
4
4
  "main": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",