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