@weaverse/next 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-boundary.js +929 -1293
- package/dist/client-boundary.js.map +1 -1
- package/dist/client-boundary.mjs +902 -1280
- package/dist/client-boundary.mjs.map +1 -1
- package/dist/index.js +265 -576
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +139 -175
- package/dist/index.mjs.map +1 -1
- package/dist/seo-BCFNGChj.js +319 -0
- package/dist/seo-BCFNGChj.js.map +1 -0
- package/dist/seo-C-S2viuI.mjs +242 -0
- package/dist/seo-C-S2viuI.mjs.map +1 -0
- package/dist/server.js +626 -1076
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +620 -803
- package/dist/server.mjs.map +1 -1
- package/dist/types/item.d.ts +1 -1
- package/dist/types/item.d.ts.map +1 -1
- package/dist/types/revalidate-item.d.ts +1 -1
- package/dist/types/revalidate-item.d.ts.map +1 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/translation-store.d.ts.map +1 -1
- package/dist/types/types.d.ts +6 -1
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/types.ts +6 -0
- package/dist/chunk-OSC5HR5V.mjs +0 -328
- package/dist/chunk-OSC5HR5V.mjs.map +0 -1
package/dist/client-boundary.mjs
CHANGED
|
@@ -1,1395 +1,1017 @@
|
|
|
1
1
|
'use client'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
useWeaverse
|
|
9
|
-
} from "@weaverse/react";
|
|
10
|
-
|
|
11
|
-
// src/registry.ts
|
|
12
|
-
import { Weaverse as Weaverse2 } from "@weaverse/react";
|
|
13
|
-
|
|
14
|
-
// src/item.ts
|
|
15
|
-
import { Weaverse, WeaverseItemStore } from "@weaverse/react";
|
|
16
|
-
|
|
17
|
-
// src/utils.ts
|
|
2
|
+
import { Weaverse, WeaverseItemStore, WeaverseRoot, useChildInstances, useItemInstance, useParentInstance, useSafeExternalStore, useWeaverse } from "@weaverse/react";
|
|
3
|
+
import { PageTypeSchema, createSchema } from "@weaverse/schema";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { createContext, memo, useContext, useEffect, useLayoutEffect, useMemo, useRef, useSyncExternalStore } from "react";
|
|
6
|
+
import { useRouter } from "next/navigation";
|
|
7
|
+
//#region src/utils.ts
|
|
18
8
|
function generateDataFromSchema(schema) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
return data;
|
|
33
|
-
}
|
|
34
|
-
var isBrowser = typeof window !== "undefined";
|
|
35
|
-
var isIframe = isBrowser && window.top !== window.self;
|
|
36
|
-
|
|
37
|
-
// src/item.ts
|
|
9
|
+
let data = {};
|
|
10
|
+
if (!schema) return data;
|
|
11
|
+
let groups = schema.settings ?? schema.inspector ?? [];
|
|
12
|
+
for (let group of groups) for (let input of group?.inputs ?? []) {
|
|
13
|
+
let { name, defaultValue } = input;
|
|
14
|
+
if (name && defaultValue !== null && defaultValue !== void 0) data[name] = defaultValue;
|
|
15
|
+
}
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
typeof window !== "undefined" && (window.top, window.self);
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/item.ts
|
|
38
21
|
function flattenItemData(update) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
22
|
+
let { data, ...rest } = update;
|
|
23
|
+
if (!(data && typeof data === "object" && !Array.isArray(data))) return rest;
|
|
24
|
+
return {
|
|
25
|
+
...data,
|
|
26
|
+
...rest
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
let deferredItemUpdates = null;
|
|
46
30
|
function collectDeferredItemUpdates(create) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
31
|
+
let previousQueue = deferredItemUpdates;
|
|
32
|
+
let queue = /* @__PURE__ */ new Set();
|
|
33
|
+
deferredItemUpdates = queue;
|
|
34
|
+
try {
|
|
35
|
+
return [create(), [...queue]];
|
|
36
|
+
} finally {
|
|
37
|
+
deferredItemUpdates = previousQueue;
|
|
38
|
+
}
|
|
55
39
|
}
|
|
56
40
|
var WeaverseNextItem = class extends WeaverseItemStore {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this._store = {
|
|
92
|
-
...generateDataFromSchema(schema),
|
|
93
|
-
...data === void 0 ? {} : { data },
|
|
94
|
-
...flattenItemData(update)
|
|
95
|
-
};
|
|
96
|
-
} else {
|
|
97
|
-
this.data = flattenItemData(update);
|
|
98
|
-
}
|
|
99
|
-
if (deferredItemUpdates) {
|
|
100
|
-
deferredItemUpdates.add(this);
|
|
101
|
-
} else {
|
|
102
|
-
this.triggerUpdate();
|
|
103
|
-
}
|
|
104
|
-
return this.data;
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Overlay item-level translations onto the base store when the runtime is in
|
|
108
|
-
* translation mode. Mirrors Hydrogen's `WeaverseHydrogenItem.getSnapShot()`:
|
|
109
|
-
* memoized by `_store` ref + translation entry ref so the returned object is
|
|
110
|
-
* referentially stable, and a fast path that returns the base store untouched
|
|
111
|
-
* when the item has no translations.
|
|
112
|
-
*/
|
|
113
|
-
getSnapShot = () => {
|
|
114
|
-
let base = this._store;
|
|
115
|
-
let translations = this.weaverse.translationMap[this._id];
|
|
116
|
-
if (!translations) {
|
|
117
|
-
return base;
|
|
118
|
-
}
|
|
119
|
-
if (this._cachedSnapshot && this._snapshotStoreRef === base && this._snapshotTranslationRef === translations) {
|
|
120
|
-
return this._cachedSnapshot;
|
|
121
|
-
}
|
|
122
|
-
let merged = { ...base };
|
|
123
|
-
for (let [key, entry] of Object.entries(translations)) {
|
|
124
|
-
if (entry.translatedValue !== void 0) {
|
|
125
|
-
merged[key] = entry.translatedValue;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
this._cachedSnapshot = merged;
|
|
129
|
-
this._snapshotStoreRef = base;
|
|
130
|
-
this._snapshotTranslationRef = translations;
|
|
131
|
-
return merged;
|
|
132
|
-
};
|
|
41
|
+
_cachedSnapshot = null;
|
|
42
|
+
_snapshotStoreRef = null;
|
|
43
|
+
_snapshotTranslationRef = null;
|
|
44
|
+
constructor(initialData, weaverse) {
|
|
45
|
+
super(initialData, weaverse);
|
|
46
|
+
let schemaData = generateDataFromSchema(this.Element?.schema);
|
|
47
|
+
Object.assign(this._store, schemaData, flattenItemData(initialData));
|
|
48
|
+
}
|
|
49
|
+
setData = (update) => {
|
|
50
|
+
if ("id" in update && "type" in update) {
|
|
51
|
+
let { data, type } = update;
|
|
52
|
+
let schema = this.weaverse.elementRegistry.get(type)?.schema;
|
|
53
|
+
this._store = {
|
|
54
|
+
...generateDataFromSchema(schema),
|
|
55
|
+
...data === void 0 ? {} : { data },
|
|
56
|
+
...flattenItemData(update)
|
|
57
|
+
};
|
|
58
|
+
} else this.data = flattenItemData(update);
|
|
59
|
+
if (deferredItemUpdates) deferredItemUpdates.add(this);
|
|
60
|
+
else this.triggerUpdate();
|
|
61
|
+
return this.data;
|
|
62
|
+
};
|
|
63
|
+
getSnapShot = () => {
|
|
64
|
+
let base = this._store;
|
|
65
|
+
let translations = this.weaverse.translationMap[this._id];
|
|
66
|
+
if (!translations) return base;
|
|
67
|
+
if (this._cachedSnapshot && this._snapshotStoreRef === base && this._snapshotTranslationRef === translations) return this._cachedSnapshot;
|
|
68
|
+
let merged = { ...base };
|
|
69
|
+
for (let [key, entry] of Object.entries(translations)) if (entry.translatedValue !== void 0) merged[key] = entry.translatedValue;
|
|
70
|
+
this._cachedSnapshot = merged;
|
|
71
|
+
this._snapshotStoreRef = base;
|
|
72
|
+
this._snapshotTranslationRef = translations;
|
|
73
|
+
return merged;
|
|
74
|
+
};
|
|
133
75
|
};
|
|
134
76
|
function ensureNextItemConstructor() {
|
|
135
|
-
|
|
136
|
-
Weaverse.ItemConstructor = WeaverseNextItem;
|
|
137
|
-
}
|
|
77
|
+
if (!Weaverse.ItemConstructor || Weaverse.ItemConstructor === WeaverseItemStore || Weaverse.ItemConstructor === WeaverseNextItem) Weaverse.ItemConstructor = WeaverseNextItem;
|
|
138
78
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
import { createSchema } from "@weaverse/schema";
|
|
142
|
-
import { jsx } from "react/jsx-runtime";
|
|
79
|
+
//#endregion
|
|
80
|
+
//#region src/main.tsx
|
|
143
81
|
function Main(props) {
|
|
144
|
-
|
|
145
|
-
|
|
82
|
+
let { children, loaderData, ...rest } = props;
|
|
83
|
+
return /* @__PURE__ */ jsx("div", {
|
|
84
|
+
...rest,
|
|
85
|
+
children
|
|
86
|
+
});
|
|
146
87
|
}
|
|
147
88
|
Main.displayName = "main";
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
schema: mainSchema
|
|
89
|
+
const defaultMainComponent = {
|
|
90
|
+
default: Main,
|
|
91
|
+
schema: createSchema({
|
|
92
|
+
type: "main",
|
|
93
|
+
title: "Main"
|
|
94
|
+
})
|
|
155
95
|
};
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/registry.ts
|
|
98
|
+
const MAIN_TYPE = "main";
|
|
99
|
+
const registeredComponentTypes = /* @__PURE__ */ new Set();
|
|
160
100
|
function registerWeaverseNextComponents(components) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
// src/client.ts
|
|
101
|
+
ensureNextItemConstructor();
|
|
102
|
+
let hasUserMain = components.some((component) => component.schema?.type === MAIN_TYPE);
|
|
103
|
+
let effectiveComponents = hasUserMain ? components : [defaultMainComponent, ...components];
|
|
104
|
+
for (let component of effectiveComponents) {
|
|
105
|
+
let type = component.schema.type;
|
|
106
|
+
let element = {
|
|
107
|
+
type,
|
|
108
|
+
Component: component.default,
|
|
109
|
+
schema: component.schema,
|
|
110
|
+
loader: component.loader
|
|
111
|
+
};
|
|
112
|
+
if (type === MAIN_TYPE && hasUserMain) {
|
|
113
|
+
Weaverse.elementRegistry.set(type, element);
|
|
114
|
+
registeredComponentTypes.add(type);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (type && !registeredComponentTypes.has(type)) {
|
|
118
|
+
Weaverse.registerElement(element);
|
|
119
|
+
registeredComponentTypes.add(type);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
//#region src/client.ts
|
|
187
125
|
var NextClient = class {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
};
|
|
224
|
-
loadThemeSettings = (context) => {
|
|
225
|
-
if (!this._fetchThemeSettings) {
|
|
226
|
-
throw new Error(
|
|
227
|
-
"[WeaverseNextClient] loadThemeSettings requires a `fetchThemeSettings` function in client config."
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
return this._fetchThemeSettings(context ?? this.requestContext);
|
|
231
|
-
};
|
|
126
|
+
projectId;
|
|
127
|
+
components;
|
|
128
|
+
themeSchema;
|
|
129
|
+
themeSettings;
|
|
130
|
+
requestContext;
|
|
131
|
+
commerce;
|
|
132
|
+
data = null;
|
|
133
|
+
dataContext = {};
|
|
134
|
+
_fetchPage;
|
|
135
|
+
_fetchThemeSettings;
|
|
136
|
+
constructor(config) {
|
|
137
|
+
this.projectId = config.projectId;
|
|
138
|
+
this.components = config.components;
|
|
139
|
+
registerWeaverseNextComponents(this.components);
|
|
140
|
+
this.themeSchema = config.themeSchema;
|
|
141
|
+
this.themeSettings = {
|
|
142
|
+
...generateDataFromSchema(config.themeSchema),
|
|
143
|
+
...config.themeSettings
|
|
144
|
+
};
|
|
145
|
+
this.requestContext = config.requestContext;
|
|
146
|
+
this.commerce = config.commerce;
|
|
147
|
+
this._fetchPage = config.fetchPage;
|
|
148
|
+
this._fetchThemeSettings = config.fetchThemeSettings;
|
|
149
|
+
}
|
|
150
|
+
get storefront() {
|
|
151
|
+
return this.commerce?.storefront;
|
|
152
|
+
}
|
|
153
|
+
loadPage = (input = {}) => {
|
|
154
|
+
if (!this._fetchPage) throw new Error("[WeaverseNextClient] loadPage requires a `fetchPage` function in client config.");
|
|
155
|
+
return this._fetchPage(input);
|
|
156
|
+
};
|
|
157
|
+
loadThemeSettings = (context) => {
|
|
158
|
+
if (!this._fetchThemeSettings) throw new Error("[WeaverseNextClient] loadThemeSettings requires a `fetchThemeSettings` function in client config.");
|
|
159
|
+
return this._fetchThemeSettings(context ?? this.requestContext);
|
|
160
|
+
};
|
|
232
161
|
};
|
|
233
162
|
function createWeaverseNextClient(config) {
|
|
234
|
-
|
|
163
|
+
return new NextClient(config);
|
|
235
164
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
import { useContext as useContext3, useSyncExternalStore } from "react";
|
|
239
|
-
|
|
240
|
-
// src/provider.tsx
|
|
241
|
-
import {
|
|
242
|
-
createContext as createContext3,
|
|
243
|
-
useContext as useContext2,
|
|
244
|
-
useEffect as useEffect2,
|
|
245
|
-
useMemo as useMemo3,
|
|
246
|
-
useRef as useRef2
|
|
247
|
-
} from "react";
|
|
248
|
-
|
|
249
|
-
// src/root-provider.tsx
|
|
250
|
-
import {
|
|
251
|
-
createContext as createContext2,
|
|
252
|
-
useEffect,
|
|
253
|
-
useMemo as useMemo2,
|
|
254
|
-
useRef
|
|
255
|
-
} from "react";
|
|
256
|
-
|
|
257
|
-
// src/theme-settings-store.ts
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/theme-settings-store.ts
|
|
258
167
|
function createWeaverseNextThemeSettingsStore(options = {}) {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
import { createContext, useContext, useMemo } from "react";
|
|
285
|
-
|
|
286
|
-
// src/translate.ts
|
|
168
|
+
let listeners = /* @__PURE__ */ new Set();
|
|
169
|
+
let store = {
|
|
170
|
+
publicEnv: options.publicEnv,
|
|
171
|
+
schema: options.schema,
|
|
172
|
+
settings: { ...options.settings ?? {} },
|
|
173
|
+
getServerSnapshot: () => store.settings,
|
|
174
|
+
getSnapshot: () => store.settings,
|
|
175
|
+
subscribe: (listener) => {
|
|
176
|
+
listeners.add(listener);
|
|
177
|
+
return () => {
|
|
178
|
+
listeners.delete(listener);
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
updateThemeSettings: (next) => {
|
|
182
|
+
store.settings = {
|
|
183
|
+
...store.settings,
|
|
184
|
+
...next
|
|
185
|
+
};
|
|
186
|
+
for (let listener of listeners) listener();
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
return store;
|
|
190
|
+
}
|
|
191
|
+
//#endregion
|
|
192
|
+
//#region src/translate.ts
|
|
287
193
|
function getNestedKey(obj, path, fallback) {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
if (typeof current === "string") {
|
|
297
|
-
return current;
|
|
298
|
-
}
|
|
299
|
-
return fallback;
|
|
194
|
+
let keys = path.split(".");
|
|
195
|
+
let current = obj;
|
|
196
|
+
for (let key of keys) {
|
|
197
|
+
if (current == null || typeof current !== "object") return fallback;
|
|
198
|
+
current = current[key];
|
|
199
|
+
}
|
|
200
|
+
if (typeof current === "string") return current;
|
|
201
|
+
return fallback;
|
|
300
202
|
}
|
|
301
203
|
function interpolate(template, variables) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
return value === void 0 ? match : String(value);
|
|
308
|
-
});
|
|
204
|
+
if (!variables) return template;
|
|
205
|
+
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
206
|
+
let value = variables[key];
|
|
207
|
+
return value === void 0 ? match : String(value);
|
|
208
|
+
});
|
|
309
209
|
}
|
|
310
210
|
function createTranslate(sources) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
// src/translation-context.tsx
|
|
328
|
-
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
329
|
-
var TranslationContext = createContext(null);
|
|
211
|
+
let { staticContent, merchantOverrides, designOverrides, externalT } = sources;
|
|
212
|
+
return (key, variables) => {
|
|
213
|
+
if (externalT) {
|
|
214
|
+
let external = externalT(key, variables);
|
|
215
|
+
if (external && external !== key) return external;
|
|
216
|
+
}
|
|
217
|
+
let design = designOverrides && Object.hasOwn(designOverrides, key) ? designOverrides[key] : void 0;
|
|
218
|
+
let override = merchantOverrides ? getNestedKey(merchantOverrides, key) : void 0;
|
|
219
|
+
let staticValue = getNestedKey(staticContent, key);
|
|
220
|
+
return interpolate(design ?? override ?? staticValue ?? key, variables);
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
//#endregion
|
|
224
|
+
//#region src/translation-context.tsx
|
|
225
|
+
const TranslationContext = createContext(null);
|
|
330
226
|
TranslationContext.displayName = "WeaverseNextTranslationContext";
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
// Deprecated alias — same instance, kept for backward compatibility.
|
|
359
|
-
themeTextStore: store,
|
|
360
|
-
merchantOverrides: merchantOverrides ?? null
|
|
361
|
-
}),
|
|
362
|
-
[staticContent, merchantOverrides, designOverrides, externalT, store]
|
|
363
|
-
);
|
|
364
|
-
return /* @__PURE__ */ jsx2(TranslationContext.Provider, { value, children });
|
|
227
|
+
const EMPTY = {};
|
|
228
|
+
const NOOP_SUBSCRIBE = () => () => {};
|
|
229
|
+
const NOOP_SNAPSHOT = () => EMPTY;
|
|
230
|
+
function TranslationProvider({ staticContent, merchantOverrides, t: externalT, translationStore, themeTextStore, children }) {
|
|
231
|
+
let store = translationStore ?? themeTextStore ?? null;
|
|
232
|
+
let designOverrides = useSafeExternalStore(store?.subscribe ?? NOOP_SUBSCRIBE, store?.getSnapshot ?? NOOP_SNAPSHOT, store?.getServerSnapshot ?? NOOP_SNAPSHOT);
|
|
233
|
+
let value = useMemo(() => ({
|
|
234
|
+
t: createTranslate({
|
|
235
|
+
staticContent,
|
|
236
|
+
merchantOverrides,
|
|
237
|
+
designOverrides,
|
|
238
|
+
externalT
|
|
239
|
+
}),
|
|
240
|
+
translationStore: store,
|
|
241
|
+
themeTextStore: store,
|
|
242
|
+
merchantOverrides: merchantOverrides ?? null
|
|
243
|
+
}), [
|
|
244
|
+
staticContent,
|
|
245
|
+
merchantOverrides,
|
|
246
|
+
designOverrides,
|
|
247
|
+
externalT,
|
|
248
|
+
store
|
|
249
|
+
]);
|
|
250
|
+
return /* @__PURE__ */ jsx(TranslationContext.Provider, {
|
|
251
|
+
value,
|
|
252
|
+
children
|
|
253
|
+
});
|
|
365
254
|
}
|
|
366
255
|
function useTranslation() {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
var ThemeTextProvider = TranslationProvider;
|
|
376
|
-
var useThemeText = useTranslation;
|
|
377
|
-
|
|
378
|
-
// src/translation-store.ts
|
|
256
|
+
let ctx = useContext(TranslationContext);
|
|
257
|
+
if (!ctx) throw new Error("useTranslation must be used within <TranslationProvider>. Wrap your app with <WeaverseNextRootProvider>.");
|
|
258
|
+
return ctx;
|
|
259
|
+
}
|
|
260
|
+
const ThemeTextProvider = TranslationProvider;
|
|
261
|
+
const useThemeText = useTranslation;
|
|
262
|
+
//#endregion
|
|
263
|
+
//#region src/translation-store.ts
|
|
379
264
|
var TranslationStore = class {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
} catch (error) {
|
|
409
|
-
console.error("TranslationStore: Listener error", error);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
};
|
|
265
|
+
overrides = {};
|
|
266
|
+
listeners = /* @__PURE__ */ new Set();
|
|
267
|
+
setOverrides = (overrides) => {
|
|
268
|
+
this.overrides = { ...overrides };
|
|
269
|
+
this.emit();
|
|
270
|
+
};
|
|
271
|
+
updateOverrides = (newOverrides) => {
|
|
272
|
+
this.overrides = {
|
|
273
|
+
...this.overrides,
|
|
274
|
+
...newOverrides
|
|
275
|
+
};
|
|
276
|
+
this.emit();
|
|
277
|
+
};
|
|
278
|
+
getSnapshot = () => this.overrides;
|
|
279
|
+
getServerSnapshot = () => this.overrides;
|
|
280
|
+
subscribe = (callback) => {
|
|
281
|
+
this.listeners.add(callback);
|
|
282
|
+
return () => {
|
|
283
|
+
this.listeners.delete(callback);
|
|
284
|
+
};
|
|
285
|
+
};
|
|
286
|
+
emit = () => {
|
|
287
|
+
for (const listener of Array.from(this.listeners)) try {
|
|
288
|
+
listener();
|
|
289
|
+
} catch (error) {
|
|
290
|
+
console.error("TranslationStore: Listener error", error);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
413
293
|
};
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
var WeaverseNextRootContext = createContext2(null);
|
|
294
|
+
//#endregion
|
|
295
|
+
//#region src/root-provider.tsx
|
|
296
|
+
const WeaverseNextRootContext = createContext(null);
|
|
418
297
|
function WeaverseNextRootProvider(props) {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
staticContent: resolvedStaticContent,
|
|
478
|
-
t,
|
|
479
|
-
translationStore,
|
|
480
|
-
children
|
|
481
|
-
}
|
|
482
|
-
) }) });
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
// src/provider.tsx
|
|
486
|
-
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
487
|
-
var EMPTY_THEME_SETTINGS = {};
|
|
488
|
-
var EMPTY_STATIC_CONTENT = {};
|
|
298
|
+
let { children, initialThemeSettings, merchantOverrides, staticContent, t, themeSchema, publicEnv } = props;
|
|
299
|
+
let storeRef = useRef(null);
|
|
300
|
+
if (!storeRef.current) storeRef.current = createWeaverseNextThemeSettingsStore({
|
|
301
|
+
publicEnv,
|
|
302
|
+
schema: themeSchema,
|
|
303
|
+
settings: initialThemeSettings
|
|
304
|
+
});
|
|
305
|
+
let themeSettingsStore = storeRef.current;
|
|
306
|
+
let translationStoreRef = useRef(null);
|
|
307
|
+
if (!translationStoreRef.current) translationStoreRef.current = new TranslationStore();
|
|
308
|
+
let translationStore = translationStoreRef.current;
|
|
309
|
+
let appliedThemeSettingsRef = useRef(initialThemeSettings);
|
|
310
|
+
useEffect(() => {
|
|
311
|
+
if (initialThemeSettings && appliedThemeSettingsRef.current !== initialThemeSettings) {
|
|
312
|
+
themeSettingsStore.updateThemeSettings(initialThemeSettings);
|
|
313
|
+
appliedThemeSettingsRef.current = initialThemeSettings;
|
|
314
|
+
}
|
|
315
|
+
}, [initialThemeSettings, themeSettingsStore]);
|
|
316
|
+
let resolvedStaticContent = staticContent ?? getSchemaStaticContent(themeSchema);
|
|
317
|
+
let rootContextValue = useMemo(() => ({
|
|
318
|
+
merchantOverrides,
|
|
319
|
+
staticContent: resolvedStaticContent,
|
|
320
|
+
themeSettingsStore,
|
|
321
|
+
translationStore
|
|
322
|
+
}), [
|
|
323
|
+
merchantOverrides,
|
|
324
|
+
resolvedStaticContent,
|
|
325
|
+
themeSettingsStore,
|
|
326
|
+
translationStore
|
|
327
|
+
]);
|
|
328
|
+
let contextValue = useMemo(() => ({
|
|
329
|
+
merchantOverrides,
|
|
330
|
+
themeSettings: themeSettingsStore.getSnapshot(),
|
|
331
|
+
themeSettingsStore,
|
|
332
|
+
translationStore
|
|
333
|
+
}), [
|
|
334
|
+
merchantOverrides,
|
|
335
|
+
themeSettingsStore,
|
|
336
|
+
translationStore
|
|
337
|
+
]);
|
|
338
|
+
return /* @__PURE__ */ jsx(WeaverseNextRootContext.Provider, {
|
|
339
|
+
value: rootContextValue,
|
|
340
|
+
children: /* @__PURE__ */ jsx(WeaverseNextContext.Provider, {
|
|
341
|
+
value: contextValue,
|
|
342
|
+
children: /* @__PURE__ */ jsx(TranslationProvider, {
|
|
343
|
+
merchantOverrides,
|
|
344
|
+
staticContent: resolvedStaticContent,
|
|
345
|
+
t,
|
|
346
|
+
translationStore,
|
|
347
|
+
children
|
|
348
|
+
})
|
|
349
|
+
})
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
//#endregion
|
|
353
|
+
//#region src/provider.tsx
|
|
354
|
+
const EMPTY_THEME_SETTINGS = {};
|
|
355
|
+
const EMPTY_STATIC_CONTENT = {};
|
|
489
356
|
function getSchemaStaticContent(schema) {
|
|
490
|
-
|
|
491
|
-
return i18n?.staticContent ?? EMPTY_STATIC_CONTENT;
|
|
357
|
+
return (schema?.i18n)?.staticContent ?? EMPTY_STATIC_CONTENT;
|
|
492
358
|
}
|
|
493
|
-
|
|
359
|
+
const WeaverseNextContext = createContext(null);
|
|
494
360
|
function WeaverseNextProvider(props) {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
// src/hooks.ts
|
|
556
|
-
var OUTSIDE_PROVIDER_ERROR = "must be used inside a <WeaverseNextProvider>.";
|
|
361
|
+
let { children, client, rootData, pageData, commerce, themeSettings } = props;
|
|
362
|
+
let rootContext = useContext(WeaverseNextRootContext);
|
|
363
|
+
let themeSettingsValue = themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS;
|
|
364
|
+
let ownTranslationStoreRef = useRef(null);
|
|
365
|
+
if (!(rootContext || ownTranslationStoreRef.current)) ownTranslationStoreRef.current = new TranslationStore();
|
|
366
|
+
let translationStore = rootContext?.translationStore ?? ownTranslationStoreRef.current;
|
|
367
|
+
let staticContent = props.staticContent ?? rootContext?.staticContent ?? getSchemaStaticContent(client?.themeSchema);
|
|
368
|
+
let merchantOverrides = props.merchantOverrides ?? rootContext?.merchantOverrides;
|
|
369
|
+
let ownThemeSettingsStore = useMemo(() => {
|
|
370
|
+
if (rootContext) return null;
|
|
371
|
+
return createWeaverseNextThemeSettingsStore({
|
|
372
|
+
schema: client?.themeSchema,
|
|
373
|
+
settings: themeSettingsValue
|
|
374
|
+
});
|
|
375
|
+
}, [
|
|
376
|
+
rootContext,
|
|
377
|
+
client?.themeSchema,
|
|
378
|
+
themeSettingsValue
|
|
379
|
+
]);
|
|
380
|
+
let themeSettingsStore = rootContext?.themeSettingsStore ?? ownThemeSettingsStore;
|
|
381
|
+
let mergedIntoRootRef = useRef(void 0);
|
|
382
|
+
useEffect(() => {
|
|
383
|
+
if (rootContext && themeSettingsValue !== EMPTY_THEME_SETTINGS && mergedIntoRootRef.current !== themeSettingsValue) {
|
|
384
|
+
rootContext.themeSettingsStore.updateThemeSettings(themeSettingsValue);
|
|
385
|
+
mergedIntoRootRef.current = themeSettingsValue;
|
|
386
|
+
}
|
|
387
|
+
}, [rootContext, themeSettingsValue]);
|
|
388
|
+
let value = useMemo(() => ({
|
|
389
|
+
client,
|
|
390
|
+
rootData,
|
|
391
|
+
pageData,
|
|
392
|
+
commerce: commerce ?? client?.commerce,
|
|
393
|
+
merchantOverrides,
|
|
394
|
+
themeSettings: themeSettingsStore.getSnapshot(),
|
|
395
|
+
themeSettingsStore,
|
|
396
|
+
translationStore
|
|
397
|
+
}), [
|
|
398
|
+
client,
|
|
399
|
+
rootData,
|
|
400
|
+
pageData,
|
|
401
|
+
commerce,
|
|
402
|
+
merchantOverrides,
|
|
403
|
+
themeSettingsStore,
|
|
404
|
+
translationStore
|
|
405
|
+
]);
|
|
406
|
+
return /* @__PURE__ */ jsx(WeaverseNextContext.Provider, {
|
|
407
|
+
value,
|
|
408
|
+
children: /* @__PURE__ */ jsx(TranslationProvider, {
|
|
409
|
+
merchantOverrides,
|
|
410
|
+
staticContent,
|
|
411
|
+
t: props.t,
|
|
412
|
+
translationStore,
|
|
413
|
+
children
|
|
414
|
+
})
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
//#region src/hooks.ts
|
|
419
|
+
const OUTSIDE_PROVIDER_ERROR = "must be used inside a <WeaverseNextProvider>.";
|
|
557
420
|
function useWeaverseNextContext(hookName) {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
}
|
|
562
|
-
return context;
|
|
421
|
+
let context = useContext(WeaverseNextContext);
|
|
422
|
+
if (!context) throw new Error(`[@weaverse/next] ${hookName} ${OUTSIDE_PROVIDER_ERROR}`);
|
|
423
|
+
return context;
|
|
563
424
|
}
|
|
564
425
|
function useWeaverseRootData() {
|
|
565
|
-
|
|
426
|
+
return useWeaverseNextContext("useWeaverseRootData").rootData;
|
|
566
427
|
}
|
|
567
428
|
function useWeaversePageData() {
|
|
568
|
-
|
|
429
|
+
return useWeaverseNextContext("useWeaversePageData").pageData;
|
|
569
430
|
}
|
|
570
431
|
function useWeaverseCommerce() {
|
|
571
|
-
|
|
432
|
+
return useWeaverseNextContext("useWeaverseCommerce").commerce;
|
|
572
433
|
}
|
|
573
434
|
function useThemeSettings() {
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
themeSettingsStore.subscribe,
|
|
577
|
-
themeSettingsStore.getSnapshot,
|
|
578
|
-
themeSettingsStore.getServerSnapshot
|
|
579
|
-
);
|
|
435
|
+
let { themeSettingsStore } = useWeaverseNextContext("useThemeSettings");
|
|
436
|
+
return useSyncExternalStore(themeSettingsStore.subscribe, themeSettingsStore.getSnapshot, themeSettingsStore.getServerSnapshot);
|
|
580
437
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
import { WeaverseRoot } from "@weaverse/react";
|
|
584
|
-
import { memo, useContext as useContext4, useEffect as useEffect4, useLayoutEffect, useMemo as useMemo4 } from "react";
|
|
585
|
-
|
|
586
|
-
// src/runtime.ts
|
|
587
|
-
import { Weaverse as Weaverse3 } from "@weaverse/react";
|
|
588
|
-
|
|
589
|
-
// src/request-info.ts
|
|
438
|
+
//#endregion
|
|
439
|
+
//#region src/request-info.ts
|
|
590
440
|
function toUrl(value) {
|
|
591
|
-
|
|
441
|
+
return typeof value === "string" ? new URL(value, "http://localhost") : value;
|
|
592
442
|
}
|
|
593
443
|
function getSearchParamsFromContext(context) {
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
}
|
|
601
|
-
return new URLSearchParams();
|
|
444
|
+
if (context?.searchParams) return new URLSearchParams(context.searchParams);
|
|
445
|
+
if (context?.url) {
|
|
446
|
+
let url = toUrl(context.url);
|
|
447
|
+
return new URLSearchParams(url.searchParams);
|
|
448
|
+
}
|
|
449
|
+
return new URLSearchParams();
|
|
602
450
|
}
|
|
603
451
|
function withPathPrefix(pathname, i18n) {
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
return pathname;
|
|
609
|
-
}
|
|
610
|
-
return pathname === "/" ? prefix : `${prefix}${pathname}`;
|
|
452
|
+
let segments = (typeof i18n?.pathPrefix === "string" ? i18n.pathPrefix : "").split("/").filter(Boolean);
|
|
453
|
+
let prefix = segments.length > 0 ? `/${segments.join("/")}` : "";
|
|
454
|
+
if (prefix === "" || pathname === prefix || pathname.startsWith(`${prefix}/`)) return pathname;
|
|
455
|
+
return pathname === "/" ? prefix : `${prefix}${pathname}`;
|
|
611
456
|
}
|
|
612
457
|
function getPathnameFromContext(context) {
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
if (context?.url) {
|
|
617
|
-
let url = toUrl(context.url);
|
|
618
|
-
return withPathPrefix(url.pathname || "/", context.i18n);
|
|
619
|
-
}
|
|
620
|
-
return "/";
|
|
458
|
+
if (context?.pathname) return withPathPrefix(context.pathname, context.i18n);
|
|
459
|
+
if (context?.url) return withPathPrefix(toUrl(context.url).pathname || "/", context.i18n);
|
|
460
|
+
return "/";
|
|
621
461
|
}
|
|
622
462
|
function coerceQueryValue(value) {
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
if (value === "false") {
|
|
627
|
-
return false;
|
|
628
|
-
}
|
|
629
|
-
return value;
|
|
463
|
+
if (value === "true") return true;
|
|
464
|
+
if (value === "false") return false;
|
|
465
|
+
return value;
|
|
630
466
|
}
|
|
631
467
|
function toQueryRecord(searchParams) {
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
}
|
|
636
|
-
return queries;
|
|
468
|
+
let queries = {};
|
|
469
|
+
for (let [key, value] of searchParams.entries()) queries[key] = coerceQueryValue(value);
|
|
470
|
+
return queries;
|
|
637
471
|
}
|
|
638
|
-
|
|
639
|
-
"weaverseDraftItem",
|
|
640
|
-
// Legacy name from the original design-mode draft-item spike. Keep it out of
|
|
641
|
-
// runtime requestInfo too, in case an older Builder bundle is in front of a
|
|
642
|
-
// newer Next storefront.
|
|
643
|
-
"__weaverseDraftItem"
|
|
644
|
-
]);
|
|
472
|
+
const TRANSIENT_STUDIO_PARAMS = new Set(["weaverseDraftItem", "__weaverseDraftItem"]);
|
|
645
473
|
function getRequestInfoSearchParams(context) {
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
}
|
|
650
|
-
return searchParams;
|
|
474
|
+
let searchParams = new URLSearchParams(getSearchParamsFromContext(context));
|
|
475
|
+
for (let key of TRANSIENT_STUDIO_PARAMS) searchParams.delete(key);
|
|
476
|
+
return searchParams;
|
|
651
477
|
}
|
|
652
478
|
function buildWeaverseNextRequestInfo(context) {
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
|
|
479
|
+
let searchParams = getRequestInfoSearchParams(context);
|
|
480
|
+
let search = searchParams.toString();
|
|
481
|
+
return {
|
|
482
|
+
pathname: getPathnameFromContext(context),
|
|
483
|
+
search: search ? `?${search}` : "",
|
|
484
|
+
queries: toQueryRecord(searchParams),
|
|
485
|
+
...context?.i18n ? { i18n: context.i18n } : {},
|
|
486
|
+
...context?.pageType ? { pageType: context.pageType } : {},
|
|
487
|
+
...context?.handle ? { handle: context.handle } : {}
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
//#endregion
|
|
491
|
+
//#region src/runtime.ts
|
|
666
492
|
function getRuntimeWindow() {
|
|
667
|
-
|
|
493
|
+
return typeof window === "undefined" ? void 0 : window;
|
|
668
494
|
}
|
|
669
|
-
function getRenderablePage(data) {
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
495
|
+
function getRenderablePage$1(data) {
|
|
496
|
+
let page = data.page;
|
|
497
|
+
let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
|
|
498
|
+
return {
|
|
499
|
+
...page,
|
|
500
|
+
rootId
|
|
501
|
+
};
|
|
673
502
|
}
|
|
674
503
|
function getConfigString(configs, key) {
|
|
675
|
-
|
|
676
|
-
|
|
504
|
+
let value = configs?.[key];
|
|
505
|
+
return typeof value === "string" ? value : void 0;
|
|
677
506
|
}
|
|
678
507
|
function resolveModeFlag(config, key) {
|
|
679
|
-
|
|
508
|
+
return config.client?.requestContext?.[key] === true || config.data.configs?.[key] === true;
|
|
680
509
|
}
|
|
681
510
|
function resolveSectionType(config) {
|
|
682
|
-
|
|
511
|
+
return config.client?.requestContext?.sectionType || getConfigString(config.data.configs, "sectionType") || void 0;
|
|
683
512
|
}
|
|
684
513
|
function getRecordString(record, key) {
|
|
685
|
-
|
|
686
|
-
|
|
514
|
+
let value = record?.[key];
|
|
515
|
+
return typeof value === "string" ? value : void 0;
|
|
687
516
|
}
|
|
688
517
|
function resolveProjectId(client, data, fallback) {
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
if (configProjectId) {
|
|
695
|
-
return configProjectId;
|
|
696
|
-
}
|
|
697
|
-
return getRecordString(data.project, "id") ?? fallback;
|
|
518
|
+
let projectId = client?.projectId;
|
|
519
|
+
if (projectId) return projectId;
|
|
520
|
+
let configProjectId = getConfigString(data.configs, "projectId");
|
|
521
|
+
if (configProjectId) return configProjectId;
|
|
522
|
+
return getRecordString(data.project, "id") ?? fallback;
|
|
698
523
|
}
|
|
699
524
|
function resolveDataContext(config) {
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
if (config.client?.dataContext) {
|
|
704
|
-
return config.client.dataContext;
|
|
705
|
-
}
|
|
706
|
-
return {};
|
|
525
|
+
if (config.dataContext) return config.dataContext;
|
|
526
|
+
if (config.client?.dataContext) return config.client.dataContext;
|
|
527
|
+
return {};
|
|
707
528
|
}
|
|
708
529
|
function getRuntimeKey(pageId, requestInfo) {
|
|
709
|
-
|
|
530
|
+
return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`;
|
|
710
531
|
}
|
|
711
532
|
function registerRuntime(runtime) {
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
runtimeWindow.__weaverses[runtime.pageId] = runtime;
|
|
718
|
-
runtimeWindow.__weaverse = runtime;
|
|
533
|
+
let runtimeWindow = getRuntimeWindow();
|
|
534
|
+
if (!runtimeWindow) return;
|
|
535
|
+
runtimeWindow.__weaverses ??= {};
|
|
536
|
+
runtimeWindow.__weaverses[runtime.pageId] = runtime;
|
|
537
|
+
runtimeWindow.__weaverse = runtime;
|
|
719
538
|
}
|
|
720
539
|
function rebindPageItemsToRuntime(runtime) {
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
/**
|
|
846
|
-
* Update a single translatable field for one item. Assigns a new per-item
|
|
847
|
-
* entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
|
|
848
|
-
* invalidates, then triggers only that item's subscribers.
|
|
849
|
-
*/
|
|
850
|
-
updateTranslation = (itemId, key, originalValue, translatedValue) => {
|
|
851
|
-
if (!this.translationMap[itemId]) {
|
|
852
|
-
this.translationMap[itemId] = {};
|
|
853
|
-
}
|
|
854
|
-
this.translationMap[itemId] = {
|
|
855
|
-
...this.translationMap[itemId],
|
|
856
|
-
[key]: { originalValue, translatedValue }
|
|
857
|
-
};
|
|
858
|
-
let instance = this.itemInstances.get(itemId);
|
|
859
|
-
if (instance) {
|
|
860
|
-
instance.triggerUpdate();
|
|
861
|
-
}
|
|
862
|
-
};
|
|
863
|
-
/**
|
|
864
|
-
* Collect translation changes for the save flow. Returns `undefined` unless
|
|
865
|
-
* both the locale and language ID are set and at least one entry exists;
|
|
866
|
-
* each entry key is namespaced as `data.<field>` to match Builder.
|
|
867
|
-
*/
|
|
868
|
-
getTranslationChanges = () => {
|
|
869
|
-
let languageId = this.translationLanguageId;
|
|
870
|
-
if (!(this.translationLocale && languageId)) {
|
|
871
|
-
return;
|
|
872
|
-
}
|
|
873
|
-
let entries = [];
|
|
874
|
-
for (let [itemId, fields] of Object.entries(this.translationMap)) {
|
|
875
|
-
for (let [key, entry] of Object.entries(fields)) {
|
|
876
|
-
entries.push({
|
|
877
|
-
itemId,
|
|
878
|
-
key: `data.${key}`,
|
|
879
|
-
originalValue: entry.originalValue,
|
|
880
|
-
translatedValue: entry.translatedValue
|
|
881
|
-
});
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
if (entries.length === 0) {
|
|
885
|
-
return;
|
|
886
|
-
}
|
|
887
|
-
return { languageId, entries };
|
|
888
|
-
};
|
|
889
|
-
/**
|
|
890
|
-
* Re-extract the translation sidecar whenever project data is replaced (route
|
|
891
|
-
* change / non-design reuse), before rebuilding item stores. Takes the
|
|
892
|
-
* renderable page shape (`rootId` resolved) that `getRenderablePage()` and
|
|
893
|
-
* the reuse branch pass in.
|
|
894
|
-
*/
|
|
895
|
-
setProjectData = (data) => {
|
|
896
|
-
this.data = data;
|
|
897
|
-
this.extractTranslationSidecar();
|
|
898
|
-
this.initProject();
|
|
899
|
-
};
|
|
900
|
-
/**
|
|
901
|
-
* Apply updates deferred off the render phase: swap in any pending page data
|
|
902
|
-
* captured on runtime reuse, then notify items whose data was refreshed
|
|
903
|
-
* during construction. The renderer calls this from a layout effect right
|
|
904
|
-
* after commit, so subscribers re-render before paint (no content flash) and
|
|
905
|
-
* without React's setState-in-render warning.
|
|
906
|
-
*/
|
|
907
|
-
flushRenderPhaseUpdates = () => {
|
|
908
|
-
let pendingData = this.pendingProjectData;
|
|
909
|
-
if (pendingData) {
|
|
910
|
-
this.pendingProjectData = void 0;
|
|
911
|
-
this.setProjectData(pendingData);
|
|
912
|
-
}
|
|
913
|
-
let pendingItems = this.pendingItemUpdates;
|
|
914
|
-
if (pendingItems.length > 0) {
|
|
915
|
-
this.pendingItemUpdates = [];
|
|
916
|
-
for (let item of pendingItems) {
|
|
917
|
-
item.triggerUpdate();
|
|
918
|
-
}
|
|
919
|
-
}
|
|
920
|
-
};
|
|
540
|
+
let items = runtime.data?.items;
|
|
541
|
+
if (!items) return;
|
|
542
|
+
for (let { id } of items) {
|
|
543
|
+
let instance = runtime.itemInstances.get(id);
|
|
544
|
+
if (instance && instance.weaverse !== runtime) instance.weaverse = runtime;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
var WeaverseNextRuntime = class extends Weaverse {
|
|
548
|
+
pageId;
|
|
549
|
+
internal;
|
|
550
|
+
requestInfo;
|
|
551
|
+
isPreviewMode;
|
|
552
|
+
isRevisionPreview;
|
|
553
|
+
sectionType;
|
|
554
|
+
translationMap = {};
|
|
555
|
+
translationLocale = String();
|
|
556
|
+
translationLanguageId = String();
|
|
557
|
+
pendingProjectData;
|
|
558
|
+
pendingItemUpdates = [];
|
|
559
|
+
constructor(config) {
|
|
560
|
+
let { client, data } = config;
|
|
561
|
+
let page = getRenderablePage$1(data);
|
|
562
|
+
let configs = data.configs;
|
|
563
|
+
let requestContext = client?.requestContext;
|
|
564
|
+
let isDesignMode = resolveModeFlag(config, "isDesignMode");
|
|
565
|
+
let isPreviewMode = resolveModeFlag(config, "isPreviewMode");
|
|
566
|
+
let isRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
|
|
567
|
+
let sectionType = resolveSectionType(config);
|
|
568
|
+
let projectId = resolveProjectId(client, data, page.id);
|
|
569
|
+
ensureNextItemConstructor();
|
|
570
|
+
super({
|
|
571
|
+
projectId,
|
|
572
|
+
data: page,
|
|
573
|
+
isDesignMode,
|
|
574
|
+
weaverseHost: getConfigString(configs, "weaverseHost"),
|
|
575
|
+
weaverseVersion: getConfigString(configs, "weaverseVersion")
|
|
576
|
+
});
|
|
577
|
+
this.pageId = page.id;
|
|
578
|
+
this.dataContext = resolveDataContext(config);
|
|
579
|
+
this.requestInfo = buildWeaverseNextRequestInfo(requestContext);
|
|
580
|
+
this.isDesignMode = isDesignMode;
|
|
581
|
+
this.isPreviewMode = isPreviewMode;
|
|
582
|
+
this.isRevisionPreview = isRevisionPreview;
|
|
583
|
+
this.sectionType = sectionType;
|
|
584
|
+
let translationStore = config.translationStore ?? new TranslationStore();
|
|
585
|
+
this.internal = {
|
|
586
|
+
merchantOverrides: config.merchantOverrides,
|
|
587
|
+
navigate: config.navigate,
|
|
588
|
+
pageAssignment: data.pageAssignment,
|
|
589
|
+
project: data.project,
|
|
590
|
+
revalidate: config.revalidate,
|
|
591
|
+
themeSettingsStore: config.themeSettingsStore ?? createWeaverseNextThemeSettingsStore({
|
|
592
|
+
schema: client?.themeSchema,
|
|
593
|
+
settings: client?.themeSettings
|
|
594
|
+
}),
|
|
595
|
+
translationStore,
|
|
596
|
+
themeTextStore: translationStore
|
|
597
|
+
};
|
|
598
|
+
this.extractTranslationSidecar();
|
|
599
|
+
}
|
|
600
|
+
extractTranslationSidecar = () => {
|
|
601
|
+
let pageData = this.data;
|
|
602
|
+
let translationMap = pageData?.translationMap;
|
|
603
|
+
if (translationMap) {
|
|
604
|
+
this.translationMap = translationMap;
|
|
605
|
+
this.translationLocale = pageData?.translationLocale || "";
|
|
606
|
+
this.translationLanguageId = pageData?.translationLanguageId || "";
|
|
607
|
+
} else {
|
|
608
|
+
this.translationMap = {};
|
|
609
|
+
this.translationLocale = "";
|
|
610
|
+
this.translationLanguageId = "";
|
|
611
|
+
}
|
|
612
|
+
};
|
|
613
|
+
setTranslationSidecar = (map = {}, locale = "", languageId = "") => {
|
|
614
|
+
this.translationMap = map;
|
|
615
|
+
this.translationLocale = locale;
|
|
616
|
+
this.translationLanguageId = languageId;
|
|
617
|
+
this.refreshAllItems();
|
|
618
|
+
};
|
|
619
|
+
updateTranslation = (itemId, key, originalValue, translatedValue) => {
|
|
620
|
+
if (!this.translationMap[itemId]) this.translationMap[itemId] = {};
|
|
621
|
+
this.translationMap[itemId] = {
|
|
622
|
+
...this.translationMap[itemId],
|
|
623
|
+
[key]: {
|
|
624
|
+
originalValue,
|
|
625
|
+
translatedValue
|
|
626
|
+
}
|
|
627
|
+
};
|
|
628
|
+
let instance = this.itemInstances.get(itemId);
|
|
629
|
+
if (instance) instance.triggerUpdate();
|
|
630
|
+
};
|
|
631
|
+
getTranslationChanges = () => {
|
|
632
|
+
let languageId = this.translationLanguageId;
|
|
633
|
+
if (!(this.translationLocale && languageId)) return;
|
|
634
|
+
let entries = [];
|
|
635
|
+
for (let [itemId, fields] of Object.entries(this.translationMap)) for (let [key, entry] of Object.entries(fields)) entries.push({
|
|
636
|
+
itemId,
|
|
637
|
+
key: `data.${key}`,
|
|
638
|
+
originalValue: entry.originalValue,
|
|
639
|
+
translatedValue: entry.translatedValue
|
|
640
|
+
});
|
|
641
|
+
if (entries.length === 0) return;
|
|
642
|
+
return {
|
|
643
|
+
languageId,
|
|
644
|
+
entries
|
|
645
|
+
};
|
|
646
|
+
};
|
|
647
|
+
setProjectData = (data) => {
|
|
648
|
+
this.data = data;
|
|
649
|
+
this.extractTranslationSidecar();
|
|
650
|
+
this.initProject();
|
|
651
|
+
};
|
|
652
|
+
flushRenderPhaseUpdates = () => {
|
|
653
|
+
let pendingData = this.pendingProjectData;
|
|
654
|
+
if (pendingData) {
|
|
655
|
+
this.pendingProjectData = void 0;
|
|
656
|
+
this.setProjectData(pendingData);
|
|
657
|
+
}
|
|
658
|
+
let pendingItems = this.pendingItemUpdates;
|
|
659
|
+
if (pendingItems.length > 0) {
|
|
660
|
+
this.pendingItemUpdates = [];
|
|
661
|
+
for (let item of pendingItems) item.triggerUpdate();
|
|
662
|
+
}
|
|
663
|
+
};
|
|
921
664
|
};
|
|
922
665
|
function createWeaverseNextRuntime(config) {
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
registerRuntime(existing);
|
|
966
|
-
return existing;
|
|
967
|
-
}
|
|
968
|
-
let [runtime, refreshedItems] = collectDeferredItemUpdates(
|
|
969
|
-
() => new WeaverseNextRuntime(config)
|
|
970
|
-
);
|
|
971
|
-
runtime.pendingItemUpdates = refreshedItems;
|
|
972
|
-
rebindPageItemsToRuntime(runtime);
|
|
973
|
-
runtime.__weaverseNextRequestKey = requestKey;
|
|
974
|
-
runtime.__weaverseNextLatestData = page;
|
|
975
|
-
registerRuntime(runtime);
|
|
976
|
-
return runtime;
|
|
666
|
+
let requestInfo = buildWeaverseNextRequestInfo(config.client?.requestContext);
|
|
667
|
+
let page = getRenderablePage$1(config.data);
|
|
668
|
+
let existing = getRuntimeWindow()?.__weaverses?.[page.id];
|
|
669
|
+
let requestKey = getRuntimeKey(page.id, requestInfo);
|
|
670
|
+
if (existing?.__weaverseNextRequestKey === requestKey) {
|
|
671
|
+
let configs = config.data.configs;
|
|
672
|
+
let nextIsDesignMode = resolveModeFlag(config, "isDesignMode");
|
|
673
|
+
let nextIsPreviewMode = resolveModeFlag(config, "isPreviewMode");
|
|
674
|
+
let nextIsRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
|
|
675
|
+
let nextSectionType = resolveSectionType(config);
|
|
676
|
+
if (existing.isDesignMode || nextIsDesignMode) existing.pendingProjectData = void 0;
|
|
677
|
+
else existing.pendingProjectData = page;
|
|
678
|
+
existing.__weaverseNextLatestData = page;
|
|
679
|
+
existing.dataContext = resolveDataContext(config);
|
|
680
|
+
existing.requestInfo = requestInfo;
|
|
681
|
+
existing.projectId = resolveProjectId(config.client, config.data, page.id);
|
|
682
|
+
existing.isDesignMode = nextIsDesignMode;
|
|
683
|
+
existing.isPreviewMode = nextIsPreviewMode;
|
|
684
|
+
existing.isRevisionPreview = nextIsRevisionPreview;
|
|
685
|
+
existing.sectionType = nextSectionType;
|
|
686
|
+
existing.weaverseHost = getConfigString(configs, "weaverseHost") ?? existing.weaverseHost;
|
|
687
|
+
existing.weaverseVersion = getConfigString(configs, "weaverseVersion") ?? existing.weaverseVersion;
|
|
688
|
+
existing.internal.pageAssignment = config.data.pageAssignment;
|
|
689
|
+
existing.internal.project = config.data.project;
|
|
690
|
+
if (config.navigate) existing.internal.navigate = config.navigate;
|
|
691
|
+
if (config.revalidate) existing.internal.revalidate = config.revalidate;
|
|
692
|
+
if (config.themeSettingsStore) existing.internal.themeSettingsStore = config.themeSettingsStore;
|
|
693
|
+
if (config.translationStore) {
|
|
694
|
+
existing.internal.translationStore = config.translationStore;
|
|
695
|
+
existing.internal.themeTextStore = config.translationStore;
|
|
696
|
+
}
|
|
697
|
+
existing.internal.merchantOverrides = config.merchantOverrides;
|
|
698
|
+
registerRuntime(existing);
|
|
699
|
+
return existing;
|
|
700
|
+
}
|
|
701
|
+
let [runtime, refreshedItems] = collectDeferredItemUpdates(() => new WeaverseNextRuntime(config));
|
|
702
|
+
runtime.pendingItemUpdates = refreshedItems;
|
|
703
|
+
rebindPageItemsToRuntime(runtime);
|
|
704
|
+
runtime.__weaverseNextRequestKey = requestKey;
|
|
705
|
+
runtime.__weaverseNextLatestData = page;
|
|
706
|
+
registerRuntime(runtime);
|
|
707
|
+
return runtime;
|
|
977
708
|
}
|
|
978
709
|
function bindWeaverseNextStudioRuntime(runtime) {
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
"weaverseprojectid",
|
|
1013
|
-
"weaversehost",
|
|
1014
|
-
"weaverseapikey",
|
|
1015
|
-
"weaverseapibase",
|
|
1016
|
-
"weaversepublicapibase",
|
|
1017
|
-
"weaverseversion",
|
|
1018
|
-
"projectid",
|
|
1019
|
-
"weaversedraftitem",
|
|
1020
|
-
"__weaversedraftitem",
|
|
1021
|
-
"_rsc"
|
|
710
|
+
if (!runtime.isDesignMode) return false;
|
|
711
|
+
let studio = getRuntimeWindow()?.weaverseStudio;
|
|
712
|
+
if (!studio) return false;
|
|
713
|
+
let boundRuntime = runtime;
|
|
714
|
+
let activeRequestInfo = studio.weaverse?.requestInfo;
|
|
715
|
+
let isActiveUrl = !activeRequestInfo || activeRequestInfo.pathname === runtime.requestInfo.pathname && activeRequestInfo.search === runtime.requestInfo.search;
|
|
716
|
+
if (!(boundRuntime.__weaverseNextStudioBound && isActiveUrl)) {
|
|
717
|
+
studio.init?.(runtime);
|
|
718
|
+
boundRuntime.__weaverseNextStudioBound = true;
|
|
719
|
+
return true;
|
|
720
|
+
}
|
|
721
|
+
studio.refreshStudio?.({
|
|
722
|
+
data: boundRuntime.__weaverseNextLatestData ?? runtime.data,
|
|
723
|
+
pageId: runtime.pageId,
|
|
724
|
+
requestInfo: runtime.requestInfo
|
|
725
|
+
});
|
|
726
|
+
return true;
|
|
727
|
+
}
|
|
728
|
+
//#endregion
|
|
729
|
+
//#region src/revalidate-item.ts
|
|
730
|
+
const DEFAULT_REVALIDATE_ENDPOINT = "/api/weaverse/revalidate";
|
|
731
|
+
const MAX_ROUTE_CONTEXT_HANDLE_LENGTH = 512;
|
|
732
|
+
const DENIED_ROUTE_CONTEXT_PARAMS = [
|
|
733
|
+
"weaverseprojectid",
|
|
734
|
+
"weaversehost",
|
|
735
|
+
"weaverseapikey",
|
|
736
|
+
"weaverseapibase",
|
|
737
|
+
"weaversepublicapibase",
|
|
738
|
+
"weaverseversion",
|
|
739
|
+
"projectid",
|
|
740
|
+
"weaversedraftitem",
|
|
741
|
+
"__weaversedraftitem",
|
|
742
|
+
"_rsc"
|
|
1022
743
|
];
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
744
|
+
const ROUTE_CONTEXT_I18N_KEYS = [
|
|
745
|
+
"country",
|
|
746
|
+
"label",
|
|
747
|
+
"language",
|
|
748
|
+
"locale",
|
|
749
|
+
"pathPrefix"
|
|
1029
750
|
];
|
|
1030
751
|
function sanitizeRouteContextSearch(search) {
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
}
|
|
1037
|
-
}
|
|
1038
|
-
let serialized = params.toString();
|
|
1039
|
-
return serialized ? `?${serialized}` : "";
|
|
752
|
+
let params = new URLSearchParams(search);
|
|
753
|
+
let denied = new Set(DENIED_ROUTE_CONTEXT_PARAMS);
|
|
754
|
+
for (let key of [...new Set(params.keys())]) if (denied.has(key.toLowerCase())) params.delete(key);
|
|
755
|
+
let serialized = params.toString();
|
|
756
|
+
return serialized ? `?${serialized}` : "";
|
|
1040
757
|
}
|
|
1041
758
|
function buildWeaverseNextRevalidateRouteContext(requestInfo) {
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
routeContext.i18n = picked;
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
if (requestInfo.pageType && PageTypeSchema.safeParse(requestInfo.pageType).success) {
|
|
1063
|
-
routeContext.pageType = requestInfo.pageType;
|
|
1064
|
-
}
|
|
1065
|
-
if (typeof requestInfo.handle === "string" && requestInfo.handle && requestInfo.handle.length <= MAX_ROUTE_CONTEXT_HANDLE_LENGTH) {
|
|
1066
|
-
routeContext.handle = requestInfo.handle;
|
|
1067
|
-
}
|
|
1068
|
-
return routeContext;
|
|
759
|
+
if (!requestInfo || typeof requestInfo.pathname !== "string" || !requestInfo.pathname) return;
|
|
760
|
+
let routeContext = {
|
|
761
|
+
pathname: requestInfo.pathname,
|
|
762
|
+
search: sanitizeRouteContextSearch(requestInfo.search ?? "")
|
|
763
|
+
};
|
|
764
|
+
let { i18n } = requestInfo;
|
|
765
|
+
if (i18n && typeof i18n === "object") {
|
|
766
|
+
let picked = {};
|
|
767
|
+
for (let key of ROUTE_CONTEXT_I18N_KEYS) {
|
|
768
|
+
let value = i18n[key];
|
|
769
|
+
if (typeof value === "string") picked[key] = value;
|
|
770
|
+
}
|
|
771
|
+
if (Object.keys(picked).length) routeContext.i18n = picked;
|
|
772
|
+
}
|
|
773
|
+
if (requestInfo.pageType && PageTypeSchema.safeParse(requestInfo.pageType).success) routeContext.pageType = requestInfo.pageType;
|
|
774
|
+
if (typeof requestInfo.handle === "string" && requestInfo.handle && requestInfo.handle.length <= MAX_ROUTE_CONTEXT_HANDLE_LENGTH) routeContext.handle = requestInfo.handle;
|
|
775
|
+
return routeContext;
|
|
1069
776
|
}
|
|
1070
777
|
async function revalidateWeaverseNextItem(runtime, draftItem, endpoint = DEFAULT_REVALIDATE_ENDPOINT) {
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
}
|
|
1091
|
-
let { loaderData } = await response.json();
|
|
1092
|
-
instance.setData({ loaderData: loaderData ?? null });
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
// src/studio-bridge.tsx
|
|
1096
|
-
import { useEffect as useEffect3, useRef as useRef3 } from "react";
|
|
1097
|
-
var STUDIO_BIND_RETRY_INTERVAL_MS = 50;
|
|
1098
|
-
var STUDIO_BIND_MAX_ATTEMPTS = 100;
|
|
778
|
+
let instance = runtime.itemInstances.get(draftItem.id);
|
|
779
|
+
if (!instance) throw new Error(`[weaverse-next] No live item instance for "${draftItem.id}".`);
|
|
780
|
+
let routeContext = buildWeaverseNextRevalidateRouteContext(runtime.requestInfo);
|
|
781
|
+
let response = await fetch(endpoint, {
|
|
782
|
+
method: "POST",
|
|
783
|
+
headers: { "Content-Type": "application/json" },
|
|
784
|
+
body: JSON.stringify(routeContext ? {
|
|
785
|
+
draftItem,
|
|
786
|
+
routeContext
|
|
787
|
+
} : { draftItem })
|
|
788
|
+
});
|
|
789
|
+
if (!response.ok) throw new Error(`[weaverse-next] Revalidate endpoint responded ${response.status}.`);
|
|
790
|
+
let { loaderData } = await response.json();
|
|
791
|
+
instance.setData({ loaderData: loaderData ?? null });
|
|
792
|
+
}
|
|
793
|
+
//#endregion
|
|
794
|
+
//#region src/studio-bridge.tsx
|
|
795
|
+
const STUDIO_BIND_RETRY_INTERVAL_MS = 50;
|
|
796
|
+
const STUDIO_BIND_MAX_ATTEMPTS = 100;
|
|
1099
797
|
function WeaverseNextStudioBridge(props) {
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
}
|
|
1142
|
-
|
|
1143
|
-
// src/studio-router.ts
|
|
798
|
+
let { runtime, navigate, revalidate, revalidateItem } = props;
|
|
799
|
+
let lastRuntimeRef = useRef(runtime);
|
|
800
|
+
let lastRuntimeDataRef = useRef(runtime.data);
|
|
801
|
+
let lastRequestInfoRef = useRef(runtime.requestInfo);
|
|
802
|
+
useEffect(() => {
|
|
803
|
+
if (navigate) runtime.internal.navigate = navigate;
|
|
804
|
+
if (revalidate) runtime.internal.revalidate = revalidate;
|
|
805
|
+
if (revalidateItem) runtime.internal.revalidateItem = revalidateItem;
|
|
806
|
+
if (bindWeaverseNextStudioRuntime(runtime) || !runtime.isDesignMode) return;
|
|
807
|
+
let attempts = 0;
|
|
808
|
+
let interval = window.setInterval(() => {
|
|
809
|
+
attempts += 1;
|
|
810
|
+
if (bindWeaverseNextStudioRuntime(runtime) || attempts >= STUDIO_BIND_MAX_ATTEMPTS) window.clearInterval(interval);
|
|
811
|
+
}, STUDIO_BIND_RETRY_INTERVAL_MS);
|
|
812
|
+
return () => window.clearInterval(interval);
|
|
813
|
+
}, [
|
|
814
|
+
runtime,
|
|
815
|
+
navigate,
|
|
816
|
+
revalidate,
|
|
817
|
+
revalidateItem
|
|
818
|
+
]);
|
|
819
|
+
useEffect(() => {
|
|
820
|
+
if (lastRuntimeRef.current !== runtime) {
|
|
821
|
+
lastRuntimeRef.current = runtime;
|
|
822
|
+
lastRuntimeDataRef.current = runtime.data;
|
|
823
|
+
lastRequestInfoRef.current = runtime.requestInfo;
|
|
824
|
+
return;
|
|
825
|
+
}
|
|
826
|
+
if (lastRuntimeDataRef.current === runtime.data && lastRequestInfoRef.current === runtime.requestInfo) return;
|
|
827
|
+
lastRuntimeDataRef.current = runtime.data;
|
|
828
|
+
lastRequestInfoRef.current = runtime.requestInfo;
|
|
829
|
+
bindWeaverseNextStudioRuntime(runtime);
|
|
830
|
+
}, [
|
|
831
|
+
runtime,
|
|
832
|
+
runtime.data,
|
|
833
|
+
runtime.requestInfo
|
|
834
|
+
]);
|
|
835
|
+
return null;
|
|
836
|
+
}
|
|
837
|
+
//#endregion
|
|
838
|
+
//#region src/studio-router.ts
|
|
1144
839
|
function shouldResetScroll(options) {
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
}
|
|
1148
|
-
return !options.preventScrollReset;
|
|
840
|
+
if (!options || typeof options !== "object") return true;
|
|
841
|
+
return !options.preventScrollReset;
|
|
1149
842
|
}
|
|
1150
843
|
function createWeaverseNextStudioInternals(router, options = {}) {
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
// src/use-weaverse-next-studio.tsx
|
|
1167
|
-
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
844
|
+
return {
|
|
845
|
+
navigate: (to, navigateOptions) => {
|
|
846
|
+
let scroll = shouldResetScroll(navigateOptions);
|
|
847
|
+
if (options.replace) router.replace(to, { scroll });
|
|
848
|
+
else router.push(to, { scroll });
|
|
849
|
+
},
|
|
850
|
+
revalidate: () => {
|
|
851
|
+
router.refresh();
|
|
852
|
+
}
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
//#endregion
|
|
856
|
+
//#region src/use-weaverse-next-studio.tsx
|
|
1168
857
|
function useWeaverseNextStudioInternals(options) {
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
}
|
|
1178
|
-
return ref.current.internals;
|
|
858
|
+
let router = useRouter();
|
|
859
|
+
let ref = useRef(null);
|
|
860
|
+
if (!ref.current || ref.current.router !== router || ref.current.replace !== options?.replace) ref.current = {
|
|
861
|
+
internals: createWeaverseNextStudioInternals(router, options),
|
|
862
|
+
replace: options?.replace,
|
|
863
|
+
router
|
|
864
|
+
};
|
|
865
|
+
return ref.current.internals;
|
|
1179
866
|
}
|
|
1180
867
|
function WeaverseNextStudio(props) {
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
weaverse?.flushRenderPhaseUpdates();
|
|
1244
|
-
}, [weaverse]);
|
|
1245
|
-
if (!weaverse) {
|
|
1246
|
-
return null;
|
|
1247
|
-
}
|
|
1248
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1249
|
-
/* @__PURE__ */ jsx6(WeaverseRoot, { context: weaverse }),
|
|
1250
|
-
/* @__PURE__ */ jsx6(WeaverseNextStudio, { runtime: weaverse })
|
|
1251
|
-
] });
|
|
868
|
+
let { runtime, replace, revalidateEndpoint } = props;
|
|
869
|
+
let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace });
|
|
870
|
+
let endpoint = revalidateEndpoint ?? "/api/weaverse/revalidate";
|
|
871
|
+
let revalidateItemRef = useRef(null);
|
|
872
|
+
if (revalidateItemRef.current?.endpoint !== endpoint || revalidateItemRef.current.runtime !== runtime) revalidateItemRef.current = {
|
|
873
|
+
endpoint,
|
|
874
|
+
revalidateItem: (draftItem) => revalidateWeaverseNextItem(runtime, draftItem, endpoint),
|
|
875
|
+
runtime
|
|
876
|
+
};
|
|
877
|
+
return /* @__PURE__ */ jsx(WeaverseNextStudioBridge, {
|
|
878
|
+
navigate,
|
|
879
|
+
revalidate,
|
|
880
|
+
revalidateItem: revalidateItemRef.current.revalidateItem,
|
|
881
|
+
runtime
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
//#endregion
|
|
885
|
+
//#region src/renderer.tsx
|
|
886
|
+
const EMPTY_DATA_CONTEXT = {};
|
|
887
|
+
const useIsomorphicLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
|
|
888
|
+
function getRenderablePage(data) {
|
|
889
|
+
let page = data?.page;
|
|
890
|
+
if (!page) return null;
|
|
891
|
+
let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
|
|
892
|
+
return {
|
|
893
|
+
...page,
|
|
894
|
+
rootId
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
const WeaverseNextRenderer = memo(function WeaverseNextRendererComponent(props) {
|
|
898
|
+
let context = useContext(WeaverseNextContext);
|
|
899
|
+
let client = props.client ?? context?.client;
|
|
900
|
+
let data = props.data ?? client?.data ?? null;
|
|
901
|
+
let dataContext = props.dataContext ?? client?.dataContext ?? EMPTY_DATA_CONTEXT;
|
|
902
|
+
let page = useMemo(() => getRenderablePage(data), [data]);
|
|
903
|
+
let weaverse = useMemo(() => {
|
|
904
|
+
if (!page) return null;
|
|
905
|
+
return createWeaverseNextRuntime({
|
|
906
|
+
client,
|
|
907
|
+
data: {
|
|
908
|
+
...data,
|
|
909
|
+
page
|
|
910
|
+
},
|
|
911
|
+
dataContext,
|
|
912
|
+
merchantOverrides: context?.merchantOverrides,
|
|
913
|
+
themeSettingsStore: context?.themeSettingsStore,
|
|
914
|
+
translationStore: context?.translationStore
|
|
915
|
+
});
|
|
916
|
+
}, [
|
|
917
|
+
client,
|
|
918
|
+
page,
|
|
919
|
+
data,
|
|
920
|
+
dataContext,
|
|
921
|
+
context?.merchantOverrides,
|
|
922
|
+
context?.themeSettingsStore,
|
|
923
|
+
context?.translationStore
|
|
924
|
+
]);
|
|
925
|
+
useIsomorphicLayoutEffect(() => {
|
|
926
|
+
weaverse?.flushRenderPhaseUpdates();
|
|
927
|
+
}, [weaverse]);
|
|
928
|
+
if (!weaverse) return null;
|
|
929
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(WeaverseRoot, { context: weaverse }), /* @__PURE__ */ jsx(WeaverseNextStudio, { runtime: weaverse })] });
|
|
1252
930
|
});
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
// src/studio-script-src.ts
|
|
1258
|
-
var TRUSTED_STUDIO_DOMAINS = ["weaverse.io", "weaverse.dev"];
|
|
931
|
+
//#endregion
|
|
932
|
+
//#region src/studio-script-src.ts
|
|
933
|
+
const TRUSTED_STUDIO_DOMAINS = ["weaverse.io", "weaverse.dev"];
|
|
1259
934
|
function isLoopbackHostname(hostname) {
|
|
1260
|
-
|
|
935
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname.endsWith(".localhost");
|
|
1261
936
|
}
|
|
1262
937
|
function normalizeOrigin(value) {
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
return null;
|
|
1270
|
-
}
|
|
938
|
+
if (!value) return null;
|
|
939
|
+
try {
|
|
940
|
+
return new URL(value).origin;
|
|
941
|
+
} catch {
|
|
942
|
+
return null;
|
|
943
|
+
}
|
|
1271
944
|
}
|
|
1272
945
|
function isTrustedStudioOrigin(origin, storefrontHostname) {
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
if (protocol !== "https:") {
|
|
1284
|
-
return false;
|
|
1285
|
-
}
|
|
1286
|
-
return TRUSTED_STUDIO_DOMAINS.some(
|
|
1287
|
-
(domain) => hostname === domain || hostname.endsWith(`.${domain}`)
|
|
1288
|
-
);
|
|
946
|
+
let parsed;
|
|
947
|
+
try {
|
|
948
|
+
parsed = new URL(origin);
|
|
949
|
+
} catch {
|
|
950
|
+
return false;
|
|
951
|
+
}
|
|
952
|
+
let { hostname, protocol } = parsed;
|
|
953
|
+
if (isLoopbackHostname(storefrontHostname) && isLoopbackHostname(hostname)) return protocol === "http:" || protocol === "https:";
|
|
954
|
+
if (protocol !== "https:") return false;
|
|
955
|
+
return TRUSTED_STUDIO_DOMAINS.some((domain) => hostname === domain || hostname.endsWith(`.${domain}`));
|
|
1289
956
|
}
|
|
1290
957
|
function toSearchParams(context) {
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
}
|
|
1298
|
-
return new URLSearchParams();
|
|
958
|
+
if (context?.searchParams) return new URLSearchParams(context.searchParams);
|
|
959
|
+
if (context?.url) {
|
|
960
|
+
let url = typeof context.url === "string" ? new URL(context.url, "http://localhost") : context.url;
|
|
961
|
+
return new URLSearchParams(url.searchParams);
|
|
962
|
+
}
|
|
963
|
+
return new URLSearchParams();
|
|
1299
964
|
}
|
|
1300
965
|
function last(searchParams, key) {
|
|
1301
|
-
|
|
1302
|
-
|
|
966
|
+
let values = searchParams.getAll(key);
|
|
967
|
+
return values.length ? values.at(-1) ?? null : null;
|
|
1303
968
|
}
|
|
1304
969
|
function resolveWeaverseNextStudioScriptSrc(context, options = {}) {
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
let version = last(searchParams, "weaverseVersion");
|
|
1322
|
-
let url = `${origin}/static/studio/next/${bundle}`;
|
|
1323
|
-
return version ? `${url}?v=${encodeURIComponent(version)}` : url;
|
|
1324
|
-
}
|
|
1325
|
-
|
|
1326
|
-
// src/studio-connect.tsx
|
|
1327
|
-
var loadedScriptSrcs = /* @__PURE__ */ new Set();
|
|
970
|
+
let searchParams = toSearchParams(context);
|
|
971
|
+
let isDesignMode = context?.isDesignMode ?? last(searchParams, "isDesignMode") === "true";
|
|
972
|
+
let isPreviewMode = context?.isPreviewMode ?? last(searchParams, "isPreviewMode") === "true";
|
|
973
|
+
let isRevisionPreview = context?.isRevisionPreview ?? Boolean(last(searchParams, "__revisionId"));
|
|
974
|
+
if (!(isDesignMode || isPreviewMode || isRevisionPreview)) return null;
|
|
975
|
+
let origin = normalizeOrigin(last(searchParams, "weaverseHost"));
|
|
976
|
+
if (!origin) return null;
|
|
977
|
+
if (!isTrustedStudioOrigin(origin, options.storefrontHostname ?? "")) return null;
|
|
978
|
+
let bundle = isPreviewMode || isRevisionPreview ? "preview.js" : "index.js";
|
|
979
|
+
let version = last(searchParams, "weaverseVersion");
|
|
980
|
+
let url = `${origin}/static/studio/next/${bundle}`;
|
|
981
|
+
return version ? `${url}?v=${encodeURIComponent(version)}` : url;
|
|
982
|
+
}
|
|
983
|
+
//#endregion
|
|
984
|
+
//#region src/studio-connect.tsx
|
|
985
|
+
const loadedScriptSrcs = /* @__PURE__ */ new Set();
|
|
1328
986
|
function loadScript(src) {
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
let script = document.createElement("script");
|
|
1341
|
-
script.async = true;
|
|
1342
|
-
script.src = src;
|
|
1343
|
-
document.head.appendChild(script);
|
|
1344
|
-
loadedScriptSrcs.add(src);
|
|
987
|
+
if (typeof document === "undefined") return;
|
|
988
|
+
if (loadedScriptSrcs.has(src)) return;
|
|
989
|
+
if (document.querySelector(`script[src="${src}"]`)) {
|
|
990
|
+
loadedScriptSrcs.add(src);
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
993
|
+
let script = document.createElement("script");
|
|
994
|
+
script.async = true;
|
|
995
|
+
script.src = src;
|
|
996
|
+
document.head.appendChild(script);
|
|
997
|
+
loadedScriptSrcs.add(src);
|
|
1345
998
|
}
|
|
1346
999
|
function loadWeaverseNextStudioScript(context, options = {}) {
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
let src = resolveWeaverseNextStudioScriptSrc(resolvedContext, {
|
|
1355
|
-
storefrontHostname: options.storefrontHostname ?? (typeof window === "undefined" ? void 0 : window.location.hostname)
|
|
1356
|
-
});
|
|
1357
|
-
if (src) {
|
|
1358
|
-
loadScript(src);
|
|
1359
|
-
}
|
|
1000
|
+
let resolvedContext = context;
|
|
1001
|
+
if (!resolvedContext && typeof window !== "undefined") resolvedContext = {
|
|
1002
|
+
searchParams: new URLSearchParams(window.location.search),
|
|
1003
|
+
url: window.location.href
|
|
1004
|
+
};
|
|
1005
|
+
let src = resolveWeaverseNextStudioScriptSrc(resolvedContext, { storefrontHostname: options.storefrontHostname ?? (typeof window === "undefined" ? void 0 : window.location.hostname) });
|
|
1006
|
+
if (src) loadScript(src);
|
|
1360
1007
|
}
|
|
1361
1008
|
function WeaverseNextStudioConnect(props) {
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
}, [props.context, props.storefrontHostname]);
|
|
1367
|
-
return null;
|
|
1009
|
+
useEffect(() => {
|
|
1010
|
+
loadWeaverseNextStudioScript(props.context, { storefrontHostname: props.storefrontHostname });
|
|
1011
|
+
}, [props.context, props.storefrontHostname]);
|
|
1012
|
+
return null;
|
|
1368
1013
|
}
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
WeaverseNextProvider,
|
|
1373
|
-
WeaverseNextRenderer,
|
|
1374
|
-
WeaverseNextRootProvider,
|
|
1375
|
-
WeaverseNextRuntime,
|
|
1376
|
-
WeaverseNextStudio,
|
|
1377
|
-
WeaverseNextStudioBridge,
|
|
1378
|
-
WeaverseNextStudioConnect,
|
|
1379
|
-
bindWeaverseNextStudioRuntime,
|
|
1380
|
-
createWeaverseNextClient,
|
|
1381
|
-
createWeaverseNextRuntime,
|
|
1382
|
-
loadWeaverseNextStudioScript,
|
|
1383
|
-
useChildInstances,
|
|
1384
|
-
useItemInstance,
|
|
1385
|
-
useParentInstance,
|
|
1386
|
-
useThemeSettings,
|
|
1387
|
-
useThemeText,
|
|
1388
|
-
useTranslation,
|
|
1389
|
-
useWeaverse,
|
|
1390
|
-
useWeaverseCommerce,
|
|
1391
|
-
useWeaverseNextStudioInternals,
|
|
1392
|
-
useWeaversePageData,
|
|
1393
|
-
useWeaverseRootData
|
|
1394
|
-
};
|
|
1014
|
+
//#endregion
|
|
1015
|
+
export { ThemeTextProvider, TranslationProvider, WeaverseNextProvider, WeaverseNextRenderer, WeaverseNextRootProvider, WeaverseNextRuntime, WeaverseNextStudio, WeaverseNextStudioBridge, WeaverseNextStudioConnect, bindWeaverseNextStudioRuntime, createWeaverseNextClient, createWeaverseNextRuntime, loadWeaverseNextStudioScript, useChildInstances, useItemInstance, useParentInstance, useThemeSettings, useThemeText, useTranslation, useWeaverse, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
|
|
1016
|
+
|
|
1395
1017
|
//# sourceMappingURL=client-boundary.mjs.map
|