@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.mjs
CHANGED
|
@@ -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.
|
|
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
|
|
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 (
|
|
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
|
},
|