@weaverse/next 0.1.0-alpha.0 → 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +165 -0
- package/dist/chunk-SS6QUKYY.mjs +149 -0
- package/dist/chunk-SS6QUKYY.mjs.map +1 -0
- package/dist/index.d.mts +145 -160
- package/dist/index.d.ts +145 -160
- package/dist/index.js +477 -18
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +407 -108
- package/dist/index.mjs.map +1 -1
- package/dist/server.d.mts +60 -0
- package/dist/server.d.ts +60 -0
- package/dist/server.js +662 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +513 -0
- package/dist/server.mjs.map +1 -0
- package/dist/types-DvEeLX6L.d.mts +321 -0
- package/dist/types-DvEeLX6L.d.ts +321 -0
- package/package.json +22 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/configs.ts","../src/server/normalize-page-url.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, and `weaverse*` control params\n// (host, version, project id). Everything else — utm_*, fbclid, gclid,\n// storefront filters — is irrelevant to which page the Builder returns and\n// would otherwise fragment any fetch cache keyed on the request body.\nconst KEPT_PARAM_RE = /^(?:__revisionId|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'\nimport { runWeaverseComponentLoaders } from '../loader'\nimport { buildWeaverseNextRequestInfo } from '../request-info'\nimport type {\n WeaverseNextBaseConfigs,\n WeaverseNextCacheConfig,\n WeaverseNextCommerceContext,\n WeaverseNextComponent,\n WeaverseNextComponentData,\n WeaverseNextConfigs,\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\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 _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"]}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { WeaverseElement, WeaverseResourcePickerData } from '@weaverse/react';
|
|
2
|
+
import { PageType, SchemaType } from '@weaverse/schema';
|
|
3
|
+
import { ReactNode, ComponentType, ForwardRefExoticComponent } from 'react';
|
|
4
|
+
|
|
5
|
+
interface WeaverseNextRequestInfo {
|
|
6
|
+
i18n?: WeaverseNextI18n;
|
|
7
|
+
pathname: string;
|
|
8
|
+
queries: Record<string, string | boolean>;
|
|
9
|
+
search: string;
|
|
10
|
+
}
|
|
11
|
+
interface WeaverseNextThemeSettingsStore {
|
|
12
|
+
getServerSnapshot: () => Record<string, unknown>;
|
|
13
|
+
getSnapshot: () => Record<string, unknown>;
|
|
14
|
+
publicEnv?: Record<string, string | undefined>;
|
|
15
|
+
schema?: unknown;
|
|
16
|
+
settings: Record<string, unknown>;
|
|
17
|
+
subscribe: (listener: () => void) => () => void;
|
|
18
|
+
updateThemeSettings: (next: Record<string, unknown>) => void;
|
|
19
|
+
}
|
|
20
|
+
interface WeaverseNextRuntimeInternal {
|
|
21
|
+
navigate?: (to: string, options?: {
|
|
22
|
+
preventScrollReset?: boolean;
|
|
23
|
+
} | Record<string, unknown>) => void;
|
|
24
|
+
pageAssignment?: unknown;
|
|
25
|
+
project?: unknown;
|
|
26
|
+
revalidate?: (options?: unknown) => Promise<void> | void;
|
|
27
|
+
themeSettingsStore?: WeaverseNextThemeSettingsStore;
|
|
28
|
+
}
|
|
29
|
+
interface WeaverseNextRuntimeConfig {
|
|
30
|
+
client?: WeaverseNextClient;
|
|
31
|
+
data: WeaverseNextLoaderData;
|
|
32
|
+
dataContext?: Record<string, unknown>;
|
|
33
|
+
navigate?: WeaverseNextRuntimeInternal['navigate'];
|
|
34
|
+
revalidate?: WeaverseNextRuntimeInternal['revalidate'];
|
|
35
|
+
themeSettingsStore?: WeaverseNextThemeSettingsStore;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Locale/market info passed through to component loaders and the Storefront
|
|
39
|
+
* client. Kept structurally close to Hydrogen's `WeaverseI18n` but without the
|
|
40
|
+
* `@shopify/hydrogen` `I18nBase` dependency so the adapter stays framework
|
|
41
|
+
* neutral.
|
|
42
|
+
*/
|
|
43
|
+
interface WeaverseNextI18n {
|
|
44
|
+
country?: string;
|
|
45
|
+
label?: string;
|
|
46
|
+
language?: string;
|
|
47
|
+
locale?: string;
|
|
48
|
+
pathPrefix?: string;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Minimal Storefront client shape required by component loaders. The host app
|
|
53
|
+
* provides this (public or private token mode); Weaverse never owns it.
|
|
54
|
+
*/
|
|
55
|
+
interface WeaverseNextStorefront {
|
|
56
|
+
i18n?: WeaverseNextI18n;
|
|
57
|
+
query: (query: string, options?: unknown) => Promise<unknown>;
|
|
58
|
+
[key: string]: unknown;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* App-provided commerce context. `storefront` is the only v0 must-have; cart
|
|
62
|
+
* and customer-account stay app-owned and are passed through untouched.
|
|
63
|
+
*/
|
|
64
|
+
interface WeaverseNextCommerceContext {
|
|
65
|
+
cart?: unknown;
|
|
66
|
+
customerAccount?: unknown;
|
|
67
|
+
storefront?: WeaverseNextStorefront;
|
|
68
|
+
[key: string]: unknown;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Explicit, framework-neutral replacement for React Router's
|
|
72
|
+
* `LoaderFunctionArgs`. Built by the Next route/page from params + headers +
|
|
73
|
+
* searchParams instead of an implicit loader context.
|
|
74
|
+
*/
|
|
75
|
+
interface WeaverseNextRequestContext {
|
|
76
|
+
handle?: string;
|
|
77
|
+
headers?: Headers;
|
|
78
|
+
i18n?: WeaverseNextI18n;
|
|
79
|
+
isDesignMode?: boolean;
|
|
80
|
+
isPreviewMode?: boolean;
|
|
81
|
+
isRevisionPreview?: boolean;
|
|
82
|
+
pageType?: PageType;
|
|
83
|
+
pathname?: string;
|
|
84
|
+
searchParams?: URLSearchParams;
|
|
85
|
+
sectionType?: string;
|
|
86
|
+
url?: URL | string;
|
|
87
|
+
[key: string]: unknown;
|
|
88
|
+
}
|
|
89
|
+
/** A single serialized item in a Weaverse page tree. */
|
|
90
|
+
interface WeaverseNextComponentData {
|
|
91
|
+
children?: WeaverseNextComponentData[] | {
|
|
92
|
+
id: string;
|
|
93
|
+
}[];
|
|
94
|
+
data?: Record<string, unknown>;
|
|
95
|
+
id: string;
|
|
96
|
+
/** Attached by {@link runWeaverseComponentLoaders} after a loader runs. */
|
|
97
|
+
loaderData?: unknown;
|
|
98
|
+
type: string;
|
|
99
|
+
[key: string]: unknown;
|
|
100
|
+
}
|
|
101
|
+
/** Serialized page tree fetched from Weaverse. */
|
|
102
|
+
interface WeaverseNextPageData {
|
|
103
|
+
id: string;
|
|
104
|
+
items: WeaverseNextComponentData[];
|
|
105
|
+
name?: string;
|
|
106
|
+
rootId?: string;
|
|
107
|
+
[key: string]: unknown;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Top-level payload returned by `client.loadPage`. Kept close to Hydrogen's
|
|
111
|
+
* `WeaverseLoaderData` so registered components stay portable.
|
|
112
|
+
*/
|
|
113
|
+
interface WeaverseNextLoaderData {
|
|
114
|
+
configs?: Record<string, unknown>;
|
|
115
|
+
page: WeaverseNextPageData;
|
|
116
|
+
pageAssignment?: Record<string, unknown>;
|
|
117
|
+
project?: Record<string, unknown>;
|
|
118
|
+
[key: string]: unknown;
|
|
119
|
+
}
|
|
120
|
+
/** Props injected into every registered Weaverse component. */
|
|
121
|
+
interface WeaverseNextComponentProps<L = unknown> extends Partial<WeaverseElement> {
|
|
122
|
+
children?: ReactNode;
|
|
123
|
+
className?: string;
|
|
124
|
+
loaderData?: L;
|
|
125
|
+
[key: string]: unknown;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Arguments passed to a component `loader`. `commerce.storefront` is the
|
|
129
|
+
* explicit contract; `weaverse.storefront` exists as a compatibility alias for
|
|
130
|
+
* Pilot-style loaders that call `weaverse.storefront.query(...)`.
|
|
131
|
+
*/
|
|
132
|
+
interface WeaverseNextComponentLoaderArgs<TData = unknown> {
|
|
133
|
+
commerce?: WeaverseNextCommerceContext;
|
|
134
|
+
context?: WeaverseNextRequestContext;
|
|
135
|
+
data: TData;
|
|
136
|
+
weaverse: WeaverseNextClient;
|
|
137
|
+
}
|
|
138
|
+
/** Registered component module shape: `default` + `schema` + optional `loader`. */
|
|
139
|
+
interface WeaverseNextComponent<TProps extends WeaverseNextComponentProps = WeaverseNextComponentProps> {
|
|
140
|
+
default: ComponentType<TProps> | ForwardRefExoticComponent<TProps>;
|
|
141
|
+
loader?: (args: WeaverseNextComponentLoaderArgs) => Promise<unknown>;
|
|
142
|
+
schema: SchemaType;
|
|
143
|
+
}
|
|
144
|
+
/** Input for `client.loadPage`. The Next route maps `params` → `type/handle`. */
|
|
145
|
+
interface WeaverseNextLoadPageInput {
|
|
146
|
+
handle?: string;
|
|
147
|
+
locale?: string;
|
|
148
|
+
type?: PageType;
|
|
149
|
+
[key: string]: unknown;
|
|
150
|
+
}
|
|
151
|
+
interface WeaverseNextClientConfig {
|
|
152
|
+
commerce?: WeaverseNextCommerceContext;
|
|
153
|
+
components: WeaverseNextComponent[];
|
|
154
|
+
/**
|
|
155
|
+
* Injected page fetcher. v0 delegates network I/O to the host app so the
|
|
156
|
+
* adapter can be tested without real Weaverse API calls.
|
|
157
|
+
*/
|
|
158
|
+
fetchPage?: (input: WeaverseNextLoadPageInput) => Promise<WeaverseNextLoaderData | null>;
|
|
159
|
+
/** Injected theme-settings fetcher. */
|
|
160
|
+
fetchThemeSettings?: (context?: WeaverseNextRequestContext) => Promise<unknown>;
|
|
161
|
+
projectId: string;
|
|
162
|
+
requestContext?: WeaverseNextRequestContext;
|
|
163
|
+
themeSchema?: unknown;
|
|
164
|
+
themeSettings?: Record<string, unknown>;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Request-safe client returned by {@link createWeaverseNextClient}. Holds the
|
|
168
|
+
* registry/config plus the currently loaded page data, and is the object passed
|
|
169
|
+
* to component loaders as `weaverse`.
|
|
170
|
+
*/
|
|
171
|
+
interface WeaverseNextClient {
|
|
172
|
+
commerce?: WeaverseNextCommerceContext;
|
|
173
|
+
components: WeaverseNextComponent[];
|
|
174
|
+
/** Currently loaded page payload (set by `loadPage`). */
|
|
175
|
+
data: WeaverseNextLoaderData | null;
|
|
176
|
+
/** Data-connector context handed to the React renderer. */
|
|
177
|
+
dataContext: Record<string, unknown>;
|
|
178
|
+
loadPage: (input?: WeaverseNextLoadPageInput) => Promise<WeaverseNextLoaderData | null>;
|
|
179
|
+
loadThemeSettings: (context?: WeaverseNextRequestContext) => Promise<unknown>;
|
|
180
|
+
projectId: string;
|
|
181
|
+
requestContext?: WeaverseNextRequestContext;
|
|
182
|
+
/** Compatibility alias for `commerce.storefront`. */
|
|
183
|
+
storefront?: WeaverseNextStorefront;
|
|
184
|
+
themeSchema?: unknown;
|
|
185
|
+
themeSettings: Record<string, unknown>;
|
|
186
|
+
}
|
|
187
|
+
type WeaverseProduct = WeaverseResourcePickerData;
|
|
188
|
+
type WeaverseCollection = WeaverseResourcePickerData;
|
|
189
|
+
/**
|
|
190
|
+
* Project identifier accepted by {@link WeaverseNextServerClientConfig}. Either
|
|
191
|
+
* a static string or a (possibly async) resolver that reads the request
|
|
192
|
+
* context — matching Hydrogen's static/dynamic projectId support.
|
|
193
|
+
*/
|
|
194
|
+
type WeaverseNextProjectId = string | ((context?: WeaverseNextRequestContext) => string | Promise<string> | undefined);
|
|
195
|
+
/** Simple Next.js fetch cache options used for published-mode requests. */
|
|
196
|
+
interface WeaverseNextCacheConfig {
|
|
197
|
+
/** Maps to Next's `fetch(..., { next: { revalidate } })`. */
|
|
198
|
+
revalidate?: number | false;
|
|
199
|
+
/** Maps to Next's `fetch(..., { next: { tags } })`. */
|
|
200
|
+
tags?: string[];
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Per-request fetch options for {@link WeaverseNextServerClient.fetchWithCache}.
|
|
204
|
+
* Plain `RequestInit` plus the same simple Next cache knobs as
|
|
205
|
+
* {@link WeaverseNextCacheConfig}, so callers never need to import `next/*`.
|
|
206
|
+
*/
|
|
207
|
+
interface WeaverseNextFetchOptions extends RequestInit {
|
|
208
|
+
revalidate?: number | false;
|
|
209
|
+
tags?: string[];
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Public, client-safe Weaverse config bundle. Mirrors Hydrogen's
|
|
213
|
+
* `WeaverseProjectConfigs` minus server secrets — `weaverseApiKey` is never
|
|
214
|
+
* included so it cannot leak into serialized loader data.
|
|
215
|
+
*/
|
|
216
|
+
interface WeaverseNextConfigs {
|
|
217
|
+
isDesignMode: boolean;
|
|
218
|
+
isPreviewMode: boolean;
|
|
219
|
+
isRevisionPreview: boolean;
|
|
220
|
+
projectId: string;
|
|
221
|
+
publicEnv: Record<string, string | undefined>;
|
|
222
|
+
sectionType: string;
|
|
223
|
+
weaverseApiBase: string;
|
|
224
|
+
weaverseHost: string;
|
|
225
|
+
weaversePublicApiBase: string;
|
|
226
|
+
weaverseVersion: string;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Resolved base configs derived from request context + env. Includes the
|
|
230
|
+
* server-only `weaverseApiKey`, so this stays internal to the server client and
|
|
231
|
+
* is never serialized into loader data.
|
|
232
|
+
*/
|
|
233
|
+
interface WeaverseNextBaseConfigs {
|
|
234
|
+
envProjectId: string;
|
|
235
|
+
isDesignMode: boolean;
|
|
236
|
+
isPreviewMode: boolean;
|
|
237
|
+
isRevisionPreview: boolean;
|
|
238
|
+
publicEnv: Record<string, string | undefined>;
|
|
239
|
+
queryProjectId: string;
|
|
240
|
+
sectionType: string;
|
|
241
|
+
weaverseApiBase: string;
|
|
242
|
+
weaverseApiKey: string;
|
|
243
|
+
weaverseHost: string;
|
|
244
|
+
weaverseVersion: string;
|
|
245
|
+
}
|
|
246
|
+
/** Theme settings payload returned by {@link WeaverseNextServerClient.loadThemeSettings}. */
|
|
247
|
+
interface WeaverseNextThemeSettingsResponse {
|
|
248
|
+
_error?: string;
|
|
249
|
+
_loadFailed?: boolean;
|
|
250
|
+
merchantOverrides?: Record<string, unknown>;
|
|
251
|
+
publicEnv?: Record<string, string | undefined>;
|
|
252
|
+
schema?: unknown;
|
|
253
|
+
staticContent?: Record<string, unknown>;
|
|
254
|
+
theme?: Record<string, unknown>;
|
|
255
|
+
[key: string]: unknown;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Options for {@link WeaverseNextServerClient.loadThemeSettings}. Cache knobs
|
|
259
|
+
* only — the server client always reads the request context it was created
|
|
260
|
+
* with, so there is no per-call context override.
|
|
261
|
+
*/
|
|
262
|
+
interface WeaverseNextThemeSettingsOptions extends WeaverseNextCacheConfig {
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Config for {@link createWeaverseNextServerClient}. Unlike
|
|
266
|
+
* {@link WeaverseNextClientConfig} (which delegates network I/O to injected
|
|
267
|
+
* fetchers), the server client performs the real Weaverse API fetch itself, so
|
|
268
|
+
* it accepts request context, env, and cache options instead.
|
|
269
|
+
*/
|
|
270
|
+
interface WeaverseNextServerClientConfig {
|
|
271
|
+
cache?: WeaverseNextCacheConfig;
|
|
272
|
+
commerce?: WeaverseNextCommerceContext;
|
|
273
|
+
components: WeaverseNextComponent[];
|
|
274
|
+
/** Plain env map; falls back to `process.env` for any missing key. */
|
|
275
|
+
env?: Record<string, string | undefined>;
|
|
276
|
+
/** Custom `fetch` (mainly for tests); defaults to the global `fetch`. */
|
|
277
|
+
fetch?: typeof fetch;
|
|
278
|
+
/** Per-request network timeout in ms. Defaults to 10s. */
|
|
279
|
+
fetchTimeoutMs?: number;
|
|
280
|
+
projectId?: WeaverseNextProjectId;
|
|
281
|
+
requestContext?: WeaverseNextRequestContext;
|
|
282
|
+
themeSchema?: unknown;
|
|
283
|
+
themeSettings?: Record<string, unknown>;
|
|
284
|
+
/** Optional override for the resolved Weaverse public API base. */
|
|
285
|
+
weaverseApiBase?: string;
|
|
286
|
+
/** Optional override for the resolved Weaverse host. */
|
|
287
|
+
weaverseHost?: string;
|
|
288
|
+
weaverseVersion?: string;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Server-side Weaverse client returned by {@link createWeaverseNextServerClient}.
|
|
292
|
+
* Closes the gap with Hydrogen's `context.weaverse.loadPage(...)` by performing
|
|
293
|
+
* the real Weaverse API fetch in Next server components/route handlers. It is
|
|
294
|
+
* also assignable to {@link WeaverseNextClient} so it can be passed straight to
|
|
295
|
+
* `runWeaverseComponentLoaders` and the renderer/runtime.
|
|
296
|
+
*/
|
|
297
|
+
interface WeaverseNextServerClient extends WeaverseNextClient {
|
|
298
|
+
/** Public, client-safe resolved configs (no server secrets). */
|
|
299
|
+
configs: WeaverseNextConfigs;
|
|
300
|
+
fetchWithCache: <T = unknown>(url: string, options?: WeaverseNextFetchOptions) => Promise<T>;
|
|
301
|
+
loadPage: (input?: WeaverseNextLoadPageInput) => Promise<WeaverseNextLoaderData | null>;
|
|
302
|
+
/**
|
|
303
|
+
* Load theme settings. Pass cache options (`revalidate` / `tags`) only — the
|
|
304
|
+
* request context is the one the client was created with, so there is no
|
|
305
|
+
* per-call context override. The parameter is typed broadly purely to stay
|
|
306
|
+
* assignable to the base {@link WeaverseNextClient.loadThemeSettings}; any
|
|
307
|
+
* non-cache fields are ignored.
|
|
308
|
+
*/
|
|
309
|
+
loadThemeSettings: (options?: WeaverseNextThemeSettingsOptions | WeaverseNextRequestContext) => Promise<WeaverseNextThemeSettingsResponse>;
|
|
310
|
+
/** Resolve the effective projectId (query → function → string → env). */
|
|
311
|
+
resolveProjectId: () => Promise<string>;
|
|
312
|
+
}
|
|
313
|
+
/** Input for {@link WeaverseNextServerClient.loadPage}. */
|
|
314
|
+
interface WeaverseNextServerLoadPageInput extends WeaverseNextLoadPageInput {
|
|
315
|
+
/** Per-call cache override merged over the client-level `cache` config. */
|
|
316
|
+
cache?: WeaverseNextCacheConfig;
|
|
317
|
+
/** Route-level project override (multi-project), like Hydrogen. */
|
|
318
|
+
projectId?: string;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export type { WeaverseNextThemeSettingsStore as A, WeaverseProduct as B, WeaverseCollection as W, WeaverseNextBaseConfigs as a, WeaverseNextCacheConfig as b, WeaverseNextClient as c, WeaverseNextClientConfig as d, WeaverseNextCommerceContext as e, WeaverseNextComponent as f, WeaverseNextComponentData as g, WeaverseNextComponentLoaderArgs as h, WeaverseNextComponentProps as i, WeaverseNextConfigs as j, WeaverseNextFetchOptions as k, WeaverseNextI18n as l, WeaverseNextLoadPageInput as m, WeaverseNextLoaderData as n, WeaverseNextPageData as o, WeaverseNextProjectId as p, WeaverseNextRequestContext as q, WeaverseNextRequestInfo as r, WeaverseNextRuntimeConfig as s, WeaverseNextRuntimeInternal as t, WeaverseNextServerClient as u, WeaverseNextServerClientConfig as v, WeaverseNextServerLoadPageInput as w, WeaverseNextStorefront as x, WeaverseNextThemeSettingsOptions as y, WeaverseNextThemeSettingsResponse as z };
|