@riverbankcms/sdk 0.7.4 → 0.8.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 (79) hide show
  1. package/README.md +88 -1
  2. package/dist/cli/index.js +3693 -39
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/client.d.mts +2 -2
  5. package/dist/client/client.d.ts +2 -2
  6. package/dist/client/client.js +167 -4
  7. package/dist/client/client.js.map +1 -1
  8. package/dist/client/client.mjs +167 -4
  9. package/dist/client/client.mjs.map +1 -1
  10. package/dist/client/hooks.d.mts +2 -2
  11. package/dist/client/hooks.d.ts +2 -2
  12. package/dist/client/usePage-CdnO2CP5.d.mts +6875 -0
  13. package/dist/client/usePage-_ksKXlUF.d.ts +6875 -0
  14. package/dist/server/{Layout-qWLdVm5-.d.mts → Layout-D4J009eS.d.mts} +1 -1
  15. package/dist/server/{Layout-Yluyb6sK.d.ts → Layout-l2v4Qa6E.d.ts} +1 -1
  16. package/dist/server/{chunk-74XUVNOO.mjs → chunk-4YQJUL5W.mjs} +4 -2
  17. package/dist/server/{chunk-74XUVNOO.mjs.map → chunk-4YQJUL5W.mjs.map} +1 -1
  18. package/dist/server/{chunk-JNU7ZS2V.mjs → chunk-65A5HAUZ.mjs} +168 -5
  19. package/dist/server/chunk-65A5HAUZ.mjs.map +1 -0
  20. package/dist/server/{chunk-JWRNMNWI.js → chunk-EIJ27EZQ.js} +4 -2
  21. package/dist/server/chunk-EIJ27EZQ.js.map +1 -0
  22. package/dist/server/{chunk-6Z4MQG47.js → chunk-WM646WI3.js} +168 -5
  23. package/dist/server/chunk-WM646WI3.js.map +1 -0
  24. package/dist/server/{components-Di5ME6He.d.ts → components-D2uCKCj7.d.ts} +3 -3
  25. package/dist/server/{components-DNHfSCML.d.mts → components-vtYEmmPF.d.mts} +3 -3
  26. package/dist/server/components.d.mts +5 -5
  27. package/dist/server/components.d.ts +5 -5
  28. package/dist/server/config-validation.d.mts +2 -2
  29. package/dist/server/config-validation.d.ts +2 -2
  30. package/dist/server/config.d.mts +3 -3
  31. package/dist/server/config.d.ts +3 -3
  32. package/dist/server/data.d.mts +2 -2
  33. package/dist/server/data.d.ts +2 -2
  34. package/dist/server/{index-Clm3skz_.d.mts → index-2qnY7VH_.d.mts} +1 -1
  35. package/dist/server/{index-DLvNddi-.d.ts → index-BxrAuL9K.d.ts} +1 -1
  36. package/dist/server/{index-C9Ra8dza.d.ts → index-CH_dvF6n.d.ts} +2 -2
  37. package/dist/server/{index--Oyunk_B.d.mts → index-DfWg1Qle.d.mts} +2 -2
  38. package/dist/server/index.d.mts +13 -5
  39. package/dist/server/index.d.ts +13 -5
  40. package/dist/server/index.js +10 -10
  41. package/dist/server/index.mjs +1 -1
  42. package/dist/server/{loadContent-D7LQwI0o.d.ts → loadContent-DECnsp4k.d.ts} +3 -3
  43. package/dist/server/{loadContent-DVfuBLiZ.d.mts → loadContent-Du5kS8UM.d.mts} +3 -3
  44. package/dist/server/{loadPage-BmYJCe_V.d.ts → loadPage-BZohBxxf.d.ts} +2 -2
  45. package/dist/server/{loadPage-BucnLHmE.d.mts → loadPage-VBorKlWv.d.mts} +2 -2
  46. package/dist/server/metadata.d.mts +4 -4
  47. package/dist/server/metadata.d.ts +4 -4
  48. package/dist/server/navigation.d.mts +2 -2
  49. package/dist/server/navigation.d.ts +2 -2
  50. package/dist/server/next.d.mts +38 -7
  51. package/dist/server/next.d.ts +38 -7
  52. package/dist/server/next.js +35 -17
  53. package/dist/server/next.js.map +1 -1
  54. package/dist/server/next.mjs +30 -12
  55. package/dist/server/next.mjs.map +1 -1
  56. package/dist/server/rendering/server.d.mts +4 -4
  57. package/dist/server/rendering/server.d.ts +4 -4
  58. package/dist/server/rendering.d.mts +7 -7
  59. package/dist/server/rendering.d.ts +7 -7
  60. package/dist/server/rendering.js +2 -2
  61. package/dist/server/rendering.mjs +1 -1
  62. package/dist/server/routing.d.mts +4 -4
  63. package/dist/server/routing.d.ts +4 -4
  64. package/dist/server/server.d.mts +5 -5
  65. package/dist/server/server.d.ts +5 -5
  66. package/dist/server/server.js +3 -3
  67. package/dist/server/server.mjs +2 -2
  68. package/dist/server/{types-C-LShyIg.d.mts → types-BRQ_6yOc.d.mts} +43 -1
  69. package/dist/server/{types-BjgZt8xJ.d.mts → types-CJfJwcuL.d.mts} +37 -0
  70. package/dist/server/{types-Dt98DeYa.d.ts → types-CgSO0yxg.d.ts} +8 -0
  71. package/dist/server/{types-BRQyLrQU.d.ts → types-D0rPF8l5.d.ts} +43 -1
  72. package/dist/server/{types-DLBhEPSt.d.ts → types-D8XqwoVd.d.ts} +37 -0
  73. package/dist/server/{types-BSV6Vc-P.d.mts → types-DT30Qy7x.d.mts} +8 -0
  74. package/dist/server/{validation-DU2YE7u5.d.ts → validation-D1LaY1kQ.d.ts} +1 -1
  75. package/dist/server/{validation-BGuRo8P1.d.mts → validation-Pv3Zs6dP.d.mts} +1 -1
  76. package/package.json +2 -1
  77. package/dist/server/chunk-6Z4MQG47.js.map +0 -1
  78. package/dist/server/chunk-JNU7ZS2V.mjs.map +0 -1
  79. package/dist/server/chunk-JWRNMNWI.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { R as RiverbankClient, P as PageProps, T as Theme, a as ResolvedBlockData, b as RiverbankClientConfig } from './usePage-DZtrWajy.mjs';
2
- export { d as Page, U as UsePageParams, c as UsePageResult, u as usePage } from './usePage-DZtrWajy.mjs';
1
+ import { R as RiverbankClient, P as PageProps, T as Theme, a as ResolvedBlockData, b as RiverbankClientConfig } from './usePage-CdnO2CP5.mjs';
2
+ export { d as Page, U as UsePageParams, c as UsePageResult, u as usePage } from './usePage-CdnO2CP5.mjs';
3
3
  import '@riverbankcms/ai';
4
4
  import 'zod';
5
5
  import '@riverbankcms/media-storage-supabase';
@@ -1,5 +1,5 @@
1
- import { R as RiverbankClient, P as PageProps, T as Theme, a as ResolvedBlockData, b as RiverbankClientConfig } from './usePage-BYmJCCm1.js';
2
- export { d as Page, U as UsePageParams, c as UsePageResult, u as usePage } from './usePage-BYmJCCm1.js';
1
+ import { R as RiverbankClient, P as PageProps, T as Theme, a as ResolvedBlockData, b as RiverbankClientConfig } from './usePage-_ksKXlUF.js';
2
+ export { d as Page, U as UsePageParams, c as UsePageResult, u as usePage } from './usePage-_ksKXlUF.js';
3
3
  import '@riverbankcms/ai';
4
4
  import 'zod';
5
5
  import '@riverbankcms/media-storage-supabase';
@@ -16704,6 +16704,15 @@ var ENDPOINT_DEFINITIONS = {
16704
16704
  auth: "user",
16705
16705
  responseKind: "json"
16706
16706
  },
16707
+ // Public routable content for SDK SSG
16708
+ getPublicRoutableContent: {
16709
+ path: "/public/sites/{siteId}/routable-content",
16710
+ method: "GET",
16711
+ revalidate: 60,
16712
+ tags: ["site-{siteId}", "routable-content-{siteId}"],
16713
+ auth: "public",
16714
+ responseKind: "json"
16715
+ },
16707
16716
  // Generic public content preview (preferred)
16708
16717
  getPublishedEntryPreview: {
16709
16718
  path: "/public/content/{siteId}/{type}/{slug}/preview",
@@ -17764,13 +17773,16 @@ var SimpleCache = class {
17764
17773
  };
17765
17774
 
17766
17775
  // src/version.ts
17767
- var SDK_VERSION = "0.7.4";
17776
+ var SDK_VERSION = "0.8.0";
17768
17777
 
17769
17778
  // src/client/error.ts
17770
17779
  var RiverbankApiError = class _RiverbankApiError extends Error {
17771
17780
  constructor(apiError) {
17772
17781
  super(apiError.message);
17773
17782
  this.name = "RiverbankApiError";
17783
+ if ("cause" in apiError && apiError.cause) {
17784
+ this.cause = apiError.cause;
17785
+ }
17774
17786
  this.code = apiError.code;
17775
17787
  this.requestId = apiError.requestId;
17776
17788
  this.status = apiError.status;
@@ -17857,6 +17869,54 @@ var RiverbankApiError = class _RiverbankApiError extends Error {
17857
17869
  isServerError() {
17858
17870
  return this.code.startsWith("server:");
17859
17871
  }
17872
+ /**
17873
+ * Returns a human-readable string representation of the error.
17874
+ * Includes all key details for debugging.
17875
+ *
17876
+ * @example
17877
+ * "RiverbankApiError: Content keys cannot access preview content | Code: auth:forbidden | Status: 401 | RequestId: req-abc123"
17878
+ */
17879
+ toString() {
17880
+ const parts = [`RiverbankApiError: ${this.message}`];
17881
+ if (this.code) parts.push(`Code: ${this.code}`);
17882
+ if (this.status) parts.push(`Status: ${this.status}`);
17883
+ if (this.requestId) parts.push(`RequestId: ${this.requestId}`);
17884
+ return parts.join(" | ");
17885
+ }
17886
+ /**
17887
+ * Custom Node.js inspect output for better console.log display.
17888
+ * This ensures that console.log(error) shows all relevant details
17889
+ * instead of just "[Object]" for nested properties.
17890
+ */
17891
+ [Symbol.for("nodejs.util.inspect.custom")]() {
17892
+ return this.toDetailedString();
17893
+ }
17894
+ /**
17895
+ * Returns a detailed multi-line string for debugging.
17896
+ * Used by the Node.js inspect symbol for console output.
17897
+ */
17898
+ toDetailedString() {
17899
+ const lines = [
17900
+ `RiverbankApiError: ${this.message}`,
17901
+ ` Code: ${this.code}`,
17902
+ ` Status: ${this.status}`,
17903
+ ` RequestId: ${this.requestId}`,
17904
+ ` Timestamp: ${this.timestamp}`
17905
+ ];
17906
+ if (this.isRetryable) {
17907
+ lines.push(` Retryable: true`);
17908
+ if (this.retryAfterMs) {
17909
+ lines.push(` RetryAfter: ${this.retryAfterMs}ms`);
17910
+ }
17911
+ }
17912
+ if (this.fieldErrors && this.fieldErrors.length > 0) {
17913
+ lines.push(" FieldErrors:");
17914
+ this.fieldErrors.forEach((fe) => {
17915
+ lines.push(` - ${fe.field}: ${fe.message}`);
17916
+ });
17917
+ }
17918
+ return lines.join("\n");
17919
+ }
17860
17920
  };
17861
17921
 
17862
17922
  // src/client/resilience.ts
@@ -17871,13 +17931,75 @@ var DEFAULT_CIRCUIT_BREAKER_CONFIG = {
17871
17931
  resetTimeoutMs: 3e4,
17872
17932
  halfOpenMaxRequests: 2
17873
17933
  };
17934
+ var PERMANENT_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
17935
+ "ECONNREFUSED",
17936
+ // Server is not running / port not listening
17937
+ "ENOTFOUND",
17938
+ // DNS lookup failed - hostname doesn't exist
17939
+ "EAI_AGAIN"
17940
+ // DNS lookup timeout (usually permanent for invalid hosts)
17941
+ ]);
17942
+ var TRANSIENT_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
17943
+ "ECONNRESET",
17944
+ // Connection was reset mid-request (server dropped it)
17945
+ "EPIPE",
17946
+ // Broken pipe (connection closed while writing)
17947
+ "ETIMEDOUT",
17948
+ // Connection timed out (could be temporary congestion)
17949
+ "ESOCKETTIMEDOUT"
17950
+ // Socket timeout
17951
+ ]);
17952
+ var NODE_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
17953
+ // Permanent
17954
+ "ECONNREFUSED",
17955
+ "ENOTFOUND",
17956
+ "EAI_AGAIN",
17957
+ // Transient
17958
+ "ECONNRESET",
17959
+ "EPIPE",
17960
+ "ETIMEDOUT",
17961
+ "ESOCKETTIMEDOUT"
17962
+ ]);
17963
+ function isNodeNetworkErrorCode(code) {
17964
+ return !code.includes(":") && NODE_NETWORK_ERROR_CODES.has(code);
17965
+ }
17966
+ function getErrorCodeFromCause(error) {
17967
+ let current = error;
17968
+ while (current) {
17969
+ const nodeError = current;
17970
+ if (nodeError.code && typeof nodeError.code === "string") {
17971
+ if (isNodeNetworkErrorCode(nodeError.code)) {
17972
+ return nodeError.code;
17973
+ }
17974
+ }
17975
+ const errorWithCause = current;
17976
+ current = errorWithCause.cause;
17977
+ }
17978
+ return void 0;
17979
+ }
17874
17980
  function isTransientError(error) {
17875
17981
  if (error instanceof RiverbankApiError) {
17982
+ const errorCode = getErrorCodeFromCause(error);
17983
+ if (errorCode && PERMANENT_NETWORK_ERROR_CODES.has(errorCode)) {
17984
+ return false;
17985
+ }
17876
17986
  if (error.status === 0) return true;
17877
17987
  if (error.status === 429) return true;
17878
17988
  if (error.status >= 500) return true;
17879
17989
  return false;
17880
17990
  }
17991
+ if (error instanceof TypeError) {
17992
+ const errorCode = getErrorCodeFromCause(error);
17993
+ if (errorCode) {
17994
+ if (PERMANENT_NETWORK_ERROR_CODES.has(errorCode)) {
17995
+ return false;
17996
+ }
17997
+ if (TRANSIENT_NETWORK_ERROR_CODES.has(errorCode)) {
17998
+ return true;
17999
+ }
18000
+ }
18001
+ return true;
18002
+ }
17881
18003
  return true;
17882
18004
  }
17883
18005
  function calculateBackoff(attempt, config) {
@@ -18014,7 +18136,19 @@ async function fetchWithTimeoutAndRetry(fetcher, config) {
18014
18136
  }
18015
18137
  throw lastError;
18016
18138
  }
18139
+ function isAbortError(error) {
18140
+ if (typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError") {
18141
+ return true;
18142
+ }
18143
+ if (error instanceof Error && error.name === "AbortError") {
18144
+ return true;
18145
+ }
18146
+ return false;
18147
+ }
18017
18148
  function shouldRetryError(error, customRetryOn) {
18149
+ if (isAbortError(error)) {
18150
+ return false;
18151
+ }
18018
18152
  if (customRetryOn) {
18019
18153
  const statusCode = error instanceof RiverbankApiError ? error.status : void 0;
18020
18154
  return customRetryOn(error, statusCode);
@@ -18058,7 +18192,7 @@ var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
18058
18192
  function generateRequestId2() {
18059
18193
  return `req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
18060
18194
  }
18061
- function isAbortError(error) {
18195
+ function isAbortError2(error) {
18062
18196
  if (error instanceof DOMException && error.name === "AbortError") {
18063
18197
  return true;
18064
18198
  }
@@ -18096,7 +18230,7 @@ function getNetworkErrorCode(error) {
18096
18230
  return "network:connection_error";
18097
18231
  }
18098
18232
  function convertToTypedError(error) {
18099
- if (isAbortError(error)) {
18233
+ if (isAbortError2(error)) {
18100
18234
  throw error;
18101
18235
  }
18102
18236
  if (error instanceof ApiEnvelopeError) {
@@ -18126,12 +18260,23 @@ function convertToTypedError(error) {
18126
18260
  message: networkError.message || "Network request failed",
18127
18261
  requestId: `local-${Date.now()}`,
18128
18262
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
18129
- status: 0
18263
+ status: 0,
18130
18264
  // No HTTP response received
18265
+ cause: networkError
18266
+ // Preserve original error for retry/circuit breaker classification
18131
18267
  });
18132
18268
  }
18133
18269
  throw error;
18134
18270
  }
18271
+ function detectKeyType(apiKey) {
18272
+ if (apiKey.startsWith("bld_live_sk_") || apiKey.startsWith("bld_test_sk_")) {
18273
+ return "content";
18274
+ }
18275
+ if (apiKey.startsWith("bld_preview_sk_")) {
18276
+ return "preview";
18277
+ }
18278
+ return "unknown";
18279
+ }
18135
18280
  function createRiverbankClient(config) {
18136
18281
  if (!config.baseUrl) {
18137
18282
  throw new Error(
@@ -18162,6 +18307,7 @@ function createRiverbankClient(config) {
18162
18307
  resetTimeoutMs: config.resilience?.circuitBreaker?.resetTimeoutMs ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.resetTimeoutMs,
18163
18308
  halfOpenMaxRequests: config.resilience?.circuitBreaker?.halfOpenMaxRequests ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.halfOpenMaxRequests
18164
18309
  };
18310
+ const keyType = detectKeyType(config.apiKey);
18165
18311
  const apiClient = createBearerAPIClient(config.apiKey, config.baseUrl);
18166
18312
  const cache = new SimpleCache({
18167
18313
  maxSize: cacheMaxSize,
@@ -18457,9 +18603,26 @@ function createRiverbankClient(config) {
18457
18603
  });
18458
18604
  }, { signal });
18459
18605
  },
18606
+ async getAllPublishedRoutes(params) {
18607
+ const { siteId, signal } = params;
18608
+ if (!siteId) {
18609
+ throw new Error("getAllPublishedRoutes() requires siteId");
18610
+ }
18611
+ const cacheKey = `routable-content:${siteId}:published`;
18612
+ return resilientFetch(cacheKey, async (sig) => {
18613
+ return await apiClient({
18614
+ endpoint: "getPublicRoutableContent",
18615
+ params: { siteId, publishedOnly: "true" },
18616
+ options: { signal: sig }
18617
+ });
18618
+ }, { signal });
18619
+ },
18460
18620
  clearCache() {
18461
18621
  cache.clear();
18462
18622
  },
18623
+ getKeyType() {
18624
+ return keyType;
18625
+ },
18463
18626
  getLastEmittedStatus() {
18464
18627
  return lastStatus;
18465
18628
  },