agentmail 0.4.13 → 0.4.15
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 +46 -14
- package/dist/cjs/BaseClient.js +2 -2
- package/dist/cjs/Client.d.ts +12 -0
- package/dist/cjs/Client.js +74 -0
- package/dist/cjs/api/errors/UnprocessableError.d.ts +6 -0
- package/dist/cjs/api/errors/UnprocessableError.js +54 -0
- package/dist/cjs/api/errors/index.d.ts +1 -0
- package/dist/cjs/api/errors/index.js +1 -0
- package/dist/cjs/api/resources/agent/exports.d.ts +2 -0
- package/dist/cjs/api/resources/agent/exports.js +21 -0
- package/dist/cjs/api/resources/apiKeys/exports.d.ts +2 -0
- package/dist/cjs/api/resources/apiKeys/exports.js +21 -0
- package/dist/cjs/api/resources/attachments/exports.d.ts +1 -0
- package/dist/cjs/api/resources/attachments/exports.js +18 -0
- package/dist/cjs/api/resources/domains/exports.d.ts +2 -0
- package/dist/cjs/api/resources/domains/exports.js +21 -0
- package/dist/cjs/api/resources/drafts/exports.d.ts +2 -0
- package/dist/cjs/api/resources/drafts/exports.js +21 -0
- package/dist/cjs/api/resources/events/exports.d.ts +1 -0
- package/dist/cjs/api/resources/events/exports.js +18 -0
- package/dist/cjs/api/resources/inboxes/exports.d.ts +3 -0
- package/dist/cjs/api/resources/inboxes/exports.js +22 -0
- package/dist/cjs/api/resources/inboxes/resources/apiKeys/exports.d.ts +2 -0
- package/dist/cjs/api/resources/inboxes/resources/apiKeys/exports.js +21 -0
- package/dist/cjs/api/resources/inboxes/resources/drafts/exports.d.ts +2 -0
- package/dist/cjs/api/resources/inboxes/resources/drafts/exports.js +21 -0
- package/dist/cjs/api/resources/inboxes/resources/lists/exports.d.ts +2 -0
- package/dist/cjs/api/resources/inboxes/resources/lists/exports.js +21 -0
- package/dist/cjs/api/resources/inboxes/resources/messages/client/Client.d.ts +1 -1
- package/dist/cjs/api/resources/inboxes/resources/messages/client/Client.js +1 -1
- package/dist/cjs/api/resources/inboxes/resources/messages/exports.d.ts +2 -0
- package/dist/cjs/api/resources/inboxes/resources/messages/exports.js +21 -0
- package/dist/cjs/api/resources/inboxes/resources/metrics/exports.d.ts +2 -0
- package/dist/cjs/api/resources/inboxes/resources/metrics/exports.js +21 -0
- package/dist/cjs/api/resources/inboxes/resources/threads/client/Client.d.ts +17 -0
- package/dist/cjs/api/resources/inboxes/resources/threads/client/Client.js +90 -0
- package/dist/cjs/api/resources/inboxes/resources/threads/exports.d.ts +2 -0
- package/dist/cjs/api/resources/inboxes/resources/threads/exports.js +21 -0
- package/dist/cjs/api/resources/lists/exports.d.ts +2 -0
- package/dist/cjs/api/resources/lists/exports.js +21 -0
- package/dist/cjs/api/resources/messages/exports.d.ts +1 -0
- package/dist/cjs/api/resources/messages/exports.js +18 -0
- package/dist/cjs/api/resources/messages/types/UpdateMessageResponse.d.ts +5 -0
- package/dist/cjs/api/resources/messages/types/UpdateMessageResponse.js +3 -0
- package/dist/cjs/api/resources/messages/types/index.d.ts +1 -0
- package/dist/cjs/api/resources/messages/types/index.js +1 -0
- package/dist/cjs/api/resources/metrics/exports.d.ts +2 -0
- package/dist/cjs/api/resources/metrics/exports.js +21 -0
- package/dist/cjs/api/resources/metrics/types/QueryMetricsResponse.d.ts +1 -1
- package/dist/cjs/api/resources/organizations/exports.d.ts +2 -0
- package/dist/cjs/api/resources/organizations/exports.js +21 -0
- package/dist/cjs/api/resources/pods/exports.d.ts +3 -0
- package/dist/cjs/api/resources/pods/exports.js +22 -0
- package/dist/cjs/api/resources/pods/resources/apiKeys/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/apiKeys/exports.js +21 -0
- package/dist/cjs/api/resources/pods/resources/domains/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/domains/exports.js +21 -0
- package/dist/cjs/api/resources/pods/resources/drafts/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/drafts/exports.js +21 -0
- package/dist/cjs/api/resources/pods/resources/inboxes/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/inboxes/exports.js +21 -0
- package/dist/cjs/api/resources/pods/resources/lists/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/lists/exports.js +21 -0
- package/dist/cjs/api/resources/pods/resources/metrics/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/metrics/exports.js +21 -0
- package/dist/cjs/api/resources/pods/resources/threads/client/Client.d.ts +17 -0
- package/dist/cjs/api/resources/pods/resources/threads/client/Client.js +90 -0
- package/dist/cjs/api/resources/pods/resources/threads/exports.d.ts +2 -0
- package/dist/cjs/api/resources/pods/resources/threads/exports.js +21 -0
- package/dist/cjs/api/resources/threads/client/Client.d.ts +16 -0
- package/dist/cjs/api/resources/threads/client/Client.js +89 -0
- package/dist/cjs/api/resources/threads/exports.d.ts +2 -0
- package/dist/cjs/api/resources/threads/exports.js +21 -0
- package/dist/cjs/api/resources/threads/types/UpdateThreadRequest.d.ts +6 -0
- package/dist/cjs/api/resources/threads/types/UpdateThreadRequest.js +3 -0
- package/dist/cjs/api/resources/threads/types/UpdateThreadResponse.d.ts +5 -0
- package/dist/cjs/api/resources/threads/types/UpdateThreadResponse.js +3 -0
- package/dist/cjs/api/resources/threads/types/index.d.ts +2 -0
- package/dist/cjs/api/resources/threads/types/index.js +2 -0
- package/dist/cjs/api/resources/webhooks/exports.d.ts +3 -0
- package/dist/cjs/api/resources/webhooks/exports.js +22 -0
- package/dist/cjs/api/resources/webhooks/resources/events/exports.d.ts +1 -0
- package/dist/cjs/api/resources/webhooks/resources/events/exports.js +18 -0
- package/dist/cjs/api/resources/websockets/client/Client.d.ts +6 -0
- package/dist/cjs/api/resources/websockets/client/Client.js +8 -3
- package/dist/cjs/api/resources/websockets/client/Socket.d.ts +2 -2
- package/dist/cjs/api/resources/websockets/client/Socket.js +2 -2
- package/dist/cjs/api/resources/websockets/exports.d.ts +3 -0
- package/dist/cjs/api/resources/websockets/exports.js +23 -0
- package/dist/cjs/core/fetcher/BinaryResponse.d.ts +1 -1
- package/dist/cjs/core/fetcher/Fetcher.js +8 -2
- package/dist/cjs/core/fetcher/index.d.ts +2 -0
- package/dist/cjs/core/fetcher/index.js +3 -1
- package/dist/cjs/core/fetcher/makePassthroughRequest.d.ts +49 -0
- package/dist/cjs/core/fetcher/makePassthroughRequest.js +135 -0
- package/dist/cjs/core/fetcher/makeRequest.d.ts +6 -1
- package/dist/cjs/core/fetcher/makeRequest.js +30 -9
- package/dist/cjs/core/runtime/runtime.js +8 -7
- package/dist/cjs/core/schemas/builders/list/list.js +12 -17
- package/dist/cjs/core/schemas/builders/object/object.js +102 -40
- package/dist/cjs/core/schemas/builders/object-like/getObjectLikeUtils.js +10 -3
- package/dist/cjs/core/schemas/builders/record/index.d.ts +2 -2
- package/dist/cjs/core/schemas/builders/record/index.js +2 -1
- package/dist/cjs/core/schemas/builders/record/record.d.ts +2 -1
- package/dist/cjs/core/schemas/builders/record/record.js +63 -25
- package/dist/cjs/core/schemas/builders/record/types.d.ts +2 -0
- package/dist/cjs/core/schemas/builders/union/union.js +9 -12
- package/dist/cjs/core/schemas/utils/isPlainObject.js +4 -6
- package/dist/cjs/core/websocket/ws.d.ts +14 -2
- package/dist/cjs/core/websocket/ws.js +51 -7
- package/dist/cjs/serialization/resources/messages/types/UpdateMessageResponse.d.ts +12 -0
- package/dist/cjs/serialization/resources/messages/types/UpdateMessageResponse.js +44 -0
- package/dist/cjs/serialization/resources/messages/types/index.d.ts +1 -0
- package/dist/cjs/serialization/resources/messages/types/index.js +1 -0
- package/dist/cjs/serialization/resources/metrics/types/QueryMetricsResponse.js +1 -1
- package/dist/cjs/serialization/resources/threads/types/UpdateThreadRequest.d.ts +10 -0
- package/dist/cjs/serialization/resources/threads/types/UpdateThreadRequest.js +42 -0
- package/dist/cjs/serialization/resources/threads/types/UpdateThreadResponse.d.ts +12 -0
- package/dist/cjs/serialization/resources/threads/types/UpdateThreadResponse.js +44 -0
- package/dist/cjs/serialization/resources/threads/types/index.d.ts +2 -0
- package/dist/cjs/serialization/resources/threads/types/index.js +2 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/BaseClient.mjs +2 -2
- package/dist/esm/Client.d.mts +12 -0
- package/dist/esm/Client.mjs +41 -0
- package/dist/esm/api/errors/UnprocessableError.d.mts +6 -0
- package/dist/esm/api/errors/UnprocessableError.mjs +17 -0
- package/dist/esm/api/errors/index.d.mts +1 -0
- package/dist/esm/api/errors/index.mjs +1 -0
- package/dist/esm/api/resources/agent/exports.d.mts +2 -0
- package/dist/esm/api/resources/agent/exports.mjs +3 -0
- package/dist/esm/api/resources/apiKeys/exports.d.mts +2 -0
- package/dist/esm/api/resources/apiKeys/exports.mjs +3 -0
- package/dist/esm/api/resources/attachments/exports.d.mts +1 -0
- package/dist/esm/api/resources/attachments/exports.mjs +2 -0
- package/dist/esm/api/resources/domains/exports.d.mts +2 -0
- package/dist/esm/api/resources/domains/exports.mjs +3 -0
- package/dist/esm/api/resources/drafts/exports.d.mts +2 -0
- package/dist/esm/api/resources/drafts/exports.mjs +3 -0
- package/dist/esm/api/resources/events/exports.d.mts +1 -0
- package/dist/esm/api/resources/events/exports.mjs +2 -0
- package/dist/esm/api/resources/inboxes/exports.d.mts +3 -0
- package/dist/esm/api/resources/inboxes/exports.mjs +4 -0
- package/dist/esm/api/resources/inboxes/resources/apiKeys/exports.d.mts +2 -0
- package/dist/esm/api/resources/inboxes/resources/apiKeys/exports.mjs +3 -0
- package/dist/esm/api/resources/inboxes/resources/drafts/exports.d.mts +2 -0
- package/dist/esm/api/resources/inboxes/resources/drafts/exports.mjs +3 -0
- package/dist/esm/api/resources/inboxes/resources/lists/exports.d.mts +2 -0
- package/dist/esm/api/resources/inboxes/resources/lists/exports.mjs +3 -0
- package/dist/esm/api/resources/inboxes/resources/messages/client/Client.d.mts +1 -1
- package/dist/esm/api/resources/inboxes/resources/messages/client/Client.mjs +1 -1
- package/dist/esm/api/resources/inboxes/resources/messages/exports.d.mts +2 -0
- package/dist/esm/api/resources/inboxes/resources/messages/exports.mjs +3 -0
- package/dist/esm/api/resources/inboxes/resources/metrics/exports.d.mts +2 -0
- package/dist/esm/api/resources/inboxes/resources/metrics/exports.mjs +3 -0
- package/dist/esm/api/resources/inboxes/resources/threads/client/Client.d.mts +17 -0
- package/dist/esm/api/resources/inboxes/resources/threads/client/Client.mjs +90 -0
- package/dist/esm/api/resources/inboxes/resources/threads/exports.d.mts +2 -0
- package/dist/esm/api/resources/inboxes/resources/threads/exports.mjs +3 -0
- package/dist/esm/api/resources/lists/exports.d.mts +2 -0
- package/dist/esm/api/resources/lists/exports.mjs +3 -0
- package/dist/esm/api/resources/messages/exports.d.mts +1 -0
- package/dist/esm/api/resources/messages/exports.mjs +2 -0
- package/dist/esm/api/resources/messages/types/UpdateMessageResponse.d.mts +5 -0
- package/dist/esm/api/resources/messages/types/UpdateMessageResponse.mjs +2 -0
- package/dist/esm/api/resources/messages/types/index.d.mts +1 -0
- package/dist/esm/api/resources/messages/types/index.mjs +1 -0
- package/dist/esm/api/resources/metrics/exports.d.mts +2 -0
- package/dist/esm/api/resources/metrics/exports.mjs +3 -0
- package/dist/esm/api/resources/metrics/types/QueryMetricsResponse.d.mts +1 -1
- package/dist/esm/api/resources/organizations/exports.d.mts +2 -0
- package/dist/esm/api/resources/organizations/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/exports.d.mts +3 -0
- package/dist/esm/api/resources/pods/exports.mjs +4 -0
- package/dist/esm/api/resources/pods/resources/apiKeys/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/apiKeys/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/resources/domains/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/domains/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/resources/drafts/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/drafts/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/resources/inboxes/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/inboxes/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/resources/lists/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/lists/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/resources/metrics/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/metrics/exports.mjs +3 -0
- package/dist/esm/api/resources/pods/resources/threads/client/Client.d.mts +17 -0
- package/dist/esm/api/resources/pods/resources/threads/client/Client.mjs +90 -0
- package/dist/esm/api/resources/pods/resources/threads/exports.d.mts +2 -0
- package/dist/esm/api/resources/pods/resources/threads/exports.mjs +3 -0
- package/dist/esm/api/resources/threads/client/Client.d.mts +16 -0
- package/dist/esm/api/resources/threads/client/Client.mjs +89 -0
- package/dist/esm/api/resources/threads/exports.d.mts +2 -0
- package/dist/esm/api/resources/threads/exports.mjs +3 -0
- package/dist/esm/api/resources/threads/types/UpdateThreadRequest.d.mts +6 -0
- package/dist/esm/api/resources/threads/types/UpdateThreadRequest.mjs +2 -0
- package/dist/esm/api/resources/threads/types/UpdateThreadResponse.d.mts +5 -0
- package/dist/esm/api/resources/threads/types/UpdateThreadResponse.mjs +2 -0
- package/dist/esm/api/resources/threads/types/index.d.mts +2 -0
- package/dist/esm/api/resources/threads/types/index.mjs +2 -0
- package/dist/esm/api/resources/webhooks/exports.d.mts +3 -0
- package/dist/esm/api/resources/webhooks/exports.mjs +4 -0
- package/dist/esm/api/resources/webhooks/resources/events/exports.d.mts +1 -0
- package/dist/esm/api/resources/webhooks/resources/events/exports.mjs +2 -0
- package/dist/esm/api/resources/websockets/client/Client.d.mts +6 -0
- package/dist/esm/api/resources/websockets/client/Client.mjs +8 -3
- package/dist/esm/api/resources/websockets/client/Socket.d.mts +2 -2
- package/dist/esm/api/resources/websockets/client/Socket.mjs +2 -2
- package/dist/esm/api/resources/websockets/exports.d.mts +3 -0
- package/dist/esm/api/resources/websockets/exports.mjs +4 -0
- package/dist/esm/core/fetcher/BinaryResponse.d.mts +1 -1
- package/dist/esm/core/fetcher/Fetcher.mjs +8 -2
- package/dist/esm/core/fetcher/index.d.mts +2 -0
- package/dist/esm/core/fetcher/index.mjs +1 -0
- package/dist/esm/core/fetcher/makePassthroughRequest.d.mts +49 -0
- package/dist/esm/core/fetcher/makePassthroughRequest.mjs +132 -0
- package/dist/esm/core/fetcher/makeRequest.d.mts +6 -1
- package/dist/esm/core/fetcher/makeRequest.mjs +28 -9
- package/dist/esm/core/runtime/runtime.mjs +8 -7
- package/dist/esm/core/schemas/builders/list/list.mjs +12 -17
- package/dist/esm/core/schemas/builders/object/object.mjs +102 -40
- package/dist/esm/core/schemas/builders/object-like/getObjectLikeUtils.mjs +10 -3
- package/dist/esm/core/schemas/builders/record/index.d.mts +2 -2
- package/dist/esm/core/schemas/builders/record/index.mjs +1 -1
- package/dist/esm/core/schemas/builders/record/record.d.mts +2 -1
- package/dist/esm/core/schemas/builders/record/record.mjs +62 -25
- package/dist/esm/core/schemas/builders/record/types.d.mts +2 -0
- package/dist/esm/core/schemas/builders/union/union.mjs +9 -12
- package/dist/esm/core/schemas/utils/isPlainObject.mjs +4 -6
- package/dist/esm/core/websocket/ws.d.mts +14 -2
- package/dist/esm/core/websocket/ws.mjs +51 -7
- package/dist/esm/serialization/resources/messages/types/UpdateMessageResponse.d.mts +12 -0
- package/dist/esm/serialization/resources/messages/types/UpdateMessageResponse.mjs +8 -0
- package/dist/esm/serialization/resources/messages/types/index.d.mts +1 -0
- package/dist/esm/serialization/resources/messages/types/index.mjs +1 -0
- package/dist/esm/serialization/resources/metrics/types/QueryMetricsResponse.mjs +1 -1
- package/dist/esm/serialization/resources/threads/types/UpdateThreadRequest.d.mts +10 -0
- package/dist/esm/serialization/resources/threads/types/UpdateThreadRequest.mjs +6 -0
- package/dist/esm/serialization/resources/threads/types/UpdateThreadResponse.d.mts +12 -0
- package/dist/esm/serialization/resources/threads/types/UpdateThreadResponse.mjs +8 -0
- package/dist/esm/serialization/resources/threads/types/index.d.mts +2 -0
- package/dist/esm/serialization/resources/threads/types/index.mjs +2 -0
- package/dist/esm/version.d.mts +1 -1
- package/dist/esm/version.mjs +1 -1
- package/package.json +305 -13
- package/reference.md +231 -1
|
@@ -21,7 +21,7 @@ export declare class WebsocketsSocket {
|
|
|
21
21
|
private handleError;
|
|
22
22
|
constructor(args: WebsocketsSocket.Args);
|
|
23
23
|
/** The current state of the connection; this is one of the readyState constants. */
|
|
24
|
-
get readyState():
|
|
24
|
+
get readyState(): core.ReconnectingWebSocket.ReadyState;
|
|
25
25
|
/**
|
|
26
26
|
* @param event - The event to attach to.
|
|
27
27
|
* @param callback - The callback to run when the event is triggered.
|
|
@@ -43,5 +43,5 @@ export declare class WebsocketsSocket {
|
|
|
43
43
|
/** Asserts that the websocket is open. */
|
|
44
44
|
private assertSocketIsOpen;
|
|
45
45
|
/** Send a binary payload to the websocket. */
|
|
46
|
-
protected sendBinary(payload:
|
|
46
|
+
protected sendBinary(payload: ArrayBuffer | Blob | ArrayBufferView): void;
|
|
47
47
|
}
|
|
@@ -100,7 +100,7 @@ export class WebsocketsSocket {
|
|
|
100
100
|
/** Returns a promise that resolves when the websocket is open. */
|
|
101
101
|
waitForOpen() {
|
|
102
102
|
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
-
if (this.socket.readyState === core.ReconnectingWebSocket.OPEN) {
|
|
103
|
+
if (this.socket.readyState === core.ReconnectingWebSocket.ReadyState.OPEN) {
|
|
104
104
|
return this.socket;
|
|
105
105
|
}
|
|
106
106
|
return new Promise((resolve, reject) => {
|
|
@@ -118,7 +118,7 @@ export class WebsocketsSocket {
|
|
|
118
118
|
if (!this.socket) {
|
|
119
119
|
throw new Error("Socket is not connected.");
|
|
120
120
|
}
|
|
121
|
-
if (this.socket.readyState !== core.ReconnectingWebSocket.OPEN) {
|
|
121
|
+
if (this.socket.readyState !== core.ReconnectingWebSocket.ReadyState.OPEN) {
|
|
122
122
|
throw new Error("Socket is not open.");
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -14,6 +14,6 @@ export type BinaryResponse = {
|
|
|
14
14
|
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes)
|
|
15
15
|
* Some versions of the Fetch API may not support this method.
|
|
16
16
|
*/
|
|
17
|
-
bytes?():
|
|
17
|
+
bytes?(): Promise<Uint8Array>;
|
|
18
18
|
};
|
|
19
19
|
export declare function getBinaryResponse(response: Response): BinaryResponse;
|
|
@@ -152,7 +152,13 @@ function getHeaders(args) {
|
|
|
152
152
|
return __awaiter(this, void 0, void 0, function* () {
|
|
153
153
|
var _a;
|
|
154
154
|
const newHeaders = new Headers();
|
|
155
|
-
newHeaders.set("Accept", args.responseType === "json"
|
|
155
|
+
newHeaders.set("Accept", args.responseType === "json"
|
|
156
|
+
? "application/json"
|
|
157
|
+
: args.responseType === "text"
|
|
158
|
+
? "text/plain"
|
|
159
|
+
: args.responseType === "sse"
|
|
160
|
+
? "text/event-stream"
|
|
161
|
+
: "*/*");
|
|
156
162
|
if (args.body !== undefined && args.contentType != null) {
|
|
157
163
|
newHeaders.set("Content-Type", args.contentType);
|
|
158
164
|
}
|
|
@@ -196,7 +202,7 @@ export function fetcherImpl(args) {
|
|
|
196
202
|
}
|
|
197
203
|
try {
|
|
198
204
|
const response = yield requestWithRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
199
|
-
return makeRequest(fetchFn, url, args.method, headers, requestBody, args.timeoutMs, args.abortSignal, args.withCredentials, args.duplex);
|
|
205
|
+
return makeRequest(fetchFn, url, args.method, headers, requestBody, args.timeoutMs, args.abortSignal, args.withCredentials, args.duplex, args.responseType === "streaming" || args.responseType === "sse");
|
|
200
206
|
}), args.maxRetries);
|
|
201
207
|
if (response.status >= 200 && response.status < 400) {
|
|
202
208
|
if (logger.isDebug()) {
|
|
@@ -6,6 +6,8 @@ export type { Fetcher, FetchFunction } from "./Fetcher.mjs";
|
|
|
6
6
|
export { fetcher } from "./Fetcher.mjs";
|
|
7
7
|
export { getHeader } from "./getHeader.mjs";
|
|
8
8
|
export { HttpResponsePromise } from "./HttpResponsePromise.mjs";
|
|
9
|
+
export type { PassthroughRequest } from "./makePassthroughRequest.mjs";
|
|
10
|
+
export { makePassthroughRequest } from "./makePassthroughRequest.mjs";
|
|
9
11
|
export type { RawResponse, WithRawResponse } from "./RawResponse.mjs";
|
|
10
12
|
export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.mjs";
|
|
11
13
|
export { Supplier } from "./Supplier.mjs";
|
|
@@ -2,5 +2,6 @@ export { EndpointSupplier } from "./EndpointSupplier.mjs";
|
|
|
2
2
|
export { fetcher } from "./Fetcher.mjs";
|
|
3
3
|
export { getHeader } from "./getHeader.mjs";
|
|
4
4
|
export { HttpResponsePromise } from "./HttpResponsePromise.mjs";
|
|
5
|
+
export { makePassthroughRequest } from "./makePassthroughRequest.mjs";
|
|
5
6
|
export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.mjs";
|
|
6
7
|
export { Supplier } from "./Supplier.mjs";
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type LogConfig, type Logger } from "../logging/logger.mjs";
|
|
2
|
+
import { Supplier } from "./Supplier.mjs";
|
|
3
|
+
export declare namespace PassthroughRequest {
|
|
4
|
+
/**
|
|
5
|
+
* Per-request options that can override the SDK client defaults.
|
|
6
|
+
*/
|
|
7
|
+
interface RequestOptions {
|
|
8
|
+
/** Override the default timeout for this request (in seconds). */
|
|
9
|
+
timeoutInSeconds?: number;
|
|
10
|
+
/** Override the default number of retries for this request. */
|
|
11
|
+
maxRetries?: number;
|
|
12
|
+
/** Additional headers to include in this request. */
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
/** Abort signal for this request. */
|
|
15
|
+
abortSignal?: AbortSignal;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* SDK client configuration used by the passthrough fetch method.
|
|
19
|
+
*/
|
|
20
|
+
interface ClientOptions {
|
|
21
|
+
/** The base URL or environment for the client. */
|
|
22
|
+
environment?: Supplier<string>;
|
|
23
|
+
/** Override the base URL. */
|
|
24
|
+
baseUrl?: Supplier<string>;
|
|
25
|
+
/** Default headers to include in requests. */
|
|
26
|
+
headers?: Record<string, unknown>;
|
|
27
|
+
/** Default maximum time to wait for a response in seconds. */
|
|
28
|
+
timeoutInSeconds?: number;
|
|
29
|
+
/** Default number of times to retry the request. Defaults to 2. */
|
|
30
|
+
maxRetries?: number;
|
|
31
|
+
/** A custom fetch function. */
|
|
32
|
+
fetch?: typeof fetch;
|
|
33
|
+
/** Logging configuration. */
|
|
34
|
+
logging?: LogConfig | Logger;
|
|
35
|
+
/** A function that returns auth headers. */
|
|
36
|
+
getAuthHeaders?: () => Promise<Record<string, string>>;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Makes a passthrough HTTP request using the SDK's configuration (auth, retry, logging, etc.)
|
|
41
|
+
* while mimicking the standard `fetch` API.
|
|
42
|
+
*
|
|
43
|
+
* @param input - The URL, path, or Request object. If a relative path, it will be resolved against the configured base URL.
|
|
44
|
+
* @param init - Standard RequestInit options (method, headers, body, signal, etc.)
|
|
45
|
+
* @param clientOptions - SDK client options (auth, default headers, logging, etc.)
|
|
46
|
+
* @param requestOptions - Per-request overrides (timeout, retries, extra headers, abort signal).
|
|
47
|
+
* @returns A standard Response object.
|
|
48
|
+
*/
|
|
49
|
+
export declare function makePassthroughRequest(input: Request | string | URL, init: RequestInit | undefined, clientOptions: PassthroughRequest.ClientOptions, requestOptions?: PassthroughRequest.RequestOptions): Promise<Response>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { createLogger } from "../logging/logger.mjs";
|
|
11
|
+
import { join } from "../url/join.mjs";
|
|
12
|
+
import { EndpointSupplier } from "./EndpointSupplier.mjs";
|
|
13
|
+
import { getFetchFn } from "./getFetchFn.mjs";
|
|
14
|
+
import { makeRequest } from "./makeRequest.mjs";
|
|
15
|
+
import { requestWithRetries } from "./requestWithRetries.mjs";
|
|
16
|
+
import { Supplier } from "./Supplier.mjs";
|
|
17
|
+
/**
|
|
18
|
+
* Makes a passthrough HTTP request using the SDK's configuration (auth, retry, logging, etc.)
|
|
19
|
+
* while mimicking the standard `fetch` API.
|
|
20
|
+
*
|
|
21
|
+
* @param input - The URL, path, or Request object. If a relative path, it will be resolved against the configured base URL.
|
|
22
|
+
* @param init - Standard RequestInit options (method, headers, body, signal, etc.)
|
|
23
|
+
* @param clientOptions - SDK client options (auth, default headers, logging, etc.)
|
|
24
|
+
* @param requestOptions - Per-request overrides (timeout, retries, extra headers, abort signal).
|
|
25
|
+
* @returns A standard Response object.
|
|
26
|
+
*/
|
|
27
|
+
export function makePassthroughRequest(input, init, clientOptions, requestOptions) {
|
|
28
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
30
|
+
const logger = createLogger(clientOptions.logging);
|
|
31
|
+
// Extract URL and default init properties from Request object if provided
|
|
32
|
+
let url;
|
|
33
|
+
let effectiveInit = init;
|
|
34
|
+
if (input instanceof Request) {
|
|
35
|
+
url = input.url;
|
|
36
|
+
// If no explicit init provided, extract properties from the Request object
|
|
37
|
+
if (init == null) {
|
|
38
|
+
effectiveInit = {
|
|
39
|
+
method: input.method,
|
|
40
|
+
headers: Object.fromEntries(input.headers.entries()),
|
|
41
|
+
body: input.body,
|
|
42
|
+
signal: input.signal,
|
|
43
|
+
credentials: input.credentials,
|
|
44
|
+
cache: input.cache,
|
|
45
|
+
redirect: input.redirect,
|
|
46
|
+
referrer: input.referrer,
|
|
47
|
+
integrity: input.integrity,
|
|
48
|
+
mode: input.mode,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
url = input instanceof URL ? input.toString() : input;
|
|
54
|
+
}
|
|
55
|
+
// Resolve the base URL
|
|
56
|
+
const baseUrl = (_a = (clientOptions.baseUrl != null ? yield Supplier.get(clientOptions.baseUrl) : undefined)) !== null && _a !== void 0 ? _a : (clientOptions.environment != null ? yield Supplier.get(clientOptions.environment) : undefined);
|
|
57
|
+
// Determine the full URL
|
|
58
|
+
let fullUrl;
|
|
59
|
+
if (url.startsWith("http://") || url.startsWith("https://")) {
|
|
60
|
+
fullUrl = url;
|
|
61
|
+
}
|
|
62
|
+
else if (baseUrl != null) {
|
|
63
|
+
fullUrl = join(baseUrl, url);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
fullUrl = url;
|
|
67
|
+
}
|
|
68
|
+
// Merge headers: SDK default headers -> auth headers -> user-provided headers
|
|
69
|
+
const mergedHeaders = {};
|
|
70
|
+
// Apply SDK default headers (resolve suppliers)
|
|
71
|
+
if (clientOptions.headers != null) {
|
|
72
|
+
for (const [key, value] of Object.entries(clientOptions.headers)) {
|
|
73
|
+
const resolved = yield EndpointSupplier.get(value, { endpointMetadata: {} });
|
|
74
|
+
if (resolved != null) {
|
|
75
|
+
mergedHeaders[key.toLowerCase()] = `${resolved}`;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Apply auth headers
|
|
80
|
+
if (clientOptions.getAuthHeaders != null) {
|
|
81
|
+
const authHeaders = yield clientOptions.getAuthHeaders();
|
|
82
|
+
for (const [key, value] of Object.entries(authHeaders)) {
|
|
83
|
+
mergedHeaders[key.toLowerCase()] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Apply user-provided headers from init
|
|
87
|
+
if ((effectiveInit === null || effectiveInit === void 0 ? void 0 : effectiveInit.headers) != null) {
|
|
88
|
+
const initHeaders = effectiveInit.headers instanceof Headers
|
|
89
|
+
? Object.fromEntries(effectiveInit.headers.entries())
|
|
90
|
+
: Array.isArray(effectiveInit.headers)
|
|
91
|
+
? Object.fromEntries(effectiveInit.headers)
|
|
92
|
+
: effectiveInit.headers;
|
|
93
|
+
for (const [key, value] of Object.entries(initHeaders)) {
|
|
94
|
+
if (value != null) {
|
|
95
|
+
mergedHeaders[key.toLowerCase()] = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Apply per-request option headers (highest priority)
|
|
100
|
+
if ((requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.headers) != null) {
|
|
101
|
+
for (const [key, value] of Object.entries(requestOptions.headers)) {
|
|
102
|
+
mergedHeaders[key.toLowerCase()] = value;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const method = (_b = effectiveInit === null || effectiveInit === void 0 ? void 0 : effectiveInit.method) !== null && _b !== void 0 ? _b : "GET";
|
|
106
|
+
const body = effectiveInit === null || effectiveInit === void 0 ? void 0 : effectiveInit.body;
|
|
107
|
+
const timeoutInSeconds = (_c = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.timeoutInSeconds) !== null && _c !== void 0 ? _c : clientOptions.timeoutInSeconds;
|
|
108
|
+
const timeoutMs = timeoutInSeconds != null ? timeoutInSeconds * 1000 : undefined;
|
|
109
|
+
const maxRetries = (_d = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.maxRetries) !== null && _d !== void 0 ? _d : clientOptions.maxRetries;
|
|
110
|
+
const abortSignal = (_f = (_e = requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.abortSignal) !== null && _e !== void 0 ? _e : effectiveInit === null || effectiveInit === void 0 ? void 0 : effectiveInit.signal) !== null && _f !== void 0 ? _f : undefined;
|
|
111
|
+
const fetchFn = (_g = clientOptions.fetch) !== null && _g !== void 0 ? _g : (yield getFetchFn());
|
|
112
|
+
if (logger.isDebug()) {
|
|
113
|
+
logger.debug("Making passthrough HTTP request", {
|
|
114
|
+
method,
|
|
115
|
+
url: fullUrl,
|
|
116
|
+
hasBody: body != null,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const response = yield requestWithRetries(() => __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
return makeRequest(fetchFn, fullUrl, method, mergedHeaders, body !== null && body !== void 0 ? body : undefined, timeoutMs, abortSignal, (effectiveInit === null || effectiveInit === void 0 ? void 0 : effectiveInit.credentials) === "include", undefined, // duplex
|
|
121
|
+
false);
|
|
122
|
+
}), maxRetries);
|
|
123
|
+
if (logger.isDebug()) {
|
|
124
|
+
logger.debug("Passthrough HTTP request completed", {
|
|
125
|
+
method,
|
|
126
|
+
url: fullUrl,
|
|
127
|
+
statusCode: response.status,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return response;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
export declare
|
|
1
|
+
export declare function isCacheNoStoreSupported(): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* Reset the cached result of `isCacheNoStoreSupported`. Exposed for testing only.
|
|
4
|
+
*/
|
|
5
|
+
export declare function resetCacheNoStoreSupported(): void;
|
|
6
|
+
export declare const makeRequest: (fetchFn: (url: string, init: RequestInit) => Promise<Response>, url: string, method: string, headers: Headers | Record<string, string>, requestBody: BodyInit | undefined, timeoutMs?: number, abortSignal?: AbortSignal, withCredentials?: boolean, duplex?: "half", disableCache?: boolean) => Promise<Response>;
|
|
@@ -8,7 +8,32 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { anySignal, getTimeoutSignal } from "./signals.mjs";
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Cached result of checking whether the current runtime supports
|
|
13
|
+
* the `cache` option in `Request`. Some runtimes (e.g. Cloudflare Workers)
|
|
14
|
+
* throw a TypeError when this option is used.
|
|
15
|
+
*/
|
|
16
|
+
let _cacheNoStoreSupported;
|
|
17
|
+
export function isCacheNoStoreSupported() {
|
|
18
|
+
if (_cacheNoStoreSupported != null) {
|
|
19
|
+
return _cacheNoStoreSupported;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
new Request("http://localhost", { cache: "no-store" });
|
|
23
|
+
_cacheNoStoreSupported = true;
|
|
24
|
+
}
|
|
25
|
+
catch (_a) {
|
|
26
|
+
_cacheNoStoreSupported = false;
|
|
27
|
+
}
|
|
28
|
+
return _cacheNoStoreSupported;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Reset the cached result of `isCacheNoStoreSupported`. Exposed for testing only.
|
|
32
|
+
*/
|
|
33
|
+
export function resetCacheNoStoreSupported() {
|
|
34
|
+
_cacheNoStoreSupported = undefined;
|
|
35
|
+
}
|
|
36
|
+
export const makeRequest = (fetchFn, url, method, headers, requestBody, timeoutMs, abortSignal, withCredentials, duplex, disableCache) => __awaiter(void 0, void 0, void 0, function* () {
|
|
12
37
|
const signals = [];
|
|
13
38
|
let timeoutAbortId;
|
|
14
39
|
if (timeoutMs != null) {
|
|
@@ -20,15 +45,9 @@ export const makeRequest = (fetchFn, url, method, headers, requestBody, timeoutM
|
|
|
20
45
|
signals.push(abortSignal);
|
|
21
46
|
}
|
|
22
47
|
const newSignals = anySignal(signals);
|
|
23
|
-
const response = yield fetchFn(url, {
|
|
24
|
-
method: method,
|
|
25
|
-
headers,
|
|
26
|
-
body: requestBody,
|
|
27
|
-
signal: newSignals,
|
|
28
|
-
credentials: withCredentials ? "include" : undefined,
|
|
48
|
+
const response = yield fetchFn(url, Object.assign({ method: method, headers, body: requestBody, signal: newSignals, credentials: withCredentials ? "include" : undefined,
|
|
29
49
|
// @ts-ignore
|
|
30
|
-
duplex,
|
|
31
|
-
});
|
|
50
|
+
duplex }, (disableCache && isCacheNoStoreSupported() ? { cache: "no-store" } : {})));
|
|
32
51
|
if (timeoutAbortId != null) {
|
|
33
52
|
clearTimeout(timeoutAbortId);
|
|
34
53
|
}
|
|
@@ -81,17 +81,18 @@ function evaluateRuntime() {
|
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
83
|
* A constant that indicates whether the environment the code is running is Node.JS.
|
|
84
|
+
*
|
|
85
|
+
* We assign `process` to a local variable first to avoid being flagged by
|
|
86
|
+
* bundlers that perform static analysis on `process.versions` (e.g. Next.js
|
|
87
|
+
* Edge Runtime warns about Node.js APIs even when they are guarded).
|
|
84
88
|
*/
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
!!process.version &&
|
|
88
|
-
"versions" in process &&
|
|
89
|
-
!!((_e = process.versions) === null || _e === void 0 ? void 0 : _e.node);
|
|
89
|
+
const _process = typeof process !== "undefined" ? process : undefined;
|
|
90
|
+
const isNode = typeof _process !== "undefined" && typeof ((_e = _process.versions) === null || _e === void 0 ? void 0 : _e.node) === "string";
|
|
90
91
|
if (isNode) {
|
|
91
92
|
return {
|
|
92
93
|
type: "node",
|
|
93
|
-
version:
|
|
94
|
-
parsedVersion: Number(
|
|
94
|
+
version: _process.versions.node,
|
|
95
|
+
parsedVersion: Number(_process.versions.node.split(".")[0]),
|
|
95
96
|
};
|
|
96
97
|
}
|
|
97
98
|
return {
|
|
@@ -28,24 +28,19 @@ function validateAndTransformArray(value, transformItem) {
|
|
|
28
28
|
],
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
};
|
|
31
|
+
const result = [];
|
|
32
|
+
const errors = [];
|
|
33
|
+
for (let i = 0; i < value.length; i++) {
|
|
34
|
+
const item = transformItem(value[i], i);
|
|
35
|
+
if (item.ok) {
|
|
36
|
+
result.push(item.value);
|
|
38
37
|
}
|
|
39
|
-
|
|
40
|
-
if (!acc.ok) {
|
|
41
|
-
errors.push(...acc.errors);
|
|
42
|
-
}
|
|
43
|
-
if (!item.ok) {
|
|
38
|
+
else {
|
|
44
39
|
errors.push(...item.errors);
|
|
45
40
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
41
|
+
}
|
|
42
|
+
if (errors.length === 0) {
|
|
43
|
+
return { ok: true, value: result };
|
|
44
|
+
}
|
|
45
|
+
return { ok: false, errors };
|
|
51
46
|
}
|
|
@@ -9,63 +9,113 @@ import { partition } from "../../utils/partition.mjs";
|
|
|
9
9
|
import { getObjectLikeUtils } from "../object-like/index.mjs";
|
|
10
10
|
import { getSchemaUtils } from "../schema-utils/index.mjs";
|
|
11
11
|
import { isProperty } from "./property.mjs";
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
13
|
+
const _hasOwn = Object.prototype.hasOwnProperty;
|
|
12
14
|
export function object(schemas) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
// All property metadata is lazily computed on first use.
|
|
16
|
+
// This keeps schema construction free of iteration, which matters when
|
|
17
|
+
// many schemas are defined but only some are exercised at runtime.
|
|
18
|
+
// Required-key computation is also deferred because lazy() schemas may
|
|
19
|
+
// not be resolved at construction time.
|
|
20
|
+
let _rawKeyToProperty;
|
|
21
|
+
function getRawKeyToProperty() {
|
|
22
|
+
if (_rawKeyToProperty == null) {
|
|
23
|
+
_rawKeyToProperty = {};
|
|
19
24
|
for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) {
|
|
20
|
-
const rawKey = isProperty(schemaOrObjectProperty)
|
|
25
|
+
const rawKey = isProperty(schemaOrObjectProperty)
|
|
26
|
+
? schemaOrObjectProperty.rawKey
|
|
27
|
+
: parsedKey;
|
|
21
28
|
const valueSchema = isProperty(schemaOrObjectProperty)
|
|
22
29
|
? schemaOrObjectProperty.valueSchema
|
|
23
30
|
: schemaOrObjectProperty;
|
|
24
|
-
|
|
31
|
+
_rawKeyToProperty[rawKey] = {
|
|
25
32
|
rawKey,
|
|
26
33
|
parsedKey: parsedKey,
|
|
27
34
|
valueSchema,
|
|
28
35
|
};
|
|
29
|
-
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return _rawKeyToProperty;
|
|
39
|
+
}
|
|
40
|
+
let _parseRequiredKeys;
|
|
41
|
+
let _jsonRequiredKeys;
|
|
42
|
+
let _parseRequiredKeysSet;
|
|
43
|
+
let _jsonRequiredKeysSet;
|
|
44
|
+
function getParseRequiredKeys() {
|
|
45
|
+
if (_parseRequiredKeys == null) {
|
|
46
|
+
_parseRequiredKeys = [];
|
|
47
|
+
_jsonRequiredKeys = [];
|
|
48
|
+
for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) {
|
|
49
|
+
const rawKey = isProperty(schemaOrObjectProperty)
|
|
50
|
+
? schemaOrObjectProperty.rawKey
|
|
51
|
+
: parsedKey;
|
|
52
|
+
const valueSchema = isProperty(schemaOrObjectProperty)
|
|
53
|
+
? schemaOrObjectProperty.valueSchema
|
|
54
|
+
: schemaOrObjectProperty;
|
|
30
55
|
if (isSchemaRequired(valueSchema)) {
|
|
31
|
-
|
|
56
|
+
_parseRequiredKeys.push(rawKey);
|
|
57
|
+
_jsonRequiredKeys.push(parsedKey);
|
|
32
58
|
}
|
|
33
59
|
}
|
|
60
|
+
_parseRequiredKeysSet = new Set(_parseRequiredKeys);
|
|
61
|
+
_jsonRequiredKeysSet = new Set(_jsonRequiredKeys);
|
|
62
|
+
}
|
|
63
|
+
return _parseRequiredKeys;
|
|
64
|
+
}
|
|
65
|
+
function getJsonRequiredKeys() {
|
|
66
|
+
if (_jsonRequiredKeys == null) {
|
|
67
|
+
getParseRequiredKeys();
|
|
68
|
+
}
|
|
69
|
+
return _jsonRequiredKeys;
|
|
70
|
+
}
|
|
71
|
+
function getParseRequiredKeysSet() {
|
|
72
|
+
if (_parseRequiredKeysSet == null) {
|
|
73
|
+
getParseRequiredKeys();
|
|
74
|
+
}
|
|
75
|
+
return _parseRequiredKeysSet;
|
|
76
|
+
}
|
|
77
|
+
function getJsonRequiredKeysSet() {
|
|
78
|
+
if (_jsonRequiredKeysSet == null) {
|
|
79
|
+
getParseRequiredKeys();
|
|
80
|
+
}
|
|
81
|
+
return _jsonRequiredKeysSet;
|
|
82
|
+
}
|
|
83
|
+
const baseSchema = {
|
|
84
|
+
_getRawProperties: () => Object.entries(schemas).map(([parsedKey, propertySchema]) => isProperty(propertySchema) ? propertySchema.rawKey : parsedKey),
|
|
85
|
+
_getParsedProperties: () => keys(schemas),
|
|
86
|
+
parse: (raw, opts) => {
|
|
87
|
+
var _a;
|
|
88
|
+
const breadcrumbsPrefix = (_a = opts === null || opts === void 0 ? void 0 : opts.breadcrumbsPrefix) !== null && _a !== void 0 ? _a : [];
|
|
34
89
|
return validateAndTransformObject({
|
|
35
90
|
value: raw,
|
|
36
|
-
requiredKeys,
|
|
91
|
+
requiredKeys: getParseRequiredKeys(),
|
|
92
|
+
requiredKeysSet: getParseRequiredKeysSet(),
|
|
37
93
|
getProperty: (rawKey) => {
|
|
38
|
-
const property =
|
|
94
|
+
const property = getRawKeyToProperty()[rawKey];
|
|
39
95
|
if (property == null) {
|
|
40
96
|
return undefined;
|
|
41
97
|
}
|
|
42
98
|
return {
|
|
43
99
|
transformedKey: property.parsedKey,
|
|
44
100
|
transform: (propertyValue) => {
|
|
45
|
-
|
|
46
|
-
return property.valueSchema.parse(propertyValue, Object.assign(Object.assign({}, opts), { breadcrumbsPrefix:
|
|
101
|
+
const childBreadcrumbs = [...breadcrumbsPrefix, rawKey];
|
|
102
|
+
return property.valueSchema.parse(propertyValue, Object.assign(Object.assign({}, opts), { breadcrumbsPrefix: childBreadcrumbs }));
|
|
47
103
|
},
|
|
48
104
|
};
|
|
49
105
|
},
|
|
50
106
|
unrecognizedObjectKeys: opts === null || opts === void 0 ? void 0 : opts.unrecognizedObjectKeys,
|
|
51
107
|
skipValidation: opts === null || opts === void 0 ? void 0 : opts.skipValidation,
|
|
52
|
-
breadcrumbsPrefix
|
|
108
|
+
breadcrumbsPrefix,
|
|
53
109
|
omitUndefined: opts === null || opts === void 0 ? void 0 : opts.omitUndefined,
|
|
54
110
|
});
|
|
55
111
|
},
|
|
56
112
|
json: (parsed, opts) => {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const valueSchema = isProperty(schemaOrObjectProperty)
|
|
60
|
-
? schemaOrObjectProperty.valueSchema
|
|
61
|
-
: schemaOrObjectProperty;
|
|
62
|
-
if (isSchemaRequired(valueSchema)) {
|
|
63
|
-
requiredKeys.push(parsedKey);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
113
|
+
var _a;
|
|
114
|
+
const breadcrumbsPrefix = (_a = opts === null || opts === void 0 ? void 0 : opts.breadcrumbsPrefix) !== null && _a !== void 0 ? _a : [];
|
|
66
115
|
return validateAndTransformObject({
|
|
67
116
|
value: parsed,
|
|
68
|
-
requiredKeys,
|
|
117
|
+
requiredKeys: getJsonRequiredKeys(),
|
|
118
|
+
requiredKeysSet: getJsonRequiredKeysSet(),
|
|
69
119
|
getProperty: (parsedKey) => {
|
|
70
120
|
const property = schemas[parsedKey];
|
|
71
121
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
@@ -76,8 +126,8 @@ export function object(schemas) {
|
|
|
76
126
|
return {
|
|
77
127
|
transformedKey: property.rawKey,
|
|
78
128
|
transform: (propertyValue) => {
|
|
79
|
-
|
|
80
|
-
return property.valueSchema.json(propertyValue, Object.assign(Object.assign({}, opts), { breadcrumbsPrefix:
|
|
129
|
+
const childBreadcrumbs = [...breadcrumbsPrefix, parsedKey];
|
|
130
|
+
return property.valueSchema.json(propertyValue, Object.assign(Object.assign({}, opts), { breadcrumbsPrefix: childBreadcrumbs }));
|
|
81
131
|
},
|
|
82
132
|
};
|
|
83
133
|
}
|
|
@@ -85,15 +135,15 @@ export function object(schemas) {
|
|
|
85
135
|
return {
|
|
86
136
|
transformedKey: parsedKey,
|
|
87
137
|
transform: (propertyValue) => {
|
|
88
|
-
|
|
89
|
-
return property.json(propertyValue, Object.assign(Object.assign({}, opts), { breadcrumbsPrefix:
|
|
138
|
+
const childBreadcrumbs = [...breadcrumbsPrefix, parsedKey];
|
|
139
|
+
return property.json(propertyValue, Object.assign(Object.assign({}, opts), { breadcrumbsPrefix: childBreadcrumbs }));
|
|
90
140
|
},
|
|
91
141
|
};
|
|
92
142
|
}
|
|
93
143
|
},
|
|
94
144
|
unrecognizedObjectKeys: opts === null || opts === void 0 ? void 0 : opts.unrecognizedObjectKeys,
|
|
95
145
|
skipValidation: opts === null || opts === void 0 ? void 0 : opts.skipValidation,
|
|
96
|
-
breadcrumbsPrefix
|
|
146
|
+
breadcrumbsPrefix,
|
|
97
147
|
omitUndefined: opts === null || opts === void 0 ? void 0 : opts.omitUndefined,
|
|
98
148
|
});
|
|
99
149
|
},
|
|
@@ -101,7 +151,7 @@ export function object(schemas) {
|
|
|
101
151
|
};
|
|
102
152
|
return Object.assign(Object.assign(Object.assign(Object.assign({}, maybeSkipValidation(baseSchema)), getSchemaUtils(baseSchema)), getObjectLikeUtils(baseSchema)), getObjectUtils(baseSchema));
|
|
103
153
|
}
|
|
104
|
-
function validateAndTransformObject({ value, requiredKeys, getProperty, unrecognizedObjectKeys = "fail", skipValidation = false, breadcrumbsPrefix = [], }) {
|
|
154
|
+
function validateAndTransformObject({ value, requiredKeys, requiredKeysSet, getProperty, unrecognizedObjectKeys = "fail", skipValidation = false, breadcrumbsPrefix = [], }) {
|
|
105
155
|
if (!isPlainObject(value)) {
|
|
106
156
|
return {
|
|
107
157
|
ok: false,
|
|
@@ -113,13 +163,21 @@ function validateAndTransformObject({ value, requiredKeys, getProperty, unrecogn
|
|
|
113
163
|
],
|
|
114
164
|
};
|
|
115
165
|
}
|
|
116
|
-
|
|
166
|
+
// Track which required keys have been seen.
|
|
167
|
+
// Use a counter instead of copying the Set to avoid per-call allocation.
|
|
168
|
+
let missingRequiredCount = requiredKeys.length;
|
|
117
169
|
const errors = [];
|
|
118
170
|
const transformed = {};
|
|
119
|
-
for (const
|
|
171
|
+
for (const preTransformedKey in value) {
|
|
172
|
+
if (!_hasOwn.call(value, preTransformedKey)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const preTransformedItemValue = value[preTransformedKey];
|
|
120
176
|
const property = getProperty(preTransformedKey);
|
|
121
177
|
if (property != null) {
|
|
122
|
-
|
|
178
|
+
if (missingRequiredCount > 0 && requiredKeysSet.has(preTransformedKey)) {
|
|
179
|
+
missingRequiredCount--;
|
|
180
|
+
}
|
|
123
181
|
const value = property.transform(preTransformedItemValue);
|
|
124
182
|
if (value.ok) {
|
|
125
183
|
transformed[property.transformedKey] = value.value;
|
|
@@ -145,12 +203,16 @@ function validateAndTransformObject({ value, requiredKeys, getProperty, unrecogn
|
|
|
145
203
|
}
|
|
146
204
|
}
|
|
147
205
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
206
|
+
if (missingRequiredCount > 0) {
|
|
207
|
+
for (const key of requiredKeys) {
|
|
208
|
+
if (!(key in value)) {
|
|
209
|
+
errors.push({
|
|
210
|
+
path: breadcrumbsPrefix,
|
|
211
|
+
message: `Missing required key "${key}"`,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
154
216
|
if (errors.length === 0 || skipValidation) {
|
|
155
217
|
return {
|
|
156
218
|
ok: true,
|