@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
@@ -1268,6 +1268,15 @@ var ENDPOINT_DEFINITIONS = {
1268
1268
  auth: "user",
1269
1269
  responseKind: "json"
1270
1270
  },
1271
+ // Public routable content for SDK SSG
1272
+ getPublicRoutableContent: {
1273
+ path: "/public/sites/{siteId}/routable-content",
1274
+ method: "GET",
1275
+ revalidate: 60,
1276
+ tags: ["site-{siteId}", "routable-content-{siteId}"],
1277
+ auth: "public",
1278
+ responseKind: "json"
1279
+ },
1271
1280
  // Generic public content preview (preferred)
1272
1281
  getPublishedEntryPreview: {
1273
1282
  path: "/public/content/{siteId}/{type}/{slug}/preview",
@@ -2331,13 +2340,16 @@ var SimpleCache = class {
2331
2340
  };
2332
2341
 
2333
2342
  // src/version.ts
2334
- var SDK_VERSION = "0.7.4";
2343
+ var SDK_VERSION = "0.8.0";
2335
2344
 
2336
2345
  // src/client/error.ts
2337
2346
  var RiverbankApiError = class _RiverbankApiError extends Error {
2338
2347
  constructor(apiError) {
2339
2348
  super(apiError.message);
2340
2349
  this.name = "RiverbankApiError";
2350
+ if ("cause" in apiError && apiError.cause) {
2351
+ this.cause = apiError.cause;
2352
+ }
2341
2353
  this.code = apiError.code;
2342
2354
  this.requestId = apiError.requestId;
2343
2355
  this.status = apiError.status;
@@ -2424,6 +2436,54 @@ var RiverbankApiError = class _RiverbankApiError extends Error {
2424
2436
  isServerError() {
2425
2437
  return this.code.startsWith("server:");
2426
2438
  }
2439
+ /**
2440
+ * Returns a human-readable string representation of the error.
2441
+ * Includes all key details for debugging.
2442
+ *
2443
+ * @example
2444
+ * "RiverbankApiError: Content keys cannot access preview content | Code: auth:forbidden | Status: 401 | RequestId: req-abc123"
2445
+ */
2446
+ toString() {
2447
+ const parts = [`RiverbankApiError: ${this.message}`];
2448
+ if (this.code) parts.push(`Code: ${this.code}`);
2449
+ if (this.status) parts.push(`Status: ${this.status}`);
2450
+ if (this.requestId) parts.push(`RequestId: ${this.requestId}`);
2451
+ return parts.join(" | ");
2452
+ }
2453
+ /**
2454
+ * Custom Node.js inspect output for better console.log display.
2455
+ * This ensures that console.log(error) shows all relevant details
2456
+ * instead of just "[Object]" for nested properties.
2457
+ */
2458
+ [Symbol.for("nodejs.util.inspect.custom")]() {
2459
+ return this.toDetailedString();
2460
+ }
2461
+ /**
2462
+ * Returns a detailed multi-line string for debugging.
2463
+ * Used by the Node.js inspect symbol for console output.
2464
+ */
2465
+ toDetailedString() {
2466
+ const lines = [
2467
+ `RiverbankApiError: ${this.message}`,
2468
+ ` Code: ${this.code}`,
2469
+ ` Status: ${this.status}`,
2470
+ ` RequestId: ${this.requestId}`,
2471
+ ` Timestamp: ${this.timestamp}`
2472
+ ];
2473
+ if (this.isRetryable) {
2474
+ lines.push(` Retryable: true`);
2475
+ if (this.retryAfterMs) {
2476
+ lines.push(` RetryAfter: ${this.retryAfterMs}ms`);
2477
+ }
2478
+ }
2479
+ if (this.fieldErrors && this.fieldErrors.length > 0) {
2480
+ lines.push(" FieldErrors:");
2481
+ this.fieldErrors.forEach((fe) => {
2482
+ lines.push(` - ${fe.field}: ${fe.message}`);
2483
+ });
2484
+ }
2485
+ return lines.join("\n");
2486
+ }
2427
2487
  };
2428
2488
 
2429
2489
  // src/client/resilience.ts
@@ -2438,13 +2498,75 @@ var DEFAULT_CIRCUIT_BREAKER_CONFIG = {
2438
2498
  resetTimeoutMs: 3e4,
2439
2499
  halfOpenMaxRequests: 2
2440
2500
  };
2501
+ var PERMANENT_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
2502
+ "ECONNREFUSED",
2503
+ // Server is not running / port not listening
2504
+ "ENOTFOUND",
2505
+ // DNS lookup failed - hostname doesn't exist
2506
+ "EAI_AGAIN"
2507
+ // DNS lookup timeout (usually permanent for invalid hosts)
2508
+ ]);
2509
+ var TRANSIENT_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
2510
+ "ECONNRESET",
2511
+ // Connection was reset mid-request (server dropped it)
2512
+ "EPIPE",
2513
+ // Broken pipe (connection closed while writing)
2514
+ "ETIMEDOUT",
2515
+ // Connection timed out (could be temporary congestion)
2516
+ "ESOCKETTIMEDOUT"
2517
+ // Socket timeout
2518
+ ]);
2519
+ var NODE_NETWORK_ERROR_CODES = /* @__PURE__ */ new Set([
2520
+ // Permanent
2521
+ "ECONNREFUSED",
2522
+ "ENOTFOUND",
2523
+ "EAI_AGAIN",
2524
+ // Transient
2525
+ "ECONNRESET",
2526
+ "EPIPE",
2527
+ "ETIMEDOUT",
2528
+ "ESOCKETTIMEDOUT"
2529
+ ]);
2530
+ function isNodeNetworkErrorCode(code) {
2531
+ return !code.includes(":") && NODE_NETWORK_ERROR_CODES.has(code);
2532
+ }
2533
+ function getErrorCodeFromCause(error) {
2534
+ let current = error;
2535
+ while (current) {
2536
+ const nodeError = current;
2537
+ if (nodeError.code && typeof nodeError.code === "string") {
2538
+ if (isNodeNetworkErrorCode(nodeError.code)) {
2539
+ return nodeError.code;
2540
+ }
2541
+ }
2542
+ const errorWithCause = current;
2543
+ current = errorWithCause.cause;
2544
+ }
2545
+ return void 0;
2546
+ }
2441
2547
  function isTransientError(error) {
2442
2548
  if (error instanceof RiverbankApiError) {
2549
+ const errorCode = getErrorCodeFromCause(error);
2550
+ if (errorCode && PERMANENT_NETWORK_ERROR_CODES.has(errorCode)) {
2551
+ return false;
2552
+ }
2443
2553
  if (error.status === 0) return true;
2444
2554
  if (error.status === 429) return true;
2445
2555
  if (error.status >= 500) return true;
2446
2556
  return false;
2447
2557
  }
2558
+ if (error instanceof TypeError) {
2559
+ const errorCode = getErrorCodeFromCause(error);
2560
+ if (errorCode) {
2561
+ if (PERMANENT_NETWORK_ERROR_CODES.has(errorCode)) {
2562
+ return false;
2563
+ }
2564
+ if (TRANSIENT_NETWORK_ERROR_CODES.has(errorCode)) {
2565
+ return true;
2566
+ }
2567
+ }
2568
+ return true;
2569
+ }
2448
2570
  return true;
2449
2571
  }
2450
2572
  function calculateBackoff(attempt, config) {
@@ -2581,7 +2703,19 @@ async function fetchWithTimeoutAndRetry(fetcher, config) {
2581
2703
  }
2582
2704
  throw lastError;
2583
2705
  }
2706
+ function isAbortError(error) {
2707
+ if (typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "AbortError") {
2708
+ return true;
2709
+ }
2710
+ if (error instanceof Error && error.name === "AbortError") {
2711
+ return true;
2712
+ }
2713
+ return false;
2714
+ }
2584
2715
  function shouldRetryError(error, customRetryOn) {
2716
+ if (isAbortError(error)) {
2717
+ return false;
2718
+ }
2585
2719
  if (customRetryOn) {
2586
2720
  const statusCode = error instanceof RiverbankApiError ? error.status : void 0;
2587
2721
  return customRetryOn(error, statusCode);
@@ -2625,7 +2759,7 @@ var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
2625
2759
  function generateRequestId2() {
2626
2760
  return `req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
2627
2761
  }
2628
- function isAbortError(error) {
2762
+ function isAbortError2(error) {
2629
2763
  if (error instanceof DOMException && error.name === "AbortError") {
2630
2764
  return true;
2631
2765
  }
@@ -2663,7 +2797,7 @@ function getNetworkErrorCode(error) {
2663
2797
  return "network:connection_error";
2664
2798
  }
2665
2799
  function convertToTypedError(error) {
2666
- if (isAbortError(error)) {
2800
+ if (isAbortError2(error)) {
2667
2801
  throw error;
2668
2802
  }
2669
2803
  if (error instanceof ApiEnvelopeError) {
@@ -2693,12 +2827,23 @@ function convertToTypedError(error) {
2693
2827
  message: networkError.message || "Network request failed",
2694
2828
  requestId: `local-${Date.now()}`,
2695
2829
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
2696
- status: 0
2830
+ status: 0,
2697
2831
  // No HTTP response received
2832
+ cause: networkError
2833
+ // Preserve original error for retry/circuit breaker classification
2698
2834
  });
2699
2835
  }
2700
2836
  throw error;
2701
2837
  }
2838
+ function detectKeyType(apiKey) {
2839
+ if (apiKey.startsWith("bld_live_sk_") || apiKey.startsWith("bld_test_sk_")) {
2840
+ return "content";
2841
+ }
2842
+ if (apiKey.startsWith("bld_preview_sk_")) {
2843
+ return "preview";
2844
+ }
2845
+ return "unknown";
2846
+ }
2702
2847
  function createRiverbankClient(config) {
2703
2848
  if (!config.baseUrl) {
2704
2849
  throw new Error(
@@ -2729,6 +2874,7 @@ function createRiverbankClient(config) {
2729
2874
  resetTimeoutMs: _nullishCoalesce(_optionalChain([config, 'access', _45 => _45.resilience, 'optionalAccess', _46 => _46.circuitBreaker, 'optionalAccess', _47 => _47.resetTimeoutMs]), () => ( DEFAULT_CIRCUIT_BREAKER_CONFIG.resetTimeoutMs)),
2730
2875
  halfOpenMaxRequests: _nullishCoalesce(_optionalChain([config, 'access', _48 => _48.resilience, 'optionalAccess', _49 => _49.circuitBreaker, 'optionalAccess', _50 => _50.halfOpenMaxRequests]), () => ( DEFAULT_CIRCUIT_BREAKER_CONFIG.halfOpenMaxRequests))
2731
2876
  };
2877
+ const keyType = detectKeyType(config.apiKey);
2732
2878
  const apiClient = createBearerAPIClient(config.apiKey, config.baseUrl);
2733
2879
  const cache = new SimpleCache({
2734
2880
  maxSize: cacheMaxSize,
@@ -3024,9 +3170,26 @@ function createRiverbankClient(config) {
3024
3170
  });
3025
3171
  }, { signal });
3026
3172
  },
3173
+ async getAllPublishedRoutes(params) {
3174
+ const { siteId, signal } = params;
3175
+ if (!siteId) {
3176
+ throw new Error("getAllPublishedRoutes() requires siteId");
3177
+ }
3178
+ const cacheKey = `routable-content:${siteId}:published`;
3179
+ return resilientFetch(cacheKey, async (sig) => {
3180
+ return await apiClient({
3181
+ endpoint: "getPublicRoutableContent",
3182
+ params: { siteId, publishedOnly: "true" },
3183
+ options: { signal: sig }
3184
+ });
3185
+ }, { signal });
3186
+ },
3027
3187
  clearCache() {
3028
3188
  cache.clear();
3029
3189
  },
3190
+ getKeyType() {
3191
+ return keyType;
3192
+ },
3030
3193
  getLastEmittedStatus() {
3031
3194
  return lastStatus;
3032
3195
  },
@@ -3049,4 +3212,4 @@ function createRiverbankClient(config) {
3049
3212
 
3050
3213
 
3051
3214
  exports.API_ENDPOINTS = API_ENDPOINTS; exports.buildEndpointURL = buildEndpointURL; exports.SDK_VERSION = SDK_VERSION; exports.PREBUILD_PAGE_SIZE = PREBUILD_PAGE_SIZE; exports.DEFAULT_PREBUILD_DIR = DEFAULT_PREBUILD_DIR; exports.init_constants = init_constants; exports.canUsePrebuild = canUsePrebuild; exports.PrebuildLoader = PrebuildLoader; exports.createPrebuildLoader = createPrebuildLoader; exports.init_loader = init_loader; exports.createRiverbankClient = createRiverbankClient;
3052
- //# sourceMappingURL=chunk-6Z4MQG47.js.map
3215
+ //# sourceMappingURL=chunk-WM646WI3.js.map