@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.
@@ -1,1425 +1,1061 @@
1
1
  'use client'
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
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
- let data = {};
60
- if (!schema) {
61
- return data;
62
- }
63
- let groups = schema.settings ?? schema.inspector ?? [];
64
- for (let group of groups) {
65
- for (let input of group?.inputs ?? []) {
66
- let { name, defaultValue } = input;
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
- var isBrowser = typeof window !== "undefined";
75
- var isIframe = isBrowser && window.top !== window.self;
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
- let { data, ...rest } = update;
80
- if (!(data && typeof data === "object" && !Array.isArray(data))) {
81
- return rest;
82
- }
83
- return { ...data, ...rest };
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
- var deferredItemUpdates = null;
30
+ let deferredItemUpdates = null;
86
31
  function collectDeferredItemUpdates(create) {
87
- let previousQueue = deferredItemUpdates;
88
- let queue = /* @__PURE__ */ new Set();
89
- deferredItemUpdates = queue;
90
- try {
91
- return [create(), [...queue]];
92
- } finally {
93
- deferredItemUpdates = previousQueue;
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 import_react.WeaverseItemStore {
97
- /**
98
- * Cached merged snapshot (base `_store` + translations). Reset whenever the
99
- * `_store` ref or the item's translation entry ref changes, so
100
- * `useSyncExternalStore` sees a stable object between unrelated re-renders.
101
- */
102
- _cachedSnapshot = null;
103
- _snapshotStoreRef = null;
104
- _snapshotTranslationRef = null;
105
- /** Create an item store from serialized component data and its runtime. */
106
- constructor(initialData, weaverse) {
107
- super(initialData, weaverse);
108
- let schemaData = generateDataFromSchema(this.Element?.schema);
109
- Object.assign(this._store, schemaData, flattenItemData(initialData));
110
- }
111
- /**
112
- * Flatten nested `data` on updates exactly like the constructor does. Core's
113
- * `initProject()` calls `setData(item)` when a new runtime serves a page
114
- * whose item instances already exist (e.g. locale/client navigation).
115
- *
116
- * A complete serialized item (it carries `id` and `type`; core's
117
- * `initProject()` always passes one) replaces the store the way the
118
- * constructor builds it: the schema defaults of the item's own `type` — the
119
- * Builder can replace a section in place, keeping its id — then the item's
120
- * settings. A payload omits a setting — or the whole optional `data` — when
121
- * its value equals the schema default, so merging into the previous store
122
- * would keep the previous locale's value visible. Partial updates still
123
- * merge. Either way the `_store` ref changes, which invalidates the memoized
124
- * snapshot below. The subscriber emit is queued instead of fired when a
125
- * render-phase deferral is active (see `collectDeferredItemUpdates`).
126
- */
127
- setData = (update) => {
128
- if ("id" in update && "type" in update) {
129
- let { data, type } = update;
130
- let schema = this.weaverse.elementRegistry.get(type)?.schema;
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
- if (!import_react.Weaverse.ItemConstructor || import_react.Weaverse.ItemConstructor === import_react.WeaverseItemStore || import_react.Weaverse.ItemConstructor === WeaverseNextItem) {
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
- // src/main.tsx
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
- let { children, loaderData, ...rest } = props;
185
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ...rest, children });
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
- var mainSchema = (0, import_schema.createSchema)({
189
- type: "main",
190
- title: "Main"
191
- });
192
- var defaultMainComponent = {
193
- default: Main,
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
- // src/registry.ts
198
- var MAIN_TYPE = "main";
199
- var registeredComponentTypes = /* @__PURE__ */ new Set();
97
+ //#endregion
98
+ //#region src/registry.ts
99
+ const MAIN_TYPE = "main";
100
+ const registeredComponentTypes = /* @__PURE__ */ new Set();
200
101
  function registerWeaverseNextComponents(components) {
201
- ensureNextItemConstructor();
202
- let hasUserMain = components.some(
203
- (component) => component.schema?.type === MAIN_TYPE
204
- );
205
- let effectiveComponents = hasUserMain ? components : [defaultMainComponent, ...components];
206
- for (let component of effectiveComponents) {
207
- let type = component.schema.type;
208
- let element = {
209
- type,
210
- Component: component.default,
211
- schema: component.schema,
212
- loader: component.loader
213
- };
214
- if (type === MAIN_TYPE && hasUserMain) {
215
- import_react2.Weaverse.elementRegistry.set(type, element);
216
- registeredComponentTypes.add(type);
217
- continue;
218
- }
219
- if (type && !registeredComponentTypes.has(type)) {
220
- import_react2.Weaverse.registerElement(element);
221
- registeredComponentTypes.add(type);
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
- // src/client.ts
124
+ //#endregion
125
+ //#region src/client.ts
227
126
  var NextClient = class {
228
- projectId;
229
- components;
230
- themeSchema;
231
- themeSettings;
232
- requestContext;
233
- commerce;
234
- data = null;
235
- dataContext = {};
236
- _fetchPage;
237
- _fetchThemeSettings;
238
- constructor(config) {
239
- this.projectId = config.projectId;
240
- this.components = config.components;
241
- registerWeaverseNextComponents(this.components);
242
- this.themeSchema = config.themeSchema;
243
- this.themeSettings = {
244
- ...generateDataFromSchema(config.themeSchema),
245
- ...config.themeSettings
246
- };
247
- this.requestContext = config.requestContext;
248
- this.commerce = config.commerce;
249
- this._fetchPage = config.fetchPage;
250
- this._fetchThemeSettings = config.fetchThemeSettings;
251
- }
252
- /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */
253
- get storefront() {
254
- return this.commerce?.storefront;
255
- }
256
- loadPage = (input = {}) => {
257
- if (!this._fetchPage) {
258
- throw new Error(
259
- "[WeaverseNextClient] loadPage requires a `fetchPage` function in client config."
260
- );
261
- }
262
- return this._fetchPage(input);
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
- return new NextClient(config);
164
+ return new NextClient(config);
275
165
  }
276
-
277
- // src/hooks.ts
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
- let listeners = /* @__PURE__ */ new Set();
289
- let store = {
290
- publicEnv: options.publicEnv,
291
- schema: options.schema,
292
- settings: { ...options.settings ?? {} },
293
- getServerSnapshot: () => store.settings,
294
- getSnapshot: () => store.settings,
295
- subscribe: (listener) => {
296
- listeners.add(listener);
297
- return () => {
298
- listeners.delete(listener);
299
- };
300
- },
301
- updateThemeSettings: (next) => {
302
- store.settings = { ...store.settings, ...next };
303
- for (let listener of listeners) {
304
- listener();
305
- }
306
- }
307
- };
308
- return store;
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
- // src/translation-context.tsx
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
- let keys = path.split(".");
318
- let current = obj;
319
- for (let key of keys) {
320
- if (current == null || typeof current !== "object") {
321
- return fallback;
322
- }
323
- current = current[key];
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
- if (!variables) {
332
- return template;
333
- }
334
- return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
335
- let value = variables[key];
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
- let { staticContent, merchantOverrides, designOverrides, externalT } = sources;
341
- return (key, variables) => {
342
- if (externalT) {
343
- let external = externalT(key, variables);
344
- if (external && external !== key) {
345
- return external;
346
- }
347
- }
348
- let design = designOverrides && Object.hasOwn(designOverrides, key) ? designOverrides[key] : void 0;
349
- let override = merchantOverrides ? getNestedKey(merchantOverrides, key) : void 0;
350
- let staticValue = getNestedKey(staticContent, key);
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
- // src/translation-context.tsx
357
- var import_jsx_runtime2 = require("react/jsx-runtime");
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
- var EMPTY = {};
361
- var NOOP_SUBSCRIBE = () => () => {
362
- };
363
- var NOOP_SNAPSHOT = () => EMPTY;
364
- function TranslationProvider({
365
- staticContent,
366
- merchantOverrides,
367
- t: externalT,
368
- translationStore,
369
- themeTextStore,
370
- children
371
- }) {
372
- let store = translationStore ?? themeTextStore ?? null;
373
- let designOverrides = (0, import_react3.useSafeExternalStore)(
374
- store?.subscribe ?? NOOP_SUBSCRIBE,
375
- store?.getSnapshot ?? NOOP_SNAPSHOT,
376
- store?.getServerSnapshot ?? NOOP_SNAPSHOT
377
- );
378
- let value = (0, import_react4.useMemo)(
379
- () => ({
380
- t: createTranslate({
381
- staticContent,
382
- merchantOverrides,
383
- designOverrides,
384
- externalT
385
- }),
386
- translationStore: store,
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
- let ctx = (0, import_react4.useContext)(TranslationContext);
397
- if (!ctx) {
398
- throw new Error(
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
- var ThemeTextProvider = TranslationProvider;
405
- var useThemeText = useTranslation;
406
-
407
- // src/translation-store.ts
261
+ const ThemeTextProvider = TranslationProvider;
262
+ const useThemeText = useTranslation;
263
+ //#endregion
264
+ //#region src/translation-store.ts
408
265
  var TranslationStore = class {
409
- /** Current flat translation overrides keyed by dot path. */
410
- overrides = {};
411
- listeners = /* @__PURE__ */ new Set();
412
- /** Replace every override and notify subscribers. */
413
- setOverrides = (overrides) => {
414
- this.overrides = { ...overrides };
415
- this.emit();
416
- };
417
- /** Merge changed overrides into the current values and notify subscribers. */
418
- updateOverrides = (newOverrides) => {
419
- this.overrides = { ...this.overrides, ...newOverrides };
420
- this.emit();
421
- };
422
- /** Return the current client-side override snapshot. */
423
- getSnapshot = () => this.overrides;
424
- /** Return the override snapshot used during server rendering. */
425
- getServerSnapshot = () => this.overrides;
426
- /** Subscribe to override changes and return an unsubscribe function. */
427
- subscribe = (callback) => {
428
- this.listeners.add(callback);
429
- return () => {
430
- this.listeners.delete(callback);
431
- };
432
- };
433
- emit = () => {
434
- for (const listener of Array.from(this.listeners)) {
435
- try {
436
- listener();
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
- // src/root-provider.tsx
445
- var import_jsx_runtime3 = require("react/jsx-runtime");
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
- let {
449
- children,
450
- initialThemeSettings,
451
- merchantOverrides,
452
- staticContent,
453
- t,
454
- themeSchema,
455
- publicEnv
456
- } = props;
457
- let storeRef = (0, import_react5.useRef)(null);
458
- if (!storeRef.current) {
459
- storeRef.current = createWeaverseNextThemeSettingsStore({
460
- publicEnv,
461
- schema: themeSchema,
462
- settings: initialThemeSettings
463
- });
464
- }
465
- let themeSettingsStore = storeRef.current;
466
- let translationStoreRef = (0, import_react5.useRef)(null);
467
- if (!translationStoreRef.current) {
468
- translationStoreRef.current = new TranslationStore();
469
- }
470
- let translationStore = translationStoreRef.current;
471
- let appliedThemeSettingsRef = (0, import_react5.useRef)(initialThemeSettings);
472
- (0, import_react5.useEffect)(() => {
473
- if (initialThemeSettings && appliedThemeSettingsRef.current !== initialThemeSettings) {
474
- themeSettingsStore.updateThemeSettings(initialThemeSettings);
475
- appliedThemeSettingsRef.current = initialThemeSettings;
476
- }
477
- }, [initialThemeSettings, themeSettingsStore]);
478
- let resolvedStaticContent = staticContent ?? getSchemaStaticContent(themeSchema);
479
- let rootContextValue = (0, import_react5.useMemo)(
480
- () => ({
481
- merchantOverrides,
482
- staticContent: resolvedStaticContent,
483
- themeSettingsStore,
484
- translationStore
485
- }),
486
- [
487
- merchantOverrides,
488
- resolvedStaticContent,
489
- themeSettingsStore,
490
- translationStore
491
- ]
492
- );
493
- let contextValue = (0, import_react5.useMemo)(
494
- () => ({
495
- merchantOverrides,
496
- themeSettings: themeSettingsStore.getSnapshot(),
497
- themeSettingsStore,
498
- translationStore
499
- }),
500
- [merchantOverrides, themeSettingsStore, translationStore]
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
- // src/provider.tsx
515
- var import_jsx_runtime4 = require("react/jsx-runtime");
516
- var EMPTY_THEME_SETTINGS = {};
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
- let i18n = schema?.i18n;
520
- return i18n?.staticContent ?? EMPTY_STATIC_CONTENT;
358
+ return (schema?.i18n)?.staticContent ?? EMPTY_STATIC_CONTENT;
521
359
  }
522
- var WeaverseNextContext = (0, import_react6.createContext)(null);
360
+ const WeaverseNextContext = (0, react.createContext)(null);
523
361
  function WeaverseNextProvider(props) {
524
- let { children, client, rootData, pageData, commerce, themeSettings } = props;
525
- let rootContext = (0, import_react6.useContext)(WeaverseNextRootContext);
526
- let themeSettingsValue = themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS;
527
- let ownTranslationStoreRef = (0, import_react6.useRef)(null);
528
- if (!(rootContext || ownTranslationStoreRef.current)) {
529
- ownTranslationStoreRef.current = new TranslationStore();
530
- }
531
- let translationStore = rootContext?.translationStore ?? ownTranslationStoreRef.current;
532
- let staticContent = props.staticContent ?? rootContext?.staticContent ?? getSchemaStaticContent(client?.themeSchema);
533
- let merchantOverrides = props.merchantOverrides ?? rootContext?.merchantOverrides;
534
- let ownThemeSettingsStore = (0, import_react6.useMemo)(() => {
535
- if (rootContext) {
536
- return null;
537
- }
538
- return createWeaverseNextThemeSettingsStore({
539
- schema: client?.themeSchema,
540
- settings: themeSettingsValue
541
- });
542
- }, [rootContext, client?.themeSchema, themeSettingsValue]);
543
- let themeSettingsStore = rootContext?.themeSettingsStore ?? ownThemeSettingsStore;
544
- let mergedIntoRootRef = (0, import_react6.useRef)(void 0);
545
- (0, import_react6.useEffect)(() => {
546
- if (rootContext && themeSettingsValue !== EMPTY_THEME_SETTINGS && mergedIntoRootRef.current !== themeSettingsValue) {
547
- rootContext.themeSettingsStore.updateThemeSettings(themeSettingsValue);
548
- mergedIntoRootRef.current = themeSettingsValue;
549
- }
550
- }, [rootContext, themeSettingsValue]);
551
- let value = (0, import_react6.useMemo)(
552
- () => ({
553
- client,
554
- rootData,
555
- pageData,
556
- commerce: commerce ?? client?.commerce,
557
- merchantOverrides,
558
- themeSettings: themeSettingsStore.getSnapshot(),
559
- themeSettingsStore,
560
- translationStore
561
- }),
562
- [
563
- client,
564
- rootData,
565
- pageData,
566
- commerce,
567
- merchantOverrides,
568
- themeSettingsStore,
569
- translationStore
570
- ]
571
- );
572
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(WeaverseNextContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
573
- TranslationProvider,
574
- {
575
- merchantOverrides,
576
- staticContent,
577
- t: props.t,
578
- translationStore,
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
- // src/hooks.ts
585
- var OUTSIDE_PROVIDER_ERROR = "must be used inside a <WeaverseNextProvider>.";
418
+ //#endregion
419
+ //#region src/hooks.ts
420
+ const OUTSIDE_PROVIDER_ERROR = "must be used inside a <WeaverseNextProvider>.";
586
421
  function useWeaverseNextContext(hookName) {
587
- let context = (0, import_react7.useContext)(WeaverseNextContext);
588
- if (!context) {
589
- throw new Error(`[@weaverse/next] ${hookName} ${OUTSIDE_PROVIDER_ERROR}`);
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
- return useWeaverseNextContext("useWeaverseRootData").rootData;
427
+ return useWeaverseNextContext("useWeaverseRootData").rootData;
595
428
  }
596
429
  function useWeaversePageData() {
597
- return useWeaverseNextContext("useWeaversePageData").pageData;
430
+ return useWeaverseNextContext("useWeaversePageData").pageData;
598
431
  }
599
432
  function useWeaverseCommerce() {
600
- return useWeaverseNextContext("useWeaverseCommerce").commerce;
433
+ return useWeaverseNextContext("useWeaverseCommerce").commerce;
601
434
  }
602
435
  function useThemeSettings() {
603
- let { themeSettingsStore } = useWeaverseNextContext("useThemeSettings");
604
- return (0, import_react7.useSyncExternalStore)(
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
- // src/renderer.tsx
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
- return typeof value === "string" ? new URL(value, "http://localhost") : value;
442
+ return typeof value === "string" ? new URL(value, "http://localhost") : value;
621
443
  }
622
444
  function getSearchParamsFromContext(context) {
623
- if (context?.searchParams) {
624
- return new URLSearchParams(context.searchParams);
625
- }
626
- if (context?.url) {
627
- let url = toUrl(context.url);
628
- return new URLSearchParams(url.searchParams);
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
- let raw = typeof i18n?.pathPrefix === "string" ? i18n.pathPrefix : "";
634
- let segments = raw.split("/").filter(Boolean);
635
- let prefix = segments.length > 0 ? `/${segments.join("/")}` : "";
636
- if (prefix === "" || pathname === prefix || pathname.startsWith(`${prefix}/`)) {
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
- if (context?.pathname) {
643
- return withPathPrefix(context.pathname, context.i18n);
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
- if (value === "true") {
653
- return true;
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
- let queries = {};
662
- for (let [key, value] of searchParams.entries()) {
663
- queries[key] = coerceQueryValue(value);
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
- var TRANSIENT_STUDIO_PARAMS = /* @__PURE__ */ new Set([
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
- let searchParams = new URLSearchParams(getSearchParamsFromContext(context));
676
- for (let key of TRANSIENT_STUDIO_PARAMS) {
677
- searchParams.delete(key);
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
- let searchParams = getRequestInfoSearchParams(context);
683
- let search = searchParams.toString();
684
- return {
685
- pathname: getPathnameFromContext(context),
686
- search: search ? `?${search}` : "",
687
- queries: toQueryRecord(searchParams),
688
- ...context?.i18n ? { i18n: context.i18n } : {},
689
- ...context?.pageType ? { pageType: context.pageType } : {},
690
- ...context?.handle ? { handle: context.handle } : {}
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
- // src/runtime.ts
491
+ //#endregion
492
+ //#region src/runtime.ts
695
493
  function getRuntimeWindow() {
696
- return typeof window === "undefined" ? void 0 : window;
494
+ return typeof window === "undefined" ? void 0 : window;
697
495
  }
698
- function getRenderablePage(data) {
699
- let page = data.page;
700
- let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
701
- return { ...page, rootId };
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
- let value = configs?.[key];
705
- return typeof value === "string" ? value : void 0;
505
+ let value = configs?.[key];
506
+ return typeof value === "string" ? value : void 0;
706
507
  }
707
508
  function resolveModeFlag(config, key) {
708
- return config.client?.requestContext?.[key] === true || config.data.configs?.[key] === true;
509
+ return config.client?.requestContext?.[key] === true || config.data.configs?.[key] === true;
709
510
  }
710
511
  function resolveSectionType(config) {
711
- return config.client?.requestContext?.sectionType || getConfigString(config.data.configs, "sectionType") || void 0;
512
+ return config.client?.requestContext?.sectionType || getConfigString(config.data.configs, "sectionType") || void 0;
712
513
  }
713
514
  function getRecordString(record, key) {
714
- let value = record?.[key];
715
- return typeof value === "string" ? value : void 0;
515
+ let value = record?.[key];
516
+ return typeof value === "string" ? value : void 0;
716
517
  }
717
518
  function resolveProjectId(client, data, fallback) {
718
- let projectId = client?.projectId;
719
- if (projectId) {
720
- return projectId;
721
- }
722
- let configProjectId = getConfigString(data.configs, "projectId");
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
- if (config.dataContext) {
730
- return config.dataContext;
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
- return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`;
531
+ return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`;
739
532
  }
740
533
  function registerRuntime(runtime) {
741
- let runtimeWindow = getRuntimeWindow();
742
- if (!runtimeWindow) {
743
- return;
744
- }
745
- runtimeWindow.__weaverses ??= {};
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
- let items = runtime.data?.items;
751
- if (!items) {
752
- return;
753
- }
754
- for (let { id } of items) {
755
- let instance = runtime.itemInstances.get(id);
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 import_react8.Weaverse {
762
- /** Stable ID of the page owned by this runtime. */
763
- pageId;
764
- /** Mutable callbacks and stores consumed by the Studio bridge. */
765
- internal;
766
- /** Path, query, and locale metadata for Studio navigation. */
767
- requestInfo;
768
- /** Whether this runtime renders a component preview. */
769
- isPreviewMode;
770
- /** Whether this runtime renders a saved revision. */
771
- isRevisionPreview;
772
- /** Component type rendered in section preview mode. */
773
- sectionType;
774
- // ─── Item-level translation sidecar (design mode only) ─────────────
775
- /**
776
- * Translation map received from Builder in design mode, keyed by item ID.
777
- * `WeaverseNextItem.getSnapShot()` overlays these onto the data handed to
778
- * components, so translations render without mutating the base `_store`.
779
- */
780
- translationMap = {};
781
- /** Locale associated with the item-level translation sidecar. */
782
- translationLocale = String();
783
- /** Weaverse language ID used when saving translation changes. */
784
- translationLanguageId = String();
785
- /**
786
- * Fresh page data captured while React was rendering. Runtime reuse happens
787
- * inside the renderer's render phase (`useMemo`), where applying it through
788
- * `setProjectData()` would emit item updates to `useSyncExternalStore`
789
- * subscribers mid-render. The renderer applies it post-commit via
790
- * `flushRenderPhaseUpdates()`. Never set on design-mode runtimes — the live
791
- * Studio tree owns the page data there.
792
- */
793
- pendingProjectData;
794
- /**
795
- * Reused item instances whose data was refreshed while this runtime was
796
- * constructed during render (core `initProject()` calls `setData()` on
797
- * them). Their data is already fresh; only the subscriber notification was
798
- * deferred to `flushRenderPhaseUpdates()`.
799
- */
800
- pendingItemUpdates = [];
801
- /** Create a browser runtime from a loaded page and its request context. */
802
- constructor(config) {
803
- let { client, data } = config;
804
- let page = getRenderablePage(data);
805
- let configs = data.configs;
806
- let requestContext = client?.requestContext;
807
- let isDesignMode = resolveModeFlag(config, "isDesignMode");
808
- let isPreviewMode = resolveModeFlag(config, "isPreviewMode");
809
- let isRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
810
- let sectionType = resolveSectionType(config);
811
- let projectId = resolveProjectId(client, data, page.id);
812
- ensureNextItemConstructor();
813
- super({
814
- projectId,
815
- data: page,
816
- isDesignMode,
817
- weaverseHost: getConfigString(configs, "weaverseHost"),
818
- weaverseVersion: getConfigString(configs, "weaverseVersion")
819
- });
820
- this.pageId = page.id;
821
- this.dataContext = resolveDataContext(config);
822
- this.requestInfo = buildWeaverseNextRequestInfo(requestContext);
823
- this.isDesignMode = isDesignMode;
824
- this.isPreviewMode = isPreviewMode;
825
- this.isRevisionPreview = isRevisionPreview;
826
- this.sectionType = sectionType;
827
- let translationStore = config.translationStore ?? new TranslationStore();
828
- this.internal = {
829
- merchantOverrides: config.merchantOverrides,
830
- navigate: config.navigate,
831
- pageAssignment: data.pageAssignment,
832
- project: data.project,
833
- revalidate: config.revalidate,
834
- themeSettingsStore: config.themeSettingsStore ?? createWeaverseNextThemeSettingsStore({
835
- schema: client?.themeSchema,
836
- settings: client?.themeSettings
837
- }),
838
- translationStore,
839
- themeTextStore: translationStore
840
- };
841
- this.extractTranslationSidecar();
842
- }
843
- /**
844
- * Pull `translationMap` / `translationLocale` / `translationLanguageId` off
845
- * the current page data (Builder attaches them in design mode). Unlike
846
- * Hydrogen, this also clears the sidecar to defaults when the new page data
847
- * carries none, so a reused runtime / project-data swap can't leave a stale
848
- * map overlaying the fresh tree.
849
- */
850
- extractTranslationSidecar = () => {
851
- let pageData = this.data;
852
- let translationMap = pageData?.translationMap;
853
- if (translationMap) {
854
- this.translationMap = translationMap;
855
- this.translationLocale = pageData?.translationLocale || "";
856
- this.translationLanguageId = pageData?.translationLanguageId || "";
857
- } else {
858
- this.translationMap = {};
859
- this.translationLocale = "";
860
- this.translationLanguageId = "";
861
- }
862
- };
863
- /**
864
- * Replace the translation sidecar (Builder pushes this when translation data
865
- * arrives or the active language changes) and refresh every item so their
866
- * merged snapshots recompute.
867
- */
868
- setTranslationSidecar = (map = {}, locale = "", languageId = "") => {
869
- this.translationMap = map;
870
- this.translationLocale = locale;
871
- this.translationLanguageId = languageId;
872
- this.refreshAllItems();
873
- };
874
- /**
875
- * Update a single translatable field for one item. Assigns a new per-item
876
- * entry object so `WeaverseNextItem.getSnapShot()`'s translation-ref cache
877
- * invalidates, then triggers only that item's subscribers.
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
- let requestInfo = buildWeaverseNextRequestInfo(config.client?.requestContext);
953
- let page = getRenderablePage(config.data);
954
- let runtimeWindow = getRuntimeWindow();
955
- let existing = runtimeWindow?.__weaverses?.[page.id];
956
- let requestKey = getRuntimeKey(page.id, requestInfo);
957
- if (existing?.__weaverseNextRequestKey === requestKey) {
958
- let configs = config.data.configs;
959
- let nextIsDesignMode = resolveModeFlag(config, "isDesignMode");
960
- let nextIsPreviewMode = resolveModeFlag(config, "isPreviewMode");
961
- let nextIsRevisionPreview = resolveModeFlag(config, "isRevisionPreview");
962
- let nextSectionType = resolveSectionType(config);
963
- if (existing.isDesignMode || nextIsDesignMode) {
964
- existing.pendingProjectData = void 0;
965
- } else {
966
- existing.pendingProjectData = page;
967
- }
968
- existing.__weaverseNextLatestData = page;
969
- existing.dataContext = resolveDataContext(config);
970
- existing.requestInfo = requestInfo;
971
- existing.projectId = resolveProjectId(config.client, config.data, page.id);
972
- existing.isDesignMode = nextIsDesignMode;
973
- existing.isPreviewMode = nextIsPreviewMode;
974
- existing.isRevisionPreview = nextIsRevisionPreview;
975
- existing.sectionType = nextSectionType;
976
- existing.weaverseHost = getConfigString(configs, "weaverseHost") ?? existing.weaverseHost;
977
- existing.weaverseVersion = getConfigString(configs, "weaverseVersion") ?? existing.weaverseVersion;
978
- existing.internal.pageAssignment = config.data.pageAssignment;
979
- existing.internal.project = config.data.project;
980
- if (config.navigate) {
981
- existing.internal.navigate = config.navigate;
982
- }
983
- if (config.revalidate) {
984
- existing.internal.revalidate = config.revalidate;
985
- }
986
- if (config.themeSettingsStore) {
987
- existing.internal.themeSettingsStore = config.themeSettingsStore;
988
- }
989
- if (config.translationStore) {
990
- existing.internal.translationStore = config.translationStore;
991
- existing.internal.themeTextStore = config.translationStore;
992
- }
993
- existing.internal.merchantOverrides = config.merchantOverrides;
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
- if (!runtime.isDesignMode) {
1009
- return false;
1010
- }
1011
- let studio = getRuntimeWindow()?.weaverseStudio;
1012
- if (!studio) {
1013
- return false;
1014
- }
1015
- let boundRuntime = runtime;
1016
- let activeRuntime = studio.weaverse;
1017
- let activeRequestInfo = activeRuntime?.requestInfo;
1018
- let isActiveUrl = !activeRequestInfo || activeRequestInfo.pathname === runtime.requestInfo.pathname && activeRequestInfo.search === runtime.requestInfo.search;
1019
- if (!(boundRuntime.__weaverseNextStudioBound && isActiveUrl)) {
1020
- studio.init?.(runtime);
1021
- boundRuntime.__weaverseNextStudioBound = true;
1022
- return true;
1023
- }
1024
- studio.refreshStudio?.({
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
- // src/use-weaverse-next-studio.tsx
1033
- var import_navigation = require("next/navigation");
1034
- var import_react10 = require("react");
1035
-
1036
- // src/revalidate-item.ts
1037
- var import_schema2 = require("@weaverse/schema");
1038
- var DEFAULT_REVALIDATE_ENDPOINT = "/api/weaverse/revalidate";
1039
- var MAX_ROUTE_CONTEXT_HANDLE_LENGTH = 512;
1040
- var DENIED_ROUTE_CONTEXT_PARAMS = [
1041
- "weaverseprojectid",
1042
- "weaversehost",
1043
- "weaverseapikey",
1044
- "weaverseapibase",
1045
- "weaversepublicapibase",
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
- var ROUTE_CONTEXT_I18N_KEYS = [
1053
- "country",
1054
- "label",
1055
- "language",
1056
- "locale",
1057
- "pathPrefix"
745
+ const ROUTE_CONTEXT_I18N_KEYS = [
746
+ "country",
747
+ "label",
748
+ "language",
749
+ "locale",
750
+ "pathPrefix"
1058
751
  ];
1059
752
  function sanitizeRouteContextSearch(search) {
1060
- let params = new URLSearchParams(search);
1061
- let denied = new Set(DENIED_ROUTE_CONTEXT_PARAMS);
1062
- for (let key of [...new Set(params.keys())]) {
1063
- if (denied.has(key.toLowerCase())) {
1064
- params.delete(key);
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
- if (!requestInfo || typeof requestInfo.pathname !== "string" || !requestInfo.pathname) {
1072
- return;
1073
- }
1074
- let routeContext = {
1075
- pathname: requestInfo.pathname,
1076
- search: sanitizeRouteContextSearch(requestInfo.search ?? "")
1077
- };
1078
- let { i18n } = requestInfo;
1079
- if (i18n && typeof i18n === "object") {
1080
- let picked = {};
1081
- for (let key of ROUTE_CONTEXT_I18N_KEYS) {
1082
- let value = i18n[key];
1083
- if (typeof value === "string") {
1084
- picked[key] = value;
1085
- }
1086
- }
1087
- if (Object.keys(picked).length) {
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
- let instance = runtime.itemInstances.get(draftItem.id);
1101
- if (!instance) {
1102
- throw new Error(
1103
- `[weaverse-next] No live item instance for "${draftItem.id}".`
1104
- );
1105
- }
1106
- let routeContext = buildWeaverseNextRevalidateRouteContext(
1107
- runtime.requestInfo
1108
- );
1109
- let body = routeContext ? { draftItem, routeContext } : { draftItem };
1110
- let response = await fetch(endpoint, {
1111
- method: "POST",
1112
- headers: { "Content-Type": "application/json" },
1113
- body: JSON.stringify(body)
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
- // src/studio-bridge.tsx
1125
- var import_react9 = require("react");
1126
- var STUDIO_BIND_RETRY_INTERVAL_MS = 50;
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
- let { runtime, navigate, revalidate, revalidateItem } = props;
1130
- let lastRuntimeRef = (0, import_react9.useRef)(runtime);
1131
- let lastRuntimeDataRef = (0, import_react9.useRef)(runtime.data);
1132
- let lastRequestInfoRef = (0, import_react9.useRef)(runtime.requestInfo);
1133
- (0, import_react9.useEffect)(() => {
1134
- if (navigate) {
1135
- runtime.internal.navigate = navigate;
1136
- }
1137
- if (revalidate) {
1138
- runtime.internal.revalidate = revalidate;
1139
- }
1140
- if (revalidateItem) {
1141
- runtime.internal.revalidateItem = revalidateItem;
1142
- }
1143
- if (bindWeaverseNextStudioRuntime(runtime) || !runtime.isDesignMode) {
1144
- return;
1145
- }
1146
- let attempts = 0;
1147
- let interval = window.setInterval(() => {
1148
- attempts += 1;
1149
- if (bindWeaverseNextStudioRuntime(runtime) || attempts >= STUDIO_BIND_MAX_ATTEMPTS) {
1150
- window.clearInterval(interval);
1151
- }
1152
- }, STUDIO_BIND_RETRY_INTERVAL_MS);
1153
- return () => window.clearInterval(interval);
1154
- }, [runtime, navigate, revalidate, revalidateItem]);
1155
- (0, import_react9.useEffect)(() => {
1156
- if (lastRuntimeRef.current !== runtime) {
1157
- lastRuntimeRef.current = runtime;
1158
- lastRuntimeDataRef.current = runtime.data;
1159
- lastRequestInfoRef.current = runtime.requestInfo;
1160
- return;
1161
- }
1162
- if (lastRuntimeDataRef.current === runtime.data && lastRequestInfoRef.current === runtime.requestInfo) {
1163
- return;
1164
- }
1165
- lastRuntimeDataRef.current = runtime.data;
1166
- lastRequestInfoRef.current = runtime.requestInfo;
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
- // src/studio-router.ts
838
+ //#endregion
839
+ //#region src/studio-router.ts
1173
840
  function shouldResetScroll(options) {
1174
- if (!options || typeof options !== "object") {
1175
- return true;
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
- return {
1181
- navigate: (to, navigateOptions) => {
1182
- let scroll = shouldResetScroll(navigateOptions);
1183
- if (options.replace) {
1184
- router.replace(to, { scroll });
1185
- } else {
1186
- router.push(to, { scroll });
1187
- }
1188
- },
1189
- revalidate: () => {
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
- // src/use-weaverse-next-studio.tsx
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
- let router = (0, import_navigation.useRouter)();
1199
- let ref = (0, import_react10.useRef)(null);
1200
- if (!ref.current || ref.current.router !== router || ref.current.replace !== options?.replace) {
1201
- ref.current = {
1202
- internals: createWeaverseNextStudioInternals(router, options),
1203
- replace: options?.replace,
1204
- router
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
- let { runtime, replace, revalidateEndpoint } = props;
1211
- let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace });
1212
- let endpoint = revalidateEndpoint ?? DEFAULT_REVALIDATE_ENDPOINT;
1213
- let revalidateItemRef = (0, import_react10.useRef)(null);
1214
- if (revalidateItemRef.current?.endpoint !== endpoint || revalidateItemRef.current.runtime !== runtime) {
1215
- revalidateItemRef.current = {
1216
- endpoint,
1217
- revalidateItem: (draftItem) => revalidateWeaverseNextItem(runtime, draftItem, endpoint),
1218
- runtime
1219
- };
1220
- }
1221
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1222
- WeaverseNextStudioBridge,
1223
- {
1224
- navigate,
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
- // src/renderer.tsx
1233
- var import_jsx_runtime6 = require("react/jsx-runtime");
1234
- var EMPTY_DATA_CONTEXT = {};
1235
- var useIsomorphicLayoutEffect = typeof window === "undefined" ? import_react12.useEffect : import_react12.useLayoutEffect;
1236
- function getRenderablePage2(data) {
1237
- let page = data?.page;
1238
- if (!page) {
1239
- return null;
1240
- }
1241
- let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
1242
- return { ...page, rootId };
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
- var WeaverseNextRenderer = (0, import_react12.memo)(function WeaverseNextRendererComponent(props) {
1245
- let context = (0, import_react12.useContext)(WeaverseNextContext);
1246
- let client = props.client ?? context?.client;
1247
- let data = props.data ?? client?.data ?? null;
1248
- let dataContext = props.dataContext ?? client?.dataContext ?? EMPTY_DATA_CONTEXT;
1249
- let page = (0, import_react12.useMemo)(() => getRenderablePage2(data), [data]);
1250
- let weaverse = (0, import_react12.useMemo)(() => {
1251
- if (!page) {
1252
- return null;
1253
- }
1254
- return createWeaverseNextRuntime({
1255
- client,
1256
- data: { ...data, page },
1257
- dataContext,
1258
- merchantOverrides: context?.merchantOverrides,
1259
- themeSettingsStore: context?.themeSettingsStore,
1260
- translationStore: context?.translationStore
1261
- });
1262
- }, [
1263
- client,
1264
- page,
1265
- data,
1266
- dataContext,
1267
- context?.merchantOverrides,
1268
- context?.themeSettingsStore,
1269
- context?.translationStore
1270
- ]);
1271
- useIsomorphicLayoutEffect(() => {
1272
- weaverse?.flushRenderPhaseUpdates();
1273
- }, [weaverse]);
1274
- if (!weaverse) {
1275
- return null;
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
- // src/studio-connect.tsx
1284
- var import_react13 = require("react");
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
- return hostname === "localhost" || hostname === "127.0.0.1" || hostname.endsWith(".localhost");
936
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname.endsWith(".localhost");
1290
937
  }
1291
938
  function normalizeOrigin(value) {
1292
- if (!value) {
1293
- return null;
1294
- }
1295
- try {
1296
- return new URL(value).origin;
1297
- } catch {
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
- let parsed;
1303
- try {
1304
- parsed = new URL(origin);
1305
- } catch {
1306
- return false;
1307
- }
1308
- let { hostname, protocol } = parsed;
1309
- if (isLoopbackHostname(storefrontHostname) && isLoopbackHostname(hostname)) {
1310
- return protocol === "http:" || protocol === "https:";
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
- if (context?.searchParams) {
1321
- return new URLSearchParams(context.searchParams);
1322
- }
1323
- if (context?.url) {
1324
- let url = typeof context.url === "string" ? new URL(context.url, "http://localhost") : context.url;
1325
- return new URLSearchParams(url.searchParams);
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
- let values = searchParams.getAll(key);
1331
- return values.length ? values.at(-1) ?? null : null;
967
+ let values = searchParams.getAll(key);
968
+ return values.length ? values.at(-1) ?? null : null;
1332
969
  }
1333
970
  function resolveWeaverseNextStudioScriptSrc(context, options = {}) {
1334
- let searchParams = toSearchParams(context);
1335
- let isDesignMode = context?.isDesignMode ?? last(searchParams, "isDesignMode") === "true";
1336
- let isPreviewMode = context?.isPreviewMode ?? last(searchParams, "isPreviewMode") === "true";
1337
- let isRevisionPreview = context?.isRevisionPreview ?? Boolean(last(searchParams, "__revisionId"));
1338
- if (!(isDesignMode || isPreviewMode || isRevisionPreview)) {
1339
- return null;
1340
- }
1341
- let origin = normalizeOrigin(last(searchParams, "weaverseHost"));
1342
- if (!origin) {
1343
- return null;
1344
- }
1345
- let storefrontHostname = options.storefrontHostname ?? "";
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
- // src/studio-connect.tsx
1356
- var loadedScriptSrcs = /* @__PURE__ */ new Set();
984
+ //#endregion
985
+ //#region src/studio-connect.tsx
986
+ const loadedScriptSrcs = /* @__PURE__ */ new Set();
1357
987
  function loadScript(src) {
1358
- if (typeof document === "undefined") {
1359
- return;
1360
- }
1361
- if (loadedScriptSrcs.has(src)) {
1362
- return;
1363
- }
1364
- let existing = document.querySelector(`script[src="${src}"]`);
1365
- if (existing) {
1366
- loadedScriptSrcs.add(src);
1367
- return;
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
- let resolvedContext = context;
1377
- if (!resolvedContext && typeof window !== "undefined") {
1378
- resolvedContext = {
1379
- searchParams: new URLSearchParams(window.location.search),
1380
- url: window.location.href
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
- (0, import_react13.useEffect)(() => {
1392
- loadWeaverseNextStudioScript(props.context, {
1393
- storefrontHostname: props.storefrontHostname
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
- // Annotate the CommonJS export names for ESM import in node:
1399
- 0 && (module.exports = {
1400
- ThemeTextProvider,
1401
- TranslationProvider,
1402
- WeaverseNextProvider,
1403
- WeaverseNextRenderer,
1404
- WeaverseNextRootProvider,
1405
- WeaverseNextRuntime,
1406
- WeaverseNextStudio,
1407
- WeaverseNextStudioBridge,
1408
- WeaverseNextStudioConnect,
1409
- bindWeaverseNextStudioRuntime,
1410
- createWeaverseNextClient,
1411
- createWeaverseNextRuntime,
1412
- loadWeaverseNextStudioScript,
1413
- useChildInstances,
1414
- useItemInstance,
1415
- useParentInstance,
1416
- useThemeSettings,
1417
- useThemeText,
1418
- useTranslation,
1419
- useWeaverse,
1420
- useWeaverseCommerce,
1421
- useWeaverseNextStudioInternals,
1422
- useWeaversePageData,
1423
- useWeaverseRootData
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