@runtypelabs/sdk 0.1.1
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 +398 -0
- package/dist/batch-builder.d.ts +106 -0
- package/dist/batch-builder.d.ts.map +1 -0
- package/dist/batch-builder.js +124 -0
- package/dist/batch-builder.js.map +1 -0
- package/dist/batches-namespace.d.ts +132 -0
- package/dist/batches-namespace.d.ts.map +1 -0
- package/dist/batches-namespace.js +128 -0
- package/dist/batches-namespace.js.map +1 -0
- package/dist/client.d.ts +121 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +485 -0
- package/dist/client.js.map +1 -0
- package/dist/endpoints.d.ts +560 -0
- package/dist/endpoints.d.ts.map +1 -0
- package/dist/endpoints.js +725 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/eval-builder.d.ts +216 -0
- package/dist/eval-builder.d.ts.map +1 -0
- package/dist/eval-builder.js +225 -0
- package/dist/eval-builder.js.map +1 -0
- package/dist/evals-namespace.d.ts +205 -0
- package/dist/evals-namespace.d.ts.map +1 -0
- package/dist/evals-namespace.js +208 -0
- package/dist/evals-namespace.js.map +1 -0
- package/dist/flow-builder.d.ts +620 -0
- package/dist/flow-builder.d.ts.map +1 -0
- package/dist/flow-builder.js +565 -0
- package/dist/flow-builder.js.map +1 -0
- package/dist/flow-result.d.ts +117 -0
- package/dist/flow-result.d.ts.map +1 -0
- package/dist/flow-result.js +175 -0
- package/dist/flow-result.js.map +1 -0
- package/dist/flows-namespace.d.ts +430 -0
- package/dist/flows-namespace.d.ts.map +1 -0
- package/dist/flows-namespace.js +679 -0
- package/dist/flows-namespace.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts-namespace.d.ts +236 -0
- package/dist/prompts-namespace.d.ts.map +1 -0
- package/dist/prompts-namespace.js +222 -0
- package/dist/prompts-namespace.js.map +1 -0
- package/dist/runtype.d.ts +232 -0
- package/dist/runtype.d.ts.map +1 -0
- package/dist/runtype.js +367 -0
- package/dist/runtype.js.map +1 -0
- package/dist/stream-utils.d.ts +58 -0
- package/dist/stream-utils.d.ts.map +1 -0
- package/dist/stream-utils.js +348 -0
- package/dist/stream-utils.js.map +1 -0
- package/dist/transform.d.ts +21 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +170 -0
- package/dist/transform.js.map +1 -0
- package/dist/types.d.ts +626 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SSE Stream Utilities for FlowBuilder
|
|
4
|
+
*
|
|
5
|
+
* Provides utilities for parsing Server-Sent Events (SSE) streams
|
|
6
|
+
* from the Runtype API dispatch endpoint.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.parseSSEChunk = parseSSEChunk;
|
|
10
|
+
exports.parseFinalBuffer = parseFinalBuffer;
|
|
11
|
+
exports.processStream = processStream;
|
|
12
|
+
exports.streamEvents = streamEvents;
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// SSE Parsing Utilities
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Parse SSE stream chunks into individual events
|
|
18
|
+
*
|
|
19
|
+
* @param chunk - New chunk from the stream
|
|
20
|
+
* @param buffer - Previous incomplete buffer
|
|
21
|
+
* @returns Parsed events and remaining buffer
|
|
22
|
+
*/
|
|
23
|
+
function parseSSEChunk(chunk, buffer) {
|
|
24
|
+
buffer += chunk;
|
|
25
|
+
const lines = buffer.split('\n');
|
|
26
|
+
const remainingBuffer = lines.pop() || '';
|
|
27
|
+
const events = [];
|
|
28
|
+
for (const line of lines) {
|
|
29
|
+
if (line.startsWith('data: ')) {
|
|
30
|
+
const jsonStr = line.slice(6).trim();
|
|
31
|
+
if (jsonStr && jsonStr !== '[DONE]') {
|
|
32
|
+
events.push(jsonStr);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { events, remainingBuffer };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse final buffer if it contains a complete event
|
|
40
|
+
*
|
|
41
|
+
* @param buffer - Remaining buffer after stream ends
|
|
42
|
+
* @returns Parsed event JSON string or null
|
|
43
|
+
*/
|
|
44
|
+
function parseFinalBuffer(buffer) {
|
|
45
|
+
if (buffer.trim() && buffer.startsWith('data: ')) {
|
|
46
|
+
const jsonStr = buffer.slice(6).trim();
|
|
47
|
+
if (jsonStr && jsonStr !== '[DONE]') {
|
|
48
|
+
return jsonStr;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// Stream Processing
|
|
55
|
+
// ============================================================================
|
|
56
|
+
/**
|
|
57
|
+
* Process a streaming response with callbacks
|
|
58
|
+
*
|
|
59
|
+
* @param response - Fetch Response object with streaming body
|
|
60
|
+
* @param callbacks - Callbacks for different event types
|
|
61
|
+
* @returns Promise resolving to FlowSummary when complete
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const response = await client.dispatch(config)
|
|
66
|
+
* const summary = await processStream(response, {
|
|
67
|
+
* onStepChunk: (chunk) => process.stdout.write(chunk),
|
|
68
|
+
* onFlowComplete: (event) => console.log('Done!'),
|
|
69
|
+
* })
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
async function processStream(response, callbacks = {}) {
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
const error = new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
75
|
+
callbacks.onError?.(error);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
const reader = response.body?.getReader();
|
|
79
|
+
if (!reader) {
|
|
80
|
+
const error = new Error('Response body is not readable');
|
|
81
|
+
callbacks.onError?.(error);
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
const decoder = new TextDecoder();
|
|
85
|
+
let buffer = '';
|
|
86
|
+
// Track results for summary
|
|
87
|
+
const results = new Map();
|
|
88
|
+
let flowSummary = {
|
|
89
|
+
flowId: '',
|
|
90
|
+
flowName: '',
|
|
91
|
+
totalSteps: 0,
|
|
92
|
+
successfulSteps: 0,
|
|
93
|
+
failedSteps: 0,
|
|
94
|
+
executionTime: 0,
|
|
95
|
+
success: true,
|
|
96
|
+
};
|
|
97
|
+
// Check if content-type is application/json (non-streaming response)
|
|
98
|
+
const contentType = response.headers.get('content-type');
|
|
99
|
+
if (contentType?.includes('application/json')) {
|
|
100
|
+
try {
|
|
101
|
+
const data = await response.json();
|
|
102
|
+
// Check if this is a structured non-streaming response with events
|
|
103
|
+
if (data.events && Array.isArray(data.events)) {
|
|
104
|
+
for (const event of data.events) {
|
|
105
|
+
handleEvent(event, callbacks, results, flowSummary);
|
|
106
|
+
}
|
|
107
|
+
// Also populate summary from top-level fields if available
|
|
108
|
+
if (data.flowId)
|
|
109
|
+
flowSummary.flowId = data.flowId;
|
|
110
|
+
if (data.recordId)
|
|
111
|
+
flowSummary.flowName = data.recordId; // Mapping might be loose here
|
|
112
|
+
// Use execution summary if present
|
|
113
|
+
if (data.executionSummary) {
|
|
114
|
+
const s = data.executionSummary;
|
|
115
|
+
if (s.flowId)
|
|
116
|
+
flowSummary.flowId = s.flowId;
|
|
117
|
+
if (s.flowName)
|
|
118
|
+
flowSummary.flowName = s.flowName;
|
|
119
|
+
if (s.totalSteps)
|
|
120
|
+
flowSummary.totalSteps = s.totalSteps;
|
|
121
|
+
if (s.successfulSteps)
|
|
122
|
+
flowSummary.successfulSteps = s.successfulSteps;
|
|
123
|
+
if (s.failedSteps)
|
|
124
|
+
flowSummary.failedSteps = s.failedSteps;
|
|
125
|
+
if (s.executionTime)
|
|
126
|
+
flowSummary.executionTime = s.executionTime;
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
flowId: flowSummary.flowId || '',
|
|
130
|
+
flowName: flowSummary.flowName || '',
|
|
131
|
+
totalSteps: flowSummary.totalSteps || 0,
|
|
132
|
+
successfulSteps: flowSummary.successfulSteps || 0,
|
|
133
|
+
failedSteps: flowSummary.failedSteps || 0,
|
|
134
|
+
executionTime: flowSummary.executionTime || 0,
|
|
135
|
+
results,
|
|
136
|
+
success: flowSummary.success ?? true,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Handle JSON responses without events array (API returned non-streaming response)
|
|
140
|
+
// This can happen if stream_response wasn't properly sent to the API
|
|
141
|
+
if (data.error) {
|
|
142
|
+
const error = new Error(data.error);
|
|
143
|
+
callbacks.onError?.(error);
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
// For unexpected JSON formats, throw an error rather than falling through
|
|
147
|
+
// to SSE parsing (the body is already consumed)
|
|
148
|
+
throw new Error(`Unexpected API response format. Expected SSE stream but received JSON: ${JSON.stringify(data).slice(0, 200)}`);
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
// Only fall back to stream parsing if JSON parsing itself failed (SyntaxError)
|
|
152
|
+
// NOT if we got valid JSON with unexpected structure
|
|
153
|
+
if (e instanceof SyntaxError) {
|
|
154
|
+
console.warn('Failed to parse JSON response, falling back to stream parsing', e);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Re-throw structural/API errors
|
|
158
|
+
flowSummary.success = false;
|
|
159
|
+
throw e;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
while (true) {
|
|
165
|
+
const { done, value } = await reader.read();
|
|
166
|
+
if (done)
|
|
167
|
+
break;
|
|
168
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
169
|
+
const { events, remainingBuffer } = parseSSEChunk(chunk, buffer);
|
|
170
|
+
buffer = remainingBuffer;
|
|
171
|
+
for (const eventStr of events) {
|
|
172
|
+
try {
|
|
173
|
+
const event = JSON.parse(eventStr);
|
|
174
|
+
handleEvent(event, callbacks, results, flowSummary);
|
|
175
|
+
}
|
|
176
|
+
catch (parseError) {
|
|
177
|
+
// Skip malformed JSON
|
|
178
|
+
console.warn('Failed to parse SSE event:', eventStr);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Process final buffer
|
|
183
|
+
const finalEvent = parseFinalBuffer(buffer);
|
|
184
|
+
if (finalEvent) {
|
|
185
|
+
try {
|
|
186
|
+
const event = JSON.parse(finalEvent);
|
|
187
|
+
handleEvent(event, callbacks, results, flowSummary);
|
|
188
|
+
}
|
|
189
|
+
catch (parseError) {
|
|
190
|
+
// Skip malformed JSON
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
flowSummary.success = false;
|
|
196
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
197
|
+
callbacks.onError?.(err);
|
|
198
|
+
throw err;
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
reader.releaseLock();
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
flowId: flowSummary.flowId || '',
|
|
205
|
+
flowName: flowSummary.flowName || '',
|
|
206
|
+
totalSteps: flowSummary.totalSteps || 0,
|
|
207
|
+
successfulSteps: flowSummary.successfulSteps || 0,
|
|
208
|
+
failedSteps: flowSummary.failedSteps || 0,
|
|
209
|
+
executionTime: flowSummary.executionTime || 0,
|
|
210
|
+
results,
|
|
211
|
+
success: flowSummary.success ?? true,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Handle a single SSE event
|
|
216
|
+
*/
|
|
217
|
+
function handleEvent(event, callbacks, results, summary) {
|
|
218
|
+
switch (event.type) {
|
|
219
|
+
case 'flow_start':
|
|
220
|
+
summary.flowId = event.flowId;
|
|
221
|
+
summary.flowName = event.flowName;
|
|
222
|
+
summary.totalSteps = event.totalSteps;
|
|
223
|
+
callbacks.onFlowStart?.(event);
|
|
224
|
+
break;
|
|
225
|
+
case 'step_start':
|
|
226
|
+
callbacks.onStepStart?.(event);
|
|
227
|
+
break;
|
|
228
|
+
case 'step_chunk':
|
|
229
|
+
// Normalize API's 'text' field to 'chunk' for consistency
|
|
230
|
+
// The API sends 'text' but our types use 'chunk'
|
|
231
|
+
const chunkText = event.chunk || event.text || '';
|
|
232
|
+
callbacks.onStepChunk?.(chunkText, event);
|
|
233
|
+
break;
|
|
234
|
+
case 'step_complete':
|
|
235
|
+
results.set(event.name, event.result);
|
|
236
|
+
callbacks.onStepComplete?.(event.result, event);
|
|
237
|
+
break;
|
|
238
|
+
case 'flow_complete':
|
|
239
|
+
summary.totalSteps = event.totalSteps;
|
|
240
|
+
summary.successfulSteps = event.successfulSteps;
|
|
241
|
+
summary.failedSteps = event.failedSteps;
|
|
242
|
+
summary.executionTime = event.executionTime;
|
|
243
|
+
summary.success = event.failedSteps === 0;
|
|
244
|
+
callbacks.onFlowComplete?.(event);
|
|
245
|
+
break;
|
|
246
|
+
case 'flow_error':
|
|
247
|
+
summary.success = false;
|
|
248
|
+
callbacks.onError?.(new Error(event.error));
|
|
249
|
+
break;
|
|
250
|
+
case 'flow_paused':
|
|
251
|
+
// Not strictly part of standard FlowSummary but useful for debugging
|
|
252
|
+
// The client.ts runWithLocalTools handles this for logic flow
|
|
253
|
+
break;
|
|
254
|
+
case 'step_waiting_local':
|
|
255
|
+
// Notification that local tool execution is pending
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ============================================================================
|
|
260
|
+
// Async Iterator for Advanced Use Cases
|
|
261
|
+
// ============================================================================
|
|
262
|
+
/**
|
|
263
|
+
* Create an async iterator over SSE events
|
|
264
|
+
*
|
|
265
|
+
* @param response - Fetch Response object with streaming body
|
|
266
|
+
* @yields Parsed SSE events
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```typescript
|
|
270
|
+
* const response = await client.dispatch(config)
|
|
271
|
+
* for await (const event of streamEvents(response)) {
|
|
272
|
+
* console.log(event.type, event)
|
|
273
|
+
* }
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
async function* streamEvents(response) {
|
|
277
|
+
if (!response.ok) {
|
|
278
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
279
|
+
}
|
|
280
|
+
// Check if content-type is application/json (non-streaming response)
|
|
281
|
+
const contentType = response.headers.get('content-type');
|
|
282
|
+
if (contentType?.includes('application/json')) {
|
|
283
|
+
try {
|
|
284
|
+
const data = await response.json();
|
|
285
|
+
// Yield events from array if present
|
|
286
|
+
if (data.events && Array.isArray(data.events)) {
|
|
287
|
+
for (const event of data.events) {
|
|
288
|
+
yield event;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
console.warn('Failed to parse JSON response in streamEvents', e);
|
|
295
|
+
// Fall through to stream parsing if JSON parsing fails?
|
|
296
|
+
// No, body is consumed.
|
|
297
|
+
throw e;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const reader = response.body?.getReader();
|
|
301
|
+
if (!reader) {
|
|
302
|
+
throw new Error('Response body is not readable');
|
|
303
|
+
}
|
|
304
|
+
const decoder = new TextDecoder();
|
|
305
|
+
let buffer = '';
|
|
306
|
+
try {
|
|
307
|
+
while (true) {
|
|
308
|
+
const { done, value } = await reader.read();
|
|
309
|
+
if (done)
|
|
310
|
+
break;
|
|
311
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
312
|
+
const { events, remainingBuffer } = parseSSEChunk(chunk, buffer);
|
|
313
|
+
buffer = remainingBuffer;
|
|
314
|
+
for (const eventStr of events) {
|
|
315
|
+
try {
|
|
316
|
+
const event = JSON.parse(eventStr);
|
|
317
|
+
// Normalize API's 'text' field to 'chunk' for step_chunk events
|
|
318
|
+
if (event.type === 'step_chunk' && 'text' in event && !('chunk' in event)) {
|
|
319
|
+
event.chunk = event.text;
|
|
320
|
+
}
|
|
321
|
+
yield event;
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
// Skip malformed JSON
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Process final buffer
|
|
329
|
+
const finalEvent = parseFinalBuffer(buffer);
|
|
330
|
+
if (finalEvent) {
|
|
331
|
+
try {
|
|
332
|
+
const event = JSON.parse(finalEvent);
|
|
333
|
+
// Normalize API's 'text' field to 'chunk' for step_chunk events
|
|
334
|
+
if (event.type === 'step_chunk' && 'text' in event && !('chunk' in event)) {
|
|
335
|
+
event.chunk = event.text;
|
|
336
|
+
}
|
|
337
|
+
yield event;
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// Skip malformed JSON
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
finally {
|
|
345
|
+
reader.releaseLock();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=stream-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../src/stream-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transformation utilities for converting between camelCase (client) and snake_case (API)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Transform API response from snake_case to camelCase
|
|
6
|
+
* Special handling: preserves metadata field keys
|
|
7
|
+
*/
|
|
8
|
+
export declare function transformResponse<T>(data: any): T;
|
|
9
|
+
/**
|
|
10
|
+
* Transform client request from camelCase to snake_case
|
|
11
|
+
*/
|
|
12
|
+
export declare function transformRequest(data: any): any;
|
|
13
|
+
/**
|
|
14
|
+
* Transform URL query parameters from camelCase to snake_case
|
|
15
|
+
*/
|
|
16
|
+
export declare function transformQueryParams(params: {
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
}): {
|
|
19
|
+
[key: string]: string;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAMjD;AAwED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAM/C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAe9F"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Transformation utilities for converting between camelCase (client) and snake_case (API)
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.transformResponse = transformResponse;
|
|
7
|
+
exports.transformRequest = transformRequest;
|
|
8
|
+
exports.transformQueryParams = transformQueryParams;
|
|
9
|
+
/**
|
|
10
|
+
* Convert snake_case string to camelCase
|
|
11
|
+
*/
|
|
12
|
+
function snakeToCamel(str) {
|
|
13
|
+
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Recursively convert object keys from snake_case to camelCase
|
|
17
|
+
* Special handling: preserves keys within 'metadata', 'metadataSchema', and 'parametersSchema.properties'
|
|
18
|
+
*/
|
|
19
|
+
function convertKeysToCamelCase(obj, preserveKeys = false) {
|
|
20
|
+
if (Array.isArray(obj)) {
|
|
21
|
+
return obj.map(item => convertKeysToCamelCase(item, preserveKeys));
|
|
22
|
+
}
|
|
23
|
+
else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {
|
|
24
|
+
return Object.keys(obj).reduce((result, key) => {
|
|
25
|
+
const camelKey = preserveKeys ? key : snakeToCamel(key);
|
|
26
|
+
// Special handling for metadataSchema: convert top-level keys but preserve nested content
|
|
27
|
+
if (key === 'metadata_schema') {
|
|
28
|
+
result[camelKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {
|
|
29
|
+
const camelSchemaKey = snakeToCamel(schemaKey);
|
|
30
|
+
// Preserve contents of key_types and keys, but convert the rest
|
|
31
|
+
const shouldPreserveContent = schemaKey === 'key_types' || schemaKey === 'keys';
|
|
32
|
+
schemaResult[camelSchemaKey] = convertKeysToCamelCase(obj[key][schemaKey], shouldPreserveContent);
|
|
33
|
+
return schemaResult;
|
|
34
|
+
}, {});
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
// Special handling for parametersSchema: convert top-level keys but preserve property names
|
|
38
|
+
if (key === 'parameters_schema') {
|
|
39
|
+
result[camelKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {
|
|
40
|
+
const camelSchemaKey = snakeToCamel(schemaKey);
|
|
41
|
+
// Special handling for 'properties': preserve property names but convert their attributes
|
|
42
|
+
if (schemaKey === 'properties') {
|
|
43
|
+
schemaResult[camelSchemaKey] = Object.keys(obj[key][schemaKey]).reduce((propsResult, propName) => {
|
|
44
|
+
// Preserve the property name (e.g., 'param1', 'param2', 'testParam')
|
|
45
|
+
// But convert the property attributes (default_value -> defaultValue, min_length -> minLength, etc.)
|
|
46
|
+
propsResult[propName] = convertKeysToCamelCase(obj[key][schemaKey][propName], false);
|
|
47
|
+
return propsResult;
|
|
48
|
+
}, {});
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
schemaResult[camelSchemaKey] = convertKeysToCamelCase(obj[key][schemaKey], false);
|
|
52
|
+
}
|
|
53
|
+
return schemaResult;
|
|
54
|
+
}, {});
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
// Preserve original keys within metadata fields and HTTP headers
|
|
58
|
+
// Headers like 'Accept', 'X-Auth-Token' should not be converted
|
|
59
|
+
const shouldPreserveNextLevel = key === 'metadata' ||
|
|
60
|
+
key === 'metadata_labels' ||
|
|
61
|
+
key === 'headers' ||
|
|
62
|
+
preserveKeys;
|
|
63
|
+
result[camelKey] = convertKeysToCamelCase(obj[key], shouldPreserveNextLevel);
|
|
64
|
+
return result;
|
|
65
|
+
}, {});
|
|
66
|
+
}
|
|
67
|
+
return obj;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Transform API response from snake_case to camelCase
|
|
71
|
+
* Special handling: preserves metadata field keys
|
|
72
|
+
*/
|
|
73
|
+
function transformResponse(data) {
|
|
74
|
+
if (data === null || data === undefined) {
|
|
75
|
+
return data;
|
|
76
|
+
}
|
|
77
|
+
return convertKeysToCamelCase(data);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Convert camelCase string to snake_case
|
|
81
|
+
*/
|
|
82
|
+
function camelToSnake(str) {
|
|
83
|
+
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Recursively convert object keys from camelCase to snake_case
|
|
87
|
+
* Special handling: preserves keys within 'metadata', 'metadataSchema', and 'parametersSchema.properties'
|
|
88
|
+
*/
|
|
89
|
+
function convertKeysToSnakeCase(obj, preserveKeys = false) {
|
|
90
|
+
if (Array.isArray(obj)) {
|
|
91
|
+
return obj.map(item => convertKeysToSnakeCase(item, preserveKeys));
|
|
92
|
+
}
|
|
93
|
+
else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {
|
|
94
|
+
return Object.keys(obj).reduce((result, key) => {
|
|
95
|
+
const snakeKey = preserveKeys ? key : camelToSnake(key);
|
|
96
|
+
// Special handling for metadataSchema: convert top-level keys but preserve nested content
|
|
97
|
+
if (key === 'metadataSchema' || snakeKey === 'metadata_schema') {
|
|
98
|
+
const schemaKey = camelToSnake(key);
|
|
99
|
+
result[schemaKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {
|
|
100
|
+
const snakeSchemaKey = camelToSnake(schemaKey);
|
|
101
|
+
// Preserve contents of keyTypes and keys, but convert the rest
|
|
102
|
+
const shouldPreserveContent = schemaKey === 'keyTypes' || schemaKey === 'keys' ||
|
|
103
|
+
snakeSchemaKey === 'key_types' || snakeSchemaKey === 'keys';
|
|
104
|
+
schemaResult[snakeSchemaKey] = convertKeysToSnakeCase(obj[key][schemaKey], shouldPreserveContent);
|
|
105
|
+
return schemaResult;
|
|
106
|
+
}, {});
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
// Special handling for parametersSchema: convert top-level keys but preserve property names
|
|
110
|
+
if (key === 'parametersSchema' || snakeKey === 'parameters_schema') {
|
|
111
|
+
const schemaKey = camelToSnake(key);
|
|
112
|
+
result[schemaKey] = Object.keys(obj[key]).reduce((schemaResult, schemaKey) => {
|
|
113
|
+
const snakeSchemaKey = camelToSnake(schemaKey);
|
|
114
|
+
// Special handling for 'properties': preserve property names but convert their attributes
|
|
115
|
+
if (schemaKey === 'properties' || snakeSchemaKey === 'properties') {
|
|
116
|
+
schemaResult[snakeSchemaKey] = Object.keys(obj[key][schemaKey]).reduce((propsResult, propName) => {
|
|
117
|
+
// Preserve the property name (e.g., 'param1', 'param2', 'testParam')
|
|
118
|
+
// But convert the property attributes (defaultValue -> default_value, minLength -> min_length, etc.)
|
|
119
|
+
propsResult[propName] = convertKeysToSnakeCase(obj[key][schemaKey][propName], false);
|
|
120
|
+
return propsResult;
|
|
121
|
+
}, {});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
schemaResult[snakeSchemaKey] = convertKeysToSnakeCase(obj[key][schemaKey], false);
|
|
125
|
+
}
|
|
126
|
+
return schemaResult;
|
|
127
|
+
}, {});
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
// Preserve original keys within metadata fields and HTTP headers
|
|
131
|
+
// Headers like 'Accept', 'X-Auth-Token' should not be converted
|
|
132
|
+
const shouldPreserveNextLevel = key === 'metadata' ||
|
|
133
|
+
key === 'metadataLabels' ||
|
|
134
|
+
snakeKey === 'metadata_labels' ||
|
|
135
|
+
key === 'headers' ||
|
|
136
|
+
preserveKeys;
|
|
137
|
+
result[snakeKey] = convertKeysToSnakeCase(obj[key], shouldPreserveNextLevel);
|
|
138
|
+
return result;
|
|
139
|
+
}, {});
|
|
140
|
+
}
|
|
141
|
+
return obj;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Transform client request from camelCase to snake_case
|
|
145
|
+
*/
|
|
146
|
+
function transformRequest(data) {
|
|
147
|
+
if (data === null || data === undefined) {
|
|
148
|
+
return data;
|
|
149
|
+
}
|
|
150
|
+
return convertKeysToSnakeCase(data);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Transform URL query parameters from camelCase to snake_case
|
|
154
|
+
*/
|
|
155
|
+
function transformQueryParams(params) {
|
|
156
|
+
const transformed = transformRequest(params);
|
|
157
|
+
const result = {};
|
|
158
|
+
for (const [key, value] of Object.entries(transformed)) {
|
|
159
|
+
if (value !== undefined && value !== null) {
|
|
160
|
+
if (Array.isArray(value)) {
|
|
161
|
+
result[key] = value.join(',');
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
result[key] = String(value);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
|