@riverbankcms/sdk 0.89.1 → 0.90.0

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 (161) hide show
  1. package/README.md +27 -4
  2. package/dist/{PreviewEditorSidebar-JDR64FEC.mjs → PreviewEditorSidebar-KVXNF3VW.mjs} +3 -3
  3. package/dist/{PreviewEditorUI-67TMJMAF.mjs → PreviewEditorUI-J3JN5Z7T.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-UBL6MSNP.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +216 -0
  6. package/dist/_dts/altcha/src/AltchaWidget.d.ts +1 -1
  7. package/dist/_dts/api/src/bookingOperations.d.ts +2 -0
  8. package/dist/_dts/api/src/bookingRecords.d.ts +4 -2
  9. package/dist/_dts/api/src/bookings.d.ts +3 -1
  10. package/dist/_dts/api/src/index.d.ts +6 -5
  11. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +15 -5
  12. package/dist/_dts/api/src/request.d.ts +21 -0
  13. package/dist/_dts/api/src/sdk-event-upsert.d.ts +3 -1
  14. package/dist/_dts/api/src/sdkContracts.d.ts +2 -0
  15. package/dist/_dts/api/src/types.d.ts +3 -1
  16. package/dist/_dts/api/src/url.d.ts +6 -3
  17. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +1 -0
  18. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterThumbnailCard.d.ts +5 -1
  19. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterThumbnailGrid.d.ts +9 -1
  20. package/dist/_dts/block-form/src/widgets/RepeaterField/components/index.d.ts +1 -0
  21. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +7 -11
  22. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -0
  23. package/dist/_dts/blocks/src/index.d.ts +2 -1
  24. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -6
  25. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -4
  26. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +0 -2
  27. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +3 -3
  28. package/dist/_dts/blocks/src/system/blocks/shop.shared.d.ts +8 -0
  29. package/dist/_dts/blocks/src/system/constants/events.d.ts +4 -1
  30. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +3 -1
  31. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +17 -5
  33. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +51 -6
  34. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -0
  35. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +2 -2
  36. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +1 -17
  37. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +5 -9
  38. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +5 -9
  39. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +2 -1
  40. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +24 -0
  41. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +5 -0
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +4 -4
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +50 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +2 -2
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +21 -0
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  47. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +11 -1
  48. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +2 -1
  49. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +11 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/calendarViewOptions.d.ts +10 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventProductEligibility.d.ts +24 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +5 -2
  53. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +2 -2
  54. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  55. package/dist/_dts/content-model/src/entry-slots/sdkBlocks.d.ts +21 -0
  56. package/dist/_dts/content-model/src/entry-slots/types.d.ts +7 -0
  57. package/dist/_dts/core/src/money-input.d.ts +18 -0
  58. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +50 -0
  59. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -1
  60. package/dist/_dts/media-editor/src/fieldUi.d.ts +6 -0
  61. package/dist/_dts/media-editor/src/index.d.ts +1 -1
  62. package/dist/_dts/preview-next/src/client/index.d.ts +1 -0
  63. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -2
  64. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -2
  65. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +3 -2
  66. package/dist/_dts/preview-next/src/client/preview/SiteChromeEditableSurface.d.ts +2 -2
  67. package/dist/_dts/preview-next/src/client/preview/themeRuntime.d.ts +6 -0
  68. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewMode.d.ts +2 -1
  69. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +10 -0
  70. package/dist/_dts/sdk/src/cli/content/reader.d.ts +12 -5
  71. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -55
  72. package/dist/_dts/sdk/src/components.d.ts +1 -0
  73. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  74. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -1
  75. package/dist/_dts/sdk/src/next/types.d.ts +8 -11
  76. package/dist/_dts/sdk/src/preview-next/client/index.d.ts +1 -1
  77. package/dist/_dts/sdk/src/rendering/blocks-theme-scope.d.ts +2 -1
  78. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +8 -7
  79. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +5 -6
  80. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -0
  81. package/dist/_dts/sdk/src/rendering/server.d.ts +1 -0
  82. package/dist/_dts/sdk/src/rendering/themeRuntime.d.ts +26 -0
  83. package/dist/_dts/sdk/src/version.d.ts +1 -1
  84. package/dist/_dts/site-commands/src/commands.d.ts +18 -0
  85. package/dist/_dts/theme-core/src/ResponsiveScope.d.ts +12 -0
  86. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  87. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +2 -2
  88. package/dist/_dts/theme-core/src/buttons/types.d.ts +5 -5
  89. package/dist/_dts/theme-core/src/cards/types.d.ts +2 -2
  90. package/dist/_dts/theme-core/src/index.d.ts +2 -0
  91. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +21 -21
  92. package/dist/_dts/theme-core/src/schema.d.ts +18 -18
  93. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  94. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -2
  95. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +4 -4
  96. package/dist/_dts/theme-core/src/themeRuntime.d.ts +11 -0
  97. package/dist/{chunk-HKJQERFR.mjs → chunk-AEOYWPE4.mjs} +91 -55
  98. package/dist/{chunk-F645A5UV.mjs → chunk-BOQXMCSP.mjs} +129 -101
  99. package/dist/{chunk-ZQRBLCW5.mjs → chunk-GSPFFUVB.mjs} +2 -2
  100. package/dist/{chunk-7YUAXONX.mjs → chunk-PMBB6MQ7.mjs} +1280 -774
  101. package/dist/{chunk-TGBJWKMP.mjs → chunk-RQ3XZ4SJ.mjs} +9 -1
  102. package/dist/{chunk-7N46MZHI.mjs → chunk-UG7I7S7W.mjs} +1 -1
  103. package/dist/cli/index.mjs +899 -531
  104. package/dist/cli/init-docs/content/cli-reference.md +6 -1
  105. package/dist/cli/init-docs/content/content-management.md +27 -0
  106. package/dist/client/{accordion-MUCVNGQ7.mjs → accordion-GXQNWQ6O.mjs} +1 -1
  107. package/dist/client/{bookingForm-PKD6EFIE.mjs → bookingForm-STLUJ36H.mjs} +25 -270
  108. package/dist/client/bookings.mjs +432 -269
  109. package/dist/client/{carousel-3TKQSNJC.mjs → carousel-CVRN6EPP.mjs} +1 -1
  110. package/dist/client/{cart-6XHSZK23.mjs → cart-IYIBA5CL.mjs} +5 -6
  111. package/dist/client/{checkout-FVSPM6FI.mjs → checkout-O3BGM4GS.mjs} +5 -6
  112. package/dist/client/chunk-4RTFGHZN.mjs +433 -0
  113. package/dist/client/{chunk-UQFY4AHX.mjs → chunk-6DPXDOIL.mjs} +65 -28
  114. package/dist/client/{chunk-ZT5XE7FK.mjs → chunk-D3ETC2SU.mjs} +1 -1
  115. package/dist/client/{chunk-CQKKFEQD.mjs → chunk-DAS5CIER.mjs} +274 -105
  116. package/dist/client/{chunk-SDIYSQAY.mjs → chunk-HIHOQGIP.mjs} +2 -3
  117. package/dist/client/{chunk-ZJZZA5EP.mjs → chunk-MFPKS6QS.mjs} +11 -14
  118. package/dist/client/{chunk-EY42X22F.mjs → chunk-NBFRJ5NB.mjs} +156 -4
  119. package/dist/client/{chunk-VGLXACVK.mjs → chunk-VFHZLZAC.mjs} +1 -1
  120. package/dist/client/{chunk-STJ2NCQM.mjs → chunk-WHZQDPBZ.mjs} +19 -1
  121. package/dist/client/{chunk-RSQWWUAD.mjs → chunk-Z62JYS5O.mjs} +3 -3
  122. package/dist/client/client.mjs +3292 -2827
  123. package/dist/client/{courseRegistration-ATZSYDHM.mjs → courseRegistration-2D3ACMJR.mjs} +18 -56
  124. package/dist/client/{eventCalendar-6T2UGKKP.mjs → eventCalendar-QY4UZUFF.mjs} +8 -9
  125. package/dist/client/{eventCombined-Q4VANXVF.mjs → eventCombined-RRCDKJC2.mjs} +8 -9
  126. package/dist/client/{eventDetails-DW37E7VW.mjs → eventDetails-YO335BUT.mjs} +8 -9
  127. package/dist/client/{eventListing-XURTSAUW.mjs → eventListing-PXA6GFQ3.mjs} +8 -9
  128. package/dist/client/{eventRegistration-MRKEVAXW.mjs → eventRegistration-2ZHEDDXO.mjs} +8 -9
  129. package/dist/client/{form-WZZFFGMU.mjs → form-ZS6KX4U2.mjs} +6 -6
  130. package/dist/client/{headerSection-EQYVQBLM.mjs → headerSection-QK5SLIIB.mjs} +2 -2
  131. package/dist/client/hooks.mjs +1084 -1029
  132. package/dist/client/{locationMap-MFF5VAZR.mjs → locationMap-GFNIUD2X.mjs} +2 -2
  133. package/dist/client/{newsletterForm-JQ77UYIE.mjs → newsletterForm-PGLTTCUG.mjs} +4 -4
  134. package/dist/client/{productDetail-25LMT3IZ.mjs → productDetail-OPBE5ZPI.mjs} +5 -6
  135. package/dist/client/{productList-5ABEMKUG.mjs → productList-NI72Q62Z.mjs} +5 -6
  136. package/dist/client/rendering/client.mjs +2692 -2285
  137. package/dist/client/rendering/islands.mjs +18 -18
  138. package/dist/client/rendering.mjs +2611 -2156
  139. package/dist/client/{shop-OMMQZ6YO.mjs → shop-3ZQPEWYI.mjs} +5 -6
  140. package/dist/client/spam-protection.mjs +4 -5
  141. package/dist/preview-next/before-render.mjs +2 -2
  142. package/dist/preview-next/client/runtime.mjs +5 -5
  143. package/dist/{sdk-runtime-WNLBZ3ZH.mjs → sdk-runtime-FSHXCWDS.mjs} +6 -6
  144. package/dist/server/components.mjs +1722 -1453
  145. package/dist/server/config-validation.mjs +1316 -1261
  146. package/dist/server/config.mjs +1316 -1261
  147. package/dist/server/data.mjs +1084 -1029
  148. package/dist/server/index.mjs +135 -100
  149. package/dist/server/navigation.mjs +20 -30
  150. package/dist/server/next.mjs +1782 -1500
  151. package/dist/server/page-converter.mjs +1009 -946
  152. package/dist/server/prebuild.mjs +1 -1
  153. package/dist/server/rendering/server.mjs +1722 -1453
  154. package/dist/server/rendering.mjs +1728 -1459
  155. package/dist/server/routing.mjs +1127 -1045
  156. package/dist/server/server.mjs +1219 -1129
  157. package/dist/server/theme-bridge.mjs +8 -5
  158. package/package.json +2 -2
  159. package/dist/SdkPreviewModeRuntime-ZBEMRV7N.mjs +0 -8
  160. package/dist/client/chunk-LQFDYWPJ.mjs +0 -184
  161. package/dist/client/chunk-ZFHRN6W2.mjs +0 -66
@@ -6486,19 +6486,23 @@ function normalizeDashboardOrigin(input) {
6486
6486
  }
6487
6487
  function deriveCmsApiUrlFromDashboardUrl(input) {
6488
6488
  const origin = normalizeDashboardOrigin(input);
6489
- return origin ? `${origin}/api` : "";
6489
+ return origin ? normalizeCmsApiBaseUrl(`${origin}/api`) : "";
6490
+ }
6491
+ function normalizeCmsApiBaseUrl(input) {
6492
+ return input.trim().replace(/\/+$/, "").replace(/(?:\/api)+$/i, "/api");
6490
6493
  }
6491
6494
  function getCmsApiUrl() {
6492
6495
  if (typeof window !== "undefined") {
6493
- return "/api";
6496
+ return normalizeCmsApiBaseUrl("/api");
6494
6497
  }
6495
6498
  const internalUrl = process.env.CMS_API_URL;
6496
6499
  if (internalUrl) {
6497
- return internalUrl.replace(/\/$/, "");
6500
+ return normalizeCmsApiBaseUrl(internalUrl);
6498
6501
  }
6499
6502
  const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;
6500
6503
  if (dashboardUrl) {
6501
- return deriveCmsApiUrlFromDashboardUrl(dashboardUrl);
6504
+ const apiUrl = deriveCmsApiUrlFromDashboardUrl(dashboardUrl);
6505
+ if (apiUrl) return apiUrl;
6502
6506
  }
6503
6507
  throw new Error(
6504
6508
  "CMS_API_URL or NEXT_PUBLIC_DASHBOARD_URL is not configured. Set NEXT_PUBLIC_DASHBOARD_URL to your dashboard URL (e.g., http://localhost:4000)"
@@ -6607,6 +6611,27 @@ function serializeQueryValue(value) {
6607
6611
  if (value instanceof Date) return value.toISOString();
6608
6612
  return null;
6609
6613
  }
6614
+ function normalizeHeaders(source) {
6615
+ const normalized = {};
6616
+ if (!source) return normalized;
6617
+ new Headers(source).forEach((value, key) => {
6618
+ normalized[key] = value;
6619
+ });
6620
+ return normalized;
6621
+ }
6622
+ function buildRequestHeaders(input) {
6623
+ const headers = {
6624
+ ...normalizeHeaders(input.optionsHeaders),
6625
+ ...normalizeHeaders(input.authHeaders)
6626
+ };
6627
+ if (input.sdkVersion) {
6628
+ headers["x-sdk-version"] = input.sdkVersion;
6629
+ }
6630
+ if (input.includeJsonContentType) {
6631
+ headers["Content-Type"] = "application/json";
6632
+ }
6633
+ return headers;
6634
+ }
6610
6635
  function serializePathParam(endpoint, key, value) {
6611
6636
  if (typeof value === "string") {
6612
6637
  return value;
@@ -6742,104 +6767,20 @@ function createRawCMSClient(headers = {}, baseUrl) {
6742
6767
  params,
6743
6768
  options = {}
6744
6769
  }) => {
6745
- const resolvedBaseUrl = baseUrl ?? resolveApiBaseUrl();
6746
- let url = buildEndpointURL(resolvedBaseUrl, endpoint);
6747
- const originalPath = API_ENDPOINTS[endpoint].path;
6748
- const unusedParams = {};
6749
- if (params) {
6750
- Object.entries(params).forEach(([key, value]) => {
6751
- const bracePlaceholder = `{${key}}`;
6752
- const colonPlaceholder = `:${key}`;
6753
- if (originalPath.includes(bracePlaceholder) || originalPath.includes(colonPlaceholder)) {
6754
- const stringValue = serializePathParam(endpoint, key, value);
6755
- url = url.replace(bracePlaceholder, stringValue);
6756
- url = url.replace(colonPlaceholder, stringValue);
6757
- } else {
6758
- unusedParams[key] = value;
6759
- }
6760
- });
6761
- }
6762
- const unresolvedPathParams = [
6763
- ...url.match(/\{[^}]+\}/g) ?? [],
6764
- ...url.match(/(^|\/):([A-Za-z][A-Za-z0-9_]*)\b/g) ?? []
6765
- ];
6766
- if (unresolvedPathParams.length > 0) {
6767
- const missingParams = Array.from(
6768
- new Set(
6769
- unresolvedPathParams.map((token) => {
6770
- if (token.startsWith("{") && token.endsWith("}")) {
6771
- return token.slice(1, -1);
6772
- }
6773
- return token.replace(/^\//, "").slice(1);
6774
- })
6775
- )
6776
- );
6777
- throw new Error(
6778
- `Missing required path params for endpoint ${String(endpoint)}: ${missingParams.join(", ")}`
6779
- );
6780
- }
6781
- const endpointConfig = API_ENDPOINTS[endpoint];
6782
- const method = endpointConfig.method;
6783
- const isGetOrHead = method === "GET" || method === "HEAD";
6784
- const queryParams = new URLSearchParams();
6785
- Object.entries(unusedParams).forEach(([key, value]) => {
6786
- appendQueryParam(queryParams, key, value);
6770
+ const plan = buildApiRequestPlan({
6771
+ endpoint,
6772
+ body,
6773
+ params,
6774
+ options,
6775
+ headers,
6776
+ baseUrl: normalizeCmsApiBaseUrl(baseUrl ?? resolveApiBaseUrl()),
6777
+ sdkVersion
6787
6778
  });
6788
- if (isGetOrHead && typeof body === "object" && body !== null && !isFormDataBody(body)) {
6789
- Object.entries(body).forEach(([key, value]) => {
6790
- appendQueryParam(queryParams, key, value);
6791
- });
6792
- }
6793
- const queryString = queryParams.toString();
6794
- if (queryString) {
6795
- url += (url.includes("?") ? "&" : "?") + queryString;
6796
- }
6797
- const formDataBody = isFormDataBody(body) ? body : void 0;
6798
- const optionsNext = options?.next;
6799
- const nextOptions = { ...optionsNext ?? {} };
6800
- const cacheIsNoStore = options?.cache === "no-store";
6801
- if (cacheIsNoStore) {
6802
- delete nextOptions.revalidate;
6803
- } else if (isGetOrHead && nextOptions.revalidate === void 0 && "revalidate" in endpointConfig && typeof endpointConfig.revalidate === "number") {
6804
- nextOptions.revalidate = endpointConfig.revalidate;
6805
- }
6806
- if ("tags" in endpointConfig && Array.isArray(endpointConfig.tags)) {
6807
- const processedTags = endpointConfig.tags.map((tag) => {
6808
- let processedTag = tag;
6809
- if (params) {
6810
- Object.entries(params).forEach(([key, value]) => {
6811
- processedTag = processedTag.replace(`{${key}}`, String(value));
6812
- });
6813
- }
6814
- return /\{[^}]+\}/.test(processedTag) ? null : processedTag;
6815
- }).filter((tag) => tag !== null);
6816
- nextOptions.tags = Array.from(/* @__PURE__ */ new Set([...nextOptions.tags ?? [], ...processedTags]));
6817
- }
6818
- const requestInit = {
6819
- method,
6820
- ...options,
6821
- // Include credentials for same-origin requests (sends cookies for auth)
6822
- credentials: "same-origin",
6823
- // Don't include body for GET/HEAD requests
6824
- // FormData is pre-narrowed via isFormDataBody() above
6825
- body: isGetOrHead || body == null ? void 0 : formDataBody ?? JSON.stringify(body),
6826
- headers: {
6827
- ...options.headers,
6828
- ...headers,
6829
- // Include SDK version if set
6830
- ...sdkVersion && { "x-sdk-version": sdkVersion },
6831
- // Don't set Content-Type for GET/HEAD requests without body
6832
- ...isGetOrHead ? {} : formDataBody ? {} : { "Content-Type": "application/json" }
6833
- },
6834
- // Add Next.js caching options
6835
- next: Object.keys(nextOptions).length > 0 ? nextOptions : void 0
6836
- };
6837
- const fetchPromise = fetch(url, requestInit);
6838
- if (!isGetOrHead && "tags" in endpointConfig && Array.isArray(endpointConfig.tags)) {
6839
- const tags = endpointConfig.tags.map((tag) => tag);
6779
+ const fetchPromise = fetch(plan.url, plan.init);
6780
+ if (plan.cacheInvalidationTags) {
6840
6781
  return fetchPromise.then((response) => {
6841
6782
  if (response.ok) {
6842
- invalidateCacheTags(tags, params);
6783
+ invalidateCacheTags(plan.cacheInvalidationTags, params);
6843
6784
  }
6844
6785
  return response;
6845
6786
  });
@@ -6847,6 +6788,100 @@ function createRawCMSClient(headers = {}, baseUrl) {
6847
6788
  return fetchPromise;
6848
6789
  };
6849
6790
  }
6791
+ function buildApiRequestPlan(input) {
6792
+ const { endpoint, body, params, headers = {}, baseUrl } = input;
6793
+ const options = input.options ?? {};
6794
+ let url = buildEndpointURL(baseUrl, endpoint);
6795
+ const originalPath = API_ENDPOINTS[endpoint].path;
6796
+ const unusedParams = {};
6797
+ if (params) {
6798
+ Object.entries(params).forEach(([key, value]) => {
6799
+ const bracePlaceholder = `{${key}}`;
6800
+ const colonPlaceholder = `:${key}`;
6801
+ if (originalPath.includes(bracePlaceholder) || originalPath.includes(colonPlaceholder)) {
6802
+ const stringValue = serializePathParam(endpoint, key, value);
6803
+ url = url.replace(bracePlaceholder, stringValue);
6804
+ url = url.replace(colonPlaceholder, stringValue);
6805
+ } else {
6806
+ unusedParams[key] = value;
6807
+ }
6808
+ });
6809
+ }
6810
+ const unresolvedPathParams = [
6811
+ ...url.match(/\{[^}]+\}/g) ?? [],
6812
+ ...url.match(/(^|\/):([A-Za-z][A-Za-z0-9_]*)\b/g) ?? []
6813
+ ];
6814
+ if (unresolvedPathParams.length > 0) {
6815
+ const missingParams = Array.from(
6816
+ new Set(
6817
+ unresolvedPathParams.map((token) => {
6818
+ if (token.startsWith("{") && token.endsWith("}")) {
6819
+ return token.slice(1, -1);
6820
+ }
6821
+ return token.replace(/^\//, "").slice(1);
6822
+ })
6823
+ )
6824
+ );
6825
+ throw new Error(
6826
+ `Missing required path params for endpoint ${String(endpoint)}: ${missingParams.join(", ")}`
6827
+ );
6828
+ }
6829
+ const endpointConfig = API_ENDPOINTS[endpoint];
6830
+ const method = endpointConfig.method;
6831
+ const isGetOrHead = method === "GET" || method === "HEAD";
6832
+ const queryParams = new URLSearchParams();
6833
+ Object.entries(unusedParams).forEach(([key, value]) => {
6834
+ appendQueryParam(queryParams, key, value);
6835
+ });
6836
+ if (isGetOrHead && typeof body === "object" && body !== null && !isFormDataBody(body)) {
6837
+ Object.entries(body).forEach(([key, value]) => {
6838
+ appendQueryParam(queryParams, key, value);
6839
+ });
6840
+ }
6841
+ const queryString = queryParams.toString();
6842
+ if (queryString) {
6843
+ url += (url.includes("?") ? "&" : "?") + queryString;
6844
+ }
6845
+ const formDataBody = isFormDataBody(body) ? body : void 0;
6846
+ const optionsNext = options?.next;
6847
+ const nextOptions = { ...optionsNext ?? {} };
6848
+ const cacheIsNoStore = options?.cache === "no-store";
6849
+ if (cacheIsNoStore) {
6850
+ delete nextOptions.revalidate;
6851
+ } else if (isGetOrHead && nextOptions.revalidate === void 0 && "revalidate" in endpointConfig && typeof endpointConfig.revalidate === "number") {
6852
+ nextOptions.revalidate = endpointConfig.revalidate;
6853
+ }
6854
+ if ("tags" in endpointConfig && Array.isArray(endpointConfig.tags)) {
6855
+ const processedTags = endpointConfig.tags.map((tag) => {
6856
+ let processedTag = tag;
6857
+ if (params) {
6858
+ Object.entries(params).forEach(([key, value]) => {
6859
+ processedTag = processedTag.replace(`{${key}}`, String(value));
6860
+ });
6861
+ }
6862
+ return /\{[^}]+\}/.test(processedTag) ? null : processedTag;
6863
+ }).filter((tag) => tag !== null);
6864
+ nextOptions.tags = Array.from(/* @__PURE__ */ new Set([...nextOptions.tags ?? [], ...processedTags]));
6865
+ }
6866
+ const init = {
6867
+ method,
6868
+ ...options,
6869
+ credentials: "same-origin",
6870
+ body: isGetOrHead || body == null ? void 0 : formDataBody ?? JSON.stringify(body),
6871
+ headers: buildRequestHeaders({
6872
+ optionsHeaders: options.headers,
6873
+ authHeaders: headers,
6874
+ sdkVersion: input.sdkVersion,
6875
+ includeJsonContentType: !isGetOrHead && !formDataBody
6876
+ }),
6877
+ ...Object.keys(nextOptions).length > 0 ? { next: nextOptions } : {}
6878
+ };
6879
+ return {
6880
+ url,
6881
+ init,
6882
+ ...!isGetOrHead && "tags" in endpointConfig && Array.isArray(endpointConfig.tags) ? { cacheInvalidationTags: endpointConfig.tags.map((tag) => tag) } : {}
6883
+ };
6884
+ }
6850
6885
  function createParsedClient(rawClient) {
6851
6886
  return async (params) => {
6852
6887
  const response = await rawClient(params);
@@ -7027,7 +7062,7 @@ var SimpleCache = class {
7027
7062
  };
7028
7063
 
7029
7064
  // src/version.ts
7030
- var SDK_VERSION = "0.89.1";
7065
+ var SDK_VERSION = "0.90.0";
7031
7066
 
7032
7067
  // src/client/error.ts
7033
7068
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -6,10 +6,7 @@ function normalizeRenderStage(stage) {
6
6
  return stage === "preview" ? "preview" : "published";
7
7
  }
8
8
  function isRouteVisibleInStage(routeEntry, stageInput) {
9
- const stage = normalizeRenderStage(stageInput);
10
- if (stage === "preview" || !isRouteRecord(routeEntry)) {
11
- return true;
12
- }
9
+ if (normalizeRenderStage(stageInput) === "preview" || !isRouteRecord(routeEntry)) return true;
13
10
  const status = routeEntry.status;
14
11
  return !(typeof status === "string" && status !== "published");
15
12
  }
@@ -18,52 +15,45 @@ function extractRouteHref(candidate, stageInput = "published") {
18
15
  const trimmed = candidate.trim();
19
16
  return trimmed.length > 0 ? trimmed : null;
20
17
  }
21
- if (!isRouteRecord(candidate)) {
22
- return null;
23
- }
24
- const stage = normalizeRenderStage(stageInput);
25
- const fields = stage === "preview" ? ["draftPath", "path", "href", "url"] : ["path", "href", "url"];
18
+ if (!isRouteRecord(candidate)) return null;
19
+ const fields = normalizeRenderStage(stageInput) === "preview" ? [
20
+ "draftPath",
21
+ "path",
22
+ "href",
23
+ "url"
24
+ ] : [
25
+ "path",
26
+ "href",
27
+ "url"
28
+ ];
26
29
  for (const field of fields) {
27
30
  const value = candidate[field];
28
- if (typeof value === "string" && value.trim().length > 0) {
29
- return value.trim();
30
- }
31
+ if (typeof value === "string" && value.trim().length > 0) return value.trim();
31
32
  }
32
33
  return null;
33
34
  }
34
35
  function extractRouteUpdatedAt(candidate) {
35
- if (!isRouteRecord(candidate)) {
36
- return null;
37
- }
38
- const fields = [
36
+ if (!isRouteRecord(candidate)) return null;
37
+ for (const field of [
39
38
  "updatedAt",
40
39
  "updated_at",
41
40
  "publishedAt",
42
41
  "published_at",
43
42
  "modifiedAt",
44
43
  "modified_at"
45
- ];
46
- for (const field of fields) {
44
+ ]) {
47
45
  const value = candidate[field];
48
- if (typeof value === "string" && value.length > 0) {
49
- return value;
50
- }
46
+ if (typeof value === "string" && value.length > 0) return value;
51
47
  }
52
48
  return null;
53
49
  }
54
50
  function resolveRouteTargetForStage(routeIdValue, routes, stageInput) {
55
51
  const routeId = typeof routeIdValue === "string" ? routeIdValue : null;
56
- if (!routeId || !routes) {
57
- return null;
58
- }
52
+ if (!routeId || !routes) return null;
59
53
  const routeEntry = routes[routeId];
60
- if (!isRouteVisibleInStage(routeEntry, stageInput)) {
61
- return null;
62
- }
54
+ if (!isRouteVisibleInStage(routeEntry, stageInput)) return null;
63
55
  const href = extractRouteHref(routeEntry, stageInput);
64
- if (!href) {
65
- return null;
66
- }
56
+ if (!href) return null;
67
57
  return {
68
58
  routeId,
69
59
  href,