@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.
- package/README.md +88 -1
- package/dist/cli/index.js +3693 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/client/client.d.mts +2 -2
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.js +167 -4
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +167 -4
- package/dist/client/client.mjs.map +1 -1
- package/dist/client/hooks.d.mts +2 -2
- package/dist/client/hooks.d.ts +2 -2
- package/dist/client/usePage-CdnO2CP5.d.mts +6875 -0
- package/dist/client/usePage-_ksKXlUF.d.ts +6875 -0
- package/dist/server/{Layout-qWLdVm5-.d.mts → Layout-D4J009eS.d.mts} +1 -1
- package/dist/server/{Layout-Yluyb6sK.d.ts → Layout-l2v4Qa6E.d.ts} +1 -1
- package/dist/server/{chunk-74XUVNOO.mjs → chunk-4YQJUL5W.mjs} +4 -2
- package/dist/server/{chunk-74XUVNOO.mjs.map → chunk-4YQJUL5W.mjs.map} +1 -1
- package/dist/server/{chunk-JNU7ZS2V.mjs → chunk-65A5HAUZ.mjs} +168 -5
- package/dist/server/chunk-65A5HAUZ.mjs.map +1 -0
- package/dist/server/{chunk-JWRNMNWI.js → chunk-EIJ27EZQ.js} +4 -2
- package/dist/server/chunk-EIJ27EZQ.js.map +1 -0
- package/dist/server/{chunk-6Z4MQG47.js → chunk-WM646WI3.js} +168 -5
- package/dist/server/chunk-WM646WI3.js.map +1 -0
- package/dist/server/{components-Di5ME6He.d.ts → components-D2uCKCj7.d.ts} +3 -3
- package/dist/server/{components-DNHfSCML.d.mts → components-vtYEmmPF.d.mts} +3 -3
- package/dist/server/components.d.mts +5 -5
- package/dist/server/components.d.ts +5 -5
- package/dist/server/config-validation.d.mts +2 -2
- package/dist/server/config-validation.d.ts +2 -2
- package/dist/server/config.d.mts +3 -3
- package/dist/server/config.d.ts +3 -3
- package/dist/server/data.d.mts +2 -2
- package/dist/server/data.d.ts +2 -2
- package/dist/server/{index-Clm3skz_.d.mts → index-2qnY7VH_.d.mts} +1 -1
- package/dist/server/{index-DLvNddi-.d.ts → index-BxrAuL9K.d.ts} +1 -1
- package/dist/server/{index-C9Ra8dza.d.ts → index-CH_dvF6n.d.ts} +2 -2
- package/dist/server/{index--Oyunk_B.d.mts → index-DfWg1Qle.d.mts} +2 -2
- package/dist/server/index.d.mts +13 -5
- package/dist/server/index.d.ts +13 -5
- package/dist/server/index.js +10 -10
- package/dist/server/index.mjs +1 -1
- package/dist/server/{loadContent-D7LQwI0o.d.ts → loadContent-DECnsp4k.d.ts} +3 -3
- package/dist/server/{loadContent-DVfuBLiZ.d.mts → loadContent-Du5kS8UM.d.mts} +3 -3
- package/dist/server/{loadPage-BmYJCe_V.d.ts → loadPage-BZohBxxf.d.ts} +2 -2
- package/dist/server/{loadPage-BucnLHmE.d.mts → loadPage-VBorKlWv.d.mts} +2 -2
- package/dist/server/metadata.d.mts +4 -4
- package/dist/server/metadata.d.ts +4 -4
- package/dist/server/navigation.d.mts +2 -2
- package/dist/server/navigation.d.ts +2 -2
- package/dist/server/next.d.mts +38 -7
- package/dist/server/next.d.ts +38 -7
- package/dist/server/next.js +35 -17
- package/dist/server/next.js.map +1 -1
- package/dist/server/next.mjs +30 -12
- package/dist/server/next.mjs.map +1 -1
- package/dist/server/rendering/server.d.mts +4 -4
- package/dist/server/rendering/server.d.ts +4 -4
- package/dist/server/rendering.d.mts +7 -7
- package/dist/server/rendering.d.ts +7 -7
- package/dist/server/rendering.js +2 -2
- package/dist/server/rendering.mjs +1 -1
- package/dist/server/routing.d.mts +4 -4
- package/dist/server/routing.d.ts +4 -4
- package/dist/server/server.d.mts +5 -5
- package/dist/server/server.d.ts +5 -5
- package/dist/server/server.js +3 -3
- package/dist/server/server.mjs +2 -2
- package/dist/server/{types-C-LShyIg.d.mts → types-BRQ_6yOc.d.mts} +43 -1
- package/dist/server/{types-BjgZt8xJ.d.mts → types-CJfJwcuL.d.mts} +37 -0
- package/dist/server/{types-Dt98DeYa.d.ts → types-CgSO0yxg.d.ts} +8 -0
- package/dist/server/{types-BRQyLrQU.d.ts → types-D0rPF8l5.d.ts} +43 -1
- package/dist/server/{types-DLBhEPSt.d.ts → types-D8XqwoVd.d.ts} +37 -0
- package/dist/server/{types-BSV6Vc-P.d.mts → types-DT30Qy7x.d.mts} +8 -0
- package/dist/server/{validation-DU2YE7u5.d.ts → validation-D1LaY1kQ.d.ts} +1 -1
- package/dist/server/{validation-BGuRo8P1.d.mts → validation-Pv3Zs6dP.d.mts} +1 -1
- package/package.json +2 -1
- package/dist/server/chunk-6Z4MQG47.js.map +0 -1
- package/dist/server/chunk-JNU7ZS2V.mjs.map +0 -1
- package/dist/server/chunk-JWRNMNWI.js.map +0 -1
package/dist/client/client.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as RiverbankClient, P as PageProps, T as Theme, a as ResolvedBlockData, b as RiverbankClientConfig } from './usePage-
|
|
2
|
-
export { d as Page, U as UsePageParams, c as UsePageResult, u as usePage } from './usePage-
|
|
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';
|
package/dist/client/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as RiverbankClient, P as PageProps, T as Theme, a as ResolvedBlockData, b as RiverbankClientConfig } from './usePage-
|
|
2
|
-
export { d as Page, U as UsePageParams, c as UsePageResult, u as usePage } from './usePage-
|
|
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';
|
package/dist/client/client.js
CHANGED
|
@@ -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.
|
|
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
|
|
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 (
|
|
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
|
},
|