@weaverse/core 1.0.45 → 1.0.46
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 +17 -31
- package/dist/index.js +40 -80
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -80
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -1
package/dist/index.d.ts
CHANGED
|
@@ -40,27 +40,13 @@ declare let stitchesUtils: {
|
|
|
40
40
|
};
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
/**
|
|
44
|
-
* WeaverseItemStore is a store for Weaverse item, it can be used to subscribe/update the item data
|
|
45
|
-
* @param itemData {ElementData} Weaverse item data
|
|
46
|
-
* @param weaverse {Weaverse} Weaverse instance
|
|
47
|
-
* @example
|
|
48
|
-
* useEffect(() => {
|
|
49
|
-
* let handleUpdate = (update: any) => {
|
|
50
|
-
* setData({...update})
|
|
51
|
-
* }
|
|
52
|
-
* itemInstance.subscribe(handleUpdate)
|
|
53
|
-
* return () => {
|
|
54
|
-
* itemInstance.unsubscribe(handleUpdate)
|
|
55
|
-
* }
|
|
56
|
-
* }, [])
|
|
57
|
-
*/
|
|
58
43
|
declare class WeaverseItemStore {
|
|
59
|
-
listeners: Set<any>;
|
|
60
|
-
ref: RefObject<HTMLElement>;
|
|
61
44
|
weaverse: Weaverse;
|
|
45
|
+
listeners: Set<(_: ElementData) => void>;
|
|
46
|
+
ref: RefObject<HTMLElement>;
|
|
47
|
+
platformType: PlatformTypeEnum;
|
|
62
48
|
stitchesClass: string;
|
|
63
|
-
|
|
49
|
+
_store: ElementData;
|
|
64
50
|
constructor(itemData: ElementData, weaverse: Weaverse);
|
|
65
51
|
get _id(): string;
|
|
66
52
|
get _element(): HTMLElement | null;
|
|
@@ -69,8 +55,8 @@ declare class WeaverseItemStore {
|
|
|
69
55
|
set data(update: Omit<ElementData, "id" | "type">);
|
|
70
56
|
get data(): ElementData;
|
|
71
57
|
setData: (update: Omit<ElementData, "id" | "type">) => ElementData;
|
|
72
|
-
subscribe: (fn:
|
|
73
|
-
unsubscribe: (fn:
|
|
58
|
+
subscribe: (fn: (_: ElementData) => void) => void;
|
|
59
|
+
unsubscribe: (fn: (_: ElementData) => void) => void;
|
|
74
60
|
triggerUpdate: () => void;
|
|
75
61
|
}
|
|
76
62
|
declare class Weaverse {
|
|
@@ -88,17 +74,14 @@ declare class Weaverse {
|
|
|
88
74
|
itemInstances: Map<string | number, WeaverseItemStore>;
|
|
89
75
|
/**
|
|
90
76
|
* Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
|
|
91
|
-
* @type {string}
|
|
92
77
|
*/
|
|
93
78
|
weaverseHost: string;
|
|
94
79
|
/**
|
|
95
80
|
* Weaverse version, it can be used to load the correct version of Weaverse SDK
|
|
96
|
-
* @type {string}
|
|
97
81
|
*/
|
|
98
82
|
weaverseVersion: string;
|
|
99
83
|
/**
|
|
100
84
|
* Weaverse project key to access project data via API
|
|
101
|
-
* @type {string}
|
|
102
85
|
*/
|
|
103
86
|
projectId: string;
|
|
104
87
|
pageId: string;
|
|
@@ -109,14 +92,12 @@ declare class Weaverse {
|
|
|
109
92
|
data: WeaverseProjectDataType;
|
|
110
93
|
/**
|
|
111
94
|
* Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot
|
|
112
|
-
* @type {Map<string, (data: any) => void>}
|
|
113
95
|
*/
|
|
114
|
-
listeners: Set<
|
|
96
|
+
listeners: Set<() => void>;
|
|
115
97
|
/**
|
|
116
98
|
* Check whether the sdk is in editor or not.
|
|
117
99
|
* If isDesignMode is true, it means the sdk is isDesignMode mode, render the editor UI,
|
|
118
100
|
* else render the preview UI, plain HTML + CSS + React hydrate
|
|
119
|
-
* @type {boolean}
|
|
120
101
|
*/
|
|
121
102
|
isDesignMode: boolean;
|
|
122
103
|
/**
|
|
@@ -125,12 +106,10 @@ declare class Weaverse {
|
|
|
125
106
|
platformType: PlatformTypeEnum;
|
|
126
107
|
/**
|
|
127
108
|
* Check whether the sdk is in preview mode or not
|
|
128
|
-
* @type {boolean}
|
|
129
109
|
*/
|
|
130
110
|
isPreviewMode: boolean;
|
|
131
111
|
/**
|
|
132
112
|
* Use in element to optionally render special HTML for hydration
|
|
133
|
-
* @type {boolean}
|
|
134
113
|
*/
|
|
135
114
|
ssrMode: boolean;
|
|
136
115
|
/**
|
|
@@ -152,8 +131,7 @@ declare class Weaverse {
|
|
|
152
131
|
* @param elementSchemas {Array<ElementSchema>} List of element schemas
|
|
153
132
|
* @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)
|
|
154
133
|
*/
|
|
155
|
-
constructor(
|
|
156
|
-
init({ weaverseHost, weaverseVersion, elementSchemas, platformType, projectId, data, mediaBreakPoints, isDesignMode, ssrMode, pageId, }?: WeaverseType): void;
|
|
134
|
+
constructor(params?: WeaverseType);
|
|
157
135
|
/**
|
|
158
136
|
* Register the custom React Component to Weaverse, store it into Weaverse.elementInstances
|
|
159
137
|
* @param element {WeaverseElement} custom React Component
|
|
@@ -164,8 +142,16 @@ declare class Weaverse {
|
|
|
164
142
|
unsubscribe(fn: any): void;
|
|
165
143
|
triggerUpdate(): void;
|
|
166
144
|
refreshAllItems(): void;
|
|
145
|
+
/**
|
|
146
|
+
* When applying new template,
|
|
147
|
+
* we need to reset the project data and re-initialize the project item data
|
|
148
|
+
* @param data {WeaverseProjectDataType}
|
|
149
|
+
*/
|
|
167
150
|
setProjectData(data: WeaverseProjectDataType): void;
|
|
168
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Create new WeaverseItemStore instance for each item in project data
|
|
153
|
+
*/
|
|
154
|
+
initProject(): void;
|
|
169
155
|
}
|
|
170
156
|
|
|
171
157
|
interface WeaverseProjectDataType {
|
package/dist/index.js
CHANGED
|
@@ -116,14 +116,12 @@ var stitchesUtils = {
|
|
|
116
116
|
var WeaverseItemStore = class {
|
|
117
117
|
constructor(itemData, weaverse) {
|
|
118
118
|
this.listeners = /* @__PURE__ */ new Set();
|
|
119
|
-
this.ref = {
|
|
120
|
-
|
|
121
|
-
};
|
|
119
|
+
this.ref = { current: null };
|
|
120
|
+
this.platformType = "shopify-section";
|
|
122
121
|
this.stitchesClass = "";
|
|
123
|
-
this.
|
|
122
|
+
this._store = { id: "", type: "" };
|
|
124
123
|
this.setData = (update) => {
|
|
125
|
-
|
|
126
|
-
if (platformType === "shopify-hydrogen") {
|
|
124
|
+
if (this.platformType === "shopify-hydrogen") {
|
|
127
125
|
this.data = update;
|
|
128
126
|
} else {
|
|
129
127
|
this.data = Object.assign(this.data, update);
|
|
@@ -144,13 +142,14 @@ var WeaverseItemStore = class {
|
|
|
144
142
|
};
|
|
145
143
|
let { type, id } = itemData;
|
|
146
144
|
this.weaverse = weaverse;
|
|
145
|
+
this.platformType = weaverse.platformType;
|
|
147
146
|
if (id && type) {
|
|
148
147
|
weaverse.itemInstances.set(id, this);
|
|
149
|
-
this.
|
|
148
|
+
this._store = { ...itemData };
|
|
150
149
|
}
|
|
151
150
|
}
|
|
152
151
|
get _id() {
|
|
153
|
-
return this.
|
|
152
|
+
return this._store.id;
|
|
154
153
|
}
|
|
155
154
|
get _element() {
|
|
156
155
|
return this.ref.current;
|
|
@@ -159,31 +158,33 @@ var WeaverseItemStore = class {
|
|
|
159
158
|
return this.Element?.schema?.flags || {};
|
|
160
159
|
}
|
|
161
160
|
get Element() {
|
|
162
|
-
return this.weaverse.elementInstances.get(this.
|
|
161
|
+
return this.weaverse.elementInstances.get(this._store.type);
|
|
163
162
|
}
|
|
164
163
|
set data(update) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
164
|
+
if (this.platformType === "shopify-hydrogen") {
|
|
165
|
+
let { children, ...rest } = update;
|
|
166
|
+
if (children) {
|
|
167
|
+
this._store.children = children;
|
|
168
|
+
}
|
|
169
|
+
this._store.data = merge(this._store.data, rest);
|
|
168
170
|
} else {
|
|
169
|
-
this.
|
|
171
|
+
this._store = { ...this.data, ...update };
|
|
170
172
|
}
|
|
171
173
|
}
|
|
172
174
|
get data() {
|
|
173
|
-
let
|
|
174
|
-
if (platformType === "shopify-hydrogen") {
|
|
175
|
-
let defaultData2 = { ...this.Element?.Component?.defaultProps };
|
|
175
|
+
let defaultProps = { ...this.Element?.Component?.defaultProps };
|
|
176
|
+
if (this.platformType === "shopify-hydrogen") {
|
|
176
177
|
return {
|
|
177
|
-
...this.
|
|
178
|
-
...
|
|
179
|
-
...this._data.data
|
|
178
|
+
...this._store,
|
|
179
|
+
data: { ...defaultProps?.data, ...this._store.data }
|
|
180
180
|
};
|
|
181
|
+
} else {
|
|
182
|
+
let defaultCss = this.Element?.defaultCss || {};
|
|
183
|
+
let currentCss = this._store.css || {};
|
|
184
|
+
let css = merge(defaultCss, currentCss);
|
|
185
|
+
let extraData = this.Element?.extraData;
|
|
186
|
+
return { ...defaultProps, ...extraData, ...this._store, css };
|
|
181
187
|
}
|
|
182
|
-
let defaultCss = this.Element?.defaultCss || {};
|
|
183
|
-
let currentCss = this._data.css || {};
|
|
184
|
-
let css = merge(defaultCss, currentCss);
|
|
185
|
-
let defaultData = { ...this.Element?.Component?.defaultProps, ...this.Element?.extraData || {} };
|
|
186
|
-
return { ...defaultData, ...this._data, css };
|
|
187
188
|
}
|
|
188
189
|
};
|
|
189
190
|
var Weaverse = class {
|
|
@@ -198,18 +199,7 @@ var Weaverse = class {
|
|
|
198
199
|
* @param elementSchemas {Array<ElementSchema>} List of element schemas
|
|
199
200
|
* @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)
|
|
200
201
|
*/
|
|
201
|
-
constructor({
|
|
202
|
-
weaverseHost,
|
|
203
|
-
weaverseVersion,
|
|
204
|
-
projectId,
|
|
205
|
-
data,
|
|
206
|
-
mediaBreakPoints,
|
|
207
|
-
isDesignMode,
|
|
208
|
-
ssrMode,
|
|
209
|
-
elementSchemas,
|
|
210
|
-
platformType,
|
|
211
|
-
pageId
|
|
212
|
-
} = {}) {
|
|
202
|
+
constructor(params = {}) {
|
|
213
203
|
/**
|
|
214
204
|
* For storing, registering element React component from Weaverse or created by user/developer
|
|
215
205
|
*/
|
|
@@ -220,17 +210,14 @@ var Weaverse = class {
|
|
|
220
210
|
this.itemInstances = /* @__PURE__ */ new Map();
|
|
221
211
|
/**
|
|
222
212
|
* Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
|
|
223
|
-
* @type {string}
|
|
224
213
|
*/
|
|
225
214
|
this.weaverseHost = "https://studio.weaverse.io";
|
|
226
215
|
/**
|
|
227
216
|
* Weaverse version, it can be used to load the correct version of Weaverse SDK
|
|
228
|
-
* @type {string}
|
|
229
217
|
*/
|
|
230
218
|
this.weaverseVersion = "";
|
|
231
219
|
/**
|
|
232
220
|
* Weaverse project key to access project data via API
|
|
233
|
-
* @type {string}
|
|
234
221
|
*/
|
|
235
222
|
this.projectId = "";
|
|
236
223
|
this.pageId = "";
|
|
@@ -245,14 +232,12 @@ var Weaverse = class {
|
|
|
245
232
|
};
|
|
246
233
|
/**
|
|
247
234
|
* Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot
|
|
248
|
-
* @type {Map<string, (data: any) => void>}
|
|
249
235
|
*/
|
|
250
236
|
this.listeners = /* @__PURE__ */ new Set();
|
|
251
237
|
/**
|
|
252
238
|
* Check whether the sdk is in editor or not.
|
|
253
239
|
* If isDesignMode is true, it means the sdk is isDesignMode mode, render the editor UI,
|
|
254
240
|
* else render the preview UI, plain HTML + CSS + React hydrate
|
|
255
|
-
* @type {boolean}
|
|
256
241
|
*/
|
|
257
242
|
this.isDesignMode = false;
|
|
258
243
|
/**
|
|
@@ -261,12 +246,10 @@ var Weaverse = class {
|
|
|
261
246
|
this.platformType = "shopify-section";
|
|
262
247
|
/**
|
|
263
248
|
* Check whether the sdk is in preview mode or not
|
|
264
|
-
* @type {boolean}
|
|
265
249
|
*/
|
|
266
250
|
this.isPreviewMode = false;
|
|
267
251
|
/**
|
|
268
252
|
* Use in element to optionally render special HTML for hydration
|
|
269
|
-
* @type {boolean}
|
|
270
253
|
*/
|
|
271
254
|
this.ssrMode = false;
|
|
272
255
|
this.elementSchemas = [];
|
|
@@ -284,42 +267,11 @@ var Weaverse = class {
|
|
|
284
267
|
...externalConfig
|
|
285
268
|
});
|
|
286
269
|
};
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
projectId,
|
|
291
|
-
data,
|
|
292
|
-
platformType,
|
|
293
|
-
mediaBreakPoints,
|
|
294
|
-
isDesignMode,
|
|
295
|
-
ssrMode,
|
|
296
|
-
elementSchemas,
|
|
297
|
-
pageId
|
|
270
|
+
Object.entries(params).forEach(([k, v]) => {
|
|
271
|
+
let key = k;
|
|
272
|
+
this[key] = v || this[key];
|
|
298
273
|
});
|
|
299
|
-
|
|
300
|
-
init({
|
|
301
|
-
weaverseHost,
|
|
302
|
-
weaverseVersion,
|
|
303
|
-
elementSchemas,
|
|
304
|
-
platformType,
|
|
305
|
-
projectId,
|
|
306
|
-
data,
|
|
307
|
-
mediaBreakPoints,
|
|
308
|
-
isDesignMode,
|
|
309
|
-
ssrMode,
|
|
310
|
-
pageId
|
|
311
|
-
} = {}) {
|
|
312
|
-
this.elementSchemas = elementSchemas || this.elementSchemas;
|
|
313
|
-
this.weaverseHost = weaverseHost || this.weaverseHost;
|
|
314
|
-
this.weaverseVersion = weaverseVersion || this.weaverseVersion;
|
|
315
|
-
this.projectId = projectId || this.projectId;
|
|
316
|
-
this.pageId = pageId || this.pageId;
|
|
317
|
-
this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints;
|
|
318
|
-
this.isDesignMode = isDesignMode || this.isDesignMode;
|
|
319
|
-
this.ssrMode = ssrMode || this.ssrMode;
|
|
320
|
-
this.platformType = platformType || this.platformType;
|
|
321
|
-
this.data = data || this.data;
|
|
322
|
-
this.initProjectItemData();
|
|
274
|
+
this.initProject();
|
|
323
275
|
this.initStitches();
|
|
324
276
|
}
|
|
325
277
|
/**
|
|
@@ -349,12 +301,20 @@ var Weaverse = class {
|
|
|
349
301
|
item.triggerUpdate();
|
|
350
302
|
});
|
|
351
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* When applying new template,
|
|
306
|
+
* we need to reset the project data and re-initialize the project item data
|
|
307
|
+
* @param data {WeaverseProjectDataType}
|
|
308
|
+
*/
|
|
352
309
|
setProjectData(data) {
|
|
353
310
|
this.data = data;
|
|
354
|
-
this.
|
|
311
|
+
this.initProject();
|
|
355
312
|
this.triggerUpdate();
|
|
356
313
|
}
|
|
357
|
-
|
|
314
|
+
/**
|
|
315
|
+
* Create new WeaverseItemStore instance for each item in project data
|
|
316
|
+
*/
|
|
317
|
+
initProject() {
|
|
358
318
|
const data = this.data;
|
|
359
319
|
if (data?.items) {
|
|
360
320
|
data.items.forEach((item) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/utils/load-script.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 ElementSchema,\n PlatformTypeEnum,\n WeaverseElement,\n WeaverseProjectDataType,\n WeaverseType,\n} from \"./types\"\nimport { merge } from \"./utils\"\nimport { stitchesUtils } 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\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 get _flags() {\n return this.Element?.schema?.flags || {}\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 = \"https://studio.weaverse.io\"\n /**\n * Weaverse version, it can be used to load the correct version of Weaverse SDK\n * @type {string}\n */\n weaverseVersion = \"\"\n /**\n * Weaverse project key to access project data via API\n * @type {string}\n */\n projectId = \"\"\n\n pageId = \"\"\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 the platform, shopify-section or react-ssr(hydrogen)\n */\n platformType: PlatformTypeEnum = \"shopify-section\"\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 * @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)\n */\n constructor({\n weaverseHost,\n weaverseVersion,\n projectId,\n data,\n mediaBreakPoints,\n isDesignMode,\n ssrMode,\n elementSchemas,\n platformType,\n pageId,\n }: WeaverseType = {}) {\n this.init({\n weaverseHost,\n weaverseVersion,\n projectId,\n data,\n platformType,\n mediaBreakPoints,\n isDesignMode,\n ssrMode,\n elementSchemas,\n pageId,\n })\n }\n\n init({\n weaverseHost,\n weaverseVersion,\n elementSchemas,\n platformType,\n projectId,\n data,\n mediaBreakPoints,\n isDesignMode,\n ssrMode,\n pageId,\n }: WeaverseType = {}) {\n this.elementSchemas = elementSchemas || this.elementSchemas\n this.weaverseHost = weaverseHost || this.weaverseHost\n this.weaverseVersion = weaverseVersion || this.weaverseVersion\n this.projectId = projectId || this.projectId\n this.pageId = pageId || this.pageId\n this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints\n this.isDesignMode = isDesignMode || this.isDesignMode\n this.ssrMode = ssrMode || this.ssrMode\n this.platformType = platformType || this.platformType\n this.data = data || this.data\n this.initProjectItemData()\n this.initStitches()\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 this.elementInstances.set(element?.type, element)\n }\n } else {\n console.error(\"Weaverse: registerElement: `type` is required\")\n }\n }\n\n initStitches = (externalConfig = {}) => {\n this.stitchesInstance =\n this.stitchesInstance ||\n stitches.createStitches({\n prefix: \"weaverse\",\n media: this.mediaBreakPoints,\n utils: stitchesUtils,\n ...externalConfig,\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 refreshAllItems() {\n this.itemInstances.forEach((item) => {\n item.triggerUpdate()\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 loadScript = (src: string) => {\n return new Promise((resolve, reject) => {\n let script = document.createElement(\"script\")\n script.src = src\n script.onload = resolve\n script.onerror = reject\n script.defer = true\n document.body.appendChild(script)\n })\n}\n\nexport default loadScript\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\nexport { loadScript } from \"./load-script\"\n","export let stitchesUtils = {\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/utils/load-script.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 ElementSchema,\n PlatformTypeEnum,\n WeaverseElement,\n WeaverseProjectDataType,\n WeaverseType,\n} from \"./types\"\nimport { merge } from \"./utils\"\nimport { stitchesUtils } from \"./utils/styles\"\n\nexport class WeaverseItemStore {\n weaverse: Weaverse\n listeners: Set<(_: ElementData) => void> = new Set()\n ref: RefObject<HTMLElement> = { current: null }\n platformType: PlatformTypeEnum = \"shopify-section\"\n stitchesClass = \"\"\n _store: ElementData = { id: \"\", type: \"\" }\n\n constructor(itemData: ElementData, weaverse: Weaverse) {\n let { type, id } = itemData\n this.weaverse = weaverse\n this.platformType = weaverse.platformType\n if (id && type) {\n weaverse.itemInstances.set(id, this)\n this._store = { ...itemData }\n }\n }\n\n get _id() {\n return this._store.id\n }\n get _element() {\n return this.ref.current\n }\n get _flags() {\n return this.Element?.schema?.flags || {}\n }\n get Element() {\n return this.weaverse.elementInstances.get(this._store.type)\n }\n\n set data(update: Omit<ElementData, \"id\" | \"type\">) {\n if (this.platformType === \"shopify-hydrogen\") {\n let { children, ...rest } = update\n if (children) {\n this._store.children = children\n }\n this._store.data = merge(this._store.data, rest)\n } else {\n this._store = { ...this.data, ...update }\n }\n }\n\n get data(): ElementData {\n let defaultProps = { ...this.Element?.Component?.defaultProps }\n if (this.platformType === \"shopify-hydrogen\") {\n return {\n ...this._store,\n data: { ...defaultProps?.data, ...this._store.data },\n }\n } else {\n let defaultCss = this.Element?.defaultCss || {}\n let currentCss = this._store.css || {}\n let css = merge(defaultCss, currentCss)\n let extraData = this.Element?.extraData\n return { ...defaultProps, ...extraData, ...this._store, css }\n }\n }\n\n setData = (update: Omit<ElementData, \"id\" | \"type\">) => {\n if (this.platformType === \"shopify-hydrogen\") {\n this.data = update\n } else {\n this.data = Object.assign(this.data, update)\n }\n this.triggerUpdate()\n return this.data\n }\n\n subscribe = (fn: (_: ElementData) => void) => {\n this.listeners.add(fn)\n }\n\n unsubscribe = (fn: (_: ElementData) => void) => {\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 */\n weaverseHost = \"https://studio.weaverse.io\"\n /**\n * Weaverse version, it can be used to load the correct version of Weaverse SDK\n */\n weaverseVersion = \"\"\n /**\n * Weaverse project key to access project data via API\n */\n projectId = \"\"\n\n pageId = \"\"\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 */\n listeners: Set<() => void> = 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 */\n isDesignMode = false\n\n /**\n * Check the platform, shopify-section or react-ssr(hydrogen)\n */\n platformType: PlatformTypeEnum = \"shopify-section\"\n\n /**\n * Check whether the sdk is in preview mode or not\n */\n isPreviewMode = false\n\n /**\n * Use in element to optionally render special HTML for hydration\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 * @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)\n */\n constructor(params: WeaverseType = {}) {\n Object.entries(params).forEach(([k, v]) => {\n let key = k as keyof typeof this\n this[key] = v || this[key]\n })\n this.initProject()\n this.initStitches()\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 this.elementInstances.set(element?.type, element)\n }\n } else {\n console.error(\"Weaverse: registerElement: `type` is required\")\n }\n }\n\n initStitches = (externalConfig = {}) => {\n this.stitchesInstance =\n this.stitchesInstance ||\n stitches.createStitches({\n prefix: \"weaverse\",\n media: this.mediaBreakPoints,\n utils: stitchesUtils,\n ...externalConfig,\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 refreshAllItems() {\n this.itemInstances.forEach((item) => {\n item.triggerUpdate()\n })\n }\n\n /**\n * When applying new template,\n * we need to reset the project data and re-initialize the project item data\n * @param data {WeaverseProjectDataType}\n */\n setProjectData(data: WeaverseProjectDataType) {\n this.data = data\n this.initProject()\n this.triggerUpdate()\n }\n\n /**\n * Create new WeaverseItemStore instance for each item in project data\n */\n initProject() {\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 loadScript = (src: string) => {\n return new Promise((resolve, reject) => {\n let script = document.createElement(\"script\")\n script.src = src\n script.onload = resolve\n script.onerror = reject\n script.defer = true\n document.body.appendChild(script)\n })\n}\n\nexport default loadScript\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\nexport { loadScript } from \"./load-script\"\n","export let stitchesUtils = {\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
|
@@ -74,14 +74,12 @@ var stitchesUtils = {
|
|
|
74
74
|
var WeaverseItemStore = class {
|
|
75
75
|
constructor(itemData, weaverse) {
|
|
76
76
|
this.listeners = /* @__PURE__ */ new Set();
|
|
77
|
-
this.ref = {
|
|
78
|
-
|
|
79
|
-
};
|
|
77
|
+
this.ref = { current: null };
|
|
78
|
+
this.platformType = "shopify-section";
|
|
80
79
|
this.stitchesClass = "";
|
|
81
|
-
this.
|
|
80
|
+
this._store = { id: "", type: "" };
|
|
82
81
|
this.setData = (update) => {
|
|
83
|
-
|
|
84
|
-
if (platformType === "shopify-hydrogen") {
|
|
82
|
+
if (this.platformType === "shopify-hydrogen") {
|
|
85
83
|
this.data = update;
|
|
86
84
|
} else {
|
|
87
85
|
this.data = Object.assign(this.data, update);
|
|
@@ -102,13 +100,14 @@ var WeaverseItemStore = class {
|
|
|
102
100
|
};
|
|
103
101
|
let { type, id } = itemData;
|
|
104
102
|
this.weaverse = weaverse;
|
|
103
|
+
this.platformType = weaverse.platformType;
|
|
105
104
|
if (id && type) {
|
|
106
105
|
weaverse.itemInstances.set(id, this);
|
|
107
|
-
this.
|
|
106
|
+
this._store = { ...itemData };
|
|
108
107
|
}
|
|
109
108
|
}
|
|
110
109
|
get _id() {
|
|
111
|
-
return this.
|
|
110
|
+
return this._store.id;
|
|
112
111
|
}
|
|
113
112
|
get _element() {
|
|
114
113
|
return this.ref.current;
|
|
@@ -117,31 +116,33 @@ var WeaverseItemStore = class {
|
|
|
117
116
|
return this.Element?.schema?.flags || {};
|
|
118
117
|
}
|
|
119
118
|
get Element() {
|
|
120
|
-
return this.weaverse.elementInstances.get(this.
|
|
119
|
+
return this.weaverse.elementInstances.get(this._store.type);
|
|
121
120
|
}
|
|
122
121
|
set data(update) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
if (this.platformType === "shopify-hydrogen") {
|
|
123
|
+
let { children, ...rest } = update;
|
|
124
|
+
if (children) {
|
|
125
|
+
this._store.children = children;
|
|
126
|
+
}
|
|
127
|
+
this._store.data = merge(this._store.data, rest);
|
|
126
128
|
} else {
|
|
127
|
-
this.
|
|
129
|
+
this._store = { ...this.data, ...update };
|
|
128
130
|
}
|
|
129
131
|
}
|
|
130
132
|
get data() {
|
|
131
|
-
let
|
|
132
|
-
if (platformType === "shopify-hydrogen") {
|
|
133
|
-
let defaultData2 = { ...this.Element?.Component?.defaultProps };
|
|
133
|
+
let defaultProps = { ...this.Element?.Component?.defaultProps };
|
|
134
|
+
if (this.platformType === "shopify-hydrogen") {
|
|
134
135
|
return {
|
|
135
|
-
...this.
|
|
136
|
-
...
|
|
137
|
-
...this._data.data
|
|
136
|
+
...this._store,
|
|
137
|
+
data: { ...defaultProps?.data, ...this._store.data }
|
|
138
138
|
};
|
|
139
|
+
} else {
|
|
140
|
+
let defaultCss = this.Element?.defaultCss || {};
|
|
141
|
+
let currentCss = this._store.css || {};
|
|
142
|
+
let css = merge(defaultCss, currentCss);
|
|
143
|
+
let extraData = this.Element?.extraData;
|
|
144
|
+
return { ...defaultProps, ...extraData, ...this._store, css };
|
|
139
145
|
}
|
|
140
|
-
let defaultCss = this.Element?.defaultCss || {};
|
|
141
|
-
let currentCss = this._data.css || {};
|
|
142
|
-
let css = merge(defaultCss, currentCss);
|
|
143
|
-
let defaultData = { ...this.Element?.Component?.defaultProps, ...this.Element?.extraData || {} };
|
|
144
|
-
return { ...defaultData, ...this._data, css };
|
|
145
146
|
}
|
|
146
147
|
};
|
|
147
148
|
var Weaverse = class {
|
|
@@ -156,18 +157,7 @@ var Weaverse = class {
|
|
|
156
157
|
* @param elementSchemas {Array<ElementSchema>} List of element schemas
|
|
157
158
|
* @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)
|
|
158
159
|
*/
|
|
159
|
-
constructor({
|
|
160
|
-
weaverseHost,
|
|
161
|
-
weaverseVersion,
|
|
162
|
-
projectId,
|
|
163
|
-
data,
|
|
164
|
-
mediaBreakPoints,
|
|
165
|
-
isDesignMode,
|
|
166
|
-
ssrMode,
|
|
167
|
-
elementSchemas,
|
|
168
|
-
platformType,
|
|
169
|
-
pageId
|
|
170
|
-
} = {}) {
|
|
160
|
+
constructor(params = {}) {
|
|
171
161
|
/**
|
|
172
162
|
* For storing, registering element React component from Weaverse or created by user/developer
|
|
173
163
|
*/
|
|
@@ -178,17 +168,14 @@ var Weaverse = class {
|
|
|
178
168
|
this.itemInstances = /* @__PURE__ */ new Map();
|
|
179
169
|
/**
|
|
180
170
|
* Weaverse base URL that can provide by user/developer. for local development, use localhost:3000
|
|
181
|
-
* @type {string}
|
|
182
171
|
*/
|
|
183
172
|
this.weaverseHost = "https://studio.weaverse.io";
|
|
184
173
|
/**
|
|
185
174
|
* Weaverse version, it can be used to load the correct version of Weaverse SDK
|
|
186
|
-
* @type {string}
|
|
187
175
|
*/
|
|
188
176
|
this.weaverseVersion = "";
|
|
189
177
|
/**
|
|
190
178
|
* Weaverse project key to access project data via API
|
|
191
|
-
* @type {string}
|
|
192
179
|
*/
|
|
193
180
|
this.projectId = "";
|
|
194
181
|
this.pageId = "";
|
|
@@ -203,14 +190,12 @@ var Weaverse = class {
|
|
|
203
190
|
};
|
|
204
191
|
/**
|
|
205
192
|
* Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot
|
|
206
|
-
* @type {Map<string, (data: any) => void>}
|
|
207
193
|
*/
|
|
208
194
|
this.listeners = /* @__PURE__ */ new Set();
|
|
209
195
|
/**
|
|
210
196
|
* Check whether the sdk is in editor or not.
|
|
211
197
|
* If isDesignMode is true, it means the sdk is isDesignMode mode, render the editor UI,
|
|
212
198
|
* else render the preview UI, plain HTML + CSS + React hydrate
|
|
213
|
-
* @type {boolean}
|
|
214
199
|
*/
|
|
215
200
|
this.isDesignMode = false;
|
|
216
201
|
/**
|
|
@@ -219,12 +204,10 @@ var Weaverse = class {
|
|
|
219
204
|
this.platformType = "shopify-section";
|
|
220
205
|
/**
|
|
221
206
|
* Check whether the sdk is in preview mode or not
|
|
222
|
-
* @type {boolean}
|
|
223
207
|
*/
|
|
224
208
|
this.isPreviewMode = false;
|
|
225
209
|
/**
|
|
226
210
|
* Use in element to optionally render special HTML for hydration
|
|
227
|
-
* @type {boolean}
|
|
228
211
|
*/
|
|
229
212
|
this.ssrMode = false;
|
|
230
213
|
this.elementSchemas = [];
|
|
@@ -242,42 +225,11 @@ var Weaverse = class {
|
|
|
242
225
|
...externalConfig
|
|
243
226
|
});
|
|
244
227
|
};
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
projectId,
|
|
249
|
-
data,
|
|
250
|
-
platformType,
|
|
251
|
-
mediaBreakPoints,
|
|
252
|
-
isDesignMode,
|
|
253
|
-
ssrMode,
|
|
254
|
-
elementSchemas,
|
|
255
|
-
pageId
|
|
228
|
+
Object.entries(params).forEach(([k, v]) => {
|
|
229
|
+
let key = k;
|
|
230
|
+
this[key] = v || this[key];
|
|
256
231
|
});
|
|
257
|
-
|
|
258
|
-
init({
|
|
259
|
-
weaverseHost,
|
|
260
|
-
weaverseVersion,
|
|
261
|
-
elementSchemas,
|
|
262
|
-
platformType,
|
|
263
|
-
projectId,
|
|
264
|
-
data,
|
|
265
|
-
mediaBreakPoints,
|
|
266
|
-
isDesignMode,
|
|
267
|
-
ssrMode,
|
|
268
|
-
pageId
|
|
269
|
-
} = {}) {
|
|
270
|
-
this.elementSchemas = elementSchemas || this.elementSchemas;
|
|
271
|
-
this.weaverseHost = weaverseHost || this.weaverseHost;
|
|
272
|
-
this.weaverseVersion = weaverseVersion || this.weaverseVersion;
|
|
273
|
-
this.projectId = projectId || this.projectId;
|
|
274
|
-
this.pageId = pageId || this.pageId;
|
|
275
|
-
this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints;
|
|
276
|
-
this.isDesignMode = isDesignMode || this.isDesignMode;
|
|
277
|
-
this.ssrMode = ssrMode || this.ssrMode;
|
|
278
|
-
this.platformType = platformType || this.platformType;
|
|
279
|
-
this.data = data || this.data;
|
|
280
|
-
this.initProjectItemData();
|
|
232
|
+
this.initProject();
|
|
281
233
|
this.initStitches();
|
|
282
234
|
}
|
|
283
235
|
/**
|
|
@@ -307,12 +259,20 @@ var Weaverse = class {
|
|
|
307
259
|
item.triggerUpdate();
|
|
308
260
|
});
|
|
309
261
|
}
|
|
262
|
+
/**
|
|
263
|
+
* When applying new template,
|
|
264
|
+
* we need to reset the project data and re-initialize the project item data
|
|
265
|
+
* @param data {WeaverseProjectDataType}
|
|
266
|
+
*/
|
|
310
267
|
setProjectData(data) {
|
|
311
268
|
this.data = data;
|
|
312
|
-
this.
|
|
269
|
+
this.initProject();
|
|
313
270
|
this.triggerUpdate();
|
|
314
271
|
}
|
|
315
|
-
|
|
272
|
+
/**
|
|
273
|
+
* Create new WeaverseItemStore instance for each item in project data
|
|
274
|
+
*/
|
|
275
|
+
initProject() {
|
|
316
276
|
const data = this.data;
|
|
317
277
|
if (data?.items) {
|
|
318
278
|
data.items.forEach((item) => {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core.ts","../src/utils/load-script.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 ElementSchema,\n PlatformTypeEnum,\n WeaverseElement,\n WeaverseProjectDataType,\n WeaverseType,\n} from \"./types\"\nimport { merge } from \"./utils\"\nimport { stitchesUtils } 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\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 get _flags() {\n return this.Element?.schema?.flags || {}\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 = \"https://studio.weaverse.io\"\n /**\n * Weaverse version, it can be used to load the correct version of Weaverse SDK\n * @type {string}\n */\n weaverseVersion = \"\"\n /**\n * Weaverse project key to access project data via API\n * @type {string}\n */\n projectId = \"\"\n\n pageId = \"\"\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 the platform, shopify-section or react-ssr(hydrogen)\n */\n platformType: PlatformTypeEnum = \"shopify-section\"\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 * @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)\n */\n constructor({\n weaverseHost,\n weaverseVersion,\n projectId,\n data,\n mediaBreakPoints,\n isDesignMode,\n ssrMode,\n elementSchemas,\n platformType,\n pageId,\n }: WeaverseType = {}) {\n this.init({\n weaverseHost,\n weaverseVersion,\n projectId,\n data,\n platformType,\n mediaBreakPoints,\n isDesignMode,\n ssrMode,\n elementSchemas,\n pageId,\n })\n }\n\n init({\n weaverseHost,\n weaverseVersion,\n elementSchemas,\n platformType,\n projectId,\n data,\n mediaBreakPoints,\n isDesignMode,\n ssrMode,\n pageId,\n }: WeaverseType = {}) {\n this.elementSchemas = elementSchemas || this.elementSchemas\n this.weaverseHost = weaverseHost || this.weaverseHost\n this.weaverseVersion = weaverseVersion || this.weaverseVersion\n this.projectId = projectId || this.projectId\n this.pageId = pageId || this.pageId\n this.mediaBreakPoints = mediaBreakPoints || this.mediaBreakPoints\n this.isDesignMode = isDesignMode || this.isDesignMode\n this.ssrMode = ssrMode || this.ssrMode\n this.platformType = platformType || this.platformType\n this.data = data || this.data\n this.initProjectItemData()\n this.initStitches()\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 this.elementInstances.set(element?.type, element)\n }\n } else {\n console.error(\"Weaverse: registerElement: `type` is required\")\n }\n }\n\n initStitches = (externalConfig = {}) => {\n this.stitchesInstance =\n this.stitchesInstance ||\n stitches.createStitches({\n prefix: \"weaverse\",\n media: this.mediaBreakPoints,\n utils: stitchesUtils,\n ...externalConfig,\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 refreshAllItems() {\n this.itemInstances.forEach((item) => {\n item.triggerUpdate()\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 loadScript = (src: string) => {\n return new Promise((resolve, reject) => {\n let script = document.createElement(\"script\")\n script.src = src\n script.onload = resolve\n script.onerror = reject\n script.defer = true\n document.body.appendChild(script)\n })\n}\n\nexport default loadScript\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\nexport { loadScript } from \"./load-script\"\n","export let stitchesUtils = {\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/utils/load-script.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 ElementSchema,\n PlatformTypeEnum,\n WeaverseElement,\n WeaverseProjectDataType,\n WeaverseType,\n} from \"./types\"\nimport { merge } from \"./utils\"\nimport { stitchesUtils } from \"./utils/styles\"\n\nexport class WeaverseItemStore {\n weaverse: Weaverse\n listeners: Set<(_: ElementData) => void> = new Set()\n ref: RefObject<HTMLElement> = { current: null }\n platformType: PlatformTypeEnum = \"shopify-section\"\n stitchesClass = \"\"\n _store: ElementData = { id: \"\", type: \"\" }\n\n constructor(itemData: ElementData, weaverse: Weaverse) {\n let { type, id } = itemData\n this.weaverse = weaverse\n this.platformType = weaverse.platformType\n if (id && type) {\n weaverse.itemInstances.set(id, this)\n this._store = { ...itemData }\n }\n }\n\n get _id() {\n return this._store.id\n }\n get _element() {\n return this.ref.current\n }\n get _flags() {\n return this.Element?.schema?.flags || {}\n }\n get Element() {\n return this.weaverse.elementInstances.get(this._store.type)\n }\n\n set data(update: Omit<ElementData, \"id\" | \"type\">) {\n if (this.platformType === \"shopify-hydrogen\") {\n let { children, ...rest } = update\n if (children) {\n this._store.children = children\n }\n this._store.data = merge(this._store.data, rest)\n } else {\n this._store = { ...this.data, ...update }\n }\n }\n\n get data(): ElementData {\n let defaultProps = { ...this.Element?.Component?.defaultProps }\n if (this.platformType === \"shopify-hydrogen\") {\n return {\n ...this._store,\n data: { ...defaultProps?.data, ...this._store.data },\n }\n } else {\n let defaultCss = this.Element?.defaultCss || {}\n let currentCss = this._store.css || {}\n let css = merge(defaultCss, currentCss)\n let extraData = this.Element?.extraData\n return { ...defaultProps, ...extraData, ...this._store, css }\n }\n }\n\n setData = (update: Omit<ElementData, \"id\" | \"type\">) => {\n if (this.platformType === \"shopify-hydrogen\") {\n this.data = update\n } else {\n this.data = Object.assign(this.data, update)\n }\n this.triggerUpdate()\n return this.data\n }\n\n subscribe = (fn: (_: ElementData) => void) => {\n this.listeners.add(fn)\n }\n\n unsubscribe = (fn: (_: ElementData) => void) => {\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 */\n weaverseHost = \"https://studio.weaverse.io\"\n /**\n * Weaverse version, it can be used to load the correct version of Weaverse SDK\n */\n weaverseVersion = \"\"\n /**\n * Weaverse project key to access project data via API\n */\n projectId = \"\"\n\n pageId = \"\"\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 */\n listeners: Set<() => void> = 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 */\n isDesignMode = false\n\n /**\n * Check the platform, shopify-section or react-ssr(hydrogen)\n */\n platformType: PlatformTypeEnum = \"shopify-section\"\n\n /**\n * Check whether the sdk is in preview mode or not\n */\n isPreviewMode = false\n\n /**\n * Use in element to optionally render special HTML for hydration\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 * @param platformType {PlatformTypeEnum} Check the platform, shopify-section or react-ssr(hydrogen)\n */\n constructor(params: WeaverseType = {}) {\n Object.entries(params).forEach(([k, v]) => {\n let key = k as keyof typeof this\n this[key] = v || this[key]\n })\n this.initProject()\n this.initStitches()\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 this.elementInstances.set(element?.type, element)\n }\n } else {\n console.error(\"Weaverse: registerElement: `type` is required\")\n }\n }\n\n initStitches = (externalConfig = {}) => {\n this.stitchesInstance =\n this.stitchesInstance ||\n stitches.createStitches({\n prefix: \"weaverse\",\n media: this.mediaBreakPoints,\n utils: stitchesUtils,\n ...externalConfig,\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 refreshAllItems() {\n this.itemInstances.forEach((item) => {\n item.triggerUpdate()\n })\n }\n\n /**\n * When applying new template,\n * we need to reset the project data and re-initialize the project item data\n * @param data {WeaverseProjectDataType}\n */\n setProjectData(data: WeaverseProjectDataType) {\n this.data = data\n this.initProject()\n this.triggerUpdate()\n }\n\n /**\n * Create new WeaverseItemStore instance for each item in project data\n */\n initProject() {\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 loadScript = (src: string) => {\n return new Promise((resolve, reject) => {\n let script = document.createElement(\"script\")\n script.src = src\n script.onload = resolve\n script.onerror = reject\n script.defer = true\n document.body.appendChild(script)\n })\n}\n\nexport default loadScript\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\nexport { loadScript } from \"./load-script\"\n","export let stitchesUtils = {\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": "1.0.
|
|
2
|
+
"version": "1.0.46",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
@@ -24,5 +24,8 @@
|
|
|
24
24
|
"author": "Weaverse Team",
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@stitches/core": "^1.2.8"
|
|
27
|
+
},
|
|
28
|
+
"optionalDependencies": {
|
|
29
|
+
"@esbuild/darwin-x64": "*"
|
|
27
30
|
}
|
|
28
31
|
}
|