@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.
Files changed (107) hide show
  1. package/README.md +586 -123
  2. package/dist/chunk-LH6AAEIK.mjs +326 -0
  3. package/dist/chunk-LH6AAEIK.mjs.map +1 -0
  4. package/dist/index.js +784 -60
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +588 -58
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/server.js +537 -76
  9. package/dist/server.js.map +1 -1
  10. package/dist/server.mjs +363 -27
  11. package/dist/server.mjs.map +1 -1
  12. package/dist/types/client.d.ts +16 -0
  13. package/dist/types/client.d.ts.map +1 -0
  14. package/dist/types/hooks.d.ts +20 -0
  15. package/dist/types/hooks.d.ts.map +1 -0
  16. package/dist/types/index.d.ts +34 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/types/item.d.ts +60 -0
  19. package/dist/types/item.d.ts.map +1 -0
  20. package/dist/types/loader.d.ts +25 -0
  21. package/dist/types/loader.d.ts.map +1 -0
  22. package/dist/types/main.d.ts +11 -0
  23. package/dist/types/main.d.ts.map +1 -0
  24. package/dist/types/provider.d.ts +82 -0
  25. package/dist/types/provider.d.ts.map +1 -0
  26. package/dist/types/registry.d.ts +15 -0
  27. package/dist/types/registry.d.ts.map +1 -0
  28. package/dist/types/renderer.d.ts +21 -0
  29. package/dist/types/renderer.d.ts.map +1 -0
  30. package/dist/types/request-info.d.ts +19 -0
  31. package/dist/types/request-info.d.ts.map +1 -0
  32. package/dist/types/revalidate-item.d.ts +82 -0
  33. package/dist/types/revalidate-item.d.ts.map +1 -0
  34. package/dist/types/root-provider.d.ts +62 -0
  35. package/dist/types/root-provider.d.ts.map +1 -0
  36. package/dist/types/runtime.d.ts +113 -0
  37. package/dist/types/runtime.d.ts.map +1 -0
  38. package/dist/types/seo.d.ts +55 -0
  39. package/dist/types/seo.d.ts.map +1 -0
  40. package/dist/types/server/configs.d.ts +27 -0
  41. package/dist/types/server/configs.d.ts.map +1 -0
  42. package/dist/types/server/normalize-page-url.d.ts +19 -0
  43. package/dist/types/server/normalize-page-url.d.ts.map +1 -0
  44. package/dist/types/server/revalidate-handler.d.ts +55 -0
  45. package/dist/types/server/revalidate-handler.d.ts.map +1 -0
  46. package/dist/types/server/server-client.d.ts +21 -0
  47. package/dist/types/server/server-client.d.ts.map +1 -0
  48. package/dist/types/server.d.ts +19 -0
  49. package/dist/types/server.d.ts.map +1 -0
  50. package/dist/types/studio-bridge.d.ts +16 -0
  51. package/dist/types/studio-bridge.d.ts.map +1 -0
  52. package/dist/types/studio-connect.d.ts +27 -0
  53. package/dist/types/studio-connect.d.ts.map +1 -0
  54. package/dist/types/studio-router.d.ts +50 -0
  55. package/dist/types/studio-router.d.ts.map +1 -0
  56. package/dist/types/studio-script-src.d.ts +12 -0
  57. package/dist/types/studio-script-src.d.ts.map +1 -0
  58. package/dist/types/theme-settings-store.d.ts +18 -0
  59. package/dist/types/theme-settings-store.d.ts.map +1 -0
  60. package/dist/types/translation-context.d.ts +156 -0
  61. package/dist/types/translation-context.d.ts.map +1 -0
  62. package/dist/types/translation-store.d.ts +44 -0
  63. package/dist/types/translation-store.d.ts.map +1 -0
  64. package/dist/types/types.d.ts +665 -0
  65. package/dist/types/types.d.ts.map +1 -0
  66. package/dist/types/use-weaverse-next-studio.d.ts +34 -0
  67. package/dist/types/use-weaverse-next-studio.d.ts.map +1 -0
  68. package/dist/types/utils.d.ts +12 -0
  69. package/dist/types/utils.d.ts.map +1 -0
  70. package/package.json +12 -8
  71. package/src/client.ts +102 -0
  72. package/src/hooks.ts +50 -0
  73. package/src/index.ts +153 -0
  74. package/src/item.ts +167 -0
  75. package/src/loader.ts +135 -0
  76. package/src/main.tsx +45 -0
  77. package/src/provider.tsx +225 -0
  78. package/src/registry.ts +63 -0
  79. package/src/renderer.tsx +100 -0
  80. package/src/request-info.ts +124 -0
  81. package/src/revalidate-item.ts +211 -0
  82. package/src/root-provider.tsx +182 -0
  83. package/src/runtime.ts +555 -0
  84. package/src/seo.ts +157 -0
  85. package/src/server/configs.ts +178 -0
  86. package/src/server/normalize-page-url.ts +73 -0
  87. package/src/server/revalidate-handler.ts +357 -0
  88. package/src/server/server-client.ts +728 -0
  89. package/src/server.ts +67 -0
  90. package/src/studio-bridge.tsx +82 -0
  91. package/src/studio-connect.tsx +88 -0
  92. package/src/studio-router.ts +85 -0
  93. package/src/studio-script-src.ts +128 -0
  94. package/src/theme-settings-store.ts +47 -0
  95. package/src/translation-context.tsx +299 -0
  96. package/src/translation-store.ts +69 -0
  97. package/src/types.ts +753 -0
  98. package/src/use-weaverse-next-studio.tsx +106 -0
  99. package/src/utils.ts +37 -0
  100. package/dist/chunk-SS6QUKYY.mjs +0 -149
  101. package/dist/chunk-SS6QUKYY.mjs.map +0 -1
  102. package/dist/index.d.mts +0 -250
  103. package/dist/index.d.ts +0 -250
  104. package/dist/server.d.mts +0 -60
  105. package/dist/server.d.ts +0 -60
  106. package/dist/types-DvEeLX6L.d.mts +0 -321
  107. 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
+ }
@@ -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":";AAUO,SAAS,uBACd,MAAA,EACyB;AACzB,EAAA,IAAI,OAAgC,EAAC;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GACD,MAAA,CAAO,QAAA,IAGP,MAAA,CAAyC,aAC1C,EAAC;AAEH,EAAA,KAAA,IAAS,SAAS,MAAA,EAAQ;AACxB,IAAA,KAAA,IAAS,KAAA,IAAS,KAAA,EAAO,MAAA,IAAU,EAAC,EAAG;AACrC,MAAA,IAAI,EAAE,IAAA,EAAM,YAAA,EAAa,GAAI,KAAA;AAC7B,MAAA,IAAI,IAAA,IAAQ,YAAA,KAAiB,IAAA,IAAQ,YAAA,KAAiB,MAAA,EAAW;AAC/D,QAAA,IAAA,CAAK,IAAI,CAAA,GAAI,YAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACjBA,SAAS,WAAW,IAAA,EAAkD;AACpE,EAAA,OACE,OAAO,IAAA,KAAS,QAAA,IAChB,SAAS,IAAA,IACT,OAAQ,KAAmC,IAAA,KAAS,QAAA;AAExD;AAEA,SAAS,UAAU,IAAA,EAA4D;AAC7E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,UAAU,KAAA,CAAM,OAAA,CAAQ,KAAK,QAAQ,CAAA,GACjC,KAAK,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,KAAA,KACjB,UAAA,CAAW,KAAK,CAAA,GAAI,UAAU,KAAK,CAAA,GAAI,EAAE,GAAG,KAAA;AAAM,QAEpD,IAAA,CAAK;AAAA,GACX;AACF;AAaA,eAAsB,4BACpB,IAAA,EACwC;AACxC,EAAA,IAAI,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAS,GAAI,IAAA;AACpC,EAAA,IAAI,UAAA,GAAa,IAAA,CAAK,IAAA,IAAQ,MAAA,CAAO,IAAA;AACrC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ;AACjC,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,GAA+B;AAAA,IACjC,GAAG,UAAA;AAAA,IACH,IAAA,EAAM;AAAA,MACJ,GAAG,UAAA,CAAW,IAAA;AAAA,MACd,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAI,SAAS;AAAA;AAC5C,GACF;AACA,EAAA,IAAI,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA;AAEtB,EAAA,IAAI,YAAA,uBAAmB,GAAA,EAAmC;AAC1D,EAAA,KAAA,IAAS,SAAA,IAAa,OAAO,UAAA,EAAY;AACvC,IAAA,IAAI,SAAA,EAAW,QAAQ,IAAA,EAAM;AAC3B,MAAA,YAAA,CAAa,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,SAAS,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,uBAAc,GAAA,EAAY;AAC9B,EAAA,IAAI,eAAA,GAAkB,WAAW,MAAA,CAAO,cAAA;AACxC,EAAA,IAAI,gBAAA,GAAmB,YAAY,MAAA,CAAO,QAAA;AAQ1C,EAAA,IAAI,gBAAA,GACF,gBAAA,KAAqB,MAAA,CAAO,QAAA,GACxB,MAAA,GACA;AAAA,IACE,GAAG,MAAA;AAAA,IACH,QAAA,EAAU,gBAAA;AAAA,IACV,YAAY,gBAAA,EAAkB;AAAA,GAChC;AAEN,EAAA,eAAe,KAAK,KAAA,EAAoC;AACtD,IAAA,KAAA,IAAS,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACjC,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AAEnB,MAAA,IAAI,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC1C,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,UAAA,GAAa,MAAM,SAAA,CAAU,MAAA,CAAO;AAAA,YACvC,IAAA,EAAM,EAAE,GAAG,sBAAA,CAAuB,UAAU,MAAM,CAAA,EAAG,GAAG,IAAA,CAAK,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU,gBAAA;AAAA,YACV,OAAA,EAAS,eAAA;AAAA,YACT,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAK,gCAAA,EAA6B,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,QACrE;AAAA,MACF;AAEA,MAAA,IAAI,WAAW,IAAA,CAAK,QAAA;AACpB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,IAAI,iBAAiB,QAAA,CAAS,MAAA;AAAA,UAC5B;AAAA,SACF;AACA,QAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,UAAA,MAAM,KAAK,cAAc,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAK,KAAK,CAAA;AAChB,EAAA,OAAO,IAAA;AACT;;;AC7HA,SAAS,MAAM,KAAA,EAA0B;AACvC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,IAAI,GAAA,CAAI,KAAA,EAAO,kBAAkB,CAAA,GAAI,KAAA;AAC1E;AAEA,SAAS,2BACP,OAAA,EACiB;AACjB,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,OAAO,IAAI,eAAA,CAAgB,OAAA,CAAQ,YAAY,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,OAAO,IAAI,eAAA,CAAgB,GAAA,CAAI,YAAY,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,IAAI,eAAA,EAAgB;AAC7B;AAEA,SAAS,uBAAuB,OAAA,EAA8C;AAC5E,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,OAAA,CAAQ,QAAA;AAAA,EACjB;AAEA,EAAA,IAAI,SAAS,GAAA,EAAK;AAChB,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,OAAO,IAAI,QAAA,IAAY,GAAA;AAAA,EACzB;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAiB,KAAA,EAAiC;AACzD,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cACP,YAAA,EACkC;AAClC,EAAA,IAAI,UAA4C,EAAC;AACjD,EAAA,KAAA,IAAS,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AAC/C,IAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,gBAAA,CAAiB,KAAK,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,6BACd,OAAA,EACyB;AACzB,EAAA,IAAI,YAAA,GAAe,2BAA2B,OAAO,CAAA;AACrD,EAAA,IAAI,MAAA,GAAS,aAAa,QAAA,EAAS;AAEnC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,uBAAuB,OAAO,CAAA;AAAA,IACxC,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,IAChC,OAAA,EAAS,cAAc,YAAY,CAAA;AAAA,IACnC,GAAI,SAAS,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS;AAAC,GAChD;AACF","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 };