@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
@@ -16668,6 +16668,15 @@ var ENDPOINT_DEFINITIONS = {
16668
16668
  auth: "user",
16669
16669
  responseKind: "json"
16670
16670
  },
16671
+ // Public routable content for SDK SSG
16672
+ getPublicRoutableContent: {
16673
+ path: "/public/sites/{siteId}/routable-content",
16674
+ method: "GET",
16675
+ revalidate: 60,
16676
+ tags: ["site-{siteId}", "routable-content-{siteId}"],
16677
+ auth: "public",
16678
+ responseKind: "json"
16679
+ },
16671
16680
  // Generic public content preview (preferred)
16672
16681
  getPublishedEntryPreview: {
16673
16682
  path: "/public/content/{siteId}/{type}/{slug}/preview",
@@ -17728,13 +17737,16 @@ var SimpleCache = class {
17728
17737
  };
17729
17738
 
17730
17739
  // src/version.ts
17731
- var SDK_VERSION = "0.7.4";
17740
+ var SDK_VERSION = "0.8.0";
17732
17741
 
17733
17742
  // src/client/error.ts
17734
17743
  var RiverbankApiError = class _RiverbankApiError extends Error {
17735
17744
  constructor(apiError) {
17736
17745
  super(apiError.message);
17737
17746
  this.name = "RiverbankApiError";
17747
+ if ("cause" in apiError && apiError.cause) {
17748
+ this.cause = apiError.cause;
17749
+ }
17738
17750
  this.code = apiError.code;
17739
17751
  this.requestId = apiError.requestId;
17740
17752
  this.status = apiError.status;
@@ -17821,6 +17833,54 @@ var RiverbankApiError = class _RiverbankApiError extends Error {
17821
17833
  isServerError() {
17822
17834
  return this.code.startsWith("server:");
17823
17835
  }
17836
+ /**
17837
+ * Returns a human-readable string representation of the error.
17838
+ * Includes all key details for debugging.
17839
+ *
17840
+ * @example
17841
+ * "RiverbankApiError: Content keys cannot access preview content | Code: auth:forbidden | Status: 401 | RequestId: req-abc123"
17842
+ */
17843
+ toString() {
17844
+ const parts = [`RiverbankApiError: ${this.message}`];
17845
+ if (this.code) parts.push(`Code: ${this.code}`);
17846
+ if (this.status) parts.push(`Status: ${this.status}`);
17847
+ if (this.requestId) parts.push(`RequestId: ${this.requestId}`);
17848
+ return parts.join(" | ");
17849
+ }
17850
+ /**
17851
+ * Custom Node.js inspect output for better console.log display.
17852
+ * This ensures that console.log(error) shows all relevant details
17853
+ * instead of just "[Object]" for nested properties.
17854
+ */
17855
+ [Symbol.for("nodejs.util.inspect.custom")]() {
17856
+ return this.toDetailedString();
17857
+ }
17858
+ /**
17859
+ * Returns a detailed multi-line string for debugging.
17860
+ * Used by the Node.js inspect symbol for console output.
17861
+ */
17862
+ toDetailedString() {
17863
+ const lines = [
17864
+ `RiverbankApiError: ${this.message}`,
17865
+ ` Code: ${this.code}`,
17866
+ ` Status: ${this.status}`,
17867
+ ` RequestId: ${this.requestId}`,
17868
+ ` Timestamp: ${this.timestamp}`
17869
+ ];
17870
+ if (this.isRetryable) {
17871
+ lines.push(` Retryable: true`);
17872
+ if (this.retryAfterMs) {
17873
+ lines.push(` RetryAfter: ${this.retryAfterMs}ms`);
17874
+ }
17875
+ }
17876
+ if (this.fieldErrors && this.fieldErrors.length > 0) {
17877
+ lines.push(" FieldErrors:");
17878
+ this.fieldErrors.forEach((fe) => {
17879
+ lines.push(` - ${fe.field}: ${fe.message}`);
17880
+ });
17881
+ }
17882
+ return lines.join("\n");
17883
+ }
17824
17884
  };
17825
17885
 
17826
17886
  // src/client/resilience.ts
@@ -17835,13 +17895,75 @@ var DEFAULT_CIRCUIT_BREAKER_CONFIG = {
17835
17895
  resetTimeoutMs: 3e4,
17836
17896
  halfOpenMaxRequests: 2
17837
17897
  };
17898
+ var PERMANENT_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
17899
+ "ECONNREFUSED",
17900
+ // Server is not running / port not listening
17901
+ "ENOTFOUND",
17902
+ // DNS lookup failed - hostname doesn't exist
17903
+ "EAI_AGAIN"
17904
+ // DNS lookup timeout (usually permanent for invalid hosts)
17905
+ ]);
17906
+ var TRANSIENT_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
17907
+ "ECONNRESET",
17908
+ // Connection was reset mid-request (server dropped it)
17909
+ "EPIPE",
17910
+ // Broken pipe (connection closed while writing)
17911
+ "ETIMEDOUT",
17912
+ // Connection timed out (could be temporary congestion)
17913
+ "ESOCKETTIMEDOUT"
17914
+ // Socket timeout
17915
+ ]);
17916
+ var NODE_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
17917
+ // Permanent
17918
+ "ECONNREFUSED",
17919
+ "ENOTFOUND",
17920
+ "EAI_AGAIN",
17921
+ // Transient
17922
+ "ECONNRESET",
17923
+ "EPIPE",
17924
+ "ETIMEDOUT",
17925
+ "ESOCKETTIMEDOUT"
17926
+ ]);
17927
+ function isNodeNetworkErrorCode(code) {
17928
+ return !code.includes(":") && NODE_NETWORK_ERROR_CODES.has(code);
17929
+ }
17930
+ function getErrorCodeFromCause(error) {
17931
+ let current = error;
17932
+ while (current) {
17933
+ const nodeError = current;
17934
+ if (nodeError.code && typeof nodeError.code === "string") {
17935
+ if (isNodeNetworkErrorCode(nodeError.code)) {
17936
+ return nodeError.code;
17937
+ }
17938
+ }
17939
+ const errorWithCause = current;
17940
+ current = errorWithCause.cause;
17941
+ }
17942
+ return void 0;
17943
+ }
17838
17944
  function isTransientError(error) {
17839
17945
  if (error instanceof RiverbankApiError) {
17946
+ const errorCode = getErrorCodeFromCause(error);
17947
+ if (errorCode && PERMANENT_NETWORK_ERROR_CODES.has(errorCode)) {
17948
+ return false;
17949
+ }
17840
17950
  if (error.status === 0) return true;
17841
17951
  if (error.status === 429) return true;
17842
17952
  if (error.status >= 500) return true;
17843
17953
  return false;
17844
17954
  }
17955
+ if (error instanceof TypeError) {
17956
+ const errorCode = getErrorCodeFromCause(error);
17957
+ if (errorCode) {
17958
+ if (PERMANENT_NETWORK_ERROR_CODES.has(errorCode)) {
17959
+ return false;
17960
+ }
17961
+ if (TRANSIENT_NETWORK_ERROR_CODES.has(errorCode)) {
17962
+ return true;
17963
+ }
17964
+ }
17965
+ return true;
17966
+ }
17845
17967
  return true;
17846
17968
  }
17847
17969
  function calculateBackoff(attempt, config) {
@@ -17978,7 +18100,19 @@ async function fetchWithTimeoutAndRetry(fetcher, config) {
17978
18100
  }
17979
18101
  throw lastError;
17980
18102
  }
18103
+ function isAbortError(error) {
18104
+ if (typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError") {
18105
+ return true;
18106
+ }
18107
+ if (error instanceof Error && error.name === "AbortError") {
18108
+ return true;
18109
+ }
18110
+ return false;
18111
+ }
17981
18112
  function shouldRetryError(error, customRetryOn) {
18113
+ if (isAbortError(error)) {
18114
+ return false;
18115
+ }
17982
18116
  if (customRetryOn) {
17983
18117
  const statusCode = error instanceof RiverbankApiError ? error.status : void 0;
17984
18118
  return customRetryOn(error, statusCode);
@@ -18022,7 +18156,7 @@ var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
18022
18156
  function generateRequestId2() {
18023
18157
  return `req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
18024
18158
  }
18025
- function isAbortError(error) {
18159
+ function isAbortError2(error) {
18026
18160
  if (error instanceof DOMException && error.name === "AbortError") {
18027
18161
  return true;
18028
18162
  }
@@ -18060,7 +18194,7 @@ function getNetworkErrorCode(error) {
18060
18194
  return "network:connection_error";
18061
18195
  }
18062
18196
  function convertToTypedError(error) {
18063
- if (isAbortError(error)) {
18197
+ if (isAbortError2(error)) {
18064
18198
  throw error;
18065
18199
  }
18066
18200
  if (error instanceof ApiEnvelopeError) {
@@ -18090,12 +18224,23 @@ function convertToTypedError(error) {
18090
18224
  message: networkError.message || "Network request failed",
18091
18225
  requestId: `local-${Date.now()}`,
18092
18226
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
18093
- status: 0
18227
+ status: 0,
18094
18228
  // No HTTP response received
18229
+ cause: networkError
18230
+ // Preserve original error for retry/circuit breaker classification
18095
18231
  });
18096
18232
  }
18097
18233
  throw error;
18098
18234
  }
18235
+ function detectKeyType(apiKey) {
18236
+ if (apiKey.startsWith("bld_live_sk_") || apiKey.startsWith("bld_test_sk_")) {
18237
+ return "content";
18238
+ }
18239
+ if (apiKey.startsWith("bld_preview_sk_")) {
18240
+ return "preview";
18241
+ }
18242
+ return "unknown";
18243
+ }
18099
18244
  function createRiverbankClient(config) {
18100
18245
  if (!config.baseUrl) {
18101
18246
  throw new Error(
@@ -18126,6 +18271,7 @@ function createRiverbankClient(config) {
18126
18271
  resetTimeoutMs: config.resilience?.circuitBreaker?.resetTimeoutMs ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.resetTimeoutMs,
18127
18272
  halfOpenMaxRequests: config.resilience?.circuitBreaker?.halfOpenMaxRequests ?? DEFAULT_CIRCUIT_BREAKER_CONFIG.halfOpenMaxRequests
18128
18273
  };
18274
+ const keyType = detectKeyType(config.apiKey);
18129
18275
  const apiClient = createBearerAPIClient(config.apiKey, config.baseUrl);
18130
18276
  const cache = new SimpleCache({
18131
18277
  maxSize: cacheMaxSize,
@@ -18421,9 +18567,26 @@ function createRiverbankClient(config) {
18421
18567
  });
18422
18568
  }, { signal });
18423
18569
  },
18570
+ async getAllPublishedRoutes(params) {
18571
+ const { siteId, signal } = params;
18572
+ if (!siteId) {
18573
+ throw new Error("getAllPublishedRoutes() requires siteId");
18574
+ }
18575
+ const cacheKey = `routable-content:${siteId}:published`;
18576
+ return resilientFetch(cacheKey, async (sig) => {
18577
+ return await apiClient({
18578
+ endpoint: "getPublicRoutableContent",
18579
+ params: { siteId, publishedOnly: "true" },
18580
+ options: { signal: sig }
18581
+ });
18582
+ }, { signal });
18583
+ },
18424
18584
  clearCache() {
18425
18585
  cache.clear();
18426
18586
  },
18587
+ getKeyType() {
18588
+ return keyType;
18589
+ },
18427
18590
  getLastEmittedStatus() {
18428
18591
  return lastStatus;
18429
18592
  },