@weaverse/next 0.1.0-alpha.13 → 0.1.0-alpha.14

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 (106) hide show
  1. package/README.md +125 -23
  2. package/dist/{chunk-MQ6N5ODA.mjs → chunk-NL22OVD7.mjs} +93 -4
  3. package/dist/chunk-NL22OVD7.mjs.map +1 -0
  4. package/dist/index.js +85 -4
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +19 -26
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/server.js +158 -2
  9. package/dist/server.js.map +1 -1
  10. package/dist/server.mjs +126 -5
  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 +54 -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 +20 -0
  29. package/dist/types/renderer.d.ts.map +1 -0
  30. package/dist/types/request-info.d.ts +8 -0
  31. package/dist/types/request-info.d.ts.map +1 -0
  32. package/dist/types/revalidate-item.d.ts +81 -0
  33. package/dist/types/revalidate-item.d.ts.map +1 -0
  34. package/dist/types/root-provider.d.ts +61 -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 +17 -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 +661 -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 +7 -6
  71. package/src/client.ts +101 -0
  72. package/src/hooks.ts +50 -0
  73. package/src/index.ts +153 -0
  74. package/src/item.ts +151 -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 +99 -0
  80. package/src/request-info.ts +95 -0
  81. package/src/revalidate-item.ts +210 -0
  82. package/src/root-provider.tsx +181 -0
  83. package/src/runtime.ts +521 -0
  84. package/src/seo.ts +157 -0
  85. package/src/server/configs.ts +182 -0
  86. package/src/server/normalize-page-url.ts +65 -0
  87. package/src/server/revalidate-handler.ts +357 -0
  88. package/src/server/server-client.ts +727 -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 +125 -0
  94. package/src/theme-settings-store.ts +46 -0
  95. package/src/translation-context.tsx +299 -0
  96. package/src/translation-store.ts +69 -0
  97. package/src/types.ts +748 -0
  98. package/src/use-weaverse-next-studio.tsx +106 -0
  99. package/src/utils.ts +37 -0
  100. package/dist/chunk-MQ6N5ODA.mjs.map +0 -1
  101. package/dist/index.d.mts +0 -592
  102. package/dist/index.d.ts +0 -592
  103. package/dist/seo-CrEFl_Up.d.mts +0 -516
  104. package/dist/seo-CrEFl_Up.d.ts +0 -516
  105. package/dist/server.d.mts +0 -100
  106. package/dist/server.d.ts +0 -100
package/dist/server.js CHANGED
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ var schema = require('@weaverse/schema');
4
+
3
5
  // src/seo.ts
4
6
  function hasOpenGraphContent(seo) {
5
7
  return Boolean(seo?.title || seo?.description || seo?.image || seo?.type);
@@ -180,6 +182,36 @@ function resolveRequestUrl(context) {
180
182
  let search = context?.searchParams ? new URLSearchParams(context.searchParams).toString() : "";
181
183
  return `http://localhost${pathname}${search ? `?${search}` : ""}`;
182
184
  }
185
+ var DENIED_ROUTE_CONTEXT_PARAMS = [
186
+ "weaverseprojectid",
187
+ "weaversehost",
188
+ "weaverseapikey",
189
+ "weaverseapibase",
190
+ "weaversepublicapibase",
191
+ "weaverseversion",
192
+ "projectid",
193
+ "weaversedraftitem",
194
+ "__weaversedraftitem",
195
+ "_rsc"
196
+ ];
197
+ var ROUTE_CONTEXT_I18N_KEYS = [
198
+ "country",
199
+ "label",
200
+ "language",
201
+ "locale",
202
+ "pathPrefix"
203
+ ];
204
+ function sanitizeRouteContextSearch(search) {
205
+ let params = new URLSearchParams(search);
206
+ let denied = new Set(DENIED_ROUTE_CONTEXT_PARAMS);
207
+ for (let key of [...new Set(params.keys())]) {
208
+ if (denied.has(key.toLowerCase())) {
209
+ params.delete(key);
210
+ }
211
+ }
212
+ let serialized = params.toString();
213
+ return serialized ? `?${serialized}` : "";
214
+ }
183
215
 
184
216
  // src/utils.ts
185
217
  function generateDataFromSchema(schema) {
@@ -209,6 +241,119 @@ var STATUS_BAD_REQUEST = 400;
209
241
  var STATUS_NOT_FOUND = 404;
210
242
  var STATUS_UNPROCESSABLE = 422;
211
243
  var STATUS_SERVER_ERROR = 500;
244
+ var MAX_PATHNAME_LENGTH = 2048;
245
+ var MAX_SEARCH_LENGTH = 8192;
246
+ var MAX_HANDLE_LENGTH = 512;
247
+ var MAX_I18N_FIELD_LENGTH = 256;
248
+ var CONTROL_CHAR_PATTERN = /[\u0000-\u001F\u007F]/;
249
+ function isValidPathname(pathname) {
250
+ if (!pathname || pathname.length > MAX_PATHNAME_LENGTH) {
251
+ return false;
252
+ }
253
+ if (pathname[0] !== "/" || pathname.startsWith("//")) {
254
+ return false;
255
+ }
256
+ if (pathname.includes("\\") || pathname.includes("?")) {
257
+ return false;
258
+ }
259
+ if (pathname.includes("#") || CONTROL_CHAR_PATTERN.test(pathname)) {
260
+ return false;
261
+ }
262
+ return true;
263
+ }
264
+ function isPlainObject(value) {
265
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
266
+ return false;
267
+ }
268
+ let proto = Object.getPrototypeOf(value);
269
+ return proto === Object.prototype || proto === null;
270
+ }
271
+ function sanitizeRouteContextI18n(input) {
272
+ if (input === void 0) {
273
+ return;
274
+ }
275
+ if (!isPlainObject(input)) {
276
+ return null;
277
+ }
278
+ let source = input;
279
+ let allowed = new Set(ROUTE_CONTEXT_I18N_KEYS);
280
+ for (let key of Object.keys(source)) {
281
+ if (!allowed.has(key)) {
282
+ return null;
283
+ }
284
+ }
285
+ let result = {};
286
+ for (let key of ROUTE_CONTEXT_I18N_KEYS) {
287
+ let value = source[key];
288
+ if (value === void 0) {
289
+ continue;
290
+ }
291
+ if (typeof value !== "string" || value.length > MAX_I18N_FIELD_LENGTH) {
292
+ return null;
293
+ }
294
+ result[key] = value;
295
+ }
296
+ return Object.keys(result).length ? result : void 0;
297
+ }
298
+ function reconstructRouteContext(request, routeContext) {
299
+ if (typeof routeContext !== "object" || routeContext === null || Array.isArray(routeContext)) {
300
+ return null;
301
+ }
302
+ let { pathname, search, handle, pageType, i18n } = routeContext;
303
+ if (typeof pathname !== "string" || !isValidPathname(pathname)) {
304
+ return null;
305
+ }
306
+ if (typeof search !== "string" || search.length > MAX_SEARCH_LENGTH) {
307
+ return null;
308
+ }
309
+ let rawSearch = search;
310
+ if (rawSearch.length && !rawSearch.startsWith("?")) {
311
+ return null;
312
+ }
313
+ let sanitizedI18n = sanitizeRouteContextI18n(i18n);
314
+ if (sanitizedI18n === null) {
315
+ return null;
316
+ }
317
+ let resolvedPageType;
318
+ if (pageType !== void 0) {
319
+ let parsed = schema.PageTypeSchema.safeParse(pageType);
320
+ if (!parsed.success) {
321
+ return null;
322
+ }
323
+ resolvedPageType = parsed.data;
324
+ }
325
+ let resolvedHandle;
326
+ if (handle !== void 0) {
327
+ if (typeof handle !== "string" || !handle || handle.length > MAX_HANDLE_LENGTH) {
328
+ return null;
329
+ }
330
+ resolvedHandle = handle;
331
+ }
332
+ let endpointUrl = new URL(request.url);
333
+ let routeUrl = new URL(endpointUrl.origin);
334
+ routeUrl.pathname = pathname;
335
+ routeUrl.search = sanitizeRouteContextSearch(rawSearch);
336
+ let canonicalPathname = routeUrl.pathname;
337
+ let searchParams = routeUrl.searchParams;
338
+ let lastParam2 = (key) => {
339
+ let values = searchParams.getAll(key);
340
+ return values.length ? values.at(-1) : void 0;
341
+ };
342
+ return {
343
+ pathname: canonicalPathname,
344
+ searchParams,
345
+ url: routeUrl,
346
+ // Headers come from the actual same-origin POST, never its JSON body.
347
+ headers: new Headers(request.headers),
348
+ ...sanitizedI18n ? { i18n: sanitizedI18n } : {},
349
+ ...resolvedPageType ? { pageType: resolvedPageType } : {},
350
+ ...resolvedHandle ? { handle: resolvedHandle } : {},
351
+ isDesignMode: lastParam2("isDesignMode") === "true",
352
+ isPreviewMode: lastParam2("isPreviewMode") === "true",
353
+ isRevisionPreview: searchParams.has("__revisionId"),
354
+ sectionType: lastParam2("sectionType") || void 0
355
+ };
356
+ }
212
357
  function json(body, status) {
213
358
  return new Response(JSON.stringify(body), {
214
359
  status,
@@ -242,9 +387,18 @@ function createWeaverseNextRevalidateHandler(config) {
242
387
  if (!draftItem) {
243
388
  return json({ error: "invalid-payload" }, STATUS_BAD_REQUEST);
244
389
  }
390
+ let requestContext;
391
+ let body = payload;
392
+ if (Object.hasOwn(body, "routeContext")) {
393
+ let reconstructed = reconstructRouteContext(request, body.routeContext);
394
+ if (!reconstructed) {
395
+ return json({ error: "invalid-route-context" }, STATUS_BAD_REQUEST);
396
+ }
397
+ requestContext = reconstructed;
398
+ }
245
399
  let client;
246
400
  try {
247
- client = await config.getClient(request);
401
+ client = await config.getClient(request, requestContext);
248
402
  } catch (error) {
249
403
  console.error("\u274C Revalidate handler getClient failed.", error);
250
404
  return json({ error: "client-init-failed" }, STATUS_SERVER_ERROR);
@@ -420,7 +574,9 @@ function buildWeaverseNextRequestInfo(context) {
420
574
  pathname: getPathnameFromContext(context),
421
575
  search: search ? `?${search}` : "",
422
576
  queries: toQueryRecord(searchParams),
423
- ...context?.i18n ? { i18n: context.i18n } : {}
577
+ ...context?.i18n ? { i18n: context.i18n } : {},
578
+ ...context?.pageType ? { pageType: context.pageType } : {},
579
+ ...context?.handle ? { handle: context.handle } : {}
424
580
  };
425
581
  }
426
582