@weaverse/next 0.1.0-alpha.2 → 0.1.0-alpha.20
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 +586 -123
- package/dist/chunk-LH6AAEIK.mjs +326 -0
- package/dist/chunk-LH6AAEIK.mjs.map +1 -0
- package/dist/index.js +784 -60
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +588 -58
- package/dist/index.mjs.map +1 -1
- package/dist/server.js +537 -76
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +363 -27
- package/dist/server.mjs.map +1 -1
- package/dist/types/client.d.ts +16 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/hooks.d.ts +20 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +34 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/item.d.ts +60 -0
- package/dist/types/item.d.ts.map +1 -0
- package/dist/types/loader.d.ts +25 -0
- package/dist/types/loader.d.ts.map +1 -0
- package/dist/types/main.d.ts +11 -0
- package/dist/types/main.d.ts.map +1 -0
- package/dist/types/provider.d.ts +82 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/registry.d.ts +15 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/renderer.d.ts +21 -0
- package/dist/types/renderer.d.ts.map +1 -0
- package/dist/types/request-info.d.ts +19 -0
- package/dist/types/request-info.d.ts.map +1 -0
- package/dist/types/revalidate-item.d.ts +82 -0
- package/dist/types/revalidate-item.d.ts.map +1 -0
- package/dist/types/root-provider.d.ts +62 -0
- package/dist/types/root-provider.d.ts.map +1 -0
- package/dist/types/runtime.d.ts +113 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/seo.d.ts +55 -0
- package/dist/types/seo.d.ts.map +1 -0
- package/dist/types/server/configs.d.ts +27 -0
- package/dist/types/server/configs.d.ts.map +1 -0
- package/dist/types/server/normalize-page-url.d.ts +19 -0
- package/dist/types/server/normalize-page-url.d.ts.map +1 -0
- package/dist/types/server/revalidate-handler.d.ts +55 -0
- package/dist/types/server/revalidate-handler.d.ts.map +1 -0
- package/dist/types/server/server-client.d.ts +21 -0
- package/dist/types/server/server-client.d.ts.map +1 -0
- package/dist/types/server.d.ts +19 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/studio-bridge.d.ts +16 -0
- package/dist/types/studio-bridge.d.ts.map +1 -0
- package/dist/types/studio-connect.d.ts +27 -0
- package/dist/types/studio-connect.d.ts.map +1 -0
- package/dist/types/studio-router.d.ts +50 -0
- package/dist/types/studio-router.d.ts.map +1 -0
- package/dist/types/studio-script-src.d.ts +12 -0
- package/dist/types/studio-script-src.d.ts.map +1 -0
- package/dist/types/theme-settings-store.d.ts +18 -0
- package/dist/types/theme-settings-store.d.ts.map +1 -0
- package/dist/types/translation-context.d.ts +156 -0
- package/dist/types/translation-context.d.ts.map +1 -0
- package/dist/types/translation-store.d.ts +44 -0
- package/dist/types/translation-store.d.ts.map +1 -0
- package/dist/types/types.d.ts +665 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/use-weaverse-next-studio.d.ts +34 -0
- package/dist/types/use-weaverse-next-studio.d.ts.map +1 -0
- package/dist/types/utils.d.ts +12 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +12 -8
- package/src/client.ts +102 -0
- package/src/hooks.ts +50 -0
- package/src/index.ts +153 -0
- package/src/item.ts +167 -0
- package/src/loader.ts +135 -0
- package/src/main.tsx +45 -0
- package/src/provider.tsx +225 -0
- package/src/registry.ts +63 -0
- package/src/renderer.tsx +100 -0
- package/src/request-info.ts +124 -0
- package/src/revalidate-item.ts +211 -0
- package/src/root-provider.tsx +182 -0
- package/src/runtime.ts +555 -0
- package/src/seo.ts +157 -0
- package/src/server/configs.ts +178 -0
- package/src/server/normalize-page-url.ts +73 -0
- package/src/server/revalidate-handler.ts +357 -0
- package/src/server/server-client.ts +728 -0
- package/src/server.ts +67 -0
- package/src/studio-bridge.tsx +82 -0
- package/src/studio-connect.tsx +88 -0
- package/src/studio-router.ts +85 -0
- package/src/studio-script-src.ts +128 -0
- package/src/theme-settings-store.ts +47 -0
- package/src/translation-context.tsx +299 -0
- package/src/translation-store.ts +69 -0
- package/src/types.ts +753 -0
- package/src/use-weaverse-next-studio.tsx +106 -0
- package/src/utils.ts +37 -0
- package/dist/chunk-SS6QUKYY.mjs +0 -149
- package/dist/chunk-SS6QUKYY.mjs.map +0 -1
- package/dist/index.d.mts +0 -250
- package/dist/index.d.ts +0 -250
- package/dist/server.d.mts +0 -60
- package/dist/server.d.ts +0 -60
- package/dist/types-DvEeLX6L.d.mts +0 -321
- package/dist/types-DvEeLX6L.d.ts +0 -321
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useRouter } from 'next/navigation'
|
|
4
|
+
import { useRef } from 'react'
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_REVALIDATE_ENDPOINT,
|
|
7
|
+
revalidateWeaverseNextItem,
|
|
8
|
+
} from './revalidate-item'
|
|
9
|
+
import type { WeaverseNextRuntime } from './runtime'
|
|
10
|
+
import { WeaverseNextStudioBridge } from './studio-bridge'
|
|
11
|
+
import {
|
|
12
|
+
type CreateWeaverseNextStudioInternalsOptions,
|
|
13
|
+
createWeaverseNextStudioInternals,
|
|
14
|
+
type WeaverseNextStudioInternals,
|
|
15
|
+
} from './studio-router'
|
|
16
|
+
import type { WeaverseNextRuntimeInternal } from './types'
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App
|
|
20
|
+
* Router. `useRouter()` is stable across renders, but the derived callbacks are
|
|
21
|
+
* cached in a ref keyed on the router instance so the bridge's bind effect
|
|
22
|
+
* (which depends on `navigate` / `revalidate` identity) doesn't re-run — and
|
|
23
|
+
* re-`refreshStudio` — on every render.
|
|
24
|
+
*/
|
|
25
|
+
export function useWeaverseNextStudioInternals(
|
|
26
|
+
options?: CreateWeaverseNextStudioInternalsOptions
|
|
27
|
+
): WeaverseNextStudioInternals {
|
|
28
|
+
let router = useRouter()
|
|
29
|
+
let ref = useRef<{
|
|
30
|
+
internals: WeaverseNextStudioInternals
|
|
31
|
+
replace: boolean | undefined
|
|
32
|
+
router: typeof router
|
|
33
|
+
} | null>(null)
|
|
34
|
+
|
|
35
|
+
if (
|
|
36
|
+
!ref.current ||
|
|
37
|
+
ref.current.router !== router ||
|
|
38
|
+
ref.current.replace !== options?.replace
|
|
39
|
+
) {
|
|
40
|
+
ref.current = {
|
|
41
|
+
internals: createWeaverseNextStudioInternals(router, options),
|
|
42
|
+
replace: options?.replace,
|
|
43
|
+
router,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return ref.current.internals
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Props for the page-level Next App Router Studio binder. */
|
|
51
|
+
export interface WeaverseNextStudioProps
|
|
52
|
+
extends CreateWeaverseNextStudioInternalsOptions {
|
|
53
|
+
/**
|
|
54
|
+
* Route the app mounted with `createWeaverseNextRevalidateHandler`.
|
|
55
|
+
* Defaults to `/api/weaverse/revalidate`.
|
|
56
|
+
*/
|
|
57
|
+
revalidateEndpoint?: string
|
|
58
|
+
/** Browser runtime to bind to Builder Studio. */
|
|
59
|
+
runtime: WeaverseNextRuntime
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's
|
|
64
|
+
* `useStudio` (which binds the runtime and feeds it React Router's `navigate` /
|
|
65
|
+
* `revalidate`): it resolves the App Router callbacks via
|
|
66
|
+
* {@link useWeaverseNextStudioInternals} and hands them to
|
|
67
|
+
* {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and
|
|
68
|
+
* revalidation without manually wiring `next/navigation`.
|
|
69
|
+
*
|
|
70
|
+
* Client-only — it is the single place `@weaverse/next` touches
|
|
71
|
+
* `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`
|
|
72
|
+
* free of router imports.
|
|
73
|
+
*/
|
|
74
|
+
export function WeaverseNextStudio(props: WeaverseNextStudioProps) {
|
|
75
|
+
let { runtime, replace, revalidateEndpoint } = props
|
|
76
|
+
let { navigate, revalidate } = useWeaverseNextStudioInternals({ replace })
|
|
77
|
+
let endpoint = revalidateEndpoint ?? DEFAULT_REVALIDATE_ENDPOINT
|
|
78
|
+
// Cache per runtime+endpoint so the bridge bind effect (keyed on callback
|
|
79
|
+
// identity) doesn't re-run — and re-`refreshStudio` — on every render.
|
|
80
|
+
// `itemInstances` is a static registry shared by all Weaverse runtimes, so
|
|
81
|
+
// any live runtime reference resolves the edited item.
|
|
82
|
+
let revalidateItemRef = useRef<{
|
|
83
|
+
endpoint: string
|
|
84
|
+
revalidateItem: NonNullable<WeaverseNextRuntimeInternal['revalidateItem']>
|
|
85
|
+
runtime: WeaverseNextRuntime
|
|
86
|
+
} | null>(null)
|
|
87
|
+
if (
|
|
88
|
+
revalidateItemRef.current?.endpoint !== endpoint ||
|
|
89
|
+
revalidateItemRef.current.runtime !== runtime
|
|
90
|
+
) {
|
|
91
|
+
revalidateItemRef.current = {
|
|
92
|
+
endpoint,
|
|
93
|
+
revalidateItem: (draftItem) =>
|
|
94
|
+
revalidateWeaverseNextItem(runtime, draftItem, endpoint),
|
|
95
|
+
runtime,
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return (
|
|
99
|
+
<WeaverseNextStudioBridge
|
|
100
|
+
navigate={navigate}
|
|
101
|
+
revalidate={revalidate}
|
|
102
|
+
revalidateItem={revalidateItemRef.current.revalidateItem}
|
|
103
|
+
runtime={runtime}
|
|
104
|
+
/>
|
|
105
|
+
)
|
|
106
|
+
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SchemaType } from '@weaverse/schema'
|
|
2
|
+
import type { WeaverseNextThemeSchema } from './types'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generate default component data from a schema's `settings` inputs.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors Hydrogen's `generateDataFromSchema` (settings → `{ [name]:
|
|
8
|
+
* defaultValue }`) but is kept local so `@weaverse/next` doesn't depend on
|
|
9
|
+
* `@weaverse/hydrogen`. Falls back to the deprecated `inspector` array when a
|
|
10
|
+
* schema predates `settings`.
|
|
11
|
+
*/
|
|
12
|
+
export function generateDataFromSchema(
|
|
13
|
+
schema: SchemaType | WeaverseNextThemeSchema | undefined
|
|
14
|
+
): Record<string, unknown> {
|
|
15
|
+
let data: Record<string, unknown> = {}
|
|
16
|
+
if (!schema) {
|
|
17
|
+
return data
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let groups =
|
|
21
|
+
(schema.settings as {
|
|
22
|
+
inputs?: { name?: string; defaultValue?: unknown }[]
|
|
23
|
+
}[]) ??
|
|
24
|
+
(schema as { inspector?: typeof groups }).inspector ??
|
|
25
|
+
[]
|
|
26
|
+
|
|
27
|
+
for (let group of groups) {
|
|
28
|
+
for (let input of group?.inputs ?? []) {
|
|
29
|
+
let { name, defaultValue } = input
|
|
30
|
+
if (name && defaultValue !== null && defaultValue !== undefined) {
|
|
31
|
+
data[name] = defaultValue
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return data
|
|
37
|
+
}
|
package/dist/chunk-SS6QUKYY.mjs
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
// src/utils.ts
|
|
2
|
-
function generateDataFromSchema(schema) {
|
|
3
|
-
let data = {};
|
|
4
|
-
if (!schema) {
|
|
5
|
-
return data;
|
|
6
|
-
}
|
|
7
|
-
let groups = schema.settings ?? schema.inspector ?? [];
|
|
8
|
-
for (let group of groups) {
|
|
9
|
-
for (let input of group?.inputs ?? []) {
|
|
10
|
-
let { name, defaultValue } = input;
|
|
11
|
-
if (name && defaultValue !== null && defaultValue !== void 0) {
|
|
12
|
-
data[name] = defaultValue;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return data;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// src/loader.ts
|
|
20
|
-
function isItemNode(node) {
|
|
21
|
-
return typeof node === "object" && node !== null && typeof node.type === "string";
|
|
22
|
-
}
|
|
23
|
-
function cloneItem(item) {
|
|
24
|
-
return {
|
|
25
|
-
...item,
|
|
26
|
-
children: Array.isArray(item.children) ? item.children.map(
|
|
27
|
-
(child) => isItemNode(child) ? cloneItem(child) : { ...child }
|
|
28
|
-
) : item.children
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
async function runWeaverseComponentLoaders(args) {
|
|
32
|
-
let { client, context, commerce } = args;
|
|
33
|
-
let sourceData = args.data ?? client.data;
|
|
34
|
-
if (!sourceData) {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
if (!sourceData.page.items.length) {
|
|
38
|
-
return sourceData;
|
|
39
|
-
}
|
|
40
|
-
let data = {
|
|
41
|
-
...sourceData,
|
|
42
|
-
page: {
|
|
43
|
-
...sourceData.page,
|
|
44
|
-
items: sourceData.page.items.map(cloneItem)
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
let items = data.page.items;
|
|
48
|
-
let componentMap = /* @__PURE__ */ new Map();
|
|
49
|
-
for (let component of client.components) {
|
|
50
|
-
if (component?.schema?.type) {
|
|
51
|
-
componentMap.set(component.schema.type, component);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
let visited = /* @__PURE__ */ new Set();
|
|
55
|
-
let resolvedContext = context ?? client.requestContext;
|
|
56
|
-
let resolvedCommerce = commerce ?? client.commerce;
|
|
57
|
-
let resolvedWeaverse = resolvedCommerce === client.commerce ? client : {
|
|
58
|
-
...client,
|
|
59
|
-
commerce: resolvedCommerce,
|
|
60
|
-
storefront: resolvedCommerce?.storefront
|
|
61
|
-
};
|
|
62
|
-
async function walk(nodes) {
|
|
63
|
-
for (let item of nodes) {
|
|
64
|
-
if (!item || visited.has(item.id)) {
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
visited.add(item.id);
|
|
68
|
-
let component = componentMap.get(item.type);
|
|
69
|
-
if (component?.loader) {
|
|
70
|
-
try {
|
|
71
|
-
item.loaderData = await component.loader({
|
|
72
|
-
data: { ...generateDataFromSchema(component.schema), ...item.data },
|
|
73
|
-
weaverse: resolvedWeaverse,
|
|
74
|
-
context: resolvedContext,
|
|
75
|
-
commerce: resolvedCommerce
|
|
76
|
-
});
|
|
77
|
-
} catch (error) {
|
|
78
|
-
console.warn("\u274C Item loader run failed.", item.type, item.id, error);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
let children = item.children;
|
|
82
|
-
if (Array.isArray(children)) {
|
|
83
|
-
let inlineChildren = children.filter(
|
|
84
|
-
isItemNode
|
|
85
|
-
);
|
|
86
|
-
if (inlineChildren.length) {
|
|
87
|
-
await walk(inlineChildren);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
await walk(items);
|
|
93
|
-
return data;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// src/request-info.ts
|
|
97
|
-
function toUrl(value) {
|
|
98
|
-
return typeof value === "string" ? new URL(value, "http://localhost") : value;
|
|
99
|
-
}
|
|
100
|
-
function getSearchParamsFromContext(context) {
|
|
101
|
-
if (context?.searchParams) {
|
|
102
|
-
return new URLSearchParams(context.searchParams);
|
|
103
|
-
}
|
|
104
|
-
if (context?.url) {
|
|
105
|
-
let url = toUrl(context.url);
|
|
106
|
-
return new URLSearchParams(url.searchParams);
|
|
107
|
-
}
|
|
108
|
-
return new URLSearchParams();
|
|
109
|
-
}
|
|
110
|
-
function getPathnameFromContext(context) {
|
|
111
|
-
if (context?.pathname) {
|
|
112
|
-
return context.pathname;
|
|
113
|
-
}
|
|
114
|
-
if (context?.url) {
|
|
115
|
-
let url = toUrl(context.url);
|
|
116
|
-
return url.pathname || "/";
|
|
117
|
-
}
|
|
118
|
-
return "/";
|
|
119
|
-
}
|
|
120
|
-
function coerceQueryValue(value) {
|
|
121
|
-
if (value === "true") {
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
|
-
if (value === "false") {
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
return value;
|
|
128
|
-
}
|
|
129
|
-
function toQueryRecord(searchParams) {
|
|
130
|
-
let queries = {};
|
|
131
|
-
for (let [key, value] of searchParams.entries()) {
|
|
132
|
-
queries[key] = coerceQueryValue(value);
|
|
133
|
-
}
|
|
134
|
-
return queries;
|
|
135
|
-
}
|
|
136
|
-
function buildWeaverseNextRequestInfo(context) {
|
|
137
|
-
let searchParams = getSearchParamsFromContext(context);
|
|
138
|
-
let search = searchParams.toString();
|
|
139
|
-
return {
|
|
140
|
-
pathname: getPathnameFromContext(context),
|
|
141
|
-
search: search ? `?${search}` : "",
|
|
142
|
-
queries: toQueryRecord(searchParams),
|
|
143
|
-
...context?.i18n ? { i18n: context.i18n } : {}
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export { buildWeaverseNextRequestInfo, generateDataFromSchema, runWeaverseComponentLoaders };
|
|
148
|
-
//# sourceMappingURL=chunk-SS6QUKYY.mjs.map
|
|
149
|
-
//# sourceMappingURL=chunk-SS6QUKYY.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/loader.ts","../src/request-info.ts"],"names":[],"mappings":"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","file":"chunk-SS6QUKYY.mjs","sourcesContent":["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 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\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 = getSearchParamsFromContext(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"]}
|
package/dist/index.d.mts
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { Weaverse } from '@weaverse/react';
|
|
2
|
-
export { isBrowser, isIframe, useChildInstances, useItemInstance, useParentInstance, useWeaverse } from '@weaverse/react';
|
|
3
|
-
export { InspectorGroup, PageType, SchemaType, createSchema } from '@weaverse/schema';
|
|
4
|
-
import { d as WeaverseNextClientConfig, c as WeaverseNextClient, e as WeaverseNextCommerceContext, q as WeaverseNextRequestContext, n as WeaverseNextLoaderData, r as WeaverseNextRequestInfo, t as WeaverseNextRuntimeInternal, s as WeaverseNextRuntimeConfig, A as WeaverseNextThemeSettingsStore } from './types-DvEeLX6L.mjs';
|
|
5
|
-
export { W as WeaverseCollection, f as WeaverseNextComponent, g as WeaverseNextComponentData, h as WeaverseNextComponentLoaderArgs, i as WeaverseNextComponentProps, l as WeaverseNextI18n, m as WeaverseNextLoadPageInput, o as WeaverseNextPageData, x as WeaverseNextStorefront, B as WeaverseProduct } from './types-DvEeLX6L.mjs';
|
|
6
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
7
|
-
import * as react from 'react';
|
|
8
|
-
import { ReactNode } from 'react';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Create a {@link WeaverseNextClient} from explicit config.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```ts
|
|
15
|
-
* let client = createWeaverseNextClient({
|
|
16
|
-
* projectId: process.env.WEAVERSE_PROJECT_ID!,
|
|
17
|
-
* components,
|
|
18
|
-
* commerce: { storefront },
|
|
19
|
-
* fetchPage: async ({ type, handle }) => fetchWeaversePage({ type, handle }),
|
|
20
|
-
* })
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
declare function createWeaverseNextClient(config: WeaverseNextClientConfig): WeaverseNextClient;
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Read explicit root/global data passed to the provider. Next-native
|
|
27
|
-
* replacement for `useRouteLoaderData('root')`.
|
|
28
|
-
*/
|
|
29
|
-
declare function useWeaverseRootData<T = unknown>(): T;
|
|
30
|
-
/**
|
|
31
|
-
* Read explicit page/route commerce data passed to the provider. Next-native
|
|
32
|
-
* replacement for section-level `useLoaderData()`.
|
|
33
|
-
*/
|
|
34
|
-
declare function useWeaversePageData<T = unknown>(): T;
|
|
35
|
-
/** Read the app-provided commerce context (storefront/cart/customer). */
|
|
36
|
-
declare function useWeaverseCommerce<T = WeaverseNextCommerceContext>(): T;
|
|
37
|
-
/**
|
|
38
|
-
* Read live Weaverse theme settings. The Studio bridge updates the provider's
|
|
39
|
-
* external store via `updateThemeSettings`, so components re-render during live
|
|
40
|
-
* design-mode edits.
|
|
41
|
-
*/
|
|
42
|
-
declare function useThemeSettings<T = Record<string, unknown>>(): T;
|
|
43
|
-
|
|
44
|
-
interface RunComponentLoadersArgs {
|
|
45
|
-
client: WeaverseNextClient;
|
|
46
|
-
commerce?: WeaverseNextCommerceContext;
|
|
47
|
-
context?: WeaverseNextRequestContext;
|
|
48
|
-
/** Page payload to walk; defaults to `client.data`. */
|
|
49
|
-
data?: WeaverseNextLoaderData | null;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Walk a serialized page tree and run each registered component's `loader`,
|
|
53
|
-
* attaching the result to the item as `loaderData`.
|
|
54
|
-
*
|
|
55
|
-
* Loaders receive explicit `commerce.storefront` (and `weaverse.storefront` as
|
|
56
|
-
* a compatibility alias via the client). Children are walked recursively when
|
|
57
|
-
* they are inline item objects; flat `items` arrays are covered by the
|
|
58
|
-
* top-level walk.
|
|
59
|
-
*
|
|
60
|
-
* @returns a cloned `data` object with `loaderData` attached to cloned items.
|
|
61
|
-
*/
|
|
62
|
-
declare function runWeaverseComponentLoaders(args: RunComponentLoadersArgs): Promise<WeaverseNextLoaderData | null>;
|
|
63
|
-
|
|
64
|
-
interface WeaverseNextProviderProps {
|
|
65
|
-
children: ReactNode;
|
|
66
|
-
client?: WeaverseNextClient;
|
|
67
|
-
/** App-provided commerce context (storefront/cart/customer). */
|
|
68
|
-
commerce?: WeaverseNextCommerceContext;
|
|
69
|
-
/** Explicit page/route commerce data (replaces section-level `useLoaderData`). */
|
|
70
|
-
pageData?: unknown;
|
|
71
|
-
/** Explicit root/global data (replaces `useRouteLoaderData('root')`). */
|
|
72
|
-
rootData?: unknown;
|
|
73
|
-
/** Theme settings override; falls back to `client.themeSettings`. */
|
|
74
|
-
themeSettings?: Record<string, unknown>;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Client boundary that supplies explicit root/page/commerce data to Weaverse
|
|
78
|
-
* sections. Next-native replacement for `withWeaverse` + route loader data —
|
|
79
|
-
* no React Router route matches are emulated.
|
|
80
|
-
*
|
|
81
|
-
* In App Router, create/pass `client` only from a client component wrapper. A
|
|
82
|
-
* `WeaverseNextClient` contains functions and component references, so it is
|
|
83
|
-
* not serializable across a Server Component → Client Component boundary.
|
|
84
|
-
*
|
|
85
|
-
* @example
|
|
86
|
-
* ```tsx
|
|
87
|
-
* 'use client'
|
|
88
|
-
*
|
|
89
|
-
* <WeaverseNextProvider client={client} rootData={rootData} pageData={pageData} commerce={commerce}>
|
|
90
|
-
* <WeaverseNextRenderer />
|
|
91
|
-
* </WeaverseNextProvider>
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
|
-
declare function WeaverseNextProvider(props: WeaverseNextProviderProps): react_jsx_runtime.JSX.Element;
|
|
95
|
-
|
|
96
|
-
interface WeaverseNextRendererProps {
|
|
97
|
-
/** Client to render from. Defaults to the provider's client. */
|
|
98
|
-
client?: WeaverseNextClient;
|
|
99
|
-
/** Page payload to render. Defaults to `client.data`. */
|
|
100
|
-
data?: WeaverseNextLoaderData | null;
|
|
101
|
-
/** Data-connector context for `{{...}}` template replacement. */
|
|
102
|
-
dataContext?: Record<string, unknown>;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Render a serialized Weaverse page tree through `@weaverse/react` primitives.
|
|
106
|
-
*
|
|
107
|
-
* Reads the client/page data from {@link WeaverseNextContext} when no props are
|
|
108
|
-
* passed, or accepts an explicit `client` + `data` for standalone use. Builds a
|
|
109
|
-
* framework-neutral `Weaverse` core instance (no React Router hooks) and hands
|
|
110
|
-
* it to the shared `WeaverseRoot`.
|
|
111
|
-
*/
|
|
112
|
-
declare const WeaverseNextRenderer: react.MemoExoticComponent<(props: WeaverseNextRendererProps) => react_jsx_runtime.JSX.Element | null>;
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Build the Hydrogen-like request info shape consumed by the Studio bridge.
|
|
116
|
-
* Duplicate query keys keep the last value, matching `URLSearchParams` iteration
|
|
117
|
-
* assignment and Hydrogen's practical query-object behavior.
|
|
118
|
-
*/
|
|
119
|
-
declare function buildWeaverseNextRequestInfo(context?: WeaverseNextRequestContext): WeaverseNextRequestInfo;
|
|
120
|
-
|
|
121
|
-
declare global {
|
|
122
|
-
interface Window {
|
|
123
|
-
__weaverse?: WeaverseNextRuntime;
|
|
124
|
-
__weaverses?: Record<string, WeaverseNextRuntime>;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
declare class WeaverseNextRuntime extends Weaverse {
|
|
128
|
-
pageId: string;
|
|
129
|
-
internal: WeaverseNextRuntimeInternal;
|
|
130
|
-
requestInfo: WeaverseNextRequestInfo;
|
|
131
|
-
isPreviewMode: boolean;
|
|
132
|
-
isRevisionPreview: boolean;
|
|
133
|
-
sectionType?: string;
|
|
134
|
-
translationMap: Record<string, unknown>;
|
|
135
|
-
translationLocale: string;
|
|
136
|
-
translationLanguageId: string;
|
|
137
|
-
constructor(config: WeaverseNextRuntimeConfig);
|
|
138
|
-
extractTranslationSidecar: () => undefined;
|
|
139
|
-
setTranslationSidecar: (map?: Record<string, unknown>, locale?: string, languageId?: string) => void;
|
|
140
|
-
updateTranslation: () => undefined;
|
|
141
|
-
getTranslationChanges: () => undefined;
|
|
142
|
-
}
|
|
143
|
-
declare function createWeaverseNextRuntime(config: WeaverseNextRuntimeConfig): WeaverseNextRuntime;
|
|
144
|
-
declare function bindWeaverseNextStudioRuntime(runtime: WeaverseNextRuntime): boolean;
|
|
145
|
-
|
|
146
|
-
interface WeaverseNextStudioBridgeProps {
|
|
147
|
-
navigate?: WeaverseNextRuntimeInternal['navigate'];
|
|
148
|
-
revalidate?: WeaverseNextRuntimeInternal['revalidate'];
|
|
149
|
-
runtime: WeaverseNextRuntime;
|
|
150
|
-
}
|
|
151
|
-
/** Page-level Studio runtime binder. */
|
|
152
|
-
declare function WeaverseNextStudioBridge(props: WeaverseNextStudioBridgeProps): null;
|
|
153
|
-
|
|
154
|
-
interface WeaverseNextStudioConnectProps {
|
|
155
|
-
context?: WeaverseNextRequestContext;
|
|
156
|
-
storefrontHostname?: string;
|
|
157
|
-
}
|
|
158
|
-
/** Root-level Studio script connector for Next client boundaries. */
|
|
159
|
-
declare function WeaverseNextStudioConnect(props: WeaverseNextStudioConnectProps): null;
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Minimal structural shape of the Next App Router returned by `useRouter()`
|
|
163
|
-
* (`next/navigation`) that the Studio bridge needs. Declared locally — rather
|
|
164
|
-
* than importing `AppRouterInstance` from `next` — so the adapter stays a pure
|
|
165
|
-
* function that unit tests can drive with a plain mock and never pulls
|
|
166
|
-
* `next/navigation` into the test graph.
|
|
167
|
-
*/
|
|
168
|
-
interface WeaverseNextRouterLike {
|
|
169
|
-
push: (href: string, options?: {
|
|
170
|
-
scroll?: boolean;
|
|
171
|
-
}) => void;
|
|
172
|
-
refresh: () => void;
|
|
173
|
-
replace: (href: string, options?: {
|
|
174
|
-
scroll?: boolean;
|
|
175
|
-
}) => void;
|
|
176
|
-
}
|
|
177
|
-
/** Resolved Studio navigation/revalidation callbacks for a Next runtime. */
|
|
178
|
-
interface WeaverseNextStudioInternals {
|
|
179
|
-
navigate: NonNullable<WeaverseNextRuntimeInternal['navigate']>;
|
|
180
|
-
revalidate: NonNullable<WeaverseNextRuntimeInternal['revalidate']>;
|
|
181
|
-
}
|
|
182
|
-
interface CreateWeaverseNextStudioInternalsOptions {
|
|
183
|
-
/** Use `router.replace` instead of `router.push` for navigation. */
|
|
184
|
-
replace?: boolean;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Build Studio `navigate` / `revalidate` callbacks from a Next App Router.
|
|
188
|
-
*
|
|
189
|
-
* Maps Hydrogen's React Router semantics onto Next App Router:
|
|
190
|
-
* - `navigate(to, { preventScrollReset })` → `router.push(to, { scroll })`,
|
|
191
|
-
* where `scroll` is the inverse of `preventScrollReset`. Studio passes
|
|
192
|
-
* `preventScrollReset` for in-place edits so the preview viewport is kept,
|
|
193
|
-
* matching React Router's `navigate({ preventScrollReset })`.
|
|
194
|
-
* - `revalidate()` → `router.refresh()`, the App Router's loader-backed refresh
|
|
195
|
-
* and the closest equivalent to React Router's `useRevalidator`.
|
|
196
|
-
*
|
|
197
|
-
* Pure (no React, no `next/navigation`) so it is unit-testable with a mock
|
|
198
|
-
* router; the {@link WeaverseNextRouterLike} contract is the only coupling.
|
|
199
|
-
*/
|
|
200
|
-
declare function createWeaverseNextStudioInternals(router: WeaverseNextRouterLike, options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
|
|
201
|
-
|
|
202
|
-
interface ResolveWeaverseNextStudioScriptSrcOptions {
|
|
203
|
-
framework?: 'hydrogen' | 'next';
|
|
204
|
-
storefrontHostname?: string;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Resolve the Studio script URL from request/search context. v0 intentionally
|
|
208
|
-
* reuses the existing structural Hydrogen bridge script until a concrete Builder
|
|
209
|
-
* incompatibility requires a dedicated Next bundle.
|
|
210
|
-
*/
|
|
211
|
-
declare function resolveWeaverseNextStudioScriptSrc(context?: WeaverseNextRequestContext, options?: ResolveWeaverseNextStudioScriptSrcOptions): string | null;
|
|
212
|
-
|
|
213
|
-
interface CreateWeaverseNextThemeSettingsStoreOptions {
|
|
214
|
-
publicEnv?: Record<string, string | undefined>;
|
|
215
|
-
schema?: unknown;
|
|
216
|
-
settings?: Record<string, unknown>;
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Small external store shape compatible with the Studio bridge and React's
|
|
220
|
-
* `useSyncExternalStore` contract. The bridge calls `updateThemeSettings` during
|
|
221
|
-
* live theme edits, so keep that method name stable.
|
|
222
|
-
*/
|
|
223
|
-
declare function createWeaverseNextThemeSettingsStore(options?: CreateWeaverseNextThemeSettingsStoreOptions): WeaverseNextThemeSettingsStore;
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Resolve stable Studio `navigate` / `revalidate` callbacks from the Next App
|
|
227
|
-
* Router. `useRouter()` is stable across renders, but the derived callbacks are
|
|
228
|
-
* cached in a ref keyed on the router instance so the bridge's bind effect
|
|
229
|
-
* (which depends on `navigate` / `revalidate` identity) doesn't re-run — and
|
|
230
|
-
* re-`refreshStudio` — on every render.
|
|
231
|
-
*/
|
|
232
|
-
declare function useWeaverseNextStudioInternals(options?: CreateWeaverseNextStudioInternalsOptions): WeaverseNextStudioInternals;
|
|
233
|
-
interface WeaverseNextStudioProps extends CreateWeaverseNextStudioInternalsOptions {
|
|
234
|
-
runtime: WeaverseNextRuntime;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Page-level Studio binder wired to the Next App Router. Mirrors Hydrogen's
|
|
238
|
-
* `useStudio` (which binds the runtime and feeds it React Router's `navigate` /
|
|
239
|
-
* `revalidate`): it resolves the App Router callbacks via
|
|
240
|
-
* {@link useWeaverseNextStudioInternals} and hands them to
|
|
241
|
-
* {@link WeaverseNextStudioBridge}, so consuming apps get Studio navigation and
|
|
242
|
-
* revalidation without manually wiring `next/navigation`.
|
|
243
|
-
*
|
|
244
|
-
* Client-only — it is the single place `@weaverse/next` touches
|
|
245
|
-
* `next/navigation`, keeping the runtime/renderer and `@weaverse/next/server`
|
|
246
|
-
* free of router imports.
|
|
247
|
-
*/
|
|
248
|
-
declare function WeaverseNextStudio(props: WeaverseNextStudioProps): react_jsx_runtime.JSX.Element;
|
|
249
|
-
|
|
250
|
-
export { type CreateWeaverseNextStudioInternalsOptions, type CreateWeaverseNextThemeSettingsStoreOptions, type ResolveWeaverseNextStudioScriptSrcOptions, type RunComponentLoadersArgs, WeaverseNextClient, WeaverseNextClientConfig, WeaverseNextCommerceContext, WeaverseNextLoaderData, WeaverseNextProvider, type WeaverseNextProviderProps, WeaverseNextRenderer, type WeaverseNextRendererProps, WeaverseNextRequestContext, WeaverseNextRequestInfo, type WeaverseNextRouterLike, WeaverseNextRuntime, WeaverseNextRuntimeConfig, WeaverseNextRuntimeInternal, WeaverseNextStudio, WeaverseNextStudioBridge, type WeaverseNextStudioBridgeProps, WeaverseNextStudioConnect, type WeaverseNextStudioConnectProps, type WeaverseNextStudioInternals, type WeaverseNextStudioProps, WeaverseNextThemeSettingsStore, bindWeaverseNextStudioRuntime, buildWeaverseNextRequestInfo, createWeaverseNextClient, createWeaverseNextRuntime, createWeaverseNextStudioInternals, createWeaverseNextThemeSettingsStore, resolveWeaverseNextStudioScriptSrc, runWeaverseComponentLoaders, useThemeSettings, useWeaverseCommerce, useWeaverseNextStudioInternals, useWeaversePageData, useWeaverseRootData };
|