@weaverse/next 0.1.0-alpha.0 → 0.1.0-alpha.1

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.
@@ -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 };
package/package.json CHANGED
@@ -2,11 +2,24 @@
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.0",
5
+ "version": "0.1.0-alpha.1",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
8
8
  "typings": "dist/index.d.ts",
9
9
  "module": "dist/index.mjs",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.mjs",
14
+ "require": "./dist/index.js"
15
+ },
16
+ "./server": {
17
+ "types": "./dist/server.d.ts",
18
+ "import": "./dist/server.mjs",
19
+ "require": "./dist/server.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
10
23
  "publishConfig": {
11
24
  "access": "public",
12
25
  "@weaverse:registry": "https://registry.npmjs.org"
@@ -30,7 +43,8 @@
30
43
  },
31
44
  "tsup": {
32
45
  "entry": [
33
- "src/index.ts"
46
+ "src/index.ts",
47
+ "src/server.ts"
34
48
  ],
35
49
  "format": [
36
50
  "esm",