@weaverse/next 0.1.0-alpha.6 → 0.1.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Weaverse } from '@weaverse/react';
2
2
  export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  export { InspectorGroup, PageType, SchemaType, createSchema } from '@weaverse/schema';
4
- import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, v as WeaverseNextRequestContext, s as WeaverseNextLoaderData, w as WeaverseNextRequestInfo, j as WeaverseNextComponentData, G as WeaverseNextThemeSettingsStore, y as WeaverseNextRuntimeInternal, x as WeaverseNextRuntimeConfig } from './seo-kwaliD-K.mjs';
5
- export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageData, z as WeaverseNextSeoMetadata, D as WeaverseNextStorefront, H as WeaverseProduct, I as formatWeaverseNextSeoMetadata, J as getWeaverseNextSeoMetadata } from './seo-kwaliD-K.mjs';
4
+ import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, w as WeaverseNextRequestContext, s as WeaverseNextLoaderData, x as WeaverseNextRequestInfo, j as WeaverseNextComponentData, H as WeaverseNextThemeSettingsStore, z as WeaverseNextRuntimeInternal, y as WeaverseNextRuntimeConfig } from './seo-B9yNko4W.mjs';
5
+ export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageAssignment, u as WeaverseNextPageData, A as WeaverseNextSeoMetadata, E as WeaverseNextStorefront, I as WeaverseProduct, J as formatWeaverseNextSeoMetadata, K as getWeaverseNextSeoMetadata } from './seo-B9yNko4W.mjs';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import * as react from 'react';
8
8
  import { ReactNode } from 'react';
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Weaverse } from '@weaverse/react';
2
2
  export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
3
3
  export { InspectorGroup, PageType, SchemaType, createSchema } from '@weaverse/schema';
4
- import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, v as WeaverseNextRequestContext, s as WeaverseNextLoaderData, w as WeaverseNextRequestInfo, j as WeaverseNextComponentData, G as WeaverseNextThemeSettingsStore, y as WeaverseNextRuntimeInternal, x as WeaverseNextRuntimeConfig } from './seo-kwaliD-K.js';
5
- export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageData, z as WeaverseNextSeoMetadata, D as WeaverseNextStorefront, H as WeaverseProduct, I as formatWeaverseNextSeoMetadata, J as getWeaverseNextSeoMetadata } from './seo-kwaliD-K.js';
4
+ import { g as WeaverseNextClientConfig, f as WeaverseNextClient, h as WeaverseNextCommerceContext, w as WeaverseNextRequestContext, s as WeaverseNextLoaderData, x as WeaverseNextRequestInfo, j as WeaverseNextComponentData, H as WeaverseNextThemeSettingsStore, z as WeaverseNextRuntimeInternal, y as WeaverseNextRuntimeConfig } from './seo-B9yNko4W.js';
5
+ export { W as WeaverseArticle, a as WeaverseBlog, b as WeaverseCollection, c as WeaverseMetaObject, i as WeaverseNextComponent, k as WeaverseNextComponentLoaderArgs, l as WeaverseNextComponentProps, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, q as WeaverseNextI18n, r as WeaverseNextLoadPageInput, t as WeaverseNextPageAssignment, u as WeaverseNextPageData, A as WeaverseNextSeoMetadata, E as WeaverseNextStorefront, I as WeaverseProduct, J as formatWeaverseNextSeoMetadata, K as getWeaverseNextSeoMetadata } from './seo-B9yNko4W.js';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
7
  import * as react from 'react';
8
8
  import { ReactNode } from 'react';
@@ -17,11 +17,32 @@ interface WeaverseNextThemeSettingsStore {
17
17
  subscribe: (listener: () => void) => () => void;
18
18
  updateThemeSettings: (next: Record<string, unknown>) => void;
19
19
  }
20
+ /**
21
+ * Page assignment payload returned by `/api/public/project` and preserved on
22
+ * loader data so the Builder Studio save pipeline receives the same shape it
23
+ * gets from Hydrogen (`{ projectId, type, locale, handle }`, plus optional
24
+ * inherited/fallback `meta`). Kept framework-neutral: `type` accepts a known
25
+ * {@link PageType} or any string, and `meta` preserves inherited/fallback
26
+ * metadata (unknown fields included) without asserting a strict shape.
27
+ */
28
+ interface WeaverseNextPageAssignment {
29
+ handle: string;
30
+ locale: string;
31
+ /** Inherited/fallback page metadata; unknown fields preserved as-is. */
32
+ meta?: {
33
+ depth?: number;
34
+ inherited?: boolean;
35
+ sourceProjectId?: string;
36
+ [key: string]: unknown;
37
+ };
38
+ projectId: string;
39
+ type: PageType | string;
40
+ }
20
41
  interface WeaverseNextRuntimeInternal {
21
42
  navigate?: (to: string, options?: {
22
43
  preventScrollReset?: boolean;
23
44
  } | Record<string, unknown>) => void;
24
- pageAssignment?: unknown;
45
+ pageAssignment?: WeaverseNextPageAssignment;
25
46
  project?: unknown;
26
47
  revalidate?: (options?: unknown) => Promise<void> | void;
27
48
  /**
@@ -121,7 +142,7 @@ interface WeaverseNextPageData {
121
142
  interface WeaverseNextLoaderData {
122
143
  configs?: Record<string, unknown>;
123
144
  page: WeaverseNextPageData;
124
- pageAssignment?: Record<string, unknown>;
145
+ pageAssignment?: WeaverseNextPageAssignment;
125
146
  project?: Record<string, unknown>;
126
147
  [key: string]: unknown;
127
148
  }
@@ -371,4 +392,4 @@ declare function getWeaverseNextSeoMetadata(data: WeaverseNextLoaderData | Weave
371
392
  page?: WeaverseNextPageData | null;
372
393
  } | null | undefined): WeaverseNextSeoMetadata;
373
394
 
374
- export { type WeaverseNextServerClient as A, type WeaverseNextServerClientConfig as B, type WeaverseNextServerLoadPageInput as C, type WeaverseNextStorefront as D, type WeaverseNextThemeSettingsOptions as E, type WeaverseNextThemeSettingsResponse as F, type WeaverseNextThemeSettingsStore as G, type WeaverseProduct as H, formatWeaverseNextSeoMetadata as I, getWeaverseNextSeoMetadata as J, type WeaverseArticle as W, type WeaverseBlog as a, type WeaverseCollection as b, type WeaverseMetaObject as c, type WeaverseNextBaseConfigs as d, type WeaverseNextCacheConfig as e, type WeaverseNextClient as f, type WeaverseNextClientConfig as g, type WeaverseNextCommerceContext as h, type WeaverseNextComponent as i, type WeaverseNextComponentData as j, type WeaverseNextComponentLoaderArgs as k, type WeaverseNextComponentProps as l, type WeaverseNextConfigs as m, type WeaverseNextCustomPageEntry as n, type WeaverseNextFetchCustomPagesOptions as o, type WeaverseNextFetchOptions as p, type WeaverseNextI18n as q, type WeaverseNextLoadPageInput as r, type WeaverseNextLoaderData as s, type WeaverseNextPageData as t, type WeaverseNextProjectId as u, type WeaverseNextRequestContext as v, type WeaverseNextRequestInfo as w, type WeaverseNextRuntimeConfig as x, type WeaverseNextRuntimeInternal as y, type WeaverseNextSeoMetadata as z };
395
+ export { type WeaverseNextSeoMetadata as A, type WeaverseNextServerClient as B, type WeaverseNextServerClientConfig as C, type WeaverseNextServerLoadPageInput as D, type WeaverseNextStorefront as E, type WeaverseNextThemeSettingsOptions as F, type WeaverseNextThemeSettingsResponse as G, type WeaverseNextThemeSettingsStore as H, type WeaverseProduct as I, formatWeaverseNextSeoMetadata as J, getWeaverseNextSeoMetadata as K, type WeaverseArticle as W, type WeaverseBlog as a, type WeaverseCollection as b, type WeaverseMetaObject as c, type WeaverseNextBaseConfigs as d, type WeaverseNextCacheConfig as e, type WeaverseNextClient as f, type WeaverseNextClientConfig as g, type WeaverseNextCommerceContext as h, type WeaverseNextComponent as i, type WeaverseNextComponentData as j, type WeaverseNextComponentLoaderArgs as k, type WeaverseNextComponentProps as l, type WeaverseNextConfigs as m, type WeaverseNextCustomPageEntry as n, type WeaverseNextFetchCustomPagesOptions as o, type WeaverseNextFetchOptions as p, type WeaverseNextI18n as q, type WeaverseNextLoadPageInput as r, type WeaverseNextLoaderData as s, type WeaverseNextPageAssignment as t, type WeaverseNextPageData as u, type WeaverseNextProjectId as v, type WeaverseNextRequestContext as w, type WeaverseNextRequestInfo as x, type WeaverseNextRuntimeConfig as y, type WeaverseNextRuntimeInternal as z };
@@ -17,11 +17,32 @@ interface WeaverseNextThemeSettingsStore {
17
17
  subscribe: (listener: () => void) => () => void;
18
18
  updateThemeSettings: (next: Record<string, unknown>) => void;
19
19
  }
20
+ /**
21
+ * Page assignment payload returned by `/api/public/project` and preserved on
22
+ * loader data so the Builder Studio save pipeline receives the same shape it
23
+ * gets from Hydrogen (`{ projectId, type, locale, handle }`, plus optional
24
+ * inherited/fallback `meta`). Kept framework-neutral: `type` accepts a known
25
+ * {@link PageType} or any string, and `meta` preserves inherited/fallback
26
+ * metadata (unknown fields included) without asserting a strict shape.
27
+ */
28
+ interface WeaverseNextPageAssignment {
29
+ handle: string;
30
+ locale: string;
31
+ /** Inherited/fallback page metadata; unknown fields preserved as-is. */
32
+ meta?: {
33
+ depth?: number;
34
+ inherited?: boolean;
35
+ sourceProjectId?: string;
36
+ [key: string]: unknown;
37
+ };
38
+ projectId: string;
39
+ type: PageType | string;
40
+ }
20
41
  interface WeaverseNextRuntimeInternal {
21
42
  navigate?: (to: string, options?: {
22
43
  preventScrollReset?: boolean;
23
44
  } | Record<string, unknown>) => void;
24
- pageAssignment?: unknown;
45
+ pageAssignment?: WeaverseNextPageAssignment;
25
46
  project?: unknown;
26
47
  revalidate?: (options?: unknown) => Promise<void> | void;
27
48
  /**
@@ -121,7 +142,7 @@ interface WeaverseNextPageData {
121
142
  interface WeaverseNextLoaderData {
122
143
  configs?: Record<string, unknown>;
123
144
  page: WeaverseNextPageData;
124
- pageAssignment?: Record<string, unknown>;
145
+ pageAssignment?: WeaverseNextPageAssignment;
125
146
  project?: Record<string, unknown>;
126
147
  [key: string]: unknown;
127
148
  }
@@ -371,4 +392,4 @@ declare function getWeaverseNextSeoMetadata(data: WeaverseNextLoaderData | Weave
371
392
  page?: WeaverseNextPageData | null;
372
393
  } | null | undefined): WeaverseNextSeoMetadata;
373
394
 
374
- export { type WeaverseNextServerClient as A, type WeaverseNextServerClientConfig as B, type WeaverseNextServerLoadPageInput as C, type WeaverseNextStorefront as D, type WeaverseNextThemeSettingsOptions as E, type WeaverseNextThemeSettingsResponse as F, type WeaverseNextThemeSettingsStore as G, type WeaverseProduct as H, formatWeaverseNextSeoMetadata as I, getWeaverseNextSeoMetadata as J, type WeaverseArticle as W, type WeaverseBlog as a, type WeaverseCollection as b, type WeaverseMetaObject as c, type WeaverseNextBaseConfigs as d, type WeaverseNextCacheConfig as e, type WeaverseNextClient as f, type WeaverseNextClientConfig as g, type WeaverseNextCommerceContext as h, type WeaverseNextComponent as i, type WeaverseNextComponentData as j, type WeaverseNextComponentLoaderArgs as k, type WeaverseNextComponentProps as l, type WeaverseNextConfigs as m, type WeaverseNextCustomPageEntry as n, type WeaverseNextFetchCustomPagesOptions as o, type WeaverseNextFetchOptions as p, type WeaverseNextI18n as q, type WeaverseNextLoadPageInput as r, type WeaverseNextLoaderData as s, type WeaverseNextPageData as t, type WeaverseNextProjectId as u, type WeaverseNextRequestContext as v, type WeaverseNextRequestInfo as w, type WeaverseNextRuntimeConfig as x, type WeaverseNextRuntimeInternal as y, type WeaverseNextSeoMetadata as z };
395
+ export { type WeaverseNextSeoMetadata as A, type WeaverseNextServerClient as B, type WeaverseNextServerClientConfig as C, type WeaverseNextServerLoadPageInput as D, type WeaverseNextStorefront as E, type WeaverseNextThemeSettingsOptions as F, type WeaverseNextThemeSettingsResponse as G, type WeaverseNextThemeSettingsStore as H, type WeaverseProduct as I, formatWeaverseNextSeoMetadata as J, getWeaverseNextSeoMetadata as K, type WeaverseArticle as W, type WeaverseBlog as a, type WeaverseCollection as b, type WeaverseMetaObject as c, type WeaverseNextBaseConfigs as d, type WeaverseNextCacheConfig as e, type WeaverseNextClient as f, type WeaverseNextClientConfig as g, type WeaverseNextCommerceContext as h, type WeaverseNextComponent as i, type WeaverseNextComponentData as j, type WeaverseNextComponentLoaderArgs as k, type WeaverseNextComponentProps as l, type WeaverseNextConfigs as m, type WeaverseNextCustomPageEntry as n, type WeaverseNextFetchCustomPagesOptions as o, type WeaverseNextFetchOptions as p, type WeaverseNextI18n as q, type WeaverseNextLoadPageInput as r, type WeaverseNextLoaderData as s, type WeaverseNextPageAssignment as t, type WeaverseNextPageData as u, type WeaverseNextProjectId as v, type WeaverseNextRequestContext as w, type WeaverseNextRequestInfo as x, type WeaverseNextRuntimeConfig as y, type WeaverseNextRuntimeInternal as z };
package/dist/server.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { v as WeaverseNextRequestContext, d as WeaverseNextBaseConfigs, A as WeaverseNextServerClient, j as WeaverseNextComponentData, B as WeaverseNextServerClientConfig } from './seo-kwaliD-K.mjs';
2
- export { e as WeaverseNextCacheConfig, m as WeaverseNextConfigs, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, p as WeaverseNextFetchOptions, u as WeaverseNextProjectId, z as WeaverseNextSeoMetadata, C as WeaverseNextServerLoadPageInput, E as WeaverseNextThemeSettingsOptions, F as WeaverseNextThemeSettingsResponse, I as formatWeaverseNextSeoMetadata, J as getWeaverseNextSeoMetadata } from './seo-kwaliD-K.mjs';
1
+ import { w as WeaverseNextRequestContext, d as WeaverseNextBaseConfigs, B as WeaverseNextServerClient, j as WeaverseNextComponentData, C as WeaverseNextServerClientConfig } from './seo-B9yNko4W.mjs';
2
+ export { e as WeaverseNextCacheConfig, m as WeaverseNextConfigs, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, p as WeaverseNextFetchOptions, v as WeaverseNextProjectId, A as WeaverseNextSeoMetadata, D as WeaverseNextServerLoadPageInput, F as WeaverseNextThemeSettingsOptions, G as WeaverseNextThemeSettingsResponse, J as formatWeaverseNextSeoMetadata, K as getWeaverseNextSeoMetadata } from './seo-B9yNko4W.mjs';
3
3
  import '@weaverse/schema';
4
4
  import '@weaverse/react';
5
5
  import 'react';
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { v as WeaverseNextRequestContext, d as WeaverseNextBaseConfigs, A as WeaverseNextServerClient, j as WeaverseNextComponentData, B as WeaverseNextServerClientConfig } from './seo-kwaliD-K.js';
2
- export { e as WeaverseNextCacheConfig, m as WeaverseNextConfigs, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, p as WeaverseNextFetchOptions, u as WeaverseNextProjectId, z as WeaverseNextSeoMetadata, C as WeaverseNextServerLoadPageInput, E as WeaverseNextThemeSettingsOptions, F as WeaverseNextThemeSettingsResponse, I as formatWeaverseNextSeoMetadata, J as getWeaverseNextSeoMetadata } from './seo-kwaliD-K.js';
1
+ import { w as WeaverseNextRequestContext, d as WeaverseNextBaseConfigs, B as WeaverseNextServerClient, j as WeaverseNextComponentData, C as WeaverseNextServerClientConfig } from './seo-B9yNko4W.js';
2
+ export { e as WeaverseNextCacheConfig, m as WeaverseNextConfigs, n as WeaverseNextCustomPageEntry, o as WeaverseNextFetchCustomPagesOptions, p as WeaverseNextFetchOptions, v as WeaverseNextProjectId, A as WeaverseNextSeoMetadata, D as WeaverseNextServerLoadPageInput, F as WeaverseNextThemeSettingsOptions, G as WeaverseNextThemeSettingsResponse, J as formatWeaverseNextSeoMetadata, K as getWeaverseNextSeoMetadata } from './seo-B9yNko4W.js';
3
3
  import '@weaverse/schema';
4
4
  import '@weaverse/react';
5
5
  import 'react';
package/dist/server.js CHANGED
@@ -434,6 +434,25 @@ function generateUuid() {
434
434
  }
435
435
  return `id-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;
436
436
  }
437
+ function normalizeWeaverseNextPageAssignment(input) {
438
+ if (!input || typeof input !== "object") {
439
+ return;
440
+ }
441
+ let { projectId, type, handle, locale, meta } = input;
442
+ if (typeof projectId !== "string" || typeof type !== "string" || typeof handle !== "string") {
443
+ return;
444
+ }
445
+ let normalized = {
446
+ projectId,
447
+ type,
448
+ handle,
449
+ locale: typeof locale === "string" ? locale : ""
450
+ };
451
+ if (meta && typeof meta === "object") {
452
+ normalized.meta = meta;
453
+ }
454
+ return normalized;
455
+ }
437
456
  var NextServerClient = class {
438
457
  components;
439
458
  commerce;
@@ -733,7 +752,9 @@ var NextServerClient = class {
733
752
  this._assertNoPageError(payload);
734
753
  let page = payload.page;
735
754
  let project = payload.project;
736
- let pageAssignment = payload.pageAssignment;
755
+ let pageAssignment = normalizeWeaverseNextPageAssignment(
756
+ payload.pageAssignment
757
+ );
737
758
  page ??= this._generateFallbackPage(
738
759
  '<div style="text-align: center;">Please add new section to start.</div>'
739
760
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/seo.ts","../src/server/configs.ts","../src/server/normalize-page-url.ts","../src/utils.ts","../src/server/revalidate-handler.ts","../src/loader.ts","../src/request-info.ts","../src/server/server-client.ts"],"names":["toUrl"],"mappings":"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","file":"server.js","sourcesContent":["import type { PageSEOData } from '@weaverse/schema'\nimport type { WeaverseNextLoaderData, WeaverseNextPageData } from './types'\n\nexport interface WeaverseNextSeoMetadata {\n alternates?: { canonical?: string }\n description?: string\n keywords?: string\n openGraph?: {\n description?: string\n images?: string[]\n title?: string\n type?: string\n }\n robots: {\n follow: boolean\n index: boolean\n }\n title?: string\n twitter?: {\n card?: string\n description?: string\n images?: string[]\n title?: string\n }\n}\n\nfunction hasOpenGraphContent(seo: PageSEOData['openGraph']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.type)\n}\n\nfunction hasTwitterContent(seo: PageSEOData['twitter']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.cardType)\n}\n\nexport function formatWeaverseNextSeoMetadata(\n seo: PageSEOData | null | undefined\n): WeaverseNextSeoMetadata {\n let index = seo?.robots?.index !== false\n let follow = seo?.robots?.follow !== false\n let metadata: WeaverseNextSeoMetadata = {\n robots: { index, follow },\n }\n\n if (!seo) {\n return metadata\n }\n\n if (seo.title) {\n metadata.title = seo.title\n }\n if (seo.description) {\n metadata.description = seo.description\n }\n if (seo.keywords) {\n metadata.keywords = seo.keywords\n }\n if (seo.canonicalUrl) {\n metadata.alternates = { canonical: seo.canonicalUrl }\n }\n\n let openGraph = seo.openGraph\n if (hasOpenGraphContent(openGraph)) {\n metadata.openGraph = {\n title: openGraph?.title,\n description: openGraph?.description,\n images: openGraph?.image ? [openGraph.image] : undefined,\n type: openGraph?.type || 'website',\n }\n }\n\n let twitter = seo.twitter\n if (hasTwitterContent(twitter)) {\n metadata.twitter = {\n card: twitter?.cardType || 'summary',\n title: twitter?.title,\n description: twitter?.description,\n images: twitter?.image ? [twitter.image] : undefined,\n }\n }\n\n return metadata\n}\n\nexport function getWeaverseNextSeoMetadata(\n data:\n | WeaverseNextLoaderData\n | WeaverseNextPageData\n | { page?: WeaverseNextPageData | null }\n | null\n | undefined\n): WeaverseNextSeoMetadata {\n if (!data) {\n return formatWeaverseNextSeoMetadata(null)\n }\n let page =\n 'items' in data && 'id' in data\n ? (data as WeaverseNextPageData)\n : ((data as { page?: WeaverseNextPageData | null }).page ?? null)\n return formatWeaverseNextSeoMetadata(page?.seo ?? null)\n}\n","import type {\n WeaverseNextBaseConfigs,\n WeaverseNextRequestContext,\n} from '../types'\n\nconst DEFAULT_WEAVERSE_HOST = 'https://studio.weaverse.io'\nconst DEFAULT_WEAVERSE_API_BASE = 'https://api.weaverse.io'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge / data API may be served\n * from (matched on the host itself and any subdomain). Kept in sync with\n * Hydrogen's `isTrustedStudioHost`.\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\n/**\n * Whether `host` is an origin we trust to resolve page/theme data. The\n * `weaverseHost` query param is attacker-controllable, so a crafted\n * `?weaverseHost=` must be rejected before it can point server-side fetches at\n * an arbitrary origin (SSRF). Only `weaverse.io`/`weaverse.dev` and subdomains\n * over https are trusted.\n */\nfunction isTrustedStudioHost(host: string): boolean {\n let parsed: URL\n try {\n parsed = new URL(host)\n } catch {\n return false\n }\n if (parsed.protocol !== 'https:') {\n return false\n }\n let { hostname } = parsed\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\nfunction toUrl(value: string | URL): URL | null {\n try {\n return typeof value === 'string'\n ? new URL(value, 'http://localhost')\n : value\n } catch {\n return null\n }\n}\n\n/**\n * Extract the request search params from the explicit Next request context.\n * Prefers `searchParams`, falls back to parsing `url`.\n */\nexport function getContextSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n if (context?.url) {\n let url = toUrl(context.url)\n if (url) {\n return new URLSearchParams(url.searchParams)\n }\n }\n return new URLSearchParams()\n}\n\n/**\n * Last value of a (possibly duplicated) query key. Matches Hydrogen's\n * `getRequestQueries`, which assigns while iterating and so keeps the last\n * occurrence — Studio appends its own control params, so a stale earlier value\n * must not win.\n */\nfunction lastParam(\n searchParams: URLSearchParams,\n key: string\n): string | undefined {\n let values = searchParams.getAll(key)\n return values.length ? values.at(-1) : undefined\n}\n\nfunction coerceBool(value: string | undefined): boolean {\n return value === 'true'\n}\n\nfunction readEnv(\n env: Record<string, string | undefined> | undefined,\n key: string\n): string | undefined {\n let fromConfig = env?.[key]\n if (fromConfig !== undefined) {\n return fromConfig\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key]\n }\n return\n}\n\nexport interface ResolveConfigsOptions {\n env?: Record<string, string | undefined>\n weaverseApiBase?: string\n weaverseHost?: string\n weaverseVersion?: string\n}\n\n/**\n * Derive Weaverse configs from the request context and env, close to Hydrogen's\n * `getWeaverseConfigs`. Resolves the trusted host, public API base, design /\n * preview / revision flags, and public env — but never resolves the final\n * `projectId` (that priority chain, which may call an async resolver, lives in\n * the server client). Query/env projectId candidates are returned for the\n * client to combine with function/string inputs.\n */\nexport function getWeaverseNextConfigs(\n context?: WeaverseNextRequestContext,\n options: ResolveConfigsOptions = {}\n): WeaverseNextBaseConfigs {\n let searchParams = getContextSearchParams(context)\n let { env } = options\n\n let queryHost = lastParam(searchParams, 'weaverseHost')\n // A trusted query host is canonicalized to its origin before use, so a crafted\n // `?weaverseHost=https://studio.weaverse.io/evil?x=1` can only ever resolve to\n // `https://studio.weaverse.io` — never carrying an attacker path/query into the\n // server-side API base.\n let trustedUrlHost =\n queryHost && isTrustedStudioHost(queryHost) ? new URL(queryHost).origin : ''\n\n let configuredHost =\n options.weaverseHost || readEnv(env, 'WEAVERSE_HOST') || ''\n let weaverseHost = trustedUrlHost || configuredHost || DEFAULT_WEAVERSE_HOST\n\n // Public data reads default to the edge proxy, but an explicit custom host\n // (staging/self-hosted Weaverse) must stay the API base so those deployments\n // don't fetch page/config data from the production proxy.\n let weaverseApiBase =\n trustedUrlHost ||\n options.weaverseApiBase ||\n readEnv(env, 'WEAVERSE_PUBLIC_API_BASE') ||\n (configuredHost && configuredHost !== DEFAULT_WEAVERSE_HOST\n ? configuredHost\n : DEFAULT_WEAVERSE_API_BASE)\n\n let isRevisionPreview =\n context?.isRevisionPreview ?? searchParams.has('__revisionId')\n let isDesignMode =\n context?.isDesignMode ?? coerceBool(lastParam(searchParams, 'isDesignMode'))\n let isPreviewMode =\n context?.isPreviewMode ??\n coerceBool(lastParam(searchParams, 'isPreviewMode'))\n\n return {\n queryProjectId: lastParam(searchParams, 'weaverseProjectId') || '',\n envProjectId: readEnv(env, 'WEAVERSE_PROJECT_ID') || '',\n weaverseHost,\n weaverseApiBase,\n weaverseApiKey:\n lastParam(searchParams, 'weaverseApiKey') ||\n readEnv(env, 'WEAVERSE_API_KEY') ||\n '',\n weaverseVersion:\n lastParam(searchParams, 'weaverseVersion') ||\n options.weaverseVersion ||\n '',\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n sectionType:\n context?.sectionType || lastParam(searchParams, 'sectionType') || '',\n publicEnv: {\n PUBLIC_STORE_DOMAIN: readEnv(env, 'PUBLIC_STORE_DOMAIN') || '',\n PUBLIC_STOREFRONT_API_TOKEN:\n readEnv(env, 'PUBLIC_STOREFRONT_API_TOKEN') || '',\n },\n }\n}\n","import type { WeaverseNextRequestContext } from '../types'\n\n// Query params that influence Weaverse page resolution on the Builder:\n// revision previews, design-mode flags, design-mode draft item overrides,\n// and `weaverse*` control params (host, version, project id). Everything\n// else — utm_*, fbclid, gclid, storefront filters — is irrelevant to which\n// page the Builder returns and would otherwise fragment any fetch cache keyed\n// on the request body. `weaverseDraftItem` is the current draft item param;\n// `__weaverseDraftItem` is kept as a legacy compatibility alias.\nconst KEPT_PARAM_RE =\n /^(?:__revisionId|__weaverseDraftItem|isDesignMode|weaverse)/\nconst DATA_SUFFIX = '.data'\n\n/**\n * Normalize the storefront URL sent in the Builder page API request body.\n *\n * The Builder reads only the pathname (locale/type/handle fallback) and the\n * Weaverse/Studio control params from this URL, so keep exactly those and drop\n * tracking params. Params are sorted for a stable, cache-friendly string.\n *\n * Ported from `@weaverse/hydrogen`'s `normalizePageUrl`, but tolerant of a\n * relative URL (Next route handlers may only know the pathname).\n */\nexport function normalizeNextPageUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n try {\n parsed = new URL(url, 'http://localhost')\n } catch {\n return url\n }\n }\n\n let kept = [...parsed.searchParams].filter(([key]) => KEPT_PARAM_RE.test(key))\n kept.sort(([a], [b]) => a.localeCompare(b))\n let search = new URLSearchParams(kept).toString()\n\n let { pathname } = parsed\n if (pathname.endsWith(DATA_SUFFIX)) {\n pathname = pathname.slice(0, -DATA_SUFFIX.length)\n }\n return `${parsed.origin}${pathname}${search ? `?${search}` : ''}`\n}\n\n/**\n * Build an absolute-ish request URL string from the explicit request context,\n * preferring `url`, then `pathname` + `searchParams`. Used as the input to\n * {@link normalizeNextPageUrl}.\n */\nexport function resolveRequestUrl(\n context?: WeaverseNextRequestContext\n): string {\n if (context?.url) {\n return typeof context.url === 'string'\n ? context.url\n : context.url.toString()\n }\n let pathname = context?.pathname || '/'\n let search = context?.searchParams\n ? new URLSearchParams(context.searchParams).toString()\n : ''\n return `http://localhost${pathname}${search ? `?${search}` : ''}`\n}\n","import type { SchemaType } from '@weaverse/schema'\n\n/**\n * Generate default component data from a schema's `settings` inputs.\n *\n * Mirrors Hydrogen's `generateDataFromSchema` (settings → `{ [name]:\n * defaultValue }`) but is kept local so `@weaverse/next` doesn't depend on\n * `@weaverse/hydrogen`. Falls back to the deprecated `inspector` array when a\n * schema predates `settings`.\n */\nexport function generateDataFromSchema(\n schema: SchemaType | undefined\n): Record<string, unknown> {\n let data: Record<string, unknown> = {}\n if (!schema) {\n return data\n }\n\n let groups =\n (schema.settings as {\n inputs?: { name?: string; defaultValue?: unknown }[]\n }[]) ??\n (schema as { inspector?: typeof groups }).inspector ??\n []\n\n for (let group of groups) {\n for (let input of group?.inputs ?? []) {\n let { name, defaultValue } = input\n if (name && defaultValue !== null && defaultValue !== undefined) {\n data[name] = defaultValue\n }\n }\n }\n\n return data\n}\n","import type {\n WeaverseNextComponentData,\n WeaverseNextServerClient,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\n\nconst NO_STORE_HEADERS = {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n} as const\n\nconst STATUS_OK = 200\nconst STATUS_BAD_REQUEST = 400\nconst STATUS_NOT_FOUND = 404\nconst STATUS_UNPROCESSABLE = 422\nconst STATUS_SERVER_ERROR = 500\n\nexport interface WeaverseNextRevalidateHandlerConfig {\n /**\n * Reuse the app's server-client factory so the loader runs with the same\n * component registry and commerce (storefront) context as page loads.\n */\n getClient: (\n request: Request\n ) => Promise<WeaverseNextServerClient> | WeaverseNextServerClient\n}\n\n/** POST body accepted by the revalidate route. */\nexport interface WeaverseNextRevalidateRequestBody {\n draftItem: WeaverseNextComponentData\n}\n\nfunction json(body: Record<string, unknown>, status: number) {\n return new Response(JSON.stringify(body), {\n status,\n headers: NO_STORE_HEADERS,\n })\n}\n\nfunction parseDraftItem(payload: unknown): WeaverseNextComponentData | null {\n if (typeof payload !== 'object' || payload === null) {\n return null\n }\n let draftItem = (payload as { draftItem?: unknown }).draftItem\n if (typeof draftItem !== 'object' || draftItem === null) {\n return null\n }\n let { id, type } = draftItem as { id?: unknown; type?: unknown }\n if (typeof id !== 'string' || !id || typeof type !== 'string' || !type) {\n return null\n }\n return draftItem as WeaverseNextComponentData\n}\n\n/**\n * Create the Studio per-item revalidation route handler.\n *\n * Studio design-mode edits to loader-backed inputs (e.g. resource pickers) need\n * fresh server loader data for a single item. Re-running it through\n * `router.refresh()` re-applies the whole RSC tree — and the draft-item query\n * rewrite changes the App Router page segment key, remounting the page and\n * resetting scroll. This handler runs just the edited component's `loader`\n * with the unsaved draft settings and returns the payload for an in-place\n * client update (see the `2026-07-02--next-item-revalidation` spec).\n *\n * Security: only registered component types are executable, the handler never\n * persists anything, and responses are `no-store`. Exposure is equivalent to\n * the existing `weaverseDraftItem` URL param, which already lets any visitor\n * run design-mode loaders with arbitrary draft settings.\n *\n * @example\n * ```ts\n * // app/api/weaverse/revalidate/route.ts\n * export const { POST } = createWeaverseNextRevalidateHandler({\n * getClient: () => getWeaverseServerClient(Promise.resolve({})),\n * })\n * ```\n */\nexport function createWeaverseNextRevalidateHandler(\n config: WeaverseNextRevalidateHandlerConfig\n): { POST: (request: Request) => Promise<Response> } {\n return {\n POST: async (request: Request) => {\n let payload: unknown\n try {\n payload = await request.json()\n } catch {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let draftItem = parseDraftItem(payload)\n if (!draftItem) {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let client: WeaverseNextServerClient\n try {\n client = await config.getClient(request)\n } catch (error) {\n console.error('❌ Revalidate handler getClient failed.', error)\n return json({ error: 'client-init-failed' }, STATUS_SERVER_ERROR)\n }\n\n let component = client.components.find(\n (candidate) => candidate?.schema?.type === draftItem.type\n )\n if (!component) {\n return json({ error: 'unknown-component-type' }, STATUS_NOT_FOUND)\n }\n if (typeof component.loader !== 'function') {\n return json({ error: 'missing-loader' }, STATUS_UNPROCESSABLE)\n }\n\n try {\n // Same args shape as `runWeaverseComponentLoaders`, so component\n // loaders behave identically between page load and revalidation.\n let loaderData = await component.loader({\n data: {\n ...generateDataFromSchema(component.schema),\n ...draftItem.data,\n },\n weaverse: client,\n context: client.requestContext,\n commerce: client.commerce,\n })\n return json({ loaderData: loaderData ?? null }, STATUS_OK)\n } catch (error) {\n console.error(\n '❌ Item loader revalidation failed.',\n draftItem.type,\n draftItem.id,\n error\n )\n return json({ error: 'loader-failed' }, STATUS_SERVER_ERROR)\n }\n },\n }\n}\n","import type {\n WeaverseNextClient,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextLoaderData,\n WeaverseNextRequestContext,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\nexport interface RunComponentLoadersArgs {\n client: WeaverseNextClient\n commerce?: WeaverseNextCommerceContext\n context?: WeaverseNextRequestContext\n /** Page payload to walk; defaults to `client.data`. */\n data?: WeaverseNextLoaderData | null\n}\n\nfunction isItemNode(node: unknown): node is WeaverseNextComponentData {\n return (\n typeof node === 'object' &&\n node !== null &&\n typeof (node as WeaverseNextComponentData).type === 'string'\n )\n}\n\nfunction cloneItem(item: WeaverseNextComponentData): WeaverseNextComponentData {\n return {\n ...item,\n children: Array.isArray(item.children)\n ? item.children.map((child) =>\n isItemNode(child) ? cloneItem(child) : { ...child }\n )\n : item.children,\n }\n}\n\n/**\n * Walk a serialized page tree and run each registered component's `loader`,\n * attaching the result to the item as `loaderData`.\n *\n * Loaders receive explicit `commerce.storefront` (and `weaverse.storefront` as\n * a compatibility alias via the client). Children are walked recursively when\n * they are inline item objects; flat `items` arrays are covered by the\n * top-level walk.\n *\n * @returns a cloned `data` object with `loaderData` attached to cloned items.\n */\nexport async function runWeaverseComponentLoaders(\n args: RunComponentLoadersArgs\n): Promise<WeaverseNextLoaderData | null> {\n let { client, context, commerce } = args\n let sourceData = args.data ?? client.data\n if (!sourceData) {\n return null\n }\n if (!sourceData.page.items.length) {\n return sourceData\n }\n\n let data: WeaverseNextLoaderData = {\n ...sourceData,\n page: {\n ...sourceData.page,\n items: sourceData.page.items.map(cloneItem),\n },\n }\n let items = data.page.items\n\n let componentMap = new Map<string, WeaverseNextComponent>()\n for (let component of client.components) {\n if (component?.schema?.type) {\n componentMap.set(component.schema.type, component)\n }\n }\n\n let visited = new Set<string>()\n let resolvedContext = context ?? client.requestContext\n let resolvedCommerce = commerce ?? client.commerce\n\n // Per-call `weaverse` alias. When a request-scoped `commerce` is passed, the\n // `weaverse.storefront` compatibility alias must resolve to *that* storefront,\n // not the client's construction-time commerce. Pilot-style loaders call\n // `weaverse.storefront.query(...)`, so a stale alias would query the wrong\n // (or an undefined) storefront. When no override is given we reuse the client\n // as-is to preserve its prototype getters.\n let resolvedWeaverse: WeaverseNextClient =\n resolvedCommerce === client.commerce\n ? client\n : {\n ...client,\n commerce: resolvedCommerce,\n storefront: resolvedCommerce?.storefront,\n }\n\n async function walk(nodes: WeaverseNextComponentData[]) {\n for (let item of nodes) {\n if (!item || visited.has(item.id)) {\n continue\n }\n visited.add(item.id)\n\n let component = componentMap.get(item.type)\n if (component?.loader) {\n try {\n item.loaderData = await component.loader({\n data: { ...generateDataFromSchema(component.schema), ...item.data },\n weaverse: resolvedWeaverse,\n context: resolvedContext,\n commerce: resolvedCommerce,\n })\n } catch (error) {\n console.warn('❌ Item loader run failed.', item.type, item.id, error)\n }\n }\n\n let children = item.children\n if (Array.isArray(children)) {\n let inlineChildren = children.filter(\n isItemNode\n ) as WeaverseNextComponentData[]\n if (inlineChildren.length) {\n await walk(inlineChildren)\n }\n }\n }\n }\n\n await walk(items)\n return data\n}\n","import type {\n WeaverseNextRequestContext,\n WeaverseNextRequestInfo,\n} from './types'\n\nfunction toUrl(value: string | URL): URL {\n return typeof value === 'string' ? new URL(value, 'http://localhost') : value\n}\n\nfunction getSearchParamsFromContext(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return new URLSearchParams(url.searchParams)\n }\n\n return new URLSearchParams()\n}\n\nfunction getPathnameFromContext(context?: WeaverseNextRequestContext): string {\n if (context?.pathname) {\n return context.pathname\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return url.pathname || '/'\n }\n\n return '/'\n}\n\nfunction coerceQueryValue(value: string): string | boolean {\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n return value\n}\n\nfunction toQueryRecord(\n searchParams: URLSearchParams\n): Record<string, string | boolean> {\n let queries: Record<string, string | boolean> = {}\n for (let [key, value] of searchParams.entries()) {\n queries[key] = coerceQueryValue(value)\n }\n return queries\n}\n\nconst TRANSIENT_STUDIO_PARAMS = new Set([\n 'weaverseDraftItem',\n // Legacy name from the original design-mode draft-item spike. Keep it out of\n // runtime requestInfo too, in case an older Builder bundle is in front of a\n // newer Next storefront.\n '__weaverseDraftItem',\n])\n\nfunction getRequestInfoSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n let searchParams = new URLSearchParams(getSearchParamsFromContext(context))\n for (let key of TRANSIENT_STUDIO_PARAMS) {\n searchParams.delete(key)\n }\n return searchParams\n}\n\n/**\n * Build the Hydrogen-like request info shape consumed by the Studio bridge.\n * Duplicate query keys keep the last value, matching `URLSearchParams` iteration\n * assignment and Hydrogen's practical query-object behavior.\n */\nexport function buildWeaverseNextRequestInfo(\n context?: WeaverseNextRequestContext\n): WeaverseNextRequestInfo {\n let searchParams = getRequestInfoSearchParams(context)\n let search = searchParams.toString()\n\n return {\n pathname: getPathnameFromContext(context),\n search: search ? `?${search}` : '',\n queries: toQueryRecord(searchParams),\n ...(context?.i18n ? { i18n: context.i18n } : {}),\n }\n}\n","import type { SchemaType } from '@weaverse/schema'\nimport { runWeaverseComponentLoaders } from '../loader'\nimport { buildWeaverseNextRequestInfo } from '../request-info'\nimport type {\n WeaverseNextBaseConfigs,\n WeaverseNextCacheConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextConfigs,\n WeaverseNextCustomPageEntry,\n WeaverseNextFetchCustomPagesOptions,\n WeaverseNextFetchOptions,\n WeaverseNextLoaderData,\n WeaverseNextLoadPageInput,\n WeaverseNextPageData,\n WeaverseNextProjectId,\n WeaverseNextRequestContext,\n WeaverseNextServerClient,\n WeaverseNextServerClientConfig,\n WeaverseNextServerLoadPageInput,\n WeaverseNextStorefront,\n WeaverseNextThemeSettingsOptions,\n WeaverseNextThemeSettingsResponse,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\nimport { getWeaverseNextConfigs } from './configs'\nimport { normalizeNextPageUrl, resolveRequestUrl } from './normalize-page-url'\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 10_000\nconst RANDOM_ID_RADIX = 36\nconst RANDOM_ID_SLICE_START = 2\nconst MAX_CUSTOM_PAGE_PAGES = 100\n\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n} as const\n\n/** Next's `fetch` reads `next: { revalidate, tags }` off the request init. */\ntype NextRequestInit = RequestInit & {\n next?: { revalidate?: number | false; tags?: string[] }\n}\n\ninterface LooseThemeSchema {\n i18n?: { staticContent?: Record<string, unknown> }\n inspector?: unknown[]\n settings?: {\n inputs?: { condition?: unknown }[]\n [key: string]: unknown\n }[]\n}\n\nfunction asThemeSchema(schema: unknown): LooseThemeSchema | undefined {\n return schema && typeof schema === 'object'\n ? (schema as LooseThemeSchema)\n : undefined\n}\n\nfunction generateUuid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID()\n }\n return `id-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`\n}\n\n/**\n * Server-side Weaverse client for Next.js. Performs the real Weaverse public\n * API fetch (page + theme settings) instead of delegating to injected fetchers,\n * closing the gap with Hydrogen's `context.weaverse.loadPage(...)`.\n */\nclass NextServerClient implements WeaverseNextServerClient {\n components: WeaverseNextComponent[]\n commerce?: WeaverseNextCommerceContext\n requestContext?: WeaverseNextRequestContext\n themeSchema?: unknown\n themeSettings: Record<string, unknown>\n data: WeaverseNextLoaderData | null = null\n dataContext: Record<string, unknown> = {}\n configs: WeaverseNextConfigs\n\n private readonly _projectIdInput?: WeaverseNextProjectId\n private readonly _baseConfigs: WeaverseNextBaseConfigs\n private readonly _fetch: typeof fetch\n private readonly _cache?: WeaverseNextServerClientConfig['cache']\n private readonly _fetchTimeoutMs: number\n private _resolvedProjectId?: string\n\n constructor(config: WeaverseNextServerClientConfig) {\n // Server client keeps the component definitions for server-side loaders\n // (`runWeaverseComponentLoaders`) and preview-data generation, but it\n // intentionally does NOT call `registerWeaverseNextComponents`. Registering\n // pulls in `../registry` → `@weaverse/react`, which evaluates\n // `React.createContext()` at module load — invalid in the RSC/server graph\n // and the cause of `(0 , x.createContext) is not a function`. The client\n // wrapper/renderer (root `@weaverse/next` client entry) registers the real\n // render components instead, keeping `@weaverse/next/server` React-free.\n this.components = config.components\n this.commerce = config.commerce\n this.requestContext = config.requestContext\n this.themeSchema = config.themeSchema\n // Seed schema defaults before merchant overrides, mirroring the root client.\n this.themeSettings = {\n ...generateDataFromSchema(config.themeSchema as SchemaType | undefined),\n ...config.themeSettings,\n }\n this._projectIdInput = config.projectId\n this._fetch = config.fetch ?? globalThis.fetch\n this._cache = config.cache\n this._fetchTimeoutMs = config.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS\n\n this._baseConfigs = getWeaverseNextConfigs(config.requestContext, {\n env: config.env,\n weaverseHost: config.weaverseHost,\n weaverseApiBase: config.weaverseApiBase,\n weaverseVersion: config.weaverseVersion,\n })\n\n // Synchronous best-effort projectId (query → string → env). A function\n // resolver is awaited lazily in `resolveProjectId`, so `projectId` reflects\n // its result after the first `loadPage`/`loadThemeSettings`/`resolveProjectId`.\n this.configs = this._buildPublicConfigs(\n this._baseConfigs.queryProjectId ||\n (typeof this._projectIdInput === 'string'\n ? this._projectIdInput.trim()\n : '') ||\n this._baseConfigs.envProjectId\n )\n }\n\n get projectId(): string {\n return this.configs.projectId\n }\n\n /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */\n get storefront(): WeaverseNextStorefront | undefined {\n return this.commerce?.storefront\n }\n\n private _buildPublicConfigs(projectId: string): WeaverseNextConfigs {\n let base = this._baseConfigs\n return {\n projectId,\n weaverseHost: base.weaverseHost,\n weaverseApiBase: base.weaverseApiBase,\n weaversePublicApiBase: base.weaverseApiBase,\n weaverseVersion: base.weaverseVersion,\n isDesignMode: base.isDesignMode,\n isPreviewMode: base.isPreviewMode,\n isRevisionPreview: base.isRevisionPreview,\n sectionType: base.sectionType,\n publicEnv: base.publicEnv,\n }\n }\n\n resolveProjectId = async (): Promise<string> => {\n if (this._resolvedProjectId !== undefined) {\n return this._resolvedProjectId\n }\n\n // Priority: query param → function → string → env (matches Hydrogen).\n let resolved = this._baseConfigs.queryProjectId\n if (!resolved && typeof this._projectIdInput === 'function') {\n try {\n let value = await this._projectIdInput(this.requestContext)\n if (typeof value === 'string' && value.trim()) {\n resolved = value.trim()\n }\n } catch (error) {\n console.warn(\n '[WeaverseNextServerClient] projectId resolver threw, falling back.',\n error\n )\n }\n }\n if (!resolved && typeof this._projectIdInput === 'string') {\n resolved = this._projectIdInput.trim()\n }\n if (!resolved) {\n resolved = this._baseConfigs.envProjectId\n }\n\n this._resolvedProjectId = resolved\n this.configs = this._buildPublicConfigs(resolved)\n return resolved\n }\n\n fetchWithCache = async <T = unknown>(\n url: string,\n options: WeaverseNextFetchOptions = {}\n ): Promise<T> => {\n let { revalidate, tags, ...init } = options\n let requestInit: NextRequestInit = { ...init }\n\n let { isDesignMode, isRevisionPreview } = this._baseConfigs\n if (isDesignMode || isRevisionPreview) {\n // Design / revision data must never be served stale.\n requestInit.cache = 'no-store'\n } else if (requestInit.cache === undefined) {\n let effectiveRevalidate = revalidate ?? this._cache?.revalidate\n let effectiveTags = tags ?? this._cache?.tags\n if (effectiveRevalidate !== undefined || effectiveTags?.length) {\n requestInit.next = {\n ...(effectiveRevalidate === undefined\n ? {}\n : { revalidate: effectiveRevalidate }),\n ...(effectiveTags?.length ? { tags: effectiveTags } : {}),\n }\n }\n }\n\n let controller = new AbortController()\n let timeoutId = setTimeout(() => controller.abort(), this._fetchTimeoutMs)\n try {\n let response = await this._fetch(url, {\n ...requestInit,\n signal: requestInit.signal ?? controller.signal,\n })\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n return (await response.json()) as T\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n private _buildCustomPagesUrl(\n projectId: string,\n options: WeaverseNextFetchCustomPagesOptions,\n cursor: string | null\n ) {\n let params = new URLSearchParams()\n if (options.locale) {\n params.set('locale', options.locale)\n }\n if (options.limit) {\n params.set('limit', String(options.limit))\n }\n if (cursor) {\n params.set('cursor', cursor)\n }\n let qs = params.toString()\n return `${this._baseConfigs.weaverseApiBase}/api/public/v1/projects/${projectId}/custom-pages${\n qs ? `?${qs}` : ''\n }`\n }\n\n /**\n * Fetch all published custom pages for sitemap generation. Mirrors Hydrogen's\n * helper but uses Next's fetch cache knobs (`revalidate` / `tags`). It returns\n * accumulated results on partial pagination failure so a single API hiccup\n * does not break sitemap generation entirely.\n */\n fetchCustomPages = async (\n options: WeaverseNextFetchCustomPagesOptions = {}\n ): Promise<WeaverseNextCustomPageEntry[]> => {\n let projectId = await this.resolveProjectId()\n let entries: WeaverseNextCustomPageEntry[] = []\n if (!projectId) {\n console.warn(\n '[WeaverseNext] Failed to fetch custom pages: missing projectId'\n )\n return entries\n }\n\n let cursor: string | null = null\n for (let page = 0; page < MAX_CUSTOM_PAGE_PAGES; page += 1) {\n let url = this._buildCustomPagesUrl(projectId, options, cursor)\n\n try {\n let result = await this.fetchWithCache<{\n data?: WeaverseNextCustomPageEntry[]\n nextCursor?: string | null\n }>(url, {\n revalidate: options.revalidate,\n tags: options.tags,\n })\n entries.push(...(result.data ?? []))\n if (!result.nextCursor) {\n return entries\n }\n cursor = result.nextCursor\n } catch (error) {\n let message = error instanceof Error ? error.message : String(error)\n console.warn(\n entries.length === 0\n ? `[WeaverseNext] Failed to fetch custom pages: ${message}`\n : `[WeaverseNext] Custom pages pagination interrupted: ${message}`\n )\n return entries\n }\n }\n\n console.warn('[WeaverseNext] Custom pages pagination cap reached')\n return entries\n }\n\n private _generateFallbackPage(message: string): WeaverseNextPageData {\n let rootId = generateUuid()\n return {\n id: `fallback_page_${rootId}`,\n rootId,\n name: 'Default Page',\n items: [\n {\n type: 'main',\n id: rootId,\n data: { dangerouslySetInnerHTML: { __html: message } },\n },\n ],\n }\n }\n\n /**\n * Recursively materialize a section preset (and its preset children) into a\n * flat list of page items, returning the new item id. Ported from Hydrogen's\n * `recursivelyAddDataItem`. Returns `undefined` when the type isn't registered.\n */\n private _buildPreviewItems(\n type: string,\n items: WeaverseNextComponentData[],\n initData: Record<string, unknown> = {}\n ): string | undefined {\n let component = this.components.find((c) => c.schema?.type === type)\n if (!component) {\n return\n }\n let { children, ...data } = (component.schema?.presets ?? {}) as {\n children?: { type: string; [key: string]: unknown }[]\n [key: string]: unknown\n }\n let childIds: { id: string }[] = []\n if (children) {\n for (let child of children) {\n let { type: childType, children: _children, ...childData } = child\n let childId = this._buildPreviewItems(childType, items, childData)\n if (childId) {\n childIds.push({ id: childId })\n }\n }\n }\n let id = generateUuid()\n items.push({ id, type, data: { ...data, ...initData }, children: childIds })\n return id\n }\n\n /**\n * Synthetic loader data for Studio \"section preview\" mode. Mirrors Hydrogen's\n * `getPreviewData`: it builds a single-section page from the requested\n * `sectionType`'s presets without hitting `/api/public/project`, so preview\n * works even without a resolved `projectId`.\n */\n private _generatePreviewData(projectId: string): WeaverseNextLoaderData {\n let { sectionType, weaverseHost } = this._baseConfigs\n let items: WeaverseNextComponentData[] = []\n let sectionId = sectionType\n ? this._buildPreviewItems(sectionType, items)\n : undefined\n\n let configs = {\n ...this._buildPublicConfigs(projectId),\n isPreviewMode: true,\n weaverseHost,\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n }\n\n return {\n project: {\n id: projectId,\n weaverseShopId: 'shop-id',\n name: 'Section Preview',\n },\n configs,\n page: {\n id: 'weaverse-preview-page',\n name: 'Preview section',\n rootId: '1',\n items: [\n {\n id: '1',\n type: 'main',\n data: {},\n children: sectionId ? [{ id: sectionId }] : [],\n },\n ...items,\n ],\n },\n }\n }\n\n private _getLoadPageInput(input: WeaverseNextLoadPageInput) {\n let {\n cache,\n projectId: routeProjectId,\n ...rest\n } = input as WeaverseNextServerLoadPageInput\n let params: Record<string, unknown> = {}\n for (let [key, value] of Object.entries(rest)) {\n if (value !== undefined) {\n params[key] = value\n }\n }\n return { cache, params, routeProjectId }\n }\n\n private async _resolveLoadPageProjectId(routeProjectId?: string) {\n let effectiveProjectId =\n (typeof routeProjectId === 'string' && routeProjectId.trim()) ||\n (await this.resolveProjectId())\n if (effectiveProjectId) {\n this.configs = this._buildPublicConfigs(effectiveProjectId)\n }\n return effectiveProjectId\n }\n\n private _fetchPagePayload(\n projectId: string,\n params: Record<string, unknown>,\n cache?: WeaverseNextCacheConfig\n ) {\n let i18n = this.requestContext?.i18n ?? this.commerce?.storefront?.i18n\n let url = normalizeNextPageUrl(resolveRequestUrl(this.requestContext))\n let apiUrl = `${this._baseConfigs.weaverseApiBase}/api/public/project`\n let userAgent = this.requestContext?.headers?.get('user-agent') ?? ''\n return this.fetchWithCache<Record<string, unknown>>(apiUrl, {\n method: 'POST',\n body: JSON.stringify({\n projectId,\n url,\n i18n,\n params,\n isDesignMode: this._baseConfigs.isDesignMode,\n }),\n headers: { ...JSON_HEADERS, 'X-Visitor-UA': userAgent },\n ...(cache ?? {}),\n })\n }\n\n private _assertNoPageError(payload: Record<string, unknown>) {\n if ('error' in payload && typeof payload.error === 'string') {\n throw new Error(payload.error)\n }\n }\n\n private _createLoaderData(\n payload: Record<string, unknown>,\n projectId: string\n ): WeaverseNextLoaderData {\n this._assertNoPageError(payload)\n let page = payload.page as WeaverseNextPageData | undefined\n let project = payload.project as WeaverseNextLoaderData['project']\n let pageAssignment = payload.pageAssignment as\n | WeaverseNextLoaderData['pageAssignment']\n | undefined\n\n page ??= this._generateFallbackPage(\n '<div style=\"text-align: center;\">Please add new section to start.</div>'\n )\n project ??= {\n id: projectId,\n name: 'Weaverse project not found.',\n weaverseShopId: '',\n }\n if (Array.isArray(page.items) && page.items.length === 0) {\n page.items.push({\n type: 'main',\n id: page.rootId || generateUuid(),\n data: {},\n })\n }\n\n return {\n page,\n project,\n pageAssignment,\n configs: {\n ...this._buildPublicConfigs(projectId),\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n },\n }\n }\n\n private async _runLoaders(data: WeaverseNextLoaderData) {\n this.data = data\n let withLoaders = await runWeaverseComponentLoaders({ client: this, data })\n this.data = withLoaders ?? data\n return this.data\n }\n\n loadPage = async (\n input: WeaverseNextLoadPageInput = {}\n ): Promise<WeaverseNextLoaderData | null> => {\n try {\n let { cache, params, routeProjectId } = this._getLoadPageInput(input)\n let projectId = await this._resolveLoadPageProjectId(routeProjectId)\n if (this._baseConfigs.isPreviewMode) {\n let previewData = this._generatePreviewData(projectId || 'x')\n this.data = previewData\n return previewData\n }\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let payload = await this._fetchPagePayload(projectId, params, cache)\n let data = this._createLoaderData(payload, projectId)\n return await this._runLoaders(data)\n } catch (error) {\n console.error('❌ Page load failed', {\n url: this.requestContext?.url,\n projectId: input.projectId || this.configs.projectId,\n message: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n }\n\n loadThemeSettings = async (\n // Broad param keeps this assignable to `WeaverseNextClient.loadThemeSettings`;\n // only the cache fields below are honored — no request-context override.\n optionsInput:\n | WeaverseNextThemeSettingsOptions\n | WeaverseNextRequestContext = {}\n ): Promise<WeaverseNextThemeSettingsResponse> => {\n let options = optionsInput as WeaverseNextThemeSettingsOptions\n let themeSchema = asThemeSchema(this.themeSchema)\n let defaultThemeSettings = generateDataFromSchema(\n this.themeSchema as SchemaType | undefined\n )\n let staticContent = themeSchema?.i18n?.staticContent\n\n try {\n let projectId = await this.resolveProjectId()\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let { isDesignMode } = this._baseConfigs\n let url = `${this._baseConfigs.weaverseApiBase}/api/public/project_configs`\n let result = await this.fetchWithCache<WeaverseNextThemeSettingsResponse>(\n url,\n {\n method: 'POST',\n body: JSON.stringify({ projectId, isDesignMode }),\n headers: JSON_HEADERS,\n revalidate: options.revalidate,\n tags: options.tags,\n }\n )\n\n if (typeof result !== 'object' || result === null) {\n result = { theme: defaultThemeSettings }\n }\n\n if (themeSchema?.settings || themeSchema?.inspector) {\n if (!result.theme || typeof result.theme !== 'object') {\n result.theme = defaultThemeSettings\n } else {\n result.theme = { ...defaultThemeSettings, ...result.theme }\n }\n }\n\n if (staticContent) {\n result.staticContent = staticContent\n }\n\n if (isDesignMode) {\n result = {\n ...result,\n schema: themeSchema\n ? {\n ...themeSchema,\n settings: themeSchema.settings?.map((group) => ({\n ...group,\n inputs: group?.inputs?.map((inputItem) =>\n typeof inputItem?.condition === 'function'\n ? {\n ...inputItem,\n condition: inputItem.condition.toString(),\n }\n : inputItem\n ),\n })),\n }\n : undefined,\n publicEnv: this._baseConfigs.publicEnv,\n }\n }\n\n return result\n } catch (error) {\n let errorDetails = error instanceof Error ? error.message : String(error)\n console.error('Unable to load theme settings', errorDetails)\n return {\n theme: defaultThemeSettings,\n staticContent,\n _error: errorDetails,\n _loadFailed: true,\n }\n }\n }\n}\n\n/**\n * Create a server-side {@link WeaverseNextServerClient} for Next.js App Router\n * routes / server components.\n *\n * @example\n * ```ts\n * let weaverse = createWeaverseNextServerClient({\n * projectId: process.env.WEAVERSE_PROJECT_ID,\n * components,\n * commerce: { storefront },\n * requestContext: { url, headers, searchParams, i18n },\n * cache: { revalidate: 60, tags: ['weaverse'] },\n * })\n * let data = await weaverse.loadPage({ type: 'INDEX' })\n * let theme = await weaverse.loadThemeSettings()\n * ```\n */\nexport function createWeaverseNextServerClient(\n config: WeaverseNextServerClientConfig\n): WeaverseNextServerClient {\n return new NextServerClient(config)\n}\n\nexport { getContextSearchParams } from './configs'\n"]}
1
+ {"version":3,"sources":["../src/seo.ts","../src/server/configs.ts","../src/server/normalize-page-url.ts","../src/utils.ts","../src/server/revalidate-handler.ts","../src/loader.ts","../src/request-info.ts","../src/server/server-client.ts"],"names":["toUrl"],"mappings":"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","file":"server.js","sourcesContent":["import type { PageSEOData } from '@weaverse/schema'\nimport type { WeaverseNextLoaderData, WeaverseNextPageData } from './types'\n\nexport interface WeaverseNextSeoMetadata {\n alternates?: { canonical?: string }\n description?: string\n keywords?: string\n openGraph?: {\n description?: string\n images?: string[]\n title?: string\n type?: string\n }\n robots: {\n follow: boolean\n index: boolean\n }\n title?: string\n twitter?: {\n card?: string\n description?: string\n images?: string[]\n title?: string\n }\n}\n\nfunction hasOpenGraphContent(seo: PageSEOData['openGraph']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.type)\n}\n\nfunction hasTwitterContent(seo: PageSEOData['twitter']): boolean {\n return Boolean(seo?.title || seo?.description || seo?.image || seo?.cardType)\n}\n\nexport function formatWeaverseNextSeoMetadata(\n seo: PageSEOData | null | undefined\n): WeaverseNextSeoMetadata {\n let index = seo?.robots?.index !== false\n let follow = seo?.robots?.follow !== false\n let metadata: WeaverseNextSeoMetadata = {\n robots: { index, follow },\n }\n\n if (!seo) {\n return metadata\n }\n\n if (seo.title) {\n metadata.title = seo.title\n }\n if (seo.description) {\n metadata.description = seo.description\n }\n if (seo.keywords) {\n metadata.keywords = seo.keywords\n }\n if (seo.canonicalUrl) {\n metadata.alternates = { canonical: seo.canonicalUrl }\n }\n\n let openGraph = seo.openGraph\n if (hasOpenGraphContent(openGraph)) {\n metadata.openGraph = {\n title: openGraph?.title,\n description: openGraph?.description,\n images: openGraph?.image ? [openGraph.image] : undefined,\n type: openGraph?.type || 'website',\n }\n }\n\n let twitter = seo.twitter\n if (hasTwitterContent(twitter)) {\n metadata.twitter = {\n card: twitter?.cardType || 'summary',\n title: twitter?.title,\n description: twitter?.description,\n images: twitter?.image ? [twitter.image] : undefined,\n }\n }\n\n return metadata\n}\n\nexport function getWeaverseNextSeoMetadata(\n data:\n | WeaverseNextLoaderData\n | WeaverseNextPageData\n | { page?: WeaverseNextPageData | null }\n | null\n | undefined\n): WeaverseNextSeoMetadata {\n if (!data) {\n return formatWeaverseNextSeoMetadata(null)\n }\n let page =\n 'items' in data && 'id' in data\n ? (data as WeaverseNextPageData)\n : ((data as { page?: WeaverseNextPageData | null }).page ?? null)\n return formatWeaverseNextSeoMetadata(page?.seo ?? null)\n}\n","import type {\n WeaverseNextBaseConfigs,\n WeaverseNextRequestContext,\n} from '../types'\n\nconst DEFAULT_WEAVERSE_HOST = 'https://studio.weaverse.io'\nconst DEFAULT_WEAVERSE_API_BASE = 'https://api.weaverse.io'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge / data API may be served\n * from (matched on the host itself and any subdomain). Kept in sync with\n * Hydrogen's `isTrustedStudioHost`.\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\n/**\n * Whether `host` is an origin we trust to resolve page/theme data. The\n * `weaverseHost` query param is attacker-controllable, so a crafted\n * `?weaverseHost=` must be rejected before it can point server-side fetches at\n * an arbitrary origin (SSRF). Only `weaverse.io`/`weaverse.dev` and subdomains\n * over https are trusted.\n */\nfunction isTrustedStudioHost(host: string): boolean {\n let parsed: URL\n try {\n parsed = new URL(host)\n } catch {\n return false\n }\n if (parsed.protocol !== 'https:') {\n return false\n }\n let { hostname } = parsed\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\nfunction toUrl(value: string | URL): URL | null {\n try {\n return typeof value === 'string'\n ? new URL(value, 'http://localhost')\n : value\n } catch {\n return null\n }\n}\n\n/**\n * Extract the request search params from the explicit Next request context.\n * Prefers `searchParams`, falls back to parsing `url`.\n */\nexport function getContextSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n if (context?.url) {\n let url = toUrl(context.url)\n if (url) {\n return new URLSearchParams(url.searchParams)\n }\n }\n return new URLSearchParams()\n}\n\n/**\n * Last value of a (possibly duplicated) query key. Matches Hydrogen's\n * `getRequestQueries`, which assigns while iterating and so keeps the last\n * occurrence — Studio appends its own control params, so a stale earlier value\n * must not win.\n */\nfunction lastParam(\n searchParams: URLSearchParams,\n key: string\n): string | undefined {\n let values = searchParams.getAll(key)\n return values.length ? values.at(-1) : undefined\n}\n\nfunction coerceBool(value: string | undefined): boolean {\n return value === 'true'\n}\n\nfunction readEnv(\n env: Record<string, string | undefined> | undefined,\n key: string\n): string | undefined {\n let fromConfig = env?.[key]\n if (fromConfig !== undefined) {\n return fromConfig\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key]\n }\n return\n}\n\nexport interface ResolveConfigsOptions {\n env?: Record<string, string | undefined>\n weaverseApiBase?: string\n weaverseHost?: string\n weaverseVersion?: string\n}\n\n/**\n * Derive Weaverse configs from the request context and env, close to Hydrogen's\n * `getWeaverseConfigs`. Resolves the trusted host, public API base, design /\n * preview / revision flags, and public env — but never resolves the final\n * `projectId` (that priority chain, which may call an async resolver, lives in\n * the server client). Query/env projectId candidates are returned for the\n * client to combine with function/string inputs.\n */\nexport function getWeaverseNextConfigs(\n context?: WeaverseNextRequestContext,\n options: ResolveConfigsOptions = {}\n): WeaverseNextBaseConfigs {\n let searchParams = getContextSearchParams(context)\n let { env } = options\n\n let queryHost = lastParam(searchParams, 'weaverseHost')\n // A trusted query host is canonicalized to its origin before use, so a crafted\n // `?weaverseHost=https://studio.weaverse.io/evil?x=1` can only ever resolve to\n // `https://studio.weaverse.io` — never carrying an attacker path/query into the\n // server-side API base.\n let trustedUrlHost =\n queryHost && isTrustedStudioHost(queryHost) ? new URL(queryHost).origin : ''\n\n let configuredHost =\n options.weaverseHost || readEnv(env, 'WEAVERSE_HOST') || ''\n let weaverseHost = trustedUrlHost || configuredHost || DEFAULT_WEAVERSE_HOST\n\n // Public data reads default to the edge proxy, but an explicit custom host\n // (staging/self-hosted Weaverse) must stay the API base so those deployments\n // don't fetch page/config data from the production proxy.\n let weaverseApiBase =\n trustedUrlHost ||\n options.weaverseApiBase ||\n readEnv(env, 'WEAVERSE_PUBLIC_API_BASE') ||\n (configuredHost && configuredHost !== DEFAULT_WEAVERSE_HOST\n ? configuredHost\n : DEFAULT_WEAVERSE_API_BASE)\n\n let isRevisionPreview =\n context?.isRevisionPreview ?? searchParams.has('__revisionId')\n let isDesignMode =\n context?.isDesignMode ?? coerceBool(lastParam(searchParams, 'isDesignMode'))\n let isPreviewMode =\n context?.isPreviewMode ??\n coerceBool(lastParam(searchParams, 'isPreviewMode'))\n\n return {\n queryProjectId: lastParam(searchParams, 'weaverseProjectId') || '',\n envProjectId: readEnv(env, 'WEAVERSE_PROJECT_ID') || '',\n weaverseHost,\n weaverseApiBase,\n weaverseApiKey:\n lastParam(searchParams, 'weaverseApiKey') ||\n readEnv(env, 'WEAVERSE_API_KEY') ||\n '',\n weaverseVersion:\n lastParam(searchParams, 'weaverseVersion') ||\n options.weaverseVersion ||\n '',\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n sectionType:\n context?.sectionType || lastParam(searchParams, 'sectionType') || '',\n publicEnv: {\n PUBLIC_STORE_DOMAIN: readEnv(env, 'PUBLIC_STORE_DOMAIN') || '',\n PUBLIC_STOREFRONT_API_TOKEN:\n readEnv(env, 'PUBLIC_STOREFRONT_API_TOKEN') || '',\n },\n }\n}\n","import type { WeaverseNextRequestContext } from '../types'\n\n// Query params that influence Weaverse page resolution on the Builder:\n// revision previews, design-mode flags, design-mode draft item overrides,\n// and `weaverse*` control params (host, version, project id). Everything\n// else — utm_*, fbclid, gclid, storefront filters — is irrelevant to which\n// page the Builder returns and would otherwise fragment any fetch cache keyed\n// on the request body. `weaverseDraftItem` is the current draft item param;\n// `__weaverseDraftItem` is kept as a legacy compatibility alias.\nconst KEPT_PARAM_RE =\n /^(?:__revisionId|__weaverseDraftItem|isDesignMode|weaverse)/\nconst DATA_SUFFIX = '.data'\n\n/**\n * Normalize the storefront URL sent in the Builder page API request body.\n *\n * The Builder reads only the pathname (locale/type/handle fallback) and the\n * Weaverse/Studio control params from this URL, so keep exactly those and drop\n * tracking params. Params are sorted for a stable, cache-friendly string.\n *\n * Ported from `@weaverse/hydrogen`'s `normalizePageUrl`, but tolerant of a\n * relative URL (Next route handlers may only know the pathname).\n */\nexport function normalizeNextPageUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n try {\n parsed = new URL(url, 'http://localhost')\n } catch {\n return url\n }\n }\n\n let kept = [...parsed.searchParams].filter(([key]) => KEPT_PARAM_RE.test(key))\n kept.sort(([a], [b]) => a.localeCompare(b))\n let search = new URLSearchParams(kept).toString()\n\n let { pathname } = parsed\n if (pathname.endsWith(DATA_SUFFIX)) {\n pathname = pathname.slice(0, -DATA_SUFFIX.length)\n }\n return `${parsed.origin}${pathname}${search ? `?${search}` : ''}`\n}\n\n/**\n * Build an absolute-ish request URL string from the explicit request context,\n * preferring `url`, then `pathname` + `searchParams`. Used as the input to\n * {@link normalizeNextPageUrl}.\n */\nexport function resolveRequestUrl(\n context?: WeaverseNextRequestContext\n): string {\n if (context?.url) {\n return typeof context.url === 'string'\n ? context.url\n : context.url.toString()\n }\n let pathname = context?.pathname || '/'\n let search = context?.searchParams\n ? new URLSearchParams(context.searchParams).toString()\n : ''\n return `http://localhost${pathname}${search ? `?${search}` : ''}`\n}\n","import type { SchemaType } from '@weaverse/schema'\n\n/**\n * Generate default component data from a schema's `settings` inputs.\n *\n * Mirrors Hydrogen's `generateDataFromSchema` (settings → `{ [name]:\n * defaultValue }`) but is kept local so `@weaverse/next` doesn't depend on\n * `@weaverse/hydrogen`. Falls back to the deprecated `inspector` array when a\n * schema predates `settings`.\n */\nexport function generateDataFromSchema(\n schema: SchemaType | undefined\n): Record<string, unknown> {\n let data: Record<string, unknown> = {}\n if (!schema) {\n return data\n }\n\n let groups =\n (schema.settings as {\n inputs?: { name?: string; defaultValue?: unknown }[]\n }[]) ??\n (schema as { inspector?: typeof groups }).inspector ??\n []\n\n for (let group of groups) {\n for (let input of group?.inputs ?? []) {\n let { name, defaultValue } = input\n if (name && defaultValue !== null && defaultValue !== undefined) {\n data[name] = defaultValue\n }\n }\n }\n\n return data\n}\n","import type {\n WeaverseNextComponentData,\n WeaverseNextServerClient,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\n\nconst NO_STORE_HEADERS = {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n} as const\n\nconst STATUS_OK = 200\nconst STATUS_BAD_REQUEST = 400\nconst STATUS_NOT_FOUND = 404\nconst STATUS_UNPROCESSABLE = 422\nconst STATUS_SERVER_ERROR = 500\n\nexport interface WeaverseNextRevalidateHandlerConfig {\n /**\n * Reuse the app's server-client factory so the loader runs with the same\n * component registry and commerce (storefront) context as page loads.\n */\n getClient: (\n request: Request\n ) => Promise<WeaverseNextServerClient> | WeaverseNextServerClient\n}\n\n/** POST body accepted by the revalidate route. */\nexport interface WeaverseNextRevalidateRequestBody {\n draftItem: WeaverseNextComponentData\n}\n\nfunction json(body: Record<string, unknown>, status: number) {\n return new Response(JSON.stringify(body), {\n status,\n headers: NO_STORE_HEADERS,\n })\n}\n\nfunction parseDraftItem(payload: unknown): WeaverseNextComponentData | null {\n if (typeof payload !== 'object' || payload === null) {\n return null\n }\n let draftItem = (payload as { draftItem?: unknown }).draftItem\n if (typeof draftItem !== 'object' || draftItem === null) {\n return null\n }\n let { id, type } = draftItem as { id?: unknown; type?: unknown }\n if (typeof id !== 'string' || !id || typeof type !== 'string' || !type) {\n return null\n }\n return draftItem as WeaverseNextComponentData\n}\n\n/**\n * Create the Studio per-item revalidation route handler.\n *\n * Studio design-mode edits to loader-backed inputs (e.g. resource pickers) need\n * fresh server loader data for a single item. Re-running it through\n * `router.refresh()` re-applies the whole RSC tree — and the draft-item query\n * rewrite changes the App Router page segment key, remounting the page and\n * resetting scroll. This handler runs just the edited component's `loader`\n * with the unsaved draft settings and returns the payload for an in-place\n * client update (see the `2026-07-02--next-item-revalidation` spec).\n *\n * Security: only registered component types are executable, the handler never\n * persists anything, and responses are `no-store`. Exposure is equivalent to\n * the existing `weaverseDraftItem` URL param, which already lets any visitor\n * run design-mode loaders with arbitrary draft settings.\n *\n * @example\n * ```ts\n * // app/api/weaverse/revalidate/route.ts\n * export const { POST } = createWeaverseNextRevalidateHandler({\n * getClient: () => getWeaverseServerClient(Promise.resolve({})),\n * })\n * ```\n */\nexport function createWeaverseNextRevalidateHandler(\n config: WeaverseNextRevalidateHandlerConfig\n): { POST: (request: Request) => Promise<Response> } {\n return {\n POST: async (request: Request) => {\n let payload: unknown\n try {\n payload = await request.json()\n } catch {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let draftItem = parseDraftItem(payload)\n if (!draftItem) {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let client: WeaverseNextServerClient\n try {\n client = await config.getClient(request)\n } catch (error) {\n console.error('❌ Revalidate handler getClient failed.', error)\n return json({ error: 'client-init-failed' }, STATUS_SERVER_ERROR)\n }\n\n let component = client.components.find(\n (candidate) => candidate?.schema?.type === draftItem.type\n )\n if (!component) {\n return json({ error: 'unknown-component-type' }, STATUS_NOT_FOUND)\n }\n if (typeof component.loader !== 'function') {\n return json({ error: 'missing-loader' }, STATUS_UNPROCESSABLE)\n }\n\n try {\n // Same args shape as `runWeaverseComponentLoaders`, so component\n // loaders behave identically between page load and revalidation.\n let loaderData = await component.loader({\n data: {\n ...generateDataFromSchema(component.schema),\n ...draftItem.data,\n },\n weaverse: client,\n context: client.requestContext,\n commerce: client.commerce,\n })\n return json({ loaderData: loaderData ?? null }, STATUS_OK)\n } catch (error) {\n console.error(\n '❌ Item loader revalidation failed.',\n draftItem.type,\n draftItem.id,\n error\n )\n return json({ error: 'loader-failed' }, STATUS_SERVER_ERROR)\n }\n },\n }\n}\n","import type {\n WeaverseNextClient,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextLoaderData,\n WeaverseNextRequestContext,\n} from './types'\nimport { generateDataFromSchema } from './utils'\n\nexport interface RunComponentLoadersArgs {\n client: WeaverseNextClient\n commerce?: WeaverseNextCommerceContext\n context?: WeaverseNextRequestContext\n /** Page payload to walk; defaults to `client.data`. */\n data?: WeaverseNextLoaderData | null\n}\n\nfunction isItemNode(node: unknown): node is WeaverseNextComponentData {\n return (\n typeof node === 'object' &&\n node !== null &&\n typeof (node as WeaverseNextComponentData).type === 'string'\n )\n}\n\nfunction cloneItem(item: WeaverseNextComponentData): WeaverseNextComponentData {\n return {\n ...item,\n children: Array.isArray(item.children)\n ? item.children.map((child) =>\n isItemNode(child) ? cloneItem(child) : { ...child }\n )\n : item.children,\n }\n}\n\n/**\n * Walk a serialized page tree and run each registered component's `loader`,\n * attaching the result to the item as `loaderData`.\n *\n * Loaders receive explicit `commerce.storefront` (and `weaverse.storefront` as\n * a compatibility alias via the client). Children are walked recursively when\n * they are inline item objects; flat `items` arrays are covered by the\n * top-level walk.\n *\n * @returns a cloned `data` object with `loaderData` attached to cloned items.\n */\nexport async function runWeaverseComponentLoaders(\n args: RunComponentLoadersArgs\n): Promise<WeaverseNextLoaderData | null> {\n let { client, context, commerce } = args\n let sourceData = args.data ?? client.data\n if (!sourceData) {\n return null\n }\n if (!sourceData.page.items.length) {\n return sourceData\n }\n\n let data: WeaverseNextLoaderData = {\n ...sourceData,\n page: {\n ...sourceData.page,\n items: sourceData.page.items.map(cloneItem),\n },\n }\n let items = data.page.items\n\n let componentMap = new Map<string, WeaverseNextComponent>()\n for (let component of client.components) {\n if (component?.schema?.type) {\n componentMap.set(component.schema.type, component)\n }\n }\n\n let visited = new Set<string>()\n let resolvedContext = context ?? client.requestContext\n let resolvedCommerce = commerce ?? client.commerce\n\n // Per-call `weaverse` alias. When a request-scoped `commerce` is passed, the\n // `weaverse.storefront` compatibility alias must resolve to *that* storefront,\n // not the client's construction-time commerce. Pilot-style loaders call\n // `weaverse.storefront.query(...)`, so a stale alias would query the wrong\n // (or an undefined) storefront. When no override is given we reuse the client\n // as-is to preserve its prototype getters.\n let resolvedWeaverse: WeaverseNextClient =\n resolvedCommerce === client.commerce\n ? client\n : {\n ...client,\n commerce: resolvedCommerce,\n storefront: resolvedCommerce?.storefront,\n }\n\n async function walk(nodes: WeaverseNextComponentData[]) {\n for (let item of nodes) {\n if (!item || visited.has(item.id)) {\n continue\n }\n visited.add(item.id)\n\n let component = componentMap.get(item.type)\n if (component?.loader) {\n try {\n item.loaderData = await component.loader({\n data: { ...generateDataFromSchema(component.schema), ...item.data },\n weaverse: resolvedWeaverse,\n context: resolvedContext,\n commerce: resolvedCommerce,\n })\n } catch (error) {\n console.warn('❌ Item loader run failed.', item.type, item.id, error)\n }\n }\n\n let children = item.children\n if (Array.isArray(children)) {\n let inlineChildren = children.filter(\n isItemNode\n ) as WeaverseNextComponentData[]\n if (inlineChildren.length) {\n await walk(inlineChildren)\n }\n }\n }\n }\n\n await walk(items)\n return data\n}\n","import type {\n WeaverseNextRequestContext,\n WeaverseNextRequestInfo,\n} from './types'\n\nfunction toUrl(value: string | URL): URL {\n return typeof value === 'string' ? new URL(value, 'http://localhost') : value\n}\n\nfunction getSearchParamsFromContext(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return new URLSearchParams(url.searchParams)\n }\n\n return new URLSearchParams()\n}\n\nfunction getPathnameFromContext(context?: WeaverseNextRequestContext): string {\n if (context?.pathname) {\n return context.pathname\n }\n\n if (context?.url) {\n let url = toUrl(context.url)\n return url.pathname || '/'\n }\n\n return '/'\n}\n\nfunction coerceQueryValue(value: string): string | boolean {\n if (value === 'true') {\n return true\n }\n if (value === 'false') {\n return false\n }\n return value\n}\n\nfunction toQueryRecord(\n searchParams: URLSearchParams\n): Record<string, string | boolean> {\n let queries: Record<string, string | boolean> = {}\n for (let [key, value] of searchParams.entries()) {\n queries[key] = coerceQueryValue(value)\n }\n return queries\n}\n\nconst TRANSIENT_STUDIO_PARAMS = new Set([\n 'weaverseDraftItem',\n // Legacy name from the original design-mode draft-item spike. Keep it out of\n // runtime requestInfo too, in case an older Builder bundle is in front of a\n // newer Next storefront.\n '__weaverseDraftItem',\n])\n\nfunction getRequestInfoSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n let searchParams = new URLSearchParams(getSearchParamsFromContext(context))\n for (let key of TRANSIENT_STUDIO_PARAMS) {\n searchParams.delete(key)\n }\n return searchParams\n}\n\n/**\n * Build the Hydrogen-like request info shape consumed by the Studio bridge.\n * Duplicate query keys keep the last value, matching `URLSearchParams` iteration\n * assignment and Hydrogen's practical query-object behavior.\n */\nexport function buildWeaverseNextRequestInfo(\n context?: WeaverseNextRequestContext\n): WeaverseNextRequestInfo {\n let searchParams = getRequestInfoSearchParams(context)\n let search = searchParams.toString()\n\n return {\n pathname: getPathnameFromContext(context),\n search: search ? `?${search}` : '',\n queries: toQueryRecord(searchParams),\n ...(context?.i18n ? { i18n: context.i18n } : {}),\n }\n}\n","import type { SchemaType } from '@weaverse/schema'\nimport { runWeaverseComponentLoaders } from '../loader'\nimport { buildWeaverseNextRequestInfo } from '../request-info'\nimport type {\n WeaverseNextBaseConfigs,\n WeaverseNextCacheConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextConfigs,\n WeaverseNextCustomPageEntry,\n WeaverseNextFetchCustomPagesOptions,\n WeaverseNextFetchOptions,\n WeaverseNextLoaderData,\n WeaverseNextLoadPageInput,\n WeaverseNextPageAssignment,\n WeaverseNextPageData,\n WeaverseNextProjectId,\n WeaverseNextRequestContext,\n WeaverseNextServerClient,\n WeaverseNextServerClientConfig,\n WeaverseNextServerLoadPageInput,\n WeaverseNextStorefront,\n WeaverseNextThemeSettingsOptions,\n WeaverseNextThemeSettingsResponse,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\nimport { getWeaverseNextConfigs } from './configs'\nimport { normalizeNextPageUrl, resolveRequestUrl } from './normalize-page-url'\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 10_000\nconst RANDOM_ID_RADIX = 36\nconst RANDOM_ID_SLICE_START = 2\nconst MAX_CUSTOM_PAGE_PAGES = 100\n\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n} as const\n\n/** Next's `fetch` reads `next: { revalidate, tags }` off the request init. */\ntype NextRequestInit = RequestInit & {\n next?: { revalidate?: number | false; tags?: string[] }\n}\n\ninterface LooseThemeSchema {\n i18n?: { staticContent?: Record<string, unknown> }\n inspector?: unknown[]\n settings?: {\n inputs?: { condition?: unknown }[]\n [key: string]: unknown\n }[]\n}\n\nfunction asThemeSchema(schema: unknown): LooseThemeSchema | undefined {\n return schema && typeof schema === 'object'\n ? (schema as LooseThemeSchema)\n : undefined\n}\n\nfunction generateUuid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID()\n }\n return `id-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`\n}\n\n/**\n * Normalize the raw `pageAssignment` from `/api/public/project` into a\n * save-compatible {@link WeaverseNextPageAssignment} so the Builder Studio save\n * pipeline receives the same shape it gets from Hydrogen. Returns `undefined`\n * for a missing or malformed assignment (rather than fabricating one), requires\n * string `projectId`/`type`/`handle`, coerces a nullish `locale` to `''`, and\n * preserves an object `meta` untouched.\n */\nfunction normalizeWeaverseNextPageAssignment(\n input: unknown\n): WeaverseNextPageAssignment | undefined {\n if (!input || typeof input !== 'object') {\n return\n }\n let { projectId, type, handle, locale, meta } = input as Record<\n string,\n unknown\n >\n if (\n typeof projectId !== 'string' ||\n typeof type !== 'string' ||\n typeof handle !== 'string'\n ) {\n return\n }\n let normalized: WeaverseNextPageAssignment = {\n projectId,\n type,\n handle,\n locale: typeof locale === 'string' ? locale : '',\n }\n if (meta && typeof meta === 'object') {\n normalized.meta = meta as WeaverseNextPageAssignment['meta']\n }\n return normalized\n}\n\n/**\n * Server-side Weaverse client for Next.js. Performs the real Weaverse public\n * API fetch (page + theme settings) instead of delegating to injected fetchers,\n * closing the gap with Hydrogen's `context.weaverse.loadPage(...)`.\n */\nclass NextServerClient implements WeaverseNextServerClient {\n components: WeaverseNextComponent[]\n commerce?: WeaverseNextCommerceContext\n requestContext?: WeaverseNextRequestContext\n themeSchema?: unknown\n themeSettings: Record<string, unknown>\n data: WeaverseNextLoaderData | null = null\n dataContext: Record<string, unknown> = {}\n configs: WeaverseNextConfigs\n\n private readonly _projectIdInput?: WeaverseNextProjectId\n private readonly _baseConfigs: WeaverseNextBaseConfigs\n private readonly _fetch: typeof fetch\n private readonly _cache?: WeaverseNextServerClientConfig['cache']\n private readonly _fetchTimeoutMs: number\n private _resolvedProjectId?: string\n\n constructor(config: WeaverseNextServerClientConfig) {\n // Server client keeps the component definitions for server-side loaders\n // (`runWeaverseComponentLoaders`) and preview-data generation, but it\n // intentionally does NOT call `registerWeaverseNextComponents`. Registering\n // pulls in `../registry` → `@weaverse/react`, which evaluates\n // `React.createContext()` at module load — invalid in the RSC/server graph\n // and the cause of `(0 , x.createContext) is not a function`. The client\n // wrapper/renderer (root `@weaverse/next` client entry) registers the real\n // render components instead, keeping `@weaverse/next/server` React-free.\n this.components = config.components\n this.commerce = config.commerce\n this.requestContext = config.requestContext\n this.themeSchema = config.themeSchema\n // Seed schema defaults before merchant overrides, mirroring the root client.\n this.themeSettings = {\n ...generateDataFromSchema(config.themeSchema as SchemaType | undefined),\n ...config.themeSettings,\n }\n this._projectIdInput = config.projectId\n this._fetch = config.fetch ?? globalThis.fetch\n this._cache = config.cache\n this._fetchTimeoutMs = config.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS\n\n this._baseConfigs = getWeaverseNextConfigs(config.requestContext, {\n env: config.env,\n weaverseHost: config.weaverseHost,\n weaverseApiBase: config.weaverseApiBase,\n weaverseVersion: config.weaverseVersion,\n })\n\n // Synchronous best-effort projectId (query → string → env). A function\n // resolver is awaited lazily in `resolveProjectId`, so `projectId` reflects\n // its result after the first `loadPage`/`loadThemeSettings`/`resolveProjectId`.\n this.configs = this._buildPublicConfigs(\n this._baseConfigs.queryProjectId ||\n (typeof this._projectIdInput === 'string'\n ? this._projectIdInput.trim()\n : '') ||\n this._baseConfigs.envProjectId\n )\n }\n\n get projectId(): string {\n return this.configs.projectId\n }\n\n /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */\n get storefront(): WeaverseNextStorefront | undefined {\n return this.commerce?.storefront\n }\n\n private _buildPublicConfigs(projectId: string): WeaverseNextConfigs {\n let base = this._baseConfigs\n return {\n projectId,\n weaverseHost: base.weaverseHost,\n weaverseApiBase: base.weaverseApiBase,\n weaversePublicApiBase: base.weaverseApiBase,\n weaverseVersion: base.weaverseVersion,\n isDesignMode: base.isDesignMode,\n isPreviewMode: base.isPreviewMode,\n isRevisionPreview: base.isRevisionPreview,\n sectionType: base.sectionType,\n publicEnv: base.publicEnv,\n }\n }\n\n resolveProjectId = async (): Promise<string> => {\n if (this._resolvedProjectId !== undefined) {\n return this._resolvedProjectId\n }\n\n // Priority: query param → function → string → env (matches Hydrogen).\n let resolved = this._baseConfigs.queryProjectId\n if (!resolved && typeof this._projectIdInput === 'function') {\n try {\n let value = await this._projectIdInput(this.requestContext)\n if (typeof value === 'string' && value.trim()) {\n resolved = value.trim()\n }\n } catch (error) {\n console.warn(\n '[WeaverseNextServerClient] projectId resolver threw, falling back.',\n error\n )\n }\n }\n if (!resolved && typeof this._projectIdInput === 'string') {\n resolved = this._projectIdInput.trim()\n }\n if (!resolved) {\n resolved = this._baseConfigs.envProjectId\n }\n\n this._resolvedProjectId = resolved\n this.configs = this._buildPublicConfigs(resolved)\n return resolved\n }\n\n fetchWithCache = async <T = unknown>(\n url: string,\n options: WeaverseNextFetchOptions = {}\n ): Promise<T> => {\n let { revalidate, tags, ...init } = options\n let requestInit: NextRequestInit = { ...init }\n\n let { isDesignMode, isRevisionPreview } = this._baseConfigs\n if (isDesignMode || isRevisionPreview) {\n // Design / revision data must never be served stale.\n requestInit.cache = 'no-store'\n } else if (requestInit.cache === undefined) {\n let effectiveRevalidate = revalidate ?? this._cache?.revalidate\n let effectiveTags = tags ?? this._cache?.tags\n if (effectiveRevalidate !== undefined || effectiveTags?.length) {\n requestInit.next = {\n ...(effectiveRevalidate === undefined\n ? {}\n : { revalidate: effectiveRevalidate }),\n ...(effectiveTags?.length ? { tags: effectiveTags } : {}),\n }\n }\n }\n\n let controller = new AbortController()\n let timeoutId = setTimeout(() => controller.abort(), this._fetchTimeoutMs)\n try {\n let response = await this._fetch(url, {\n ...requestInit,\n signal: requestInit.signal ?? controller.signal,\n })\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n return (await response.json()) as T\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n private _buildCustomPagesUrl(\n projectId: string,\n options: WeaverseNextFetchCustomPagesOptions,\n cursor: string | null\n ) {\n let params = new URLSearchParams()\n if (options.locale) {\n params.set('locale', options.locale)\n }\n if (options.limit) {\n params.set('limit', String(options.limit))\n }\n if (cursor) {\n params.set('cursor', cursor)\n }\n let qs = params.toString()\n return `${this._baseConfigs.weaverseApiBase}/api/public/v1/projects/${projectId}/custom-pages${\n qs ? `?${qs}` : ''\n }`\n }\n\n /**\n * Fetch all published custom pages for sitemap generation. Mirrors Hydrogen's\n * helper but uses Next's fetch cache knobs (`revalidate` / `tags`). It returns\n * accumulated results on partial pagination failure so a single API hiccup\n * does not break sitemap generation entirely.\n */\n fetchCustomPages = async (\n options: WeaverseNextFetchCustomPagesOptions = {}\n ): Promise<WeaverseNextCustomPageEntry[]> => {\n let projectId = await this.resolveProjectId()\n let entries: WeaverseNextCustomPageEntry[] = []\n if (!projectId) {\n console.warn(\n '[WeaverseNext] Failed to fetch custom pages: missing projectId'\n )\n return entries\n }\n\n let cursor: string | null = null\n for (let page = 0; page < MAX_CUSTOM_PAGE_PAGES; page += 1) {\n let url = this._buildCustomPagesUrl(projectId, options, cursor)\n\n try {\n let result = await this.fetchWithCache<{\n data?: WeaverseNextCustomPageEntry[]\n nextCursor?: string | null\n }>(url, {\n revalidate: options.revalidate,\n tags: options.tags,\n })\n entries.push(...(result.data ?? []))\n if (!result.nextCursor) {\n return entries\n }\n cursor = result.nextCursor\n } catch (error) {\n let message = error instanceof Error ? error.message : String(error)\n console.warn(\n entries.length === 0\n ? `[WeaverseNext] Failed to fetch custom pages: ${message}`\n : `[WeaverseNext] Custom pages pagination interrupted: ${message}`\n )\n return entries\n }\n }\n\n console.warn('[WeaverseNext] Custom pages pagination cap reached')\n return entries\n }\n\n private _generateFallbackPage(message: string): WeaverseNextPageData {\n let rootId = generateUuid()\n return {\n id: `fallback_page_${rootId}`,\n rootId,\n name: 'Default Page',\n items: [\n {\n type: 'main',\n id: rootId,\n data: { dangerouslySetInnerHTML: { __html: message } },\n },\n ],\n }\n }\n\n /**\n * Recursively materialize a section preset (and its preset children) into a\n * flat list of page items, returning the new item id. Ported from Hydrogen's\n * `recursivelyAddDataItem`. Returns `undefined` when the type isn't registered.\n */\n private _buildPreviewItems(\n type: string,\n items: WeaverseNextComponentData[],\n initData: Record<string, unknown> = {}\n ): string | undefined {\n let component = this.components.find((c) => c.schema?.type === type)\n if (!component) {\n return\n }\n let { children, ...data } = (component.schema?.presets ?? {}) as {\n children?: { type: string; [key: string]: unknown }[]\n [key: string]: unknown\n }\n let childIds: { id: string }[] = []\n if (children) {\n for (let child of children) {\n let { type: childType, children: _children, ...childData } = child\n let childId = this._buildPreviewItems(childType, items, childData)\n if (childId) {\n childIds.push({ id: childId })\n }\n }\n }\n let id = generateUuid()\n items.push({ id, type, data: { ...data, ...initData }, children: childIds })\n return id\n }\n\n /**\n * Synthetic loader data for Studio \"section preview\" mode. Mirrors Hydrogen's\n * `getPreviewData`: it builds a single-section page from the requested\n * `sectionType`'s presets without hitting `/api/public/project`, so preview\n * works even without a resolved `projectId`.\n */\n private _generatePreviewData(projectId: string): WeaverseNextLoaderData {\n let { sectionType, weaverseHost } = this._baseConfigs\n let items: WeaverseNextComponentData[] = []\n let sectionId = sectionType\n ? this._buildPreviewItems(sectionType, items)\n : undefined\n\n let configs = {\n ...this._buildPublicConfigs(projectId),\n isPreviewMode: true,\n weaverseHost,\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n }\n\n return {\n project: {\n id: projectId,\n weaverseShopId: 'shop-id',\n name: 'Section Preview',\n },\n configs,\n page: {\n id: 'weaverse-preview-page',\n name: 'Preview section',\n rootId: '1',\n items: [\n {\n id: '1',\n type: 'main',\n data: {},\n children: sectionId ? [{ id: sectionId }] : [],\n },\n ...items,\n ],\n },\n }\n }\n\n private _getLoadPageInput(input: WeaverseNextLoadPageInput) {\n let {\n cache,\n projectId: routeProjectId,\n ...rest\n } = input as WeaverseNextServerLoadPageInput\n let params: Record<string, unknown> = {}\n for (let [key, value] of Object.entries(rest)) {\n if (value !== undefined) {\n params[key] = value\n }\n }\n return { cache, params, routeProjectId }\n }\n\n private async _resolveLoadPageProjectId(routeProjectId?: string) {\n let effectiveProjectId =\n (typeof routeProjectId === 'string' && routeProjectId.trim()) ||\n (await this.resolveProjectId())\n if (effectiveProjectId) {\n this.configs = this._buildPublicConfigs(effectiveProjectId)\n }\n return effectiveProjectId\n }\n\n private _fetchPagePayload(\n projectId: string,\n params: Record<string, unknown>,\n cache?: WeaverseNextCacheConfig\n ) {\n let i18n = this.requestContext?.i18n ?? this.commerce?.storefront?.i18n\n let url = normalizeNextPageUrl(resolveRequestUrl(this.requestContext))\n let apiUrl = `${this._baseConfigs.weaverseApiBase}/api/public/project`\n let userAgent = this.requestContext?.headers?.get('user-agent') ?? ''\n return this.fetchWithCache<Record<string, unknown>>(apiUrl, {\n method: 'POST',\n body: JSON.stringify({\n projectId,\n url,\n i18n,\n params,\n isDesignMode: this._baseConfigs.isDesignMode,\n }),\n headers: { ...JSON_HEADERS, 'X-Visitor-UA': userAgent },\n ...(cache ?? {}),\n })\n }\n\n private _assertNoPageError(payload: Record<string, unknown>) {\n if ('error' in payload && typeof payload.error === 'string') {\n throw new Error(payload.error)\n }\n }\n\n private _createLoaderData(\n payload: Record<string, unknown>,\n projectId: string\n ): WeaverseNextLoaderData {\n this._assertNoPageError(payload)\n let page = payload.page as WeaverseNextPageData | undefined\n let project = payload.project as WeaverseNextLoaderData['project']\n let pageAssignment = normalizeWeaverseNextPageAssignment(\n payload.pageAssignment\n )\n\n page ??= this._generateFallbackPage(\n '<div style=\"text-align: center;\">Please add new section to start.</div>'\n )\n project ??= {\n id: projectId,\n name: 'Weaverse project not found.',\n weaverseShopId: '',\n }\n if (Array.isArray(page.items) && page.items.length === 0) {\n page.items.push({\n type: 'main',\n id: page.rootId || generateUuid(),\n data: {},\n })\n }\n\n return {\n page,\n project,\n pageAssignment,\n configs: {\n ...this._buildPublicConfigs(projectId),\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n },\n }\n }\n\n private async _runLoaders(data: WeaverseNextLoaderData) {\n this.data = data\n let withLoaders = await runWeaverseComponentLoaders({ client: this, data })\n this.data = withLoaders ?? data\n return this.data\n }\n\n loadPage = async (\n input: WeaverseNextLoadPageInput = {}\n ): Promise<WeaverseNextLoaderData | null> => {\n try {\n let { cache, params, routeProjectId } = this._getLoadPageInput(input)\n let projectId = await this._resolveLoadPageProjectId(routeProjectId)\n if (this._baseConfigs.isPreviewMode) {\n let previewData = this._generatePreviewData(projectId || 'x')\n this.data = previewData\n return previewData\n }\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let payload = await this._fetchPagePayload(projectId, params, cache)\n let data = this._createLoaderData(payload, projectId)\n return await this._runLoaders(data)\n } catch (error) {\n console.error('❌ Page load failed', {\n url: this.requestContext?.url,\n projectId: input.projectId || this.configs.projectId,\n message: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n }\n\n loadThemeSettings = async (\n // Broad param keeps this assignable to `WeaverseNextClient.loadThemeSettings`;\n // only the cache fields below are honored — no request-context override.\n optionsInput:\n | WeaverseNextThemeSettingsOptions\n | WeaverseNextRequestContext = {}\n ): Promise<WeaverseNextThemeSettingsResponse> => {\n let options = optionsInput as WeaverseNextThemeSettingsOptions\n let themeSchema = asThemeSchema(this.themeSchema)\n let defaultThemeSettings = generateDataFromSchema(\n this.themeSchema as SchemaType | undefined\n )\n let staticContent = themeSchema?.i18n?.staticContent\n\n try {\n let projectId = await this.resolveProjectId()\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let { isDesignMode } = this._baseConfigs\n let url = `${this._baseConfigs.weaverseApiBase}/api/public/project_configs`\n let result = await this.fetchWithCache<WeaverseNextThemeSettingsResponse>(\n url,\n {\n method: 'POST',\n body: JSON.stringify({ projectId, isDesignMode }),\n headers: JSON_HEADERS,\n revalidate: options.revalidate,\n tags: options.tags,\n }\n )\n\n if (typeof result !== 'object' || result === null) {\n result = { theme: defaultThemeSettings }\n }\n\n if (themeSchema?.settings || themeSchema?.inspector) {\n if (!result.theme || typeof result.theme !== 'object') {\n result.theme = defaultThemeSettings\n } else {\n result.theme = { ...defaultThemeSettings, ...result.theme }\n }\n }\n\n if (staticContent) {\n result.staticContent = staticContent\n }\n\n if (isDesignMode) {\n result = {\n ...result,\n schema: themeSchema\n ? {\n ...themeSchema,\n settings: themeSchema.settings?.map((group) => ({\n ...group,\n inputs: group?.inputs?.map((inputItem) =>\n typeof inputItem?.condition === 'function'\n ? {\n ...inputItem,\n condition: inputItem.condition.toString(),\n }\n : inputItem\n ),\n })),\n }\n : undefined,\n publicEnv: this._baseConfigs.publicEnv,\n }\n }\n\n return result\n } catch (error) {\n let errorDetails = error instanceof Error ? error.message : String(error)\n console.error('Unable to load theme settings', errorDetails)\n return {\n theme: defaultThemeSettings,\n staticContent,\n _error: errorDetails,\n _loadFailed: true,\n }\n }\n }\n}\n\n/**\n * Create a server-side {@link WeaverseNextServerClient} for Next.js App Router\n * routes / server components.\n *\n * @example\n * ```ts\n * let weaverse = createWeaverseNextServerClient({\n * projectId: process.env.WEAVERSE_PROJECT_ID,\n * components,\n * commerce: { storefront },\n * requestContext: { url, headers, searchParams, i18n },\n * cache: { revalidate: 60, tags: ['weaverse'] },\n * })\n * let data = await weaverse.loadPage({ type: 'INDEX' })\n * let theme = await weaverse.loadThemeSettings()\n * ```\n */\nexport function createWeaverseNextServerClient(\n config: WeaverseNextServerClientConfig\n): WeaverseNextServerClient {\n return new NextServerClient(config)\n}\n\nexport { getContextSearchParams } from './configs'\n"]}
package/dist/server.mjs CHANGED
@@ -219,6 +219,25 @@ function generateUuid() {
219
219
  }
220
220
  return `id-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;
221
221
  }
222
+ function normalizeWeaverseNextPageAssignment(input) {
223
+ if (!input || typeof input !== "object") {
224
+ return;
225
+ }
226
+ let { projectId, type, handle, locale, meta } = input;
227
+ if (typeof projectId !== "string" || typeof type !== "string" || typeof handle !== "string") {
228
+ return;
229
+ }
230
+ let normalized = {
231
+ projectId,
232
+ type,
233
+ handle,
234
+ locale: typeof locale === "string" ? locale : ""
235
+ };
236
+ if (meta && typeof meta === "object") {
237
+ normalized.meta = meta;
238
+ }
239
+ return normalized;
240
+ }
222
241
  var NextServerClient = class {
223
242
  components;
224
243
  commerce;
@@ -518,7 +537,9 @@ var NextServerClient = class {
518
537
  this._assertNoPageError(payload);
519
538
  let page = payload.page;
520
539
  let project = payload.project;
521
- let pageAssignment = payload.pageAssignment;
540
+ let pageAssignment = normalizeWeaverseNextPageAssignment(
541
+ payload.pageAssignment
542
+ );
522
543
  page ??= this._generateFallbackPage(
523
544
  '<div style="text-align: center;">Please add new section to start.</div>'
524
545
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/configs.ts","../src/server/normalize-page-url.ts","../src/server/revalidate-handler.ts","../src/server/server-client.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["import type {\n WeaverseNextBaseConfigs,\n WeaverseNextRequestContext,\n} from '../types'\n\nconst DEFAULT_WEAVERSE_HOST = 'https://studio.weaverse.io'\nconst DEFAULT_WEAVERSE_API_BASE = 'https://api.weaverse.io'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge / data API may be served\n * from (matched on the host itself and any subdomain). Kept in sync with\n * Hydrogen's `isTrustedStudioHost`.\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\n/**\n * Whether `host` is an origin we trust to resolve page/theme data. The\n * `weaverseHost` query param is attacker-controllable, so a crafted\n * `?weaverseHost=` must be rejected before it can point server-side fetches at\n * an arbitrary origin (SSRF). Only `weaverse.io`/`weaverse.dev` and subdomains\n * over https are trusted.\n */\nfunction isTrustedStudioHost(host: string): boolean {\n let parsed: URL\n try {\n parsed = new URL(host)\n } catch {\n return false\n }\n if (parsed.protocol !== 'https:') {\n return false\n }\n let { hostname } = parsed\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\nfunction toUrl(value: string | URL): URL | null {\n try {\n return typeof value === 'string'\n ? new URL(value, 'http://localhost')\n : value\n } catch {\n return null\n }\n}\n\n/**\n * Extract the request search params from the explicit Next request context.\n * Prefers `searchParams`, falls back to parsing `url`.\n */\nexport function getContextSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n if (context?.url) {\n let url = toUrl(context.url)\n if (url) {\n return new URLSearchParams(url.searchParams)\n }\n }\n return new URLSearchParams()\n}\n\n/**\n * Last value of a (possibly duplicated) query key. Matches Hydrogen's\n * `getRequestQueries`, which assigns while iterating and so keeps the last\n * occurrence — Studio appends its own control params, so a stale earlier value\n * must not win.\n */\nfunction lastParam(\n searchParams: URLSearchParams,\n key: string\n): string | undefined {\n let values = searchParams.getAll(key)\n return values.length ? values.at(-1) : undefined\n}\n\nfunction coerceBool(value: string | undefined): boolean {\n return value === 'true'\n}\n\nfunction readEnv(\n env: Record<string, string | undefined> | undefined,\n key: string\n): string | undefined {\n let fromConfig = env?.[key]\n if (fromConfig !== undefined) {\n return fromConfig\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key]\n }\n return\n}\n\nexport interface ResolveConfigsOptions {\n env?: Record<string, string | undefined>\n weaverseApiBase?: string\n weaverseHost?: string\n weaverseVersion?: string\n}\n\n/**\n * Derive Weaverse configs from the request context and env, close to Hydrogen's\n * `getWeaverseConfigs`. Resolves the trusted host, public API base, design /\n * preview / revision flags, and public env — but never resolves the final\n * `projectId` (that priority chain, which may call an async resolver, lives in\n * the server client). Query/env projectId candidates are returned for the\n * client to combine with function/string inputs.\n */\nexport function getWeaverseNextConfigs(\n context?: WeaverseNextRequestContext,\n options: ResolveConfigsOptions = {}\n): WeaverseNextBaseConfigs {\n let searchParams = getContextSearchParams(context)\n let { env } = options\n\n let queryHost = lastParam(searchParams, 'weaverseHost')\n // A trusted query host is canonicalized to its origin before use, so a crafted\n // `?weaverseHost=https://studio.weaverse.io/evil?x=1` can only ever resolve to\n // `https://studio.weaverse.io` — never carrying an attacker path/query into the\n // server-side API base.\n let trustedUrlHost =\n queryHost && isTrustedStudioHost(queryHost) ? new URL(queryHost).origin : ''\n\n let configuredHost =\n options.weaverseHost || readEnv(env, 'WEAVERSE_HOST') || ''\n let weaverseHost = trustedUrlHost || configuredHost || DEFAULT_WEAVERSE_HOST\n\n // Public data reads default to the edge proxy, but an explicit custom host\n // (staging/self-hosted Weaverse) must stay the API base so those deployments\n // don't fetch page/config data from the production proxy.\n let weaverseApiBase =\n trustedUrlHost ||\n options.weaverseApiBase ||\n readEnv(env, 'WEAVERSE_PUBLIC_API_BASE') ||\n (configuredHost && configuredHost !== DEFAULT_WEAVERSE_HOST\n ? configuredHost\n : DEFAULT_WEAVERSE_API_BASE)\n\n let isRevisionPreview =\n context?.isRevisionPreview ?? searchParams.has('__revisionId')\n let isDesignMode =\n context?.isDesignMode ?? coerceBool(lastParam(searchParams, 'isDesignMode'))\n let isPreviewMode =\n context?.isPreviewMode ??\n coerceBool(lastParam(searchParams, 'isPreviewMode'))\n\n return {\n queryProjectId: lastParam(searchParams, 'weaverseProjectId') || '',\n envProjectId: readEnv(env, 'WEAVERSE_PROJECT_ID') || '',\n weaverseHost,\n weaverseApiBase,\n weaverseApiKey:\n lastParam(searchParams, 'weaverseApiKey') ||\n readEnv(env, 'WEAVERSE_API_KEY') ||\n '',\n weaverseVersion:\n lastParam(searchParams, 'weaverseVersion') ||\n options.weaverseVersion ||\n '',\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n sectionType:\n context?.sectionType || lastParam(searchParams, 'sectionType') || '',\n publicEnv: {\n PUBLIC_STORE_DOMAIN: readEnv(env, 'PUBLIC_STORE_DOMAIN') || '',\n PUBLIC_STOREFRONT_API_TOKEN:\n readEnv(env, 'PUBLIC_STOREFRONT_API_TOKEN') || '',\n },\n }\n}\n","import type { WeaverseNextRequestContext } from '../types'\n\n// Query params that influence Weaverse page resolution on the Builder:\n// revision previews, design-mode flags, design-mode draft item overrides,\n// and `weaverse*` control params (host, version, project id). Everything\n// else — utm_*, fbclid, gclid, storefront filters — is irrelevant to which\n// page the Builder returns and would otherwise fragment any fetch cache keyed\n// on the request body. `weaverseDraftItem` is the current draft item param;\n// `__weaverseDraftItem` is kept as a legacy compatibility alias.\nconst KEPT_PARAM_RE =\n /^(?:__revisionId|__weaverseDraftItem|isDesignMode|weaverse)/\nconst DATA_SUFFIX = '.data'\n\n/**\n * Normalize the storefront URL sent in the Builder page API request body.\n *\n * The Builder reads only the pathname (locale/type/handle fallback) and the\n * Weaverse/Studio control params from this URL, so keep exactly those and drop\n * tracking params. Params are sorted for a stable, cache-friendly string.\n *\n * Ported from `@weaverse/hydrogen`'s `normalizePageUrl`, but tolerant of a\n * relative URL (Next route handlers may only know the pathname).\n */\nexport function normalizeNextPageUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n try {\n parsed = new URL(url, 'http://localhost')\n } catch {\n return url\n }\n }\n\n let kept = [...parsed.searchParams].filter(([key]) => KEPT_PARAM_RE.test(key))\n kept.sort(([a], [b]) => a.localeCompare(b))\n let search = new URLSearchParams(kept).toString()\n\n let { pathname } = parsed\n if (pathname.endsWith(DATA_SUFFIX)) {\n pathname = pathname.slice(0, -DATA_SUFFIX.length)\n }\n return `${parsed.origin}${pathname}${search ? `?${search}` : ''}`\n}\n\n/**\n * Build an absolute-ish request URL string from the explicit request context,\n * preferring `url`, then `pathname` + `searchParams`. Used as the input to\n * {@link normalizeNextPageUrl}.\n */\nexport function resolveRequestUrl(\n context?: WeaverseNextRequestContext\n): string {\n if (context?.url) {\n return typeof context.url === 'string'\n ? context.url\n : context.url.toString()\n }\n let pathname = context?.pathname || '/'\n let search = context?.searchParams\n ? new URLSearchParams(context.searchParams).toString()\n : ''\n return `http://localhost${pathname}${search ? `?${search}` : ''}`\n}\n","import type {\n WeaverseNextComponentData,\n WeaverseNextServerClient,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\n\nconst NO_STORE_HEADERS = {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n} as const\n\nconst STATUS_OK = 200\nconst STATUS_BAD_REQUEST = 400\nconst STATUS_NOT_FOUND = 404\nconst STATUS_UNPROCESSABLE = 422\nconst STATUS_SERVER_ERROR = 500\n\nexport interface WeaverseNextRevalidateHandlerConfig {\n /**\n * Reuse the app's server-client factory so the loader runs with the same\n * component registry and commerce (storefront) context as page loads.\n */\n getClient: (\n request: Request\n ) => Promise<WeaverseNextServerClient> | WeaverseNextServerClient\n}\n\n/** POST body accepted by the revalidate route. */\nexport interface WeaverseNextRevalidateRequestBody {\n draftItem: WeaverseNextComponentData\n}\n\nfunction json(body: Record<string, unknown>, status: number) {\n return new Response(JSON.stringify(body), {\n status,\n headers: NO_STORE_HEADERS,\n })\n}\n\nfunction parseDraftItem(payload: unknown): WeaverseNextComponentData | null {\n if (typeof payload !== 'object' || payload === null) {\n return null\n }\n let draftItem = (payload as { draftItem?: unknown }).draftItem\n if (typeof draftItem !== 'object' || draftItem === null) {\n return null\n }\n let { id, type } = draftItem as { id?: unknown; type?: unknown }\n if (typeof id !== 'string' || !id || typeof type !== 'string' || !type) {\n return null\n }\n return draftItem as WeaverseNextComponentData\n}\n\n/**\n * Create the Studio per-item revalidation route handler.\n *\n * Studio design-mode edits to loader-backed inputs (e.g. resource pickers) need\n * fresh server loader data for a single item. Re-running it through\n * `router.refresh()` re-applies the whole RSC tree — and the draft-item query\n * rewrite changes the App Router page segment key, remounting the page and\n * resetting scroll. This handler runs just the edited component's `loader`\n * with the unsaved draft settings and returns the payload for an in-place\n * client update (see the `2026-07-02--next-item-revalidation` spec).\n *\n * Security: only registered component types are executable, the handler never\n * persists anything, and responses are `no-store`. Exposure is equivalent to\n * the existing `weaverseDraftItem` URL param, which already lets any visitor\n * run design-mode loaders with arbitrary draft settings.\n *\n * @example\n * ```ts\n * // app/api/weaverse/revalidate/route.ts\n * export const { POST } = createWeaverseNextRevalidateHandler({\n * getClient: () => getWeaverseServerClient(Promise.resolve({})),\n * })\n * ```\n */\nexport function createWeaverseNextRevalidateHandler(\n config: WeaverseNextRevalidateHandlerConfig\n): { POST: (request: Request) => Promise<Response> } {\n return {\n POST: async (request: Request) => {\n let payload: unknown\n try {\n payload = await request.json()\n } catch {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let draftItem = parseDraftItem(payload)\n if (!draftItem) {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let client: WeaverseNextServerClient\n try {\n client = await config.getClient(request)\n } catch (error) {\n console.error('❌ Revalidate handler getClient failed.', error)\n return json({ error: 'client-init-failed' }, STATUS_SERVER_ERROR)\n }\n\n let component = client.components.find(\n (candidate) => candidate?.schema?.type === draftItem.type\n )\n if (!component) {\n return json({ error: 'unknown-component-type' }, STATUS_NOT_FOUND)\n }\n if (typeof component.loader !== 'function') {\n return json({ error: 'missing-loader' }, STATUS_UNPROCESSABLE)\n }\n\n try {\n // Same args shape as `runWeaverseComponentLoaders`, so component\n // loaders behave identically between page load and revalidation.\n let loaderData = await component.loader({\n data: {\n ...generateDataFromSchema(component.schema),\n ...draftItem.data,\n },\n weaverse: client,\n context: client.requestContext,\n commerce: client.commerce,\n })\n return json({ loaderData: loaderData ?? null }, STATUS_OK)\n } catch (error) {\n console.error(\n '❌ Item loader revalidation failed.',\n draftItem.type,\n draftItem.id,\n error\n )\n return json({ error: 'loader-failed' }, STATUS_SERVER_ERROR)\n }\n },\n }\n}\n","import type { SchemaType } from '@weaverse/schema'\nimport { runWeaverseComponentLoaders } from '../loader'\nimport { buildWeaverseNextRequestInfo } from '../request-info'\nimport type {\n WeaverseNextBaseConfigs,\n WeaverseNextCacheConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextConfigs,\n WeaverseNextCustomPageEntry,\n WeaverseNextFetchCustomPagesOptions,\n WeaverseNextFetchOptions,\n WeaverseNextLoaderData,\n WeaverseNextLoadPageInput,\n WeaverseNextPageData,\n WeaverseNextProjectId,\n WeaverseNextRequestContext,\n WeaverseNextServerClient,\n WeaverseNextServerClientConfig,\n WeaverseNextServerLoadPageInput,\n WeaverseNextStorefront,\n WeaverseNextThemeSettingsOptions,\n WeaverseNextThemeSettingsResponse,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\nimport { getWeaverseNextConfigs } from './configs'\nimport { normalizeNextPageUrl, resolveRequestUrl } from './normalize-page-url'\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 10_000\nconst RANDOM_ID_RADIX = 36\nconst RANDOM_ID_SLICE_START = 2\nconst MAX_CUSTOM_PAGE_PAGES = 100\n\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n} as const\n\n/** Next's `fetch` reads `next: { revalidate, tags }` off the request init. */\ntype NextRequestInit = RequestInit & {\n next?: { revalidate?: number | false; tags?: string[] }\n}\n\ninterface LooseThemeSchema {\n i18n?: { staticContent?: Record<string, unknown> }\n inspector?: unknown[]\n settings?: {\n inputs?: { condition?: unknown }[]\n [key: string]: unknown\n }[]\n}\n\nfunction asThemeSchema(schema: unknown): LooseThemeSchema | undefined {\n return schema && typeof schema === 'object'\n ? (schema as LooseThemeSchema)\n : undefined\n}\n\nfunction generateUuid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID()\n }\n return `id-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`\n}\n\n/**\n * Server-side Weaverse client for Next.js. Performs the real Weaverse public\n * API fetch (page + theme settings) instead of delegating to injected fetchers,\n * closing the gap with Hydrogen's `context.weaverse.loadPage(...)`.\n */\nclass NextServerClient implements WeaverseNextServerClient {\n components: WeaverseNextComponent[]\n commerce?: WeaverseNextCommerceContext\n requestContext?: WeaverseNextRequestContext\n themeSchema?: unknown\n themeSettings: Record<string, unknown>\n data: WeaverseNextLoaderData | null = null\n dataContext: Record<string, unknown> = {}\n configs: WeaverseNextConfigs\n\n private readonly _projectIdInput?: WeaverseNextProjectId\n private readonly _baseConfigs: WeaverseNextBaseConfigs\n private readonly _fetch: typeof fetch\n private readonly _cache?: WeaverseNextServerClientConfig['cache']\n private readonly _fetchTimeoutMs: number\n private _resolvedProjectId?: string\n\n constructor(config: WeaverseNextServerClientConfig) {\n // Server client keeps the component definitions for server-side loaders\n // (`runWeaverseComponentLoaders`) and preview-data generation, but it\n // intentionally does NOT call `registerWeaverseNextComponents`. Registering\n // pulls in `../registry` → `@weaverse/react`, which evaluates\n // `React.createContext()` at module load — invalid in the RSC/server graph\n // and the cause of `(0 , x.createContext) is not a function`. The client\n // wrapper/renderer (root `@weaverse/next` client entry) registers the real\n // render components instead, keeping `@weaverse/next/server` React-free.\n this.components = config.components\n this.commerce = config.commerce\n this.requestContext = config.requestContext\n this.themeSchema = config.themeSchema\n // Seed schema defaults before merchant overrides, mirroring the root client.\n this.themeSettings = {\n ...generateDataFromSchema(config.themeSchema as SchemaType | undefined),\n ...config.themeSettings,\n }\n this._projectIdInput = config.projectId\n this._fetch = config.fetch ?? globalThis.fetch\n this._cache = config.cache\n this._fetchTimeoutMs = config.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS\n\n this._baseConfigs = getWeaverseNextConfigs(config.requestContext, {\n env: config.env,\n weaverseHost: config.weaverseHost,\n weaverseApiBase: config.weaverseApiBase,\n weaverseVersion: config.weaverseVersion,\n })\n\n // Synchronous best-effort projectId (query → string → env). A function\n // resolver is awaited lazily in `resolveProjectId`, so `projectId` reflects\n // its result after the first `loadPage`/`loadThemeSettings`/`resolveProjectId`.\n this.configs = this._buildPublicConfigs(\n this._baseConfigs.queryProjectId ||\n (typeof this._projectIdInput === 'string'\n ? this._projectIdInput.trim()\n : '') ||\n this._baseConfigs.envProjectId\n )\n }\n\n get projectId(): string {\n return this.configs.projectId\n }\n\n /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */\n get storefront(): WeaverseNextStorefront | undefined {\n return this.commerce?.storefront\n }\n\n private _buildPublicConfigs(projectId: string): WeaverseNextConfigs {\n let base = this._baseConfigs\n return {\n projectId,\n weaverseHost: base.weaverseHost,\n weaverseApiBase: base.weaverseApiBase,\n weaversePublicApiBase: base.weaverseApiBase,\n weaverseVersion: base.weaverseVersion,\n isDesignMode: base.isDesignMode,\n isPreviewMode: base.isPreviewMode,\n isRevisionPreview: base.isRevisionPreview,\n sectionType: base.sectionType,\n publicEnv: base.publicEnv,\n }\n }\n\n resolveProjectId = async (): Promise<string> => {\n if (this._resolvedProjectId !== undefined) {\n return this._resolvedProjectId\n }\n\n // Priority: query param → function → string → env (matches Hydrogen).\n let resolved = this._baseConfigs.queryProjectId\n if (!resolved && typeof this._projectIdInput === 'function') {\n try {\n let value = await this._projectIdInput(this.requestContext)\n if (typeof value === 'string' && value.trim()) {\n resolved = value.trim()\n }\n } catch (error) {\n console.warn(\n '[WeaverseNextServerClient] projectId resolver threw, falling back.',\n error\n )\n }\n }\n if (!resolved && typeof this._projectIdInput === 'string') {\n resolved = this._projectIdInput.trim()\n }\n if (!resolved) {\n resolved = this._baseConfigs.envProjectId\n }\n\n this._resolvedProjectId = resolved\n this.configs = this._buildPublicConfigs(resolved)\n return resolved\n }\n\n fetchWithCache = async <T = unknown>(\n url: string,\n options: WeaverseNextFetchOptions = {}\n ): Promise<T> => {\n let { revalidate, tags, ...init } = options\n let requestInit: NextRequestInit = { ...init }\n\n let { isDesignMode, isRevisionPreview } = this._baseConfigs\n if (isDesignMode || isRevisionPreview) {\n // Design / revision data must never be served stale.\n requestInit.cache = 'no-store'\n } else if (requestInit.cache === undefined) {\n let effectiveRevalidate = revalidate ?? this._cache?.revalidate\n let effectiveTags = tags ?? this._cache?.tags\n if (effectiveRevalidate !== undefined || effectiveTags?.length) {\n requestInit.next = {\n ...(effectiveRevalidate === undefined\n ? {}\n : { revalidate: effectiveRevalidate }),\n ...(effectiveTags?.length ? { tags: effectiveTags } : {}),\n }\n }\n }\n\n let controller = new AbortController()\n let timeoutId = setTimeout(() => controller.abort(), this._fetchTimeoutMs)\n try {\n let response = await this._fetch(url, {\n ...requestInit,\n signal: requestInit.signal ?? controller.signal,\n })\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n return (await response.json()) as T\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n private _buildCustomPagesUrl(\n projectId: string,\n options: WeaverseNextFetchCustomPagesOptions,\n cursor: string | null\n ) {\n let params = new URLSearchParams()\n if (options.locale) {\n params.set('locale', options.locale)\n }\n if (options.limit) {\n params.set('limit', String(options.limit))\n }\n if (cursor) {\n params.set('cursor', cursor)\n }\n let qs = params.toString()\n return `${this._baseConfigs.weaverseApiBase}/api/public/v1/projects/${projectId}/custom-pages${\n qs ? `?${qs}` : ''\n }`\n }\n\n /**\n * Fetch all published custom pages for sitemap generation. Mirrors Hydrogen's\n * helper but uses Next's fetch cache knobs (`revalidate` / `tags`). It returns\n * accumulated results on partial pagination failure so a single API hiccup\n * does not break sitemap generation entirely.\n */\n fetchCustomPages = async (\n options: WeaverseNextFetchCustomPagesOptions = {}\n ): Promise<WeaverseNextCustomPageEntry[]> => {\n let projectId = await this.resolveProjectId()\n let entries: WeaverseNextCustomPageEntry[] = []\n if (!projectId) {\n console.warn(\n '[WeaverseNext] Failed to fetch custom pages: missing projectId'\n )\n return entries\n }\n\n let cursor: string | null = null\n for (let page = 0; page < MAX_CUSTOM_PAGE_PAGES; page += 1) {\n let url = this._buildCustomPagesUrl(projectId, options, cursor)\n\n try {\n let result = await this.fetchWithCache<{\n data?: WeaverseNextCustomPageEntry[]\n nextCursor?: string | null\n }>(url, {\n revalidate: options.revalidate,\n tags: options.tags,\n })\n entries.push(...(result.data ?? []))\n if (!result.nextCursor) {\n return entries\n }\n cursor = result.nextCursor\n } catch (error) {\n let message = error instanceof Error ? error.message : String(error)\n console.warn(\n entries.length === 0\n ? `[WeaverseNext] Failed to fetch custom pages: ${message}`\n : `[WeaverseNext] Custom pages pagination interrupted: ${message}`\n )\n return entries\n }\n }\n\n console.warn('[WeaverseNext] Custom pages pagination cap reached')\n return entries\n }\n\n private _generateFallbackPage(message: string): WeaverseNextPageData {\n let rootId = generateUuid()\n return {\n id: `fallback_page_${rootId}`,\n rootId,\n name: 'Default Page',\n items: [\n {\n type: 'main',\n id: rootId,\n data: { dangerouslySetInnerHTML: { __html: message } },\n },\n ],\n }\n }\n\n /**\n * Recursively materialize a section preset (and its preset children) into a\n * flat list of page items, returning the new item id. Ported from Hydrogen's\n * `recursivelyAddDataItem`. Returns `undefined` when the type isn't registered.\n */\n private _buildPreviewItems(\n type: string,\n items: WeaverseNextComponentData[],\n initData: Record<string, unknown> = {}\n ): string | undefined {\n let component = this.components.find((c) => c.schema?.type === type)\n if (!component) {\n return\n }\n let { children, ...data } = (component.schema?.presets ?? {}) as {\n children?: { type: string; [key: string]: unknown }[]\n [key: string]: unknown\n }\n let childIds: { id: string }[] = []\n if (children) {\n for (let child of children) {\n let { type: childType, children: _children, ...childData } = child\n let childId = this._buildPreviewItems(childType, items, childData)\n if (childId) {\n childIds.push({ id: childId })\n }\n }\n }\n let id = generateUuid()\n items.push({ id, type, data: { ...data, ...initData }, children: childIds })\n return id\n }\n\n /**\n * Synthetic loader data for Studio \"section preview\" mode. Mirrors Hydrogen's\n * `getPreviewData`: it builds a single-section page from the requested\n * `sectionType`'s presets without hitting `/api/public/project`, so preview\n * works even without a resolved `projectId`.\n */\n private _generatePreviewData(projectId: string): WeaverseNextLoaderData {\n let { sectionType, weaverseHost } = this._baseConfigs\n let items: WeaverseNextComponentData[] = []\n let sectionId = sectionType\n ? this._buildPreviewItems(sectionType, items)\n : undefined\n\n let configs = {\n ...this._buildPublicConfigs(projectId),\n isPreviewMode: true,\n weaverseHost,\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n }\n\n return {\n project: {\n id: projectId,\n weaverseShopId: 'shop-id',\n name: 'Section Preview',\n },\n configs,\n page: {\n id: 'weaverse-preview-page',\n name: 'Preview section',\n rootId: '1',\n items: [\n {\n id: '1',\n type: 'main',\n data: {},\n children: sectionId ? [{ id: sectionId }] : [],\n },\n ...items,\n ],\n },\n }\n }\n\n private _getLoadPageInput(input: WeaverseNextLoadPageInput) {\n let {\n cache,\n projectId: routeProjectId,\n ...rest\n } = input as WeaverseNextServerLoadPageInput\n let params: Record<string, unknown> = {}\n for (let [key, value] of Object.entries(rest)) {\n if (value !== undefined) {\n params[key] = value\n }\n }\n return { cache, params, routeProjectId }\n }\n\n private async _resolveLoadPageProjectId(routeProjectId?: string) {\n let effectiveProjectId =\n (typeof routeProjectId === 'string' && routeProjectId.trim()) ||\n (await this.resolveProjectId())\n if (effectiveProjectId) {\n this.configs = this._buildPublicConfigs(effectiveProjectId)\n }\n return effectiveProjectId\n }\n\n private _fetchPagePayload(\n projectId: string,\n params: Record<string, unknown>,\n cache?: WeaverseNextCacheConfig\n ) {\n let i18n = this.requestContext?.i18n ?? this.commerce?.storefront?.i18n\n let url = normalizeNextPageUrl(resolveRequestUrl(this.requestContext))\n let apiUrl = `${this._baseConfigs.weaverseApiBase}/api/public/project`\n let userAgent = this.requestContext?.headers?.get('user-agent') ?? ''\n return this.fetchWithCache<Record<string, unknown>>(apiUrl, {\n method: 'POST',\n body: JSON.stringify({\n projectId,\n url,\n i18n,\n params,\n isDesignMode: this._baseConfigs.isDesignMode,\n }),\n headers: { ...JSON_HEADERS, 'X-Visitor-UA': userAgent },\n ...(cache ?? {}),\n })\n }\n\n private _assertNoPageError(payload: Record<string, unknown>) {\n if ('error' in payload && typeof payload.error === 'string') {\n throw new Error(payload.error)\n }\n }\n\n private _createLoaderData(\n payload: Record<string, unknown>,\n projectId: string\n ): WeaverseNextLoaderData {\n this._assertNoPageError(payload)\n let page = payload.page as WeaverseNextPageData | undefined\n let project = payload.project as WeaverseNextLoaderData['project']\n let pageAssignment = payload.pageAssignment as\n | WeaverseNextLoaderData['pageAssignment']\n | undefined\n\n page ??= this._generateFallbackPage(\n '<div style=\"text-align: center;\">Please add new section to start.</div>'\n )\n project ??= {\n id: projectId,\n name: 'Weaverse project not found.',\n weaverseShopId: '',\n }\n if (Array.isArray(page.items) && page.items.length === 0) {\n page.items.push({\n type: 'main',\n id: page.rootId || generateUuid(),\n data: {},\n })\n }\n\n return {\n page,\n project,\n pageAssignment,\n configs: {\n ...this._buildPublicConfigs(projectId),\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n },\n }\n }\n\n private async _runLoaders(data: WeaverseNextLoaderData) {\n this.data = data\n let withLoaders = await runWeaverseComponentLoaders({ client: this, data })\n this.data = withLoaders ?? data\n return this.data\n }\n\n loadPage = async (\n input: WeaverseNextLoadPageInput = {}\n ): Promise<WeaverseNextLoaderData | null> => {\n try {\n let { cache, params, routeProjectId } = this._getLoadPageInput(input)\n let projectId = await this._resolveLoadPageProjectId(routeProjectId)\n if (this._baseConfigs.isPreviewMode) {\n let previewData = this._generatePreviewData(projectId || 'x')\n this.data = previewData\n return previewData\n }\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let payload = await this._fetchPagePayload(projectId, params, cache)\n let data = this._createLoaderData(payload, projectId)\n return await this._runLoaders(data)\n } catch (error) {\n console.error('❌ Page load failed', {\n url: this.requestContext?.url,\n projectId: input.projectId || this.configs.projectId,\n message: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n }\n\n loadThemeSettings = async (\n // Broad param keeps this assignable to `WeaverseNextClient.loadThemeSettings`;\n // only the cache fields below are honored — no request-context override.\n optionsInput:\n | WeaverseNextThemeSettingsOptions\n | WeaverseNextRequestContext = {}\n ): Promise<WeaverseNextThemeSettingsResponse> => {\n let options = optionsInput as WeaverseNextThemeSettingsOptions\n let themeSchema = asThemeSchema(this.themeSchema)\n let defaultThemeSettings = generateDataFromSchema(\n this.themeSchema as SchemaType | undefined\n )\n let staticContent = themeSchema?.i18n?.staticContent\n\n try {\n let projectId = await this.resolveProjectId()\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let { isDesignMode } = this._baseConfigs\n let url = `${this._baseConfigs.weaverseApiBase}/api/public/project_configs`\n let result = await this.fetchWithCache<WeaverseNextThemeSettingsResponse>(\n url,\n {\n method: 'POST',\n body: JSON.stringify({ projectId, isDesignMode }),\n headers: JSON_HEADERS,\n revalidate: options.revalidate,\n tags: options.tags,\n }\n )\n\n if (typeof result !== 'object' || result === null) {\n result = { theme: defaultThemeSettings }\n }\n\n if (themeSchema?.settings || themeSchema?.inspector) {\n if (!result.theme || typeof result.theme !== 'object') {\n result.theme = defaultThemeSettings\n } else {\n result.theme = { ...defaultThemeSettings, ...result.theme }\n }\n }\n\n if (staticContent) {\n result.staticContent = staticContent\n }\n\n if (isDesignMode) {\n result = {\n ...result,\n schema: themeSchema\n ? {\n ...themeSchema,\n settings: themeSchema.settings?.map((group) => ({\n ...group,\n inputs: group?.inputs?.map((inputItem) =>\n typeof inputItem?.condition === 'function'\n ? {\n ...inputItem,\n condition: inputItem.condition.toString(),\n }\n : inputItem\n ),\n })),\n }\n : undefined,\n publicEnv: this._baseConfigs.publicEnv,\n }\n }\n\n return result\n } catch (error) {\n let errorDetails = error instanceof Error ? error.message : String(error)\n console.error('Unable to load theme settings', errorDetails)\n return {\n theme: defaultThemeSettings,\n staticContent,\n _error: errorDetails,\n _loadFailed: true,\n }\n }\n }\n}\n\n/**\n * Create a server-side {@link WeaverseNextServerClient} for Next.js App Router\n * routes / server components.\n *\n * @example\n * ```ts\n * let weaverse = createWeaverseNextServerClient({\n * projectId: process.env.WEAVERSE_PROJECT_ID,\n * components,\n * commerce: { storefront },\n * requestContext: { url, headers, searchParams, i18n },\n * cache: { revalidate: 60, tags: ['weaverse'] },\n * })\n * let data = await weaverse.loadPage({ type: 'INDEX' })\n * let theme = await weaverse.loadThemeSettings()\n * ```\n */\nexport function createWeaverseNextServerClient(\n config: WeaverseNextServerClientConfig\n): WeaverseNextServerClient {\n return new NextServerClient(config)\n}\n\nexport { getContextSearchParams } from './configs'\n"]}
1
+ {"version":3,"sources":["../src/server/configs.ts","../src/server/normalize-page-url.ts","../src/server/revalidate-handler.ts","../src/server/server-client.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["import type {\n WeaverseNextBaseConfigs,\n WeaverseNextRequestContext,\n} from '../types'\n\nconst DEFAULT_WEAVERSE_HOST = 'https://studio.weaverse.io'\nconst DEFAULT_WEAVERSE_API_BASE = 'https://api.weaverse.io'\n\n/**\n * Weaverse-controlled apex domains the Studio bridge / data API may be served\n * from (matched on the host itself and any subdomain). Kept in sync with\n * Hydrogen's `isTrustedStudioHost`.\n */\nconst TRUSTED_STUDIO_DOMAINS = ['weaverse.io', 'weaverse.dev']\n\n/**\n * Whether `host` is an origin we trust to resolve page/theme data. The\n * `weaverseHost` query param is attacker-controllable, so a crafted\n * `?weaverseHost=` must be rejected before it can point server-side fetches at\n * an arbitrary origin (SSRF). Only `weaverse.io`/`weaverse.dev` and subdomains\n * over https are trusted.\n */\nfunction isTrustedStudioHost(host: string): boolean {\n let parsed: URL\n try {\n parsed = new URL(host)\n } catch {\n return false\n }\n if (parsed.protocol !== 'https:') {\n return false\n }\n let { hostname } = parsed\n return TRUSTED_STUDIO_DOMAINS.some(\n (domain) => hostname === domain || hostname.endsWith(`.${domain}`)\n )\n}\n\nfunction toUrl(value: string | URL): URL | null {\n try {\n return typeof value === 'string'\n ? new URL(value, 'http://localhost')\n : value\n } catch {\n return null\n }\n}\n\n/**\n * Extract the request search params from the explicit Next request context.\n * Prefers `searchParams`, falls back to parsing `url`.\n */\nexport function getContextSearchParams(\n context?: WeaverseNextRequestContext\n): URLSearchParams {\n if (context?.searchParams) {\n return new URLSearchParams(context.searchParams)\n }\n if (context?.url) {\n let url = toUrl(context.url)\n if (url) {\n return new URLSearchParams(url.searchParams)\n }\n }\n return new URLSearchParams()\n}\n\n/**\n * Last value of a (possibly duplicated) query key. Matches Hydrogen's\n * `getRequestQueries`, which assigns while iterating and so keeps the last\n * occurrence — Studio appends its own control params, so a stale earlier value\n * must not win.\n */\nfunction lastParam(\n searchParams: URLSearchParams,\n key: string\n): string | undefined {\n let values = searchParams.getAll(key)\n return values.length ? values.at(-1) : undefined\n}\n\nfunction coerceBool(value: string | undefined): boolean {\n return value === 'true'\n}\n\nfunction readEnv(\n env: Record<string, string | undefined> | undefined,\n key: string\n): string | undefined {\n let fromConfig = env?.[key]\n if (fromConfig !== undefined) {\n return fromConfig\n }\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key]\n }\n return\n}\n\nexport interface ResolveConfigsOptions {\n env?: Record<string, string | undefined>\n weaverseApiBase?: string\n weaverseHost?: string\n weaverseVersion?: string\n}\n\n/**\n * Derive Weaverse configs from the request context and env, close to Hydrogen's\n * `getWeaverseConfigs`. Resolves the trusted host, public API base, design /\n * preview / revision flags, and public env — but never resolves the final\n * `projectId` (that priority chain, which may call an async resolver, lives in\n * the server client). Query/env projectId candidates are returned for the\n * client to combine with function/string inputs.\n */\nexport function getWeaverseNextConfigs(\n context?: WeaverseNextRequestContext,\n options: ResolveConfigsOptions = {}\n): WeaverseNextBaseConfigs {\n let searchParams = getContextSearchParams(context)\n let { env } = options\n\n let queryHost = lastParam(searchParams, 'weaverseHost')\n // A trusted query host is canonicalized to its origin before use, so a crafted\n // `?weaverseHost=https://studio.weaverse.io/evil?x=1` can only ever resolve to\n // `https://studio.weaverse.io` — never carrying an attacker path/query into the\n // server-side API base.\n let trustedUrlHost =\n queryHost && isTrustedStudioHost(queryHost) ? new URL(queryHost).origin : ''\n\n let configuredHost =\n options.weaverseHost || readEnv(env, 'WEAVERSE_HOST') || ''\n let weaverseHost = trustedUrlHost || configuredHost || DEFAULT_WEAVERSE_HOST\n\n // Public data reads default to the edge proxy, but an explicit custom host\n // (staging/self-hosted Weaverse) must stay the API base so those deployments\n // don't fetch page/config data from the production proxy.\n let weaverseApiBase =\n trustedUrlHost ||\n options.weaverseApiBase ||\n readEnv(env, 'WEAVERSE_PUBLIC_API_BASE') ||\n (configuredHost && configuredHost !== DEFAULT_WEAVERSE_HOST\n ? configuredHost\n : DEFAULT_WEAVERSE_API_BASE)\n\n let isRevisionPreview =\n context?.isRevisionPreview ?? searchParams.has('__revisionId')\n let isDesignMode =\n context?.isDesignMode ?? coerceBool(lastParam(searchParams, 'isDesignMode'))\n let isPreviewMode =\n context?.isPreviewMode ??\n coerceBool(lastParam(searchParams, 'isPreviewMode'))\n\n return {\n queryProjectId: lastParam(searchParams, 'weaverseProjectId') || '',\n envProjectId: readEnv(env, 'WEAVERSE_PROJECT_ID') || '',\n weaverseHost,\n weaverseApiBase,\n weaverseApiKey:\n lastParam(searchParams, 'weaverseApiKey') ||\n readEnv(env, 'WEAVERSE_API_KEY') ||\n '',\n weaverseVersion:\n lastParam(searchParams, 'weaverseVersion') ||\n options.weaverseVersion ||\n '',\n isDesignMode,\n isPreviewMode,\n isRevisionPreview,\n sectionType:\n context?.sectionType || lastParam(searchParams, 'sectionType') || '',\n publicEnv: {\n PUBLIC_STORE_DOMAIN: readEnv(env, 'PUBLIC_STORE_DOMAIN') || '',\n PUBLIC_STOREFRONT_API_TOKEN:\n readEnv(env, 'PUBLIC_STOREFRONT_API_TOKEN') || '',\n },\n }\n}\n","import type { WeaverseNextRequestContext } from '../types'\n\n// Query params that influence Weaverse page resolution on the Builder:\n// revision previews, design-mode flags, design-mode draft item overrides,\n// and `weaverse*` control params (host, version, project id). Everything\n// else — utm_*, fbclid, gclid, storefront filters — is irrelevant to which\n// page the Builder returns and would otherwise fragment any fetch cache keyed\n// on the request body. `weaverseDraftItem` is the current draft item param;\n// `__weaverseDraftItem` is kept as a legacy compatibility alias.\nconst KEPT_PARAM_RE =\n /^(?:__revisionId|__weaverseDraftItem|isDesignMode|weaverse)/\nconst DATA_SUFFIX = '.data'\n\n/**\n * Normalize the storefront URL sent in the Builder page API request body.\n *\n * The Builder reads only the pathname (locale/type/handle fallback) and the\n * Weaverse/Studio control params from this URL, so keep exactly those and drop\n * tracking params. Params are sorted for a stable, cache-friendly string.\n *\n * Ported from `@weaverse/hydrogen`'s `normalizePageUrl`, but tolerant of a\n * relative URL (Next route handlers may only know the pathname).\n */\nexport function normalizeNextPageUrl(url: string): string {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n try {\n parsed = new URL(url, 'http://localhost')\n } catch {\n return url\n }\n }\n\n let kept = [...parsed.searchParams].filter(([key]) => KEPT_PARAM_RE.test(key))\n kept.sort(([a], [b]) => a.localeCompare(b))\n let search = new URLSearchParams(kept).toString()\n\n let { pathname } = parsed\n if (pathname.endsWith(DATA_SUFFIX)) {\n pathname = pathname.slice(0, -DATA_SUFFIX.length)\n }\n return `${parsed.origin}${pathname}${search ? `?${search}` : ''}`\n}\n\n/**\n * Build an absolute-ish request URL string from the explicit request context,\n * preferring `url`, then `pathname` + `searchParams`. Used as the input to\n * {@link normalizeNextPageUrl}.\n */\nexport function resolveRequestUrl(\n context?: WeaverseNextRequestContext\n): string {\n if (context?.url) {\n return typeof context.url === 'string'\n ? context.url\n : context.url.toString()\n }\n let pathname = context?.pathname || '/'\n let search = context?.searchParams\n ? new URLSearchParams(context.searchParams).toString()\n : ''\n return `http://localhost${pathname}${search ? `?${search}` : ''}`\n}\n","import type {\n WeaverseNextComponentData,\n WeaverseNextServerClient,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\n\nconst NO_STORE_HEADERS = {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-store',\n} as const\n\nconst STATUS_OK = 200\nconst STATUS_BAD_REQUEST = 400\nconst STATUS_NOT_FOUND = 404\nconst STATUS_UNPROCESSABLE = 422\nconst STATUS_SERVER_ERROR = 500\n\nexport interface WeaverseNextRevalidateHandlerConfig {\n /**\n * Reuse the app's server-client factory so the loader runs with the same\n * component registry and commerce (storefront) context as page loads.\n */\n getClient: (\n request: Request\n ) => Promise<WeaverseNextServerClient> | WeaverseNextServerClient\n}\n\n/** POST body accepted by the revalidate route. */\nexport interface WeaverseNextRevalidateRequestBody {\n draftItem: WeaverseNextComponentData\n}\n\nfunction json(body: Record<string, unknown>, status: number) {\n return new Response(JSON.stringify(body), {\n status,\n headers: NO_STORE_HEADERS,\n })\n}\n\nfunction parseDraftItem(payload: unknown): WeaverseNextComponentData | null {\n if (typeof payload !== 'object' || payload === null) {\n return null\n }\n let draftItem = (payload as { draftItem?: unknown }).draftItem\n if (typeof draftItem !== 'object' || draftItem === null) {\n return null\n }\n let { id, type } = draftItem as { id?: unknown; type?: unknown }\n if (typeof id !== 'string' || !id || typeof type !== 'string' || !type) {\n return null\n }\n return draftItem as WeaverseNextComponentData\n}\n\n/**\n * Create the Studio per-item revalidation route handler.\n *\n * Studio design-mode edits to loader-backed inputs (e.g. resource pickers) need\n * fresh server loader data for a single item. Re-running it through\n * `router.refresh()` re-applies the whole RSC tree — and the draft-item query\n * rewrite changes the App Router page segment key, remounting the page and\n * resetting scroll. This handler runs just the edited component's `loader`\n * with the unsaved draft settings and returns the payload for an in-place\n * client update (see the `2026-07-02--next-item-revalidation` spec).\n *\n * Security: only registered component types are executable, the handler never\n * persists anything, and responses are `no-store`. Exposure is equivalent to\n * the existing `weaverseDraftItem` URL param, which already lets any visitor\n * run design-mode loaders with arbitrary draft settings.\n *\n * @example\n * ```ts\n * // app/api/weaverse/revalidate/route.ts\n * export const { POST } = createWeaverseNextRevalidateHandler({\n * getClient: () => getWeaverseServerClient(Promise.resolve({})),\n * })\n * ```\n */\nexport function createWeaverseNextRevalidateHandler(\n config: WeaverseNextRevalidateHandlerConfig\n): { POST: (request: Request) => Promise<Response> } {\n return {\n POST: async (request: Request) => {\n let payload: unknown\n try {\n payload = await request.json()\n } catch {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let draftItem = parseDraftItem(payload)\n if (!draftItem) {\n return json({ error: 'invalid-payload' }, STATUS_BAD_REQUEST)\n }\n\n let client: WeaverseNextServerClient\n try {\n client = await config.getClient(request)\n } catch (error) {\n console.error('❌ Revalidate handler getClient failed.', error)\n return json({ error: 'client-init-failed' }, STATUS_SERVER_ERROR)\n }\n\n let component = client.components.find(\n (candidate) => candidate?.schema?.type === draftItem.type\n )\n if (!component) {\n return json({ error: 'unknown-component-type' }, STATUS_NOT_FOUND)\n }\n if (typeof component.loader !== 'function') {\n return json({ error: 'missing-loader' }, STATUS_UNPROCESSABLE)\n }\n\n try {\n // Same args shape as `runWeaverseComponentLoaders`, so component\n // loaders behave identically between page load and revalidation.\n let loaderData = await component.loader({\n data: {\n ...generateDataFromSchema(component.schema),\n ...draftItem.data,\n },\n weaverse: client,\n context: client.requestContext,\n commerce: client.commerce,\n })\n return json({ loaderData: loaderData ?? null }, STATUS_OK)\n } catch (error) {\n console.error(\n '❌ Item loader revalidation failed.',\n draftItem.type,\n draftItem.id,\n error\n )\n return json({ error: 'loader-failed' }, STATUS_SERVER_ERROR)\n }\n },\n }\n}\n","import type { SchemaType } from '@weaverse/schema'\nimport { runWeaverseComponentLoaders } from '../loader'\nimport { buildWeaverseNextRequestInfo } from '../request-info'\nimport type {\n WeaverseNextBaseConfigs,\n WeaverseNextCacheConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextConfigs,\n WeaverseNextCustomPageEntry,\n WeaverseNextFetchCustomPagesOptions,\n WeaverseNextFetchOptions,\n WeaverseNextLoaderData,\n WeaverseNextLoadPageInput,\n WeaverseNextPageAssignment,\n WeaverseNextPageData,\n WeaverseNextProjectId,\n WeaverseNextRequestContext,\n WeaverseNextServerClient,\n WeaverseNextServerClientConfig,\n WeaverseNextServerLoadPageInput,\n WeaverseNextStorefront,\n WeaverseNextThemeSettingsOptions,\n WeaverseNextThemeSettingsResponse,\n} from '../types'\nimport { generateDataFromSchema } from '../utils'\nimport { getWeaverseNextConfigs } from './configs'\nimport { normalizeNextPageUrl, resolveRequestUrl } from './normalize-page-url'\n\nconst DEFAULT_FETCH_TIMEOUT_MS = 10_000\nconst RANDOM_ID_RADIX = 36\nconst RANDOM_ID_SLICE_START = 2\nconst MAX_CUSTOM_PAGE_PAGES = 100\n\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'Accept-Encoding': 'gzip, deflate, br',\n} as const\n\n/** Next's `fetch` reads `next: { revalidate, tags }` off the request init. */\ntype NextRequestInit = RequestInit & {\n next?: { revalidate?: number | false; tags?: string[] }\n}\n\ninterface LooseThemeSchema {\n i18n?: { staticContent?: Record<string, unknown> }\n inspector?: unknown[]\n settings?: {\n inputs?: { condition?: unknown }[]\n [key: string]: unknown\n }[]\n}\n\nfunction asThemeSchema(schema: unknown): LooseThemeSchema | undefined {\n return schema && typeof schema === 'object'\n ? (schema as LooseThemeSchema)\n : undefined\n}\n\nfunction generateUuid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\n return crypto.randomUUID()\n }\n return `id-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`\n}\n\n/**\n * Normalize the raw `pageAssignment` from `/api/public/project` into a\n * save-compatible {@link WeaverseNextPageAssignment} so the Builder Studio save\n * pipeline receives the same shape it gets from Hydrogen. Returns `undefined`\n * for a missing or malformed assignment (rather than fabricating one), requires\n * string `projectId`/`type`/`handle`, coerces a nullish `locale` to `''`, and\n * preserves an object `meta` untouched.\n */\nfunction normalizeWeaverseNextPageAssignment(\n input: unknown\n): WeaverseNextPageAssignment | undefined {\n if (!input || typeof input !== 'object') {\n return\n }\n let { projectId, type, handle, locale, meta } = input as Record<\n string,\n unknown\n >\n if (\n typeof projectId !== 'string' ||\n typeof type !== 'string' ||\n typeof handle !== 'string'\n ) {\n return\n }\n let normalized: WeaverseNextPageAssignment = {\n projectId,\n type,\n handle,\n locale: typeof locale === 'string' ? locale : '',\n }\n if (meta && typeof meta === 'object') {\n normalized.meta = meta as WeaverseNextPageAssignment['meta']\n }\n return normalized\n}\n\n/**\n * Server-side Weaverse client for Next.js. Performs the real Weaverse public\n * API fetch (page + theme settings) instead of delegating to injected fetchers,\n * closing the gap with Hydrogen's `context.weaverse.loadPage(...)`.\n */\nclass NextServerClient implements WeaverseNextServerClient {\n components: WeaverseNextComponent[]\n commerce?: WeaverseNextCommerceContext\n requestContext?: WeaverseNextRequestContext\n themeSchema?: unknown\n themeSettings: Record<string, unknown>\n data: WeaverseNextLoaderData | null = null\n dataContext: Record<string, unknown> = {}\n configs: WeaverseNextConfigs\n\n private readonly _projectIdInput?: WeaverseNextProjectId\n private readonly _baseConfigs: WeaverseNextBaseConfigs\n private readonly _fetch: typeof fetch\n private readonly _cache?: WeaverseNextServerClientConfig['cache']\n private readonly _fetchTimeoutMs: number\n private _resolvedProjectId?: string\n\n constructor(config: WeaverseNextServerClientConfig) {\n // Server client keeps the component definitions for server-side loaders\n // (`runWeaverseComponentLoaders`) and preview-data generation, but it\n // intentionally does NOT call `registerWeaverseNextComponents`. Registering\n // pulls in `../registry` → `@weaverse/react`, which evaluates\n // `React.createContext()` at module load — invalid in the RSC/server graph\n // and the cause of `(0 , x.createContext) is not a function`. The client\n // wrapper/renderer (root `@weaverse/next` client entry) registers the real\n // render components instead, keeping `@weaverse/next/server` React-free.\n this.components = config.components\n this.commerce = config.commerce\n this.requestContext = config.requestContext\n this.themeSchema = config.themeSchema\n // Seed schema defaults before merchant overrides, mirroring the root client.\n this.themeSettings = {\n ...generateDataFromSchema(config.themeSchema as SchemaType | undefined),\n ...config.themeSettings,\n }\n this._projectIdInput = config.projectId\n this._fetch = config.fetch ?? globalThis.fetch\n this._cache = config.cache\n this._fetchTimeoutMs = config.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS\n\n this._baseConfigs = getWeaverseNextConfigs(config.requestContext, {\n env: config.env,\n weaverseHost: config.weaverseHost,\n weaverseApiBase: config.weaverseApiBase,\n weaverseVersion: config.weaverseVersion,\n })\n\n // Synchronous best-effort projectId (query → string → env). A function\n // resolver is awaited lazily in `resolveProjectId`, so `projectId` reflects\n // its result after the first `loadPage`/`loadThemeSettings`/`resolveProjectId`.\n this.configs = this._buildPublicConfigs(\n this._baseConfigs.queryProjectId ||\n (typeof this._projectIdInput === 'string'\n ? this._projectIdInput.trim()\n : '') ||\n this._baseConfigs.envProjectId\n )\n }\n\n get projectId(): string {\n return this.configs.projectId\n }\n\n /** Compatibility alias so loaders can call `weaverse.storefront.query(...)`. */\n get storefront(): WeaverseNextStorefront | undefined {\n return this.commerce?.storefront\n }\n\n private _buildPublicConfigs(projectId: string): WeaverseNextConfigs {\n let base = this._baseConfigs\n return {\n projectId,\n weaverseHost: base.weaverseHost,\n weaverseApiBase: base.weaverseApiBase,\n weaversePublicApiBase: base.weaverseApiBase,\n weaverseVersion: base.weaverseVersion,\n isDesignMode: base.isDesignMode,\n isPreviewMode: base.isPreviewMode,\n isRevisionPreview: base.isRevisionPreview,\n sectionType: base.sectionType,\n publicEnv: base.publicEnv,\n }\n }\n\n resolveProjectId = async (): Promise<string> => {\n if (this._resolvedProjectId !== undefined) {\n return this._resolvedProjectId\n }\n\n // Priority: query param → function → string → env (matches Hydrogen).\n let resolved = this._baseConfigs.queryProjectId\n if (!resolved && typeof this._projectIdInput === 'function') {\n try {\n let value = await this._projectIdInput(this.requestContext)\n if (typeof value === 'string' && value.trim()) {\n resolved = value.trim()\n }\n } catch (error) {\n console.warn(\n '[WeaverseNextServerClient] projectId resolver threw, falling back.',\n error\n )\n }\n }\n if (!resolved && typeof this._projectIdInput === 'string') {\n resolved = this._projectIdInput.trim()\n }\n if (!resolved) {\n resolved = this._baseConfigs.envProjectId\n }\n\n this._resolvedProjectId = resolved\n this.configs = this._buildPublicConfigs(resolved)\n return resolved\n }\n\n fetchWithCache = async <T = unknown>(\n url: string,\n options: WeaverseNextFetchOptions = {}\n ): Promise<T> => {\n let { revalidate, tags, ...init } = options\n let requestInit: NextRequestInit = { ...init }\n\n let { isDesignMode, isRevisionPreview } = this._baseConfigs\n if (isDesignMode || isRevisionPreview) {\n // Design / revision data must never be served stale.\n requestInit.cache = 'no-store'\n } else if (requestInit.cache === undefined) {\n let effectiveRevalidate = revalidate ?? this._cache?.revalidate\n let effectiveTags = tags ?? this._cache?.tags\n if (effectiveRevalidate !== undefined || effectiveTags?.length) {\n requestInit.next = {\n ...(effectiveRevalidate === undefined\n ? {}\n : { revalidate: effectiveRevalidate }),\n ...(effectiveTags?.length ? { tags: effectiveTags } : {}),\n }\n }\n }\n\n let controller = new AbortController()\n let timeoutId = setTimeout(() => controller.abort(), this._fetchTimeoutMs)\n try {\n let response = await this._fetch(url, {\n ...requestInit,\n signal: requestInit.signal ?? controller.signal,\n })\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n return (await response.json()) as T\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n private _buildCustomPagesUrl(\n projectId: string,\n options: WeaverseNextFetchCustomPagesOptions,\n cursor: string | null\n ) {\n let params = new URLSearchParams()\n if (options.locale) {\n params.set('locale', options.locale)\n }\n if (options.limit) {\n params.set('limit', String(options.limit))\n }\n if (cursor) {\n params.set('cursor', cursor)\n }\n let qs = params.toString()\n return `${this._baseConfigs.weaverseApiBase}/api/public/v1/projects/${projectId}/custom-pages${\n qs ? `?${qs}` : ''\n }`\n }\n\n /**\n * Fetch all published custom pages for sitemap generation. Mirrors Hydrogen's\n * helper but uses Next's fetch cache knobs (`revalidate` / `tags`). It returns\n * accumulated results on partial pagination failure so a single API hiccup\n * does not break sitemap generation entirely.\n */\n fetchCustomPages = async (\n options: WeaverseNextFetchCustomPagesOptions = {}\n ): Promise<WeaverseNextCustomPageEntry[]> => {\n let projectId = await this.resolveProjectId()\n let entries: WeaverseNextCustomPageEntry[] = []\n if (!projectId) {\n console.warn(\n '[WeaverseNext] Failed to fetch custom pages: missing projectId'\n )\n return entries\n }\n\n let cursor: string | null = null\n for (let page = 0; page < MAX_CUSTOM_PAGE_PAGES; page += 1) {\n let url = this._buildCustomPagesUrl(projectId, options, cursor)\n\n try {\n let result = await this.fetchWithCache<{\n data?: WeaverseNextCustomPageEntry[]\n nextCursor?: string | null\n }>(url, {\n revalidate: options.revalidate,\n tags: options.tags,\n })\n entries.push(...(result.data ?? []))\n if (!result.nextCursor) {\n return entries\n }\n cursor = result.nextCursor\n } catch (error) {\n let message = error instanceof Error ? error.message : String(error)\n console.warn(\n entries.length === 0\n ? `[WeaverseNext] Failed to fetch custom pages: ${message}`\n : `[WeaverseNext] Custom pages pagination interrupted: ${message}`\n )\n return entries\n }\n }\n\n console.warn('[WeaverseNext] Custom pages pagination cap reached')\n return entries\n }\n\n private _generateFallbackPage(message: string): WeaverseNextPageData {\n let rootId = generateUuid()\n return {\n id: `fallback_page_${rootId}`,\n rootId,\n name: 'Default Page',\n items: [\n {\n type: 'main',\n id: rootId,\n data: { dangerouslySetInnerHTML: { __html: message } },\n },\n ],\n }\n }\n\n /**\n * Recursively materialize a section preset (and its preset children) into a\n * flat list of page items, returning the new item id. Ported from Hydrogen's\n * `recursivelyAddDataItem`. Returns `undefined` when the type isn't registered.\n */\n private _buildPreviewItems(\n type: string,\n items: WeaverseNextComponentData[],\n initData: Record<string, unknown> = {}\n ): string | undefined {\n let component = this.components.find((c) => c.schema?.type === type)\n if (!component) {\n return\n }\n let { children, ...data } = (component.schema?.presets ?? {}) as {\n children?: { type: string; [key: string]: unknown }[]\n [key: string]: unknown\n }\n let childIds: { id: string }[] = []\n if (children) {\n for (let child of children) {\n let { type: childType, children: _children, ...childData } = child\n let childId = this._buildPreviewItems(childType, items, childData)\n if (childId) {\n childIds.push({ id: childId })\n }\n }\n }\n let id = generateUuid()\n items.push({ id, type, data: { ...data, ...initData }, children: childIds })\n return id\n }\n\n /**\n * Synthetic loader data for Studio \"section preview\" mode. Mirrors Hydrogen's\n * `getPreviewData`: it builds a single-section page from the requested\n * `sectionType`'s presets without hitting `/api/public/project`, so preview\n * works even without a resolved `projectId`.\n */\n private _generatePreviewData(projectId: string): WeaverseNextLoaderData {\n let { sectionType, weaverseHost } = this._baseConfigs\n let items: WeaverseNextComponentData[] = []\n let sectionId = sectionType\n ? this._buildPreviewItems(sectionType, items)\n : undefined\n\n let configs = {\n ...this._buildPublicConfigs(projectId),\n isPreviewMode: true,\n weaverseHost,\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n }\n\n return {\n project: {\n id: projectId,\n weaverseShopId: 'shop-id',\n name: 'Section Preview',\n },\n configs,\n page: {\n id: 'weaverse-preview-page',\n name: 'Preview section',\n rootId: '1',\n items: [\n {\n id: '1',\n type: 'main',\n data: {},\n children: sectionId ? [{ id: sectionId }] : [],\n },\n ...items,\n ],\n },\n }\n }\n\n private _getLoadPageInput(input: WeaverseNextLoadPageInput) {\n let {\n cache,\n projectId: routeProjectId,\n ...rest\n } = input as WeaverseNextServerLoadPageInput\n let params: Record<string, unknown> = {}\n for (let [key, value] of Object.entries(rest)) {\n if (value !== undefined) {\n params[key] = value\n }\n }\n return { cache, params, routeProjectId }\n }\n\n private async _resolveLoadPageProjectId(routeProjectId?: string) {\n let effectiveProjectId =\n (typeof routeProjectId === 'string' && routeProjectId.trim()) ||\n (await this.resolveProjectId())\n if (effectiveProjectId) {\n this.configs = this._buildPublicConfigs(effectiveProjectId)\n }\n return effectiveProjectId\n }\n\n private _fetchPagePayload(\n projectId: string,\n params: Record<string, unknown>,\n cache?: WeaverseNextCacheConfig\n ) {\n let i18n = this.requestContext?.i18n ?? this.commerce?.storefront?.i18n\n let url = normalizeNextPageUrl(resolveRequestUrl(this.requestContext))\n let apiUrl = `${this._baseConfigs.weaverseApiBase}/api/public/project`\n let userAgent = this.requestContext?.headers?.get('user-agent') ?? ''\n return this.fetchWithCache<Record<string, unknown>>(apiUrl, {\n method: 'POST',\n body: JSON.stringify({\n projectId,\n url,\n i18n,\n params,\n isDesignMode: this._baseConfigs.isDesignMode,\n }),\n headers: { ...JSON_HEADERS, 'X-Visitor-UA': userAgent },\n ...(cache ?? {}),\n })\n }\n\n private _assertNoPageError(payload: Record<string, unknown>) {\n if ('error' in payload && typeof payload.error === 'string') {\n throw new Error(payload.error)\n }\n }\n\n private _createLoaderData(\n payload: Record<string, unknown>,\n projectId: string\n ): WeaverseNextLoaderData {\n this._assertNoPageError(payload)\n let page = payload.page as WeaverseNextPageData | undefined\n let project = payload.project as WeaverseNextLoaderData['project']\n let pageAssignment = normalizeWeaverseNextPageAssignment(\n payload.pageAssignment\n )\n\n page ??= this._generateFallbackPage(\n '<div style=\"text-align: center;\">Please add new section to start.</div>'\n )\n project ??= {\n id: projectId,\n name: 'Weaverse project not found.',\n weaverseShopId: '',\n }\n if (Array.isArray(page.items) && page.items.length === 0) {\n page.items.push({\n type: 'main',\n id: page.rootId || generateUuid(),\n data: {},\n })\n }\n\n return {\n page,\n project,\n pageAssignment,\n configs: {\n ...this._buildPublicConfigs(projectId),\n requestInfo: buildWeaverseNextRequestInfo(this.requestContext),\n },\n }\n }\n\n private async _runLoaders(data: WeaverseNextLoaderData) {\n this.data = data\n let withLoaders = await runWeaverseComponentLoaders({ client: this, data })\n this.data = withLoaders ?? data\n return this.data\n }\n\n loadPage = async (\n input: WeaverseNextLoadPageInput = {}\n ): Promise<WeaverseNextLoaderData | null> => {\n try {\n let { cache, params, routeProjectId } = this._getLoadPageInput(input)\n let projectId = await this._resolveLoadPageProjectId(routeProjectId)\n if (this._baseConfigs.isPreviewMode) {\n let previewData = this._generatePreviewData(projectId || 'x')\n this.data = previewData\n return previewData\n }\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let payload = await this._fetchPagePayload(projectId, params, cache)\n let data = this._createLoaderData(payload, projectId)\n return await this._runLoaders(data)\n } catch (error) {\n console.error('❌ Page load failed', {\n url: this.requestContext?.url,\n projectId: input.projectId || this.configs.projectId,\n message: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n }\n\n loadThemeSettings = async (\n // Broad param keeps this assignable to `WeaverseNextClient.loadThemeSettings`;\n // only the cache fields below are honored — no request-context override.\n optionsInput:\n | WeaverseNextThemeSettingsOptions\n | WeaverseNextRequestContext = {}\n ): Promise<WeaverseNextThemeSettingsResponse> => {\n let options = optionsInput as WeaverseNextThemeSettingsOptions\n let themeSchema = asThemeSchema(this.themeSchema)\n let defaultThemeSettings = generateDataFromSchema(\n this.themeSchema as SchemaType | undefined\n )\n let staticContent = themeSchema?.i18n?.staticContent\n\n try {\n let projectId = await this.resolveProjectId()\n if (!projectId) {\n throw new Error('Missing Weaverse projectId!')\n }\n\n let { isDesignMode } = this._baseConfigs\n let url = `${this._baseConfigs.weaverseApiBase}/api/public/project_configs`\n let result = await this.fetchWithCache<WeaverseNextThemeSettingsResponse>(\n url,\n {\n method: 'POST',\n body: JSON.stringify({ projectId, isDesignMode }),\n headers: JSON_HEADERS,\n revalidate: options.revalidate,\n tags: options.tags,\n }\n )\n\n if (typeof result !== 'object' || result === null) {\n result = { theme: defaultThemeSettings }\n }\n\n if (themeSchema?.settings || themeSchema?.inspector) {\n if (!result.theme || typeof result.theme !== 'object') {\n result.theme = defaultThemeSettings\n } else {\n result.theme = { ...defaultThemeSettings, ...result.theme }\n }\n }\n\n if (staticContent) {\n result.staticContent = staticContent\n }\n\n if (isDesignMode) {\n result = {\n ...result,\n schema: themeSchema\n ? {\n ...themeSchema,\n settings: themeSchema.settings?.map((group) => ({\n ...group,\n inputs: group?.inputs?.map((inputItem) =>\n typeof inputItem?.condition === 'function'\n ? {\n ...inputItem,\n condition: inputItem.condition.toString(),\n }\n : inputItem\n ),\n })),\n }\n : undefined,\n publicEnv: this._baseConfigs.publicEnv,\n }\n }\n\n return result\n } catch (error) {\n let errorDetails = error instanceof Error ? error.message : String(error)\n console.error('Unable to load theme settings', errorDetails)\n return {\n theme: defaultThemeSettings,\n staticContent,\n _error: errorDetails,\n _loadFailed: true,\n }\n }\n }\n}\n\n/**\n * Create a server-side {@link WeaverseNextServerClient} for Next.js App Router\n * routes / server components.\n *\n * @example\n * ```ts\n * let weaverse = createWeaverseNextServerClient({\n * projectId: process.env.WEAVERSE_PROJECT_ID,\n * components,\n * commerce: { storefront },\n * requestContext: { url, headers, searchParams, i18n },\n * cache: { revalidate: 60, tags: ['weaverse'] },\n * })\n * let data = await weaverse.loadPage({ type: 'INDEX' })\n * let theme = await weaverse.loadThemeSettings()\n * ```\n */\nexport function createWeaverseNextServerClient(\n config: WeaverseNextServerClientConfig\n): WeaverseNextServerClient {\n return new NextServerClient(config)\n}\n\nexport { getContextSearchParams } from './configs'\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@weaverse/next",
3
3
  "author": "Weaverse Team",
4
4
  "description": "Next.js App Router integration for building Weaverse-powered storefronts",
5
- "version": "0.1.0-alpha.6",
5
+ "version": "0.1.0-alpha.7",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
8
8
  "typings": "dist/index.d.ts",