@weaverse/next 0.1.0-alpha.0 → 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -0
- package/dist/chunk-SS6QUKYY.mjs +149 -0
- package/dist/chunk-SS6QUKYY.mjs.map +1 -0
- package/dist/index.d.mts +145 -160
- package/dist/index.d.ts +145 -160
- package/dist/index.js +477 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +407 -108
- package/dist/index.mjs.map +1 -1
- package/dist/server.d.mts +60 -0
- package/dist/server.d.ts +60 -0
- package/dist/server.js +662 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +513 -0
- package/dist/server.mjs.map +1 -0
- package/dist/types-DvEeLX6L.d.mts +321 -0
- package/dist/types-DvEeLX6L.d.ts +321 -0
- package/package.json +22 -3
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var react = require('@weaverse/react');
|
|
|
4
4
|
var schema = require('@weaverse/schema');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
var react$1 = require('react');
|
|
7
|
+
var navigation = require('next/navigation');
|
|
7
8
|
|
|
8
9
|
// src/index.ts
|
|
9
10
|
|
|
@@ -132,18 +133,53 @@ var NextClient = class {
|
|
|
132
133
|
function createWeaverseNextClient(config) {
|
|
133
134
|
return new NextClient(config);
|
|
134
135
|
}
|
|
136
|
+
|
|
137
|
+
// src/theme-settings-store.ts
|
|
138
|
+
function createWeaverseNextThemeSettingsStore(options = {}) {
|
|
139
|
+
let listeners = /* @__PURE__ */ new Set();
|
|
140
|
+
let store = {
|
|
141
|
+
publicEnv: options.publicEnv,
|
|
142
|
+
schema: options.schema,
|
|
143
|
+
settings: { ...options.settings ?? {} },
|
|
144
|
+
getServerSnapshot: () => store.settings,
|
|
145
|
+
getSnapshot: () => store.settings,
|
|
146
|
+
subscribe: (listener) => {
|
|
147
|
+
listeners.add(listener);
|
|
148
|
+
return () => {
|
|
149
|
+
listeners.delete(listener);
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
updateThemeSettings: (next) => {
|
|
153
|
+
store.settings = { ...store.settings, ...next };
|
|
154
|
+
for (let listener of listeners) {
|
|
155
|
+
listener();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
return store;
|
|
160
|
+
}
|
|
161
|
+
var EMPTY_THEME_SETTINGS = {};
|
|
135
162
|
var WeaverseNextContext = react$1.createContext(null);
|
|
136
163
|
function WeaverseNextProvider(props) {
|
|
137
164
|
let { children, client, rootData, pageData, commerce, themeSettings } = props;
|
|
165
|
+
let themeSettingsValue = themeSettings ?? client?.themeSettings ?? EMPTY_THEME_SETTINGS;
|
|
166
|
+
let themeSettingsStore = react$1.useMemo(
|
|
167
|
+
() => createWeaverseNextThemeSettingsStore({
|
|
168
|
+
schema: client?.themeSchema,
|
|
169
|
+
settings: themeSettingsValue
|
|
170
|
+
}),
|
|
171
|
+
[client?.themeSchema, themeSettingsValue]
|
|
172
|
+
);
|
|
138
173
|
let value = react$1.useMemo(
|
|
139
174
|
() => ({
|
|
140
175
|
client,
|
|
141
176
|
rootData,
|
|
142
177
|
pageData,
|
|
143
178
|
commerce: commerce ?? client?.commerce,
|
|
144
|
-
themeSettings:
|
|
179
|
+
themeSettings: themeSettingsStore.getSnapshot(),
|
|
180
|
+
themeSettingsStore
|
|
145
181
|
}),
|
|
146
|
-
[client, rootData, pageData, commerce,
|
|
182
|
+
[client, rootData, pageData, commerce, themeSettingsStore]
|
|
147
183
|
);
|
|
148
184
|
return /* @__PURE__ */ jsxRuntime.jsx(WeaverseNextContext.Provider, { value, children });
|
|
149
185
|
}
|
|
@@ -167,7 +203,12 @@ function useWeaverseCommerce() {
|
|
|
167
203
|
return useWeaverseNextContext("useWeaverseCommerce").commerce;
|
|
168
204
|
}
|
|
169
205
|
function useThemeSettings() {
|
|
170
|
-
|
|
206
|
+
let { themeSettingsStore } = useWeaverseNextContext("useThemeSettings");
|
|
207
|
+
return react$1.useSyncExternalStore(
|
|
208
|
+
themeSettingsStore.subscribe,
|
|
209
|
+
themeSettingsStore.getSnapshot,
|
|
210
|
+
themeSettingsStore.getServerSnapshot
|
|
211
|
+
);
|
|
171
212
|
}
|
|
172
213
|
|
|
173
214
|
// src/loader.ts
|
|
@@ -246,8 +287,309 @@ async function runWeaverseComponentLoaders(args) {
|
|
|
246
287
|
await walk(items);
|
|
247
288
|
return data;
|
|
248
289
|
}
|
|
249
|
-
|
|
290
|
+
|
|
291
|
+
// src/request-info.ts
|
|
292
|
+
function toUrl(value) {
|
|
293
|
+
return typeof value === "string" ? new URL(value, "http://localhost") : value;
|
|
294
|
+
}
|
|
295
|
+
function getSearchParamsFromContext(context) {
|
|
296
|
+
if (context?.searchParams) {
|
|
297
|
+
return new URLSearchParams(context.searchParams);
|
|
298
|
+
}
|
|
299
|
+
if (context?.url) {
|
|
300
|
+
let url = toUrl(context.url);
|
|
301
|
+
return new URLSearchParams(url.searchParams);
|
|
302
|
+
}
|
|
303
|
+
return new URLSearchParams();
|
|
304
|
+
}
|
|
305
|
+
function getPathnameFromContext(context) {
|
|
306
|
+
if (context?.pathname) {
|
|
307
|
+
return context.pathname;
|
|
308
|
+
}
|
|
309
|
+
if (context?.url) {
|
|
310
|
+
let url = toUrl(context.url);
|
|
311
|
+
return url.pathname || "/";
|
|
312
|
+
}
|
|
313
|
+
return "/";
|
|
314
|
+
}
|
|
315
|
+
function coerceQueryValue(value) {
|
|
316
|
+
if (value === "true") {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
if (value === "false") {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
return value;
|
|
323
|
+
}
|
|
324
|
+
function toQueryRecord(searchParams) {
|
|
325
|
+
let queries = {};
|
|
326
|
+
for (let [key, value] of searchParams.entries()) {
|
|
327
|
+
queries[key] = coerceQueryValue(value);
|
|
328
|
+
}
|
|
329
|
+
return queries;
|
|
330
|
+
}
|
|
331
|
+
function buildWeaverseNextRequestInfo(context) {
|
|
332
|
+
let searchParams = getSearchParamsFromContext(context);
|
|
333
|
+
let search = searchParams.toString();
|
|
334
|
+
return {
|
|
335
|
+
pathname: getPathnameFromContext(context),
|
|
336
|
+
search: search ? `?${search}` : "",
|
|
337
|
+
queries: toQueryRecord(searchParams),
|
|
338
|
+
...context?.i18n ? { i18n: context.i18n } : {}
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// src/runtime.ts
|
|
343
|
+
function getRuntimeWindow() {
|
|
344
|
+
return typeof window === "undefined" ? void 0 : window;
|
|
345
|
+
}
|
|
250
346
|
function getRenderablePage(data) {
|
|
347
|
+
let page = data.page;
|
|
348
|
+
let rootId = page.rootId ?? page.items.find((item) => item.type === "main")?.id ?? page.items[0]?.id ?? page.id;
|
|
349
|
+
return { ...page, rootId };
|
|
350
|
+
}
|
|
351
|
+
function getConfigString(configs, key) {
|
|
352
|
+
let value = configs?.[key];
|
|
353
|
+
return typeof value === "string" ? value : void 0;
|
|
354
|
+
}
|
|
355
|
+
function getRecordString(record, key) {
|
|
356
|
+
let value = record?.[key];
|
|
357
|
+
return typeof value === "string" ? value : void 0;
|
|
358
|
+
}
|
|
359
|
+
function resolveProjectId(client, data, fallback) {
|
|
360
|
+
let projectId = client?.projectId;
|
|
361
|
+
if (projectId) {
|
|
362
|
+
return projectId;
|
|
363
|
+
}
|
|
364
|
+
let configProjectId = getConfigString(data.configs, "projectId");
|
|
365
|
+
if (configProjectId) {
|
|
366
|
+
return configProjectId;
|
|
367
|
+
}
|
|
368
|
+
return getRecordString(data.project, "id") ?? fallback;
|
|
369
|
+
}
|
|
370
|
+
function resolveDataContext(config) {
|
|
371
|
+
if (config.dataContext) {
|
|
372
|
+
return config.dataContext;
|
|
373
|
+
}
|
|
374
|
+
if (config.client?.dataContext) {
|
|
375
|
+
return config.client.dataContext;
|
|
376
|
+
}
|
|
377
|
+
return {};
|
|
378
|
+
}
|
|
379
|
+
function getRuntimeKey(pageId, requestInfo) {
|
|
380
|
+
return `${pageId}:${requestInfo.pathname}:${requestInfo.search}`;
|
|
381
|
+
}
|
|
382
|
+
function registerRuntime(runtime) {
|
|
383
|
+
let runtimeWindow = getRuntimeWindow();
|
|
384
|
+
if (!runtimeWindow) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
runtimeWindow.__weaverses ??= {};
|
|
388
|
+
runtimeWindow.__weaverses[runtime.pageId] = runtime;
|
|
389
|
+
runtimeWindow.__weaverse = runtime;
|
|
390
|
+
}
|
|
391
|
+
var WeaverseNextRuntime = class extends react.Weaverse {
|
|
392
|
+
pageId;
|
|
393
|
+
internal;
|
|
394
|
+
requestInfo;
|
|
395
|
+
isPreviewMode;
|
|
396
|
+
isRevisionPreview;
|
|
397
|
+
sectionType;
|
|
398
|
+
translationMap = {};
|
|
399
|
+
translationLocale = "";
|
|
400
|
+
translationLanguageId = "";
|
|
401
|
+
constructor(config) {
|
|
402
|
+
let { client, data } = config;
|
|
403
|
+
let page = getRenderablePage(data);
|
|
404
|
+
let configs = data.configs;
|
|
405
|
+
let requestContext = client?.requestContext;
|
|
406
|
+
let projectId = resolveProjectId(client, data, page.id);
|
|
407
|
+
ensureNextItemConstructor();
|
|
408
|
+
super({
|
|
409
|
+
projectId,
|
|
410
|
+
data: page,
|
|
411
|
+
isDesignMode: requestContext?.isDesignMode ?? false,
|
|
412
|
+
weaverseHost: getConfigString(configs, "weaverseHost"),
|
|
413
|
+
weaverseVersion: getConfigString(configs, "weaverseVersion")
|
|
414
|
+
});
|
|
415
|
+
this.pageId = page.id;
|
|
416
|
+
this.dataContext = resolveDataContext(config);
|
|
417
|
+
this.requestInfo = buildWeaverseNextRequestInfo(requestContext);
|
|
418
|
+
this.isDesignMode = requestContext?.isDesignMode ?? false;
|
|
419
|
+
this.isPreviewMode = requestContext?.isPreviewMode ?? false;
|
|
420
|
+
this.isRevisionPreview = requestContext?.isRevisionPreview ?? false;
|
|
421
|
+
this.sectionType = requestContext?.sectionType;
|
|
422
|
+
this.internal = {
|
|
423
|
+
navigate: config.navigate,
|
|
424
|
+
pageAssignment: data.pageAssignment,
|
|
425
|
+
project: data.project,
|
|
426
|
+
revalidate: config.revalidate,
|
|
427
|
+
themeSettingsStore: config.themeSettingsStore ?? createWeaverseNextThemeSettingsStore({
|
|
428
|
+
schema: client?.themeSchema,
|
|
429
|
+
settings: client?.themeSettings
|
|
430
|
+
})
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
extractTranslationSidecar = () => void 0;
|
|
434
|
+
setTranslationSidecar = (map = {}, locale = "", languageId = "") => {
|
|
435
|
+
this.translationMap = map;
|
|
436
|
+
this.translationLocale = locale;
|
|
437
|
+
this.translationLanguageId = languageId;
|
|
438
|
+
};
|
|
439
|
+
updateTranslation = () => void 0;
|
|
440
|
+
getTranslationChanges = () => void 0;
|
|
441
|
+
};
|
|
442
|
+
function createWeaverseNextRuntime(config) {
|
|
443
|
+
let requestInfo = buildWeaverseNextRequestInfo(config.client?.requestContext);
|
|
444
|
+
let page = getRenderablePage(config.data);
|
|
445
|
+
let runtimeWindow = getRuntimeWindow();
|
|
446
|
+
let existing = runtimeWindow?.__weaverses?.[page.id];
|
|
447
|
+
let requestKey = getRuntimeKey(page.id, requestInfo);
|
|
448
|
+
if (existing?.__weaverseNextRequestKey === requestKey) {
|
|
449
|
+
let nextIsDesignMode = config.client?.requestContext?.isDesignMode ?? false;
|
|
450
|
+
if (!(existing.isDesignMode || nextIsDesignMode)) {
|
|
451
|
+
existing.setProjectData(page);
|
|
452
|
+
}
|
|
453
|
+
existing.dataContext = resolveDataContext(config);
|
|
454
|
+
existing.requestInfo = requestInfo;
|
|
455
|
+
existing.projectId = resolveProjectId(config.client, config.data, page.id);
|
|
456
|
+
existing.isDesignMode = nextIsDesignMode;
|
|
457
|
+
existing.isPreviewMode = config.client?.requestContext?.isPreviewMode ?? false;
|
|
458
|
+
existing.isRevisionPreview = config.client?.requestContext?.isRevisionPreview ?? false;
|
|
459
|
+
existing.sectionType = config.client?.requestContext?.sectionType;
|
|
460
|
+
existing.weaverseHost = getConfigString(config.data.configs, "weaverseHost") ?? existing.weaverseHost;
|
|
461
|
+
existing.weaverseVersion = getConfigString(config.data.configs, "weaverseVersion") ?? existing.weaverseVersion;
|
|
462
|
+
existing.internal.pageAssignment = config.data.pageAssignment;
|
|
463
|
+
existing.internal.project = config.data.project;
|
|
464
|
+
if (config.navigate) {
|
|
465
|
+
existing.internal.navigate = config.navigate;
|
|
466
|
+
}
|
|
467
|
+
if (config.revalidate) {
|
|
468
|
+
existing.internal.revalidate = config.revalidate;
|
|
469
|
+
}
|
|
470
|
+
if (config.themeSettingsStore) {
|
|
471
|
+
existing.internal.themeSettingsStore = config.themeSettingsStore;
|
|
472
|
+
}
|
|
473
|
+
registerRuntime(existing);
|
|
474
|
+
return existing;
|
|
475
|
+
}
|
|
476
|
+
let runtime = new WeaverseNextRuntime(config);
|
|
477
|
+
runtime.__weaverseNextRequestKey = requestKey;
|
|
478
|
+
registerRuntime(runtime);
|
|
479
|
+
return runtime;
|
|
480
|
+
}
|
|
481
|
+
function bindWeaverseNextStudioRuntime(runtime) {
|
|
482
|
+
if (!runtime.isDesignMode) {
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
let studio = getRuntimeWindow()?.weaverseStudio;
|
|
486
|
+
if (!studio) {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
let boundRuntime = runtime;
|
|
490
|
+
if (!boundRuntime.__weaverseNextStudioBound) {
|
|
491
|
+
studio.init?.(runtime);
|
|
492
|
+
boundRuntime.__weaverseNextStudioBound = true;
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
studio.refreshStudio?.({
|
|
496
|
+
data: runtime.data,
|
|
497
|
+
pageId: runtime.pageId,
|
|
498
|
+
requestInfo: runtime.requestInfo
|
|
499
|
+
});
|
|
500
|
+
return true;
|
|
501
|
+
}
|
|
502
|
+
var STUDIO_BIND_RETRY_INTERVAL_MS = 50;
|
|
503
|
+
var STUDIO_BIND_MAX_ATTEMPTS = 100;
|
|
504
|
+
function WeaverseNextStudioBridge(props) {
|
|
505
|
+
let { runtime, navigate, revalidate } = props;
|
|
506
|
+
let lastRuntimeRef = react$1.useRef(runtime);
|
|
507
|
+
let lastRuntimeDataRef = react$1.useRef(runtime.data);
|
|
508
|
+
let lastRequestInfoRef = react$1.useRef(runtime.requestInfo);
|
|
509
|
+
react$1.useEffect(() => {
|
|
510
|
+
if (navigate) {
|
|
511
|
+
runtime.internal.navigate = navigate;
|
|
512
|
+
}
|
|
513
|
+
if (revalidate) {
|
|
514
|
+
runtime.internal.revalidate = revalidate;
|
|
515
|
+
}
|
|
516
|
+
if (bindWeaverseNextStudioRuntime(runtime) || !runtime.isDesignMode) {
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
let attempts = 0;
|
|
520
|
+
let interval = window.setInterval(() => {
|
|
521
|
+
attempts += 1;
|
|
522
|
+
if (bindWeaverseNextStudioRuntime(runtime) || attempts >= STUDIO_BIND_MAX_ATTEMPTS) {
|
|
523
|
+
window.clearInterval(interval);
|
|
524
|
+
}
|
|
525
|
+
}, STUDIO_BIND_RETRY_INTERVAL_MS);
|
|
526
|
+
return () => window.clearInterval(interval);
|
|
527
|
+
}, [runtime, navigate, revalidate]);
|
|
528
|
+
react$1.useEffect(() => {
|
|
529
|
+
if (lastRuntimeRef.current !== runtime) {
|
|
530
|
+
lastRuntimeRef.current = runtime;
|
|
531
|
+
lastRuntimeDataRef.current = runtime.data;
|
|
532
|
+
lastRequestInfoRef.current = runtime.requestInfo;
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
if (lastRuntimeDataRef.current === runtime.data && lastRequestInfoRef.current === runtime.requestInfo) {
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
lastRuntimeDataRef.current = runtime.data;
|
|
539
|
+
lastRequestInfoRef.current = runtime.requestInfo;
|
|
540
|
+
bindWeaverseNextStudioRuntime(runtime);
|
|
541
|
+
}, [runtime, runtime.data, runtime.requestInfo]);
|
|
542
|
+
return null;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// src/studio-router.ts
|
|
546
|
+
function shouldResetScroll(options) {
|
|
547
|
+
if (!options || typeof options !== "object") {
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
return !options.preventScrollReset;
|
|
551
|
+
}
|
|
552
|
+
function createWeaverseNextStudioInternals(router, options = {}) {
|
|
553
|
+
return {
|
|
554
|
+
navigate: (to, navigateOptions) => {
|
|
555
|
+
let scroll = shouldResetScroll(navigateOptions);
|
|
556
|
+
if (options.replace) {
|
|
557
|
+
router.replace(to, { scroll });
|
|
558
|
+
} else {
|
|
559
|
+
router.push(to, { scroll });
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
revalidate: () => {
|
|
563
|
+
router.refresh();
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
function useWeaverseNextStudioInternals(options) {
|
|
568
|
+
let router = navigation.useRouter();
|
|
569
|
+
let ref = react$1.useRef(null);
|
|
570
|
+
if (!ref.current || ref.current.router !== router || ref.current.replace !== options?.replace) {
|
|
571
|
+
ref.current = {
|
|
572
|
+
internals: createWeaverseNextStudioInternals(router, options),
|
|
573
|
+
replace: options?.replace,
|
|
574
|
+
router
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
return ref.current.internals;
|
|
578
|
+
}
|
|
579
|
+
function WeaverseNextStudio(props) {
|
|
580
|
+
let { runtime, replace } = props;
|
|
581
|
+
let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace });
|
|
582
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
583
|
+
WeaverseNextStudioBridge,
|
|
584
|
+
{
|
|
585
|
+
navigate,
|
|
586
|
+
revalidate,
|
|
587
|
+
runtime
|
|
588
|
+
}
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
var EMPTY_DATA_CONTEXT = {};
|
|
592
|
+
function getRenderablePage2(data) {
|
|
251
593
|
let page = data?.page;
|
|
252
594
|
if (!page) {
|
|
253
595
|
return null;
|
|
@@ -260,30 +602,136 @@ var WeaverseNextRenderer = react$1.memo(function WeaverseNextRendererComponent(p
|
|
|
260
602
|
let client = props.client ?? context?.client;
|
|
261
603
|
let data = props.data ?? client?.data ?? null;
|
|
262
604
|
let dataContext = props.dataContext ?? client?.dataContext ?? EMPTY_DATA_CONTEXT;
|
|
263
|
-
let page = react$1.useMemo(() =>
|
|
605
|
+
let page = react$1.useMemo(() => getRenderablePage2(data), [data]);
|
|
264
606
|
let weaverse = react$1.useMemo(() => {
|
|
265
607
|
if (!page) {
|
|
266
608
|
return null;
|
|
267
609
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
data: page
|
|
610
|
+
return createWeaverseNextRuntime({
|
|
611
|
+
client,
|
|
612
|
+
data: { ...data, page },
|
|
613
|
+
dataContext,
|
|
614
|
+
themeSettingsStore: context?.themeSettingsStore
|
|
271
615
|
});
|
|
272
|
-
|
|
273
|
-
instance.isDesignMode = client?.requestContext?.isDesignMode ?? false;
|
|
274
|
-
return instance;
|
|
275
|
-
}, [
|
|
276
|
-
client?.projectId,
|
|
277
|
-
client?.requestContext?.isDesignMode,
|
|
278
|
-
page,
|
|
279
|
-
dataContext
|
|
280
|
-
]);
|
|
616
|
+
}, [client, page, data, dataContext, context?.themeSettingsStore]);
|
|
281
617
|
if (!weaverse) {
|
|
282
618
|
return null;
|
|
283
619
|
}
|
|
284
|
-
return /* @__PURE__ */ jsxRuntime.
|
|
620
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
621
|
+
/* @__PURE__ */ jsxRuntime.jsx(react.WeaverseRoot, { context: weaverse }),
|
|
622
|
+
/* @__PURE__ */ jsxRuntime.jsx(WeaverseNextStudio, { runtime: weaverse })
|
|
623
|
+
] });
|
|
285
624
|
});
|
|
286
625
|
|
|
626
|
+
// src/studio-script-src.ts
|
|
627
|
+
var TRUSTED_STUDIO_DOMAINS = ["weaverse.io", "weaverse.dev"];
|
|
628
|
+
function isLoopbackHostname(hostname) {
|
|
629
|
+
return hostname === "localhost" || hostname === "127.0.0.1" || hostname.endsWith(".localhost");
|
|
630
|
+
}
|
|
631
|
+
function normalizeOrigin(value) {
|
|
632
|
+
if (!value) {
|
|
633
|
+
return null;
|
|
634
|
+
}
|
|
635
|
+
try {
|
|
636
|
+
return new URL(value).origin;
|
|
637
|
+
} catch {
|
|
638
|
+
return null;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
function isTrustedStudioOrigin(origin, storefrontHostname) {
|
|
642
|
+
let parsed;
|
|
643
|
+
try {
|
|
644
|
+
parsed = new URL(origin);
|
|
645
|
+
} catch {
|
|
646
|
+
return false;
|
|
647
|
+
}
|
|
648
|
+
let { hostname, protocol } = parsed;
|
|
649
|
+
if (isLoopbackHostname(storefrontHostname) && isLoopbackHostname(hostname)) {
|
|
650
|
+
return protocol === "http:" || protocol === "https:";
|
|
651
|
+
}
|
|
652
|
+
if (protocol !== "https:") {
|
|
653
|
+
return false;
|
|
654
|
+
}
|
|
655
|
+
return TRUSTED_STUDIO_DOMAINS.some(
|
|
656
|
+
(domain) => hostname === domain || hostname.endsWith(`.${domain}`)
|
|
657
|
+
);
|
|
658
|
+
}
|
|
659
|
+
function toSearchParams(context) {
|
|
660
|
+
if (context?.searchParams) {
|
|
661
|
+
return new URLSearchParams(context.searchParams);
|
|
662
|
+
}
|
|
663
|
+
if (context?.url) {
|
|
664
|
+
let url = typeof context.url === "string" ? new URL(context.url, "http://localhost") : context.url;
|
|
665
|
+
return new URLSearchParams(url.searchParams);
|
|
666
|
+
}
|
|
667
|
+
return new URLSearchParams();
|
|
668
|
+
}
|
|
669
|
+
function last(searchParams, key) {
|
|
670
|
+
let values = searchParams.getAll(key);
|
|
671
|
+
return values.length ? values.at(-1) ?? null : null;
|
|
672
|
+
}
|
|
673
|
+
function resolveWeaverseNextStudioScriptSrc(context, options = {}) {
|
|
674
|
+
let searchParams = toSearchParams(context);
|
|
675
|
+
let isDesignMode = context?.isDesignMode ?? last(searchParams, "isDesignMode") === "true";
|
|
676
|
+
let isPreviewMode = context?.isPreviewMode ?? last(searchParams, "isPreviewMode") === "true";
|
|
677
|
+
let isRevisionPreview = context?.isRevisionPreview ?? Boolean(last(searchParams, "__revisionId"));
|
|
678
|
+
if (!(isDesignMode || isPreviewMode || isRevisionPreview)) {
|
|
679
|
+
return null;
|
|
680
|
+
}
|
|
681
|
+
let origin = normalizeOrigin(last(searchParams, "weaverseHost"));
|
|
682
|
+
if (!origin) {
|
|
683
|
+
return null;
|
|
684
|
+
}
|
|
685
|
+
let storefrontHostname = options.storefrontHostname ?? "";
|
|
686
|
+
if (!isTrustedStudioOrigin(origin, storefrontHostname)) {
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
let framework = options.framework ?? "hydrogen";
|
|
690
|
+
let bundle = isDesignMode ? "index.js" : "preview.js";
|
|
691
|
+
let version = last(searchParams, "weaverseVersion");
|
|
692
|
+
let url = `${origin}/static/studio/${framework}/${bundle}`;
|
|
693
|
+
return version ? `${url}?v=${encodeURIComponent(version)}` : url;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
// src/studio-connect.tsx
|
|
697
|
+
var loadedScriptSrcs = /* @__PURE__ */ new Set();
|
|
698
|
+
function loadScript(src) {
|
|
699
|
+
if (typeof document === "undefined") {
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
if (loadedScriptSrcs.has(src)) {
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
let existing = document.querySelector(`script[src="${src}"]`);
|
|
706
|
+
if (existing) {
|
|
707
|
+
loadedScriptSrcs.add(src);
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
let script = document.createElement("script");
|
|
711
|
+
script.async = true;
|
|
712
|
+
script.src = src;
|
|
713
|
+
document.head.appendChild(script);
|
|
714
|
+
loadedScriptSrcs.add(src);
|
|
715
|
+
}
|
|
716
|
+
function WeaverseNextStudioConnect(props) {
|
|
717
|
+
react$1.useEffect(() => {
|
|
718
|
+
let context = props.context;
|
|
719
|
+
if (!context && typeof window !== "undefined") {
|
|
720
|
+
context = {
|
|
721
|
+
searchParams: new URLSearchParams(window.location.search),
|
|
722
|
+
url: window.location.href
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
let src = resolveWeaverseNextStudioScriptSrc(context, {
|
|
726
|
+
storefrontHostname: props.storefrontHostname ?? (typeof window === "undefined" ? void 0 : window.location.hostname)
|
|
727
|
+
});
|
|
728
|
+
if (src) {
|
|
729
|
+
loadScript(src);
|
|
730
|
+
}
|
|
731
|
+
}, [props.context, props.storefrontHostname]);
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
|
|
287
735
|
Object.defineProperty(exports, "isBrowser", {
|
|
288
736
|
enumerable: true,
|
|
289
737
|
get: function () { return react.isBrowser; }
|
|
@@ -314,10 +762,21 @@ Object.defineProperty(exports, "createSchema", {
|
|
|
314
762
|
});
|
|
315
763
|
exports.WeaverseNextProvider = WeaverseNextProvider;
|
|
316
764
|
exports.WeaverseNextRenderer = WeaverseNextRenderer;
|
|
765
|
+
exports.WeaverseNextRuntime = WeaverseNextRuntime;
|
|
766
|
+
exports.WeaverseNextStudio = WeaverseNextStudio;
|
|
767
|
+
exports.WeaverseNextStudioBridge = WeaverseNextStudioBridge;
|
|
768
|
+
exports.WeaverseNextStudioConnect = WeaverseNextStudioConnect;
|
|
769
|
+
exports.bindWeaverseNextStudioRuntime = bindWeaverseNextStudioRuntime;
|
|
770
|
+
exports.buildWeaverseNextRequestInfo = buildWeaverseNextRequestInfo;
|
|
317
771
|
exports.createWeaverseNextClient = createWeaverseNextClient;
|
|
772
|
+
exports.createWeaverseNextRuntime = createWeaverseNextRuntime;
|
|
773
|
+
exports.createWeaverseNextStudioInternals = createWeaverseNextStudioInternals;
|
|
774
|
+
exports.createWeaverseNextThemeSettingsStore = createWeaverseNextThemeSettingsStore;
|
|
775
|
+
exports.resolveWeaverseNextStudioScriptSrc = resolveWeaverseNextStudioScriptSrc;
|
|
318
776
|
exports.runWeaverseComponentLoaders = runWeaverseComponentLoaders;
|
|
319
777
|
exports.useThemeSettings = useThemeSettings;
|
|
320
778
|
exports.useWeaverseCommerce = useWeaverseCommerce;
|
|
779
|
+
exports.useWeaverseNextStudioInternals = useWeaverseNextStudioInternals;
|
|
321
780
|
exports.useWeaversePageData = useWeaversePageData;
|
|
322
781
|
exports.useWeaverseRootData = useWeaverseRootData;
|
|
323
782
|
//# sourceMappingURL=index.js.map
|