@weaverse/core 1.3.2 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +74 -186
- package/dist/index.d.ts +74 -186
- package/dist/index.js +113 -181
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +113 -180
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -32,7 +32,6 @@ var src_exports = {};
|
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
Weaverse: () => Weaverse,
|
|
34
34
|
WeaverseItemStore: () => WeaverseItemStore,
|
|
35
|
-
getItemDefaultData: () => getItemDefaultData,
|
|
36
35
|
isBrowser: () => isBrowser,
|
|
37
36
|
isIframe: () => isIframe,
|
|
38
37
|
isReactNative: () => isReactNative,
|
|
@@ -44,22 +43,6 @@ module.exports = __toCommonJS(src_exports);
|
|
|
44
43
|
// src/core.ts
|
|
45
44
|
var stitches = __toESM(require("@stitches/core"));
|
|
46
45
|
|
|
47
|
-
// src/utils/load-script.ts
|
|
48
|
-
var loadScript = (src) => {
|
|
49
|
-
return new Promise((resolve, reject) => {
|
|
50
|
-
let currScript = document.querySelector(`script[src="${src}"]`);
|
|
51
|
-
if (currScript) {
|
|
52
|
-
return resolve(true);
|
|
53
|
-
}
|
|
54
|
-
let script = document.createElement("script");
|
|
55
|
-
script.src = src;
|
|
56
|
-
script.onload = resolve;
|
|
57
|
-
script.onerror = reject;
|
|
58
|
-
script.defer = true;
|
|
59
|
-
document.body.appendChild(script);
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
|
|
63
46
|
// src/utils/index.ts
|
|
64
47
|
var isReactNative = typeof navigator === "object" && navigator.product === "ReactNative";
|
|
65
48
|
var isBrowser = typeof window !== "undefined" && !isReactNative;
|
|
@@ -74,24 +57,42 @@ function merge(target, source) {
|
|
|
74
57
|
Object.assign(t || {}, source);
|
|
75
58
|
return t;
|
|
76
59
|
}
|
|
77
|
-
function
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
let groups = item.Element?.schema?.inspector;
|
|
83
|
-
let inputs = groups?.flatMap((group) => group.inputs);
|
|
84
|
-
return inputs?.reduce((a, { defaultValue, name }) => {
|
|
85
|
-
if (name && defaultValue !== null && defaultValue !== void 0) {
|
|
86
|
-
a[name] = defaultValue;
|
|
60
|
+
function loadScript(src) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
let currScript = document.querySelector(`script[src="${src}"]`);
|
|
63
|
+
if (currScript) {
|
|
64
|
+
return resolve(true);
|
|
87
65
|
}
|
|
88
|
-
|
|
89
|
-
|
|
66
|
+
let script = document.createElement("script");
|
|
67
|
+
script.src = src;
|
|
68
|
+
script.onload = resolve;
|
|
69
|
+
script.onerror = reject;
|
|
70
|
+
script.defer = true;
|
|
71
|
+
document.body.appendChild(script);
|
|
72
|
+
});
|
|
90
73
|
}
|
|
91
74
|
|
|
92
|
-
// src/utils/
|
|
75
|
+
// src/utils/event-emiiter.ts
|
|
76
|
+
var EventEmitter = class {
|
|
77
|
+
listeners;
|
|
78
|
+
constructor() {
|
|
79
|
+
this.listeners = /* @__PURE__ */ new Set();
|
|
80
|
+
}
|
|
81
|
+
subscribe(fn) {
|
|
82
|
+
this.listeners.add(fn);
|
|
83
|
+
}
|
|
84
|
+
unsubscribe(fn) {
|
|
85
|
+
this.listeners.delete(fn);
|
|
86
|
+
}
|
|
87
|
+
emit(data) {
|
|
88
|
+
this.listeners.forEach((fn) => {
|
|
89
|
+
return fn(data);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// src/utils/stitches.ts
|
|
93
95
|
var stitchesUtils = {
|
|
94
|
-
// Abbreviated margin properties
|
|
95
96
|
m: (value) => ({
|
|
96
97
|
margin: value
|
|
97
98
|
}),
|
|
@@ -115,12 +116,10 @@ var stitchesUtils = {
|
|
|
115
116
|
marginTop: value,
|
|
116
117
|
marginBottom: value
|
|
117
118
|
}),
|
|
118
|
-
// A property for applying width/height together
|
|
119
119
|
size: (value) => ({
|
|
120
120
|
width: value,
|
|
121
121
|
height: value
|
|
122
122
|
}),
|
|
123
|
-
// Abbreviated padding properties
|
|
124
123
|
px: (value) => ({
|
|
125
124
|
paddingLeft: value,
|
|
126
125
|
paddingRight: value
|
|
@@ -132,38 +131,19 @@ var stitchesUtils = {
|
|
|
132
131
|
};
|
|
133
132
|
|
|
134
133
|
// src/core.ts
|
|
135
|
-
var WeaverseItemStore = class {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.triggerUpdate();
|
|
144
|
-
return this.data;
|
|
145
|
-
};
|
|
146
|
-
this.subscribe = (fn) => {
|
|
147
|
-
this.listeners.add(fn);
|
|
148
|
-
};
|
|
149
|
-
this.unsubscribe = (fn) => {
|
|
150
|
-
this.listeners.delete(fn);
|
|
151
|
-
};
|
|
152
|
-
this.triggerUpdate = () => {
|
|
153
|
-
this.listeners.forEach((fn) => {
|
|
154
|
-
return fn(this.data);
|
|
155
|
-
});
|
|
156
|
-
};
|
|
157
|
-
let { type, id } = itemData;
|
|
134
|
+
var WeaverseItemStore = class extends EventEmitter {
|
|
135
|
+
weaverse;
|
|
136
|
+
ref = { current: null };
|
|
137
|
+
_store = { id: "", type: "" };
|
|
138
|
+
stitchesClass = "";
|
|
139
|
+
constructor(intialData, weaverse) {
|
|
140
|
+
super();
|
|
141
|
+
let { type, id } = intialData || {};
|
|
158
142
|
this.weaverse = weaverse;
|
|
159
143
|
if (id && type) {
|
|
160
144
|
weaverse.itemInstances.set(id, this);
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
this._store = { ...data, ...rest };
|
|
164
|
-
} else {
|
|
165
|
-
this._store = { ...itemData };
|
|
166
|
-
}
|
|
145
|
+
} else {
|
|
146
|
+
throw new Error(`'id' and 'type' are required to create a new Weaverse item.`);
|
|
167
147
|
}
|
|
168
148
|
}
|
|
169
149
|
get _id() {
|
|
@@ -172,125 +152,97 @@ var WeaverseItemStore = class {
|
|
|
172
152
|
get _element() {
|
|
173
153
|
return this.ref.current;
|
|
174
154
|
}
|
|
175
|
-
get _flags() {
|
|
176
|
-
return this.Element?.schema?.flags || {};
|
|
177
|
-
}
|
|
178
155
|
get Element() {
|
|
179
|
-
return this.weaverse.
|
|
180
|
-
}
|
|
181
|
-
set data(update) {
|
|
182
|
-
this._store = { ...this.data, ...update };
|
|
156
|
+
return this.weaverse.elementRegistry.get(this._store.type);
|
|
183
157
|
}
|
|
184
|
-
get
|
|
185
|
-
let defaultData = getItemDefaultData(this);
|
|
158
|
+
get css() {
|
|
186
159
|
let defaultCss = this.Element?.defaultCss || {};
|
|
187
160
|
let currentCss = this._store.css || {};
|
|
188
161
|
let css = merge(defaultCss, currentCss);
|
|
189
|
-
|
|
190
|
-
|
|
162
|
+
return css;
|
|
163
|
+
}
|
|
164
|
+
get data() {
|
|
165
|
+
let css = this.css;
|
|
166
|
+
return { ...this._store, css };
|
|
167
|
+
}
|
|
168
|
+
set data(update) {
|
|
169
|
+
this._store = { ...this.data, ...update };
|
|
191
170
|
}
|
|
171
|
+
setData = (update) => {
|
|
172
|
+
this.data = Object.assign(this.data, update);
|
|
173
|
+
this.triggerUpdate();
|
|
174
|
+
return this.data;
|
|
175
|
+
};
|
|
176
|
+
triggerUpdate = () => {
|
|
177
|
+
this.emit(this.data);
|
|
178
|
+
};
|
|
192
179
|
};
|
|
193
|
-
var Weaverse = class {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
* Weaverse project key to access project data via API
|
|
213
|
-
*/
|
|
214
|
-
this.projectId = "";
|
|
215
|
-
this.pageId = "";
|
|
216
|
-
this.internal = {};
|
|
217
|
-
this.requestInfo = {};
|
|
218
|
-
/**
|
|
219
|
-
* Weaverse project data, by default, user can provide project data via React Component:
|
|
220
|
-
* <WeaverseRoot data={data} /> it will be used to server-side rendering
|
|
221
|
-
*/
|
|
222
|
-
this.data = {
|
|
223
|
-
rootId: "",
|
|
224
|
-
items: [],
|
|
225
|
-
script: { css: "", js: "" }
|
|
226
|
-
};
|
|
227
|
-
/**
|
|
228
|
-
* Storing subscribe callback function for any component that want to listen to the change of WeaverseRoot
|
|
229
|
-
*/
|
|
230
|
-
this.listeners = /* @__PURE__ */ new Set();
|
|
231
|
-
/**
|
|
232
|
-
* Check whether the sdk is in editor or not.
|
|
233
|
-
* If isDesignMode is true, it means the sdk is isDesignMode mode, render the editor UI,
|
|
234
|
-
* else render the preview UI, plain HTML + CSS + React hydrate
|
|
235
|
-
*/
|
|
236
|
-
this.isDesignMode = false;
|
|
237
|
-
/**
|
|
238
|
-
* Check the platform, shopify-section or react-ssr(hydrogen)
|
|
239
|
-
*/
|
|
240
|
-
this.platformType = "shopify-section";
|
|
241
|
-
/**
|
|
242
|
-
* Check whether the sdk is in preview mode or not
|
|
243
|
-
*/
|
|
244
|
-
this.isPreviewMode = false;
|
|
245
|
-
/**
|
|
246
|
-
* Use in element to optionally render special HTML for hydration
|
|
247
|
-
*/
|
|
248
|
-
this.ssrMode = false;
|
|
249
|
-
this.elementSchemas = [];
|
|
250
|
-
this.mediaBreakPoints = {
|
|
251
|
-
desktop: "all",
|
|
252
|
-
// max-width need to subtract 0.02px to prevent bug https://getbootstrap.com/docs/5.1/layout/breakpoints/#max-width
|
|
253
|
-
// tablet: "(max-width: 1023.98px)", // to set css for tablet, {'@tablet' : { // css }},
|
|
254
|
-
mobile: "(max-width: 767.98px)"
|
|
255
|
-
};
|
|
256
|
-
this.initStitches = (externalConfig = {}) => {
|
|
257
|
-
this.stitchesInstance = this.stitchesInstance || stitches.createStitches({
|
|
258
|
-
prefix: "weaverse",
|
|
259
|
-
media: this.mediaBreakPoints,
|
|
260
|
-
utils: stitchesUtils,
|
|
261
|
-
...externalConfig
|
|
262
|
-
});
|
|
263
|
-
};
|
|
180
|
+
var Weaverse = class extends EventEmitter {
|
|
181
|
+
contentRootElement = null;
|
|
182
|
+
itemInstances = /* @__PURE__ */ new Map();
|
|
183
|
+
weaverseHost = "https://weaverse.io";
|
|
184
|
+
weaverseVersion = "";
|
|
185
|
+
projectId = "";
|
|
186
|
+
isDesignMode = false;
|
|
187
|
+
isPreviewMode = false;
|
|
188
|
+
stitchesInstance;
|
|
189
|
+
studioBridge;
|
|
190
|
+
elementRegistry = /* @__PURE__ */ new Map();
|
|
191
|
+
mediaBreakPoints = {
|
|
192
|
+
desktop: "all",
|
|
193
|
+
// max-width need to subtract 0.02px to prevent bug
|
|
194
|
+
// ref: https://getbootstrap.com/docs/5.1/layout/breakpoints/#max-width
|
|
195
|
+
mobile: "(max-width: 767.98px)"
|
|
196
|
+
};
|
|
197
|
+
constructor(params) {
|
|
198
|
+
super();
|
|
264
199
|
Object.entries(params).forEach(([k, v]) => {
|
|
265
200
|
let key = k;
|
|
266
|
-
|
|
267
|
-
this[key] = v || this[key];
|
|
268
|
-
}
|
|
201
|
+
this[key] = v || this[key];
|
|
269
202
|
});
|
|
270
203
|
this.initProject();
|
|
271
204
|
this.initStitches();
|
|
272
205
|
}
|
|
273
206
|
/**
|
|
274
|
-
*
|
|
275
|
-
|
|
207
|
+
* Create new `WeaverseItemStore` instance for each item in the project.
|
|
208
|
+
*/
|
|
209
|
+
initProject() {
|
|
210
|
+
let { data, itemInstances, ItemConstructor } = this;
|
|
211
|
+
if (data?.items) {
|
|
212
|
+
data.items.forEach((item) => {
|
|
213
|
+
if (!itemInstances.get(item.id)) {
|
|
214
|
+
new ItemConstructor(item, this);
|
|
215
|
+
} else {
|
|
216
|
+
let itemInstance = itemInstances.get(item.id);
|
|
217
|
+
itemInstance.setData(item);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
initStitches = (externalConfig) => {
|
|
223
|
+
this.stitchesInstance = this.stitchesInstance || stitches.createStitches({
|
|
224
|
+
prefix: "weaverse",
|
|
225
|
+
media: this.mediaBreakPoints,
|
|
226
|
+
utils: stitchesUtils,
|
|
227
|
+
...externalConfig
|
|
228
|
+
});
|
|
229
|
+
};
|
|
230
|
+
/**
|
|
231
|
+
* Register the custom React Component to Weaverse, store it into Weaverse.elementRegistry
|
|
276
232
|
*/
|
|
277
233
|
registerElement(element) {
|
|
278
234
|
if (element?.type) {
|
|
279
|
-
if (!this.
|
|
280
|
-
this.
|
|
235
|
+
if (!this.elementRegistry.has(element.type)) {
|
|
236
|
+
this.elementRegistry.set(element?.type, element);
|
|
237
|
+
} else {
|
|
238
|
+
console.warn(`Element with type '${element.type}' already exists.`);
|
|
281
239
|
}
|
|
282
240
|
} else {
|
|
283
|
-
console.error("
|
|
241
|
+
console.error("Cannot register element without 'type'.");
|
|
284
242
|
}
|
|
285
243
|
}
|
|
286
|
-
subscribe(fn) {
|
|
287
|
-
this.listeners.add(fn);
|
|
288
|
-
}
|
|
289
|
-
unsubscribe(fn) {
|
|
290
|
-
this.listeners.delete(fn);
|
|
291
|
-
}
|
|
292
244
|
triggerUpdate() {
|
|
293
|
-
this.
|
|
245
|
+
this.emit();
|
|
294
246
|
}
|
|
295
247
|
refreshAllItems() {
|
|
296
248
|
this.itemInstances.forEach((item) => {
|
|
@@ -298,39 +250,19 @@ var Weaverse = class {
|
|
|
298
250
|
});
|
|
299
251
|
}
|
|
300
252
|
/**
|
|
301
|
-
*
|
|
302
|
-
* we need to
|
|
253
|
+
* Reset the project data and re-initialize all items.
|
|
254
|
+
* Used when we need to re-render the project with new data (like applying new template)
|
|
303
255
|
* @param data {WeaverseProjectDataType}
|
|
304
256
|
*/
|
|
305
257
|
setProjectData(data) {
|
|
306
258
|
this.data = data;
|
|
307
259
|
this.initProject();
|
|
308
260
|
}
|
|
309
|
-
/**
|
|
310
|
-
* Create new WeaverseItemStore instance for each item in project data
|
|
311
|
-
*/
|
|
312
|
-
initProject() {
|
|
313
|
-
const data = this.data;
|
|
314
|
-
if (data?.items) {
|
|
315
|
-
data.items.forEach((item) => {
|
|
316
|
-
if (!this.itemInstances.get(item.id)) {
|
|
317
|
-
return new WeaverseItemStore(item, this);
|
|
318
|
-
} else {
|
|
319
|
-
let itemInstance = this.itemInstances.get(item.id);
|
|
320
|
-
if (itemInstance) {
|
|
321
|
-
itemInstance.setData(item);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
261
|
};
|
|
328
|
-
Weaverse.WeaverseItemStore = WeaverseItemStore;
|
|
329
262
|
// Annotate the CommonJS export names for ESM import in node:
|
|
330
263
|
0 && (module.exports = {
|
|
331
264
|
Weaverse,
|
|
332
265
|
WeaverseItemStore,
|
|
333
|
-
getItemDefaultData,
|
|
334
266
|
isBrowser,
|
|
335
267
|
isIframe,
|
|
336
268
|
isReactNative,
|
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","/*\n @weaverse/core is the core package of Weaverse SDKs, it contains the core logic of Weaverse.\n It is a singleton class that can be used to register item, store project data, etc.\n ---\n Licensed under MIT License.\n Source: https://github.com/weaverse/sdks\n About Weaverse: https://weaverse.io\n*/\n\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 { getItemDefaultData, 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 stitchesClass = \"\"\n private _store: 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 if (weaverse.platformType === \"shopify-hydrogen\") {\n let { data, ...rest } = itemData\n this._store = { ...data, ...rest }\n } else {\n this._store = { ...itemData }\n }\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 this._store = { ...this.data, ...update }\n }\n\n get data(): ElementData {\n let defaultData = getItemDefaultData(this)\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 { ...defaultData, ...extraData, ...this._store, css }\n }\n\n setData = (update: Omit<ElementData, \"id\" | \"type\">) => {\n this.data = Object.assign(this.data, update)\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://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 internal: any = {}\n requestInfo: any = {}\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 constructor(params: WeaverseType = {}) {\n Object.entries(params).forEach(([k, v]) => {\n let key = k as keyof typeof this\n if (key in this) {\n this[key] = v || this[key]\n }\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 }\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 return new WeaverseItemStore(item, this)\n } else {\n let itemInstance = this.itemInstances.get(item.id as string | number)\n if (itemInstance) {\n itemInstance.setData(item)\n }\n }\n })\n }\n }\n}\n","export let loadScript = (src: string) => {\n return new Promise((resolve, reject) => {\n let currScript = document.querySelector(`script[src=\"${src}\"]`)\n if (currScript) {\n return resolve(true)\n }\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","import type { WeaverseItemStore } from \"~/core\"\nimport type { BasicGroup } from \"~/types\"\n\nexport 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\nexport function getItemDefaultData(item: WeaverseItemStore) {\n let platformType = item.weaverse.platformType\n if (platformType === \"shopify-section\") {\n return { ...item.Element?.Component?.defaultProps }\n }\n let groups = item.Element?.schema?.inspector as BasicGroup[]\n let inputs = groups?.flatMap((group) => group.inputs)\n return inputs?.reduce<Record<string, any>>((a, { defaultValue, name }) => {\n if (name && defaultValue !== null && defaultValue !== undefined) {\n a[name] = defaultValue\n }\n return a\n }, {})\n}\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/index.ts","../src/utils/event-emiiter.ts","../src/utils/stitches.ts"],"sourcesContent":["export * from \"./types\"\nexport * from \"./core\"\nexport * from \"./utils\"\n","/*\n @weaverse/core is the core package of Weaverse SDKs, it contains the core logic of Weaverse.\n It is a singleton class that can be used to register item, store project data, trigger update on item or project data, etc.\n ---\n Licensed under MIT License.\n Source: https://github.com/weaverse/sdks\n About Weaverse: https://weaverse.io\n*/\n\nimport * as stitches from \"@stitches/core\"\nimport type Stitches from \"@stitches/core/types/stitches\"\nimport type { RefObject } from \"react\"\nimport type {\n BreakPoints,\n ElementCSS,\n ElementData,\n PlatformTypeEnum,\n WeaverseCoreParams,\n WeaverseProjectDataType,\n} from \"./types\"\nimport { merge } from \"./utils\"\nimport { EventEmitter } from \"./utils/event-emiiter\"\nimport { stitchesUtils } from \"./utils/stitches\"\n\nexport class WeaverseItemStore extends EventEmitter {\n weaverse: Weaverse\n ref: RefObject<HTMLElement> = { current: null }\n _store: ElementData = { id: \"\", type: \"\" }\n stitchesClass = \"\"\n\n constructor(intialData: ElementData, weaverse: Weaverse) {\n super()\n let { type, id } = intialData || {}\n this.weaverse = weaverse\n if (id && type) {\n weaverse.itemInstances.set(id, this)\n } else {\n throw new Error(`'id' and 'type' are required to create a new Weaverse item.`)\n }\n }\n\n get _id() {\n return this._store.id\n }\n\n get _element() {\n return this.ref.current\n }\n\n get Element() {\n return this.weaverse.elementRegistry.get(this._store.type)\n }\n\n get css(): ElementCSS {\n let defaultCss = this.Element?.defaultCss || {}\n let currentCss = this._store.css || {}\n let css = merge(defaultCss, currentCss)\n return css\n }\n\n get data(): ElementData {\n let css = this.css\n return { ...this._store, css }\n }\n\n set data(update: Omit<ElementData, \"id\" | \"type\">) {\n this._store = { ...this.data, ...update }\n }\n\n setData = (update: Omit<ElementData, \"id\" | \"type\">) => {\n this.data = Object.assign(this.data, update)\n this.triggerUpdate()\n return this.data\n }\n\n triggerUpdate = () => {\n this.emit(this.data)\n }\n}\n\nexport class Weaverse extends EventEmitter {\n contentRootElement: HTMLElement | null = null\n itemInstances = new Map()\n weaverseHost = \"https://weaverse.io\"\n weaverseVersion = \"\"\n projectId = \"\"\n isDesignMode = false\n isPreviewMode = false\n stitchesInstance: Stitches | any\n studioBridge?: any\n\n declare ItemConstructor: typeof WeaverseItemStore\n declare data: WeaverseProjectDataType\n declare platformType: PlatformTypeEnum\n readonly elementRegistry = new Map()\n\n mediaBreakPoints: BreakPoints = {\n desktop: \"all\",\n // max-width need to subtract 0.02px to prevent bug\n // ref: https://getbootstrap.com/docs/5.1/layout/breakpoints/#max-width\n mobile: \"(max-width: 767.98px)\",\n }\n\n constructor(params: WeaverseCoreParams) {\n super()\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 * Create new `WeaverseItemStore` instance for each item in the project.\n */\n initProject() {\n let { data, itemInstances, ItemConstructor } = this\n if (data?.items) {\n data.items.forEach((item) => {\n if (!itemInstances.get(item.id)) {\n new ItemConstructor(item, this)\n } else {\n let itemInstance = itemInstances.get(item.id)\n itemInstance.setData(item)\n }\n })\n }\n }\n\n initStitches = (externalConfig?: stitches.CreateStitches) => {\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 /**\n * Register the custom React Component to Weaverse, store it into Weaverse.elementRegistry\n */\n registerElement(element: { type: string }) {\n if (element?.type) {\n if (!this.elementRegistry.has(element.type)) {\n this.elementRegistry.set(element?.type, element)\n } else {\n console.warn(`Element with type '${element.type}' already exists.`)\n }\n } else {\n console.error(\"Cannot register element without 'type'.\")\n }\n }\n\n triggerUpdate() {\n this.emit()\n }\n\n refreshAllItems() {\n this.itemInstances.forEach((item) => {\n item.triggerUpdate()\n })\n }\n\n /**\n * Reset the project data and re-initialize all items.\n * Used when we need to re-render the project with new data (like applying new template)\n * @param data {WeaverseProjectDataType}\n */\n setProjectData(data: WeaverseProjectDataType) {\n this.data = data\n this.initProject()\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\nexport function loadScript(src: string) {\n return new Promise((resolve, reject) => {\n let currScript = document.querySelector(`script[src=\"${src}\"]`)\n if (currScript) {\n return resolve(true)\n }\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","type AnyFunction = (...args: any[]) => any\n\nexport class EventEmitter {\n listeners: Set<AnyFunction>\n constructor() {\n this.listeners = new Set()\n }\n subscribe(fn: AnyFunction) {\n this.listeners.add(fn)\n }\n unsubscribe(fn: AnyFunction) {\n this.listeners.delete(fn)\n }\n emit(data?: any) {\n this.listeners.forEach((fn) => {\n return fn(data)\n })\n }\n}\n","export let stitchesUtils = {\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 size: (value: string) => ({\n width: value,\n height: value,\n }),\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":[]}
|