@riverbankcms/sdk 0.89.1 → 0.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +27 -4
  2. package/dist/{PreviewEditorSidebar-JDR64FEC.mjs → PreviewEditorSidebar-FNFRVSIM.mjs} +3 -3
  3. package/dist/{PreviewEditorUI-67TMJMAF.mjs → PreviewEditorUI-3WXJFQXG.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-2UCIMKUB.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/bookingConfig.d.ts +3 -0
  8. package/dist/_dts/api/src/bookingOperations.d.ts +2 -0
  9. package/dist/_dts/api/src/bookingRecords.d.ts +4 -2
  10. package/dist/_dts/api/src/bookings.d.ts +3 -1
  11. package/dist/_dts/api/src/event-listing-destination.d.ts +59 -0
  12. package/dist/_dts/api/src/index.d.ts +10 -5
  13. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +0 -1
  14. package/dist/_dts/api/src/navigation.d.ts +2 -0
  15. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +18 -6
  16. package/dist/_dts/api/src/request.d.ts +21 -0
  17. package/dist/_dts/api/src/sdk-event-upsert.d.ts +3 -1
  18. package/dist/_dts/api/src/sdkContracts.d.ts +2 -0
  19. package/dist/_dts/api/src/settings/permissions.d.ts +273 -0
  20. package/dist/_dts/api/src/types.d.ts +4 -1
  21. package/dist/_dts/api/src/url.d.ts +6 -3
  22. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +1 -0
  23. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterThumbnailCard.d.ts +5 -1
  24. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterThumbnailGrid.d.ts +9 -1
  25. package/dist/_dts/block-form/src/widgets/RepeaterField/components/index.d.ts +1 -0
  26. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +7 -11
  27. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -0
  28. package/dist/_dts/blocks/src/index.d.ts +2 -1
  29. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -6
  30. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +60 -2
  31. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +16 -5
  32. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +0 -2
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +9 -9
  34. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +3 -3
  35. package/dist/_dts/blocks/src/system/blocks/shop.shared.d.ts +8 -0
  36. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +1 -1
  37. package/dist/_dts/blocks/src/system/constants/events.d.ts +4 -1
  38. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +3 -1
  39. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -0
  40. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +17 -5
  41. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +51 -6
  42. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +24 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +2 -2
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +1 -17
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +5 -9
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +5 -9
  47. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +7 -1
  48. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventPaymentOptions.d.ts +48 -0
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +5 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +4 -4
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +50 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +2 -2
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +21 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +11 -1
  56. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +2 -1
  57. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +11 -1
  58. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/calendarViewOptions.d.ts +10 -0
  59. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/destination.d.ts +8 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventProductEligibility.d.ts +24 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +3 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/utils.d.ts +7 -0
  63. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +5 -2
  64. package/dist/_dts/blocks/src/system/runtime/nodes/shop-checkout-form.d.ts +2 -2
  65. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  66. package/dist/_dts/content-model/src/entry-slots/sdkBlocks.d.ts +21 -0
  67. package/dist/_dts/content-model/src/entry-slots/types.d.ts +7 -0
  68. package/dist/_dts/core/src/event-pricing.d.ts +12 -2
  69. package/dist/_dts/core/src/money-input.d.ts +18 -0
  70. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +50 -0
  71. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -1
  72. package/dist/_dts/media-editor/src/fieldUi.d.ts +6 -0
  73. package/dist/_dts/media-editor/src/index.d.ts +1 -1
  74. package/dist/_dts/preview-next/src/client/index.d.ts +1 -0
  75. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +3 -2
  76. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +3 -2
  77. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +3 -2
  78. package/dist/_dts/preview-next/src/client/preview/SiteChromeEditableSurface.d.ts +2 -2
  79. package/dist/_dts/preview-next/src/client/preview/themeRuntime.d.ts +6 -0
  80. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewMode.d.ts +2 -1
  81. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +10 -0
  82. package/dist/_dts/sdk/src/cli/content/reader.d.ts +12 -5
  83. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -55
  84. package/dist/_dts/sdk/src/components.d.ts +1 -0
  85. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  86. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +3 -1
  87. package/dist/_dts/sdk/src/next/types.d.ts +8 -11
  88. package/dist/_dts/sdk/src/preview-next/client/index.d.ts +1 -1
  89. package/dist/_dts/sdk/src/public-api/contracts.d.ts +11 -1
  90. package/dist/_dts/sdk/src/rendering/blocks-theme-scope.d.ts +2 -1
  91. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +8 -7
  92. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +5 -6
  93. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -0
  94. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +11 -1
  95. package/dist/_dts/sdk/src/rendering/server.d.ts +1 -0
  96. package/dist/_dts/sdk/src/rendering/themeRuntime.d.ts +26 -0
  97. package/dist/_dts/sdk/src/version.d.ts +1 -1
  98. package/dist/_dts/site-commands/src/commands.d.ts +18 -0
  99. package/dist/_dts/theme-core/src/ResponsiveScope.d.ts +12 -0
  100. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  101. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +2 -2
  102. package/dist/_dts/theme-core/src/buttons/types.d.ts +5 -5
  103. package/dist/_dts/theme-core/src/cards/types.d.ts +2 -2
  104. package/dist/_dts/theme-core/src/index.d.ts +2 -0
  105. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +21 -21
  106. package/dist/_dts/theme-core/src/schema.d.ts +18 -18
  107. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  108. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -2
  109. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +4 -4
  110. package/dist/_dts/theme-core/src/themeRuntime.d.ts +11 -0
  111. package/dist/{chunk-F645A5UV.mjs → chunk-BOQXMCSP.mjs} +129 -101
  112. package/dist/{chunk-7YUAXONX.mjs → chunk-CR2VX432.mjs} +1563 -877
  113. package/dist/{chunk-HKJQERFR.mjs → chunk-FA6LVZ7C.mjs} +91 -55
  114. package/dist/{chunk-TGBJWKMP.mjs → chunk-H6TT5ZXI.mjs} +9 -1
  115. package/dist/{chunk-ZQRBLCW5.mjs → chunk-SYYJZPKU.mjs} +2 -2
  116. package/dist/{chunk-7N46MZHI.mjs → chunk-UG7I7S7W.mjs} +1 -1
  117. package/dist/cli/index.mjs +1057 -632
  118. package/dist/cli/init-docs/content/cli-reference.md +6 -1
  119. package/dist/cli/init-docs/content/content-management.md +27 -0
  120. package/dist/client/{accordion-MUCVNGQ7.mjs → accordion-4K7VGZ3I.mjs} +2 -2
  121. package/dist/client/{bookingForm-PKD6EFIE.mjs → bookingForm-3QXA3CIS.mjs} +26 -271
  122. package/dist/client/bookings.mjs +1586 -825
  123. package/dist/client/{carousel-3TKQSNJC.mjs → carousel-BEJKNGQ7.mjs} +3 -3
  124. package/dist/client/{cart-6XHSZK23.mjs → cart-44BBM6XG.mjs} +7 -8
  125. package/dist/client/{checkout-FVSPM6FI.mjs → checkout-THMHEYKF.mjs} +7 -8
  126. package/dist/client/{chunk-25W2EQUN.mjs → chunk-3H5CLFKT.mjs} +8 -0
  127. package/dist/client/{chunk-ZJZZA5EP.mjs → chunk-4COPESPO.mjs} +13 -16
  128. package/dist/client/chunk-5AJIMWKS.mjs +436 -0
  129. package/dist/client/{chunk-UQFY4AHX.mjs → chunk-B4H6QMPY.mjs} +157 -49
  130. package/dist/client/{chunk-VGLXACVK.mjs → chunk-DQIRKNZE.mjs} +1 -1
  131. package/dist/client/{chunk-7DH35FGA.mjs → chunk-EJBHK74Y.mjs} +1 -1
  132. package/dist/client/{chunk-SDIYSQAY.mjs → chunk-HIHOQGIP.mjs} +2 -3
  133. package/dist/client/{chunk-CQKKFEQD.mjs → chunk-JV7ZNAOU.mjs} +378 -111
  134. package/dist/client/{chunk-FHU6PFPM.mjs → chunk-KNTLBQ3N.mjs} +1 -1
  135. package/dist/client/{chunk-RSQWWUAD.mjs → chunk-PEDNDLPB.mjs} +4 -4
  136. package/dist/client/{chunk-EY42X22F.mjs → chunk-SLY6UDAS.mjs} +157 -5
  137. package/dist/client/{chunk-STJ2NCQM.mjs → chunk-WHZQDPBZ.mjs} +19 -1
  138. package/dist/client/{chunk-ZT5XE7FK.mjs → chunk-ZIAF2DA4.mjs} +1 -1
  139. package/dist/client/client.mjs +3552 -2898
  140. package/dist/client/{courseRegistration-ATZSYDHM.mjs → courseRegistration-URX7RCCK.mjs} +20 -58
  141. package/dist/client/{eventCalendar-6T2UGKKP.mjs → eventCalendar-GTENOQCE.mjs} +10 -11
  142. package/dist/client/{eventCombined-Q4VANXVF.mjs → eventCombined-EZVB72MF.mjs} +10 -11
  143. package/dist/client/{eventDetails-DW37E7VW.mjs → eventDetails-CH4BJR5Z.mjs} +10 -11
  144. package/dist/client/{eventListing-XURTSAUW.mjs → eventListing-4BVOI5HS.mjs} +10 -11
  145. package/dist/client/{eventRegistration-MRKEVAXW.mjs → eventRegistration-37LPIKIE.mjs} +10 -11
  146. package/dist/client/{form-WZZFFGMU.mjs → form-FX3Y54YK.mjs} +7 -7
  147. package/dist/client/{headerSection-EQYVQBLM.mjs → headerSection-UOZZGVYL.mjs} +3 -3
  148. package/dist/client/hooks.mjs +1169 -1063
  149. package/dist/client/{locationMap-MFF5VAZR.mjs → locationMap-VSIPKV35.mjs} +3 -3
  150. package/dist/client/{newsletterForm-JQ77UYIE.mjs → newsletterForm-6FRJKNAF.mjs} +5 -5
  151. package/dist/client/{productDetail-25LMT3IZ.mjs → productDetail-6AHMLXCO.mjs} +7 -8
  152. package/dist/client/{productList-5ABEMKUG.mjs → productList-M2CYIZVH.mjs} +7 -8
  153. package/dist/client/rendering/client.mjs +2912 -2316
  154. package/dist/client/rendering/islands.mjs +19 -19
  155. package/dist/client/rendering.mjs +2874 -2230
  156. package/dist/client/{shop-OMMQZ6YO.mjs → shop-AUOT6GEX.mjs} +7 -8
  157. package/dist/client/spam-protection.mjs +4 -5
  158. package/dist/preview-next/before-render.mjs +2 -2
  159. package/dist/preview-next/client/runtime.mjs +5 -5
  160. package/dist/{sdk-runtime-WNLBZ3ZH.mjs → sdk-runtime-6GPJNLU6.mjs} +6 -6
  161. package/dist/server/components.mjs +1856 -1509
  162. package/dist/server/config-validation.mjs +1394 -1288
  163. package/dist/server/config.mjs +1394 -1288
  164. package/dist/server/data.mjs +1169 -1063
  165. package/dist/server/index.mjs +135 -100
  166. package/dist/server/navigation.mjs +20 -30
  167. package/dist/server/next.mjs +1936 -1576
  168. package/dist/server/page-converter.mjs +1081 -967
  169. package/dist/server/prebuild.mjs +1 -1
  170. package/dist/server/rendering/server.mjs +1868 -1521
  171. package/dist/server/rendering.mjs +1878 -1531
  172. package/dist/server/routing.mjs +1248 -1089
  173. package/dist/server/server.mjs +1312 -1171
  174. package/dist/server/theme-bridge.mjs +8 -5
  175. package/package.json +3 -3
  176. package/dist/SdkPreviewModeRuntime-ZBEMRV7N.mjs +0 -8
  177. package/dist/client/chunk-LQFDYWPJ.mjs +0 -184
  178. 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.1";
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,