vanta-auditor-api-sdk 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/.devcontainer/README.md +5 -0
  2. package/.devcontainer/devcontainer.json +45 -0
  3. package/README.md +122 -8
  4. package/bin/mcp-server.js +39064 -0
  5. package/bin/mcp-server.js.map +312 -0
  6. package/docs/sdks/auditors/README.md +2 -2
  7. package/docs/sdks/audits/README.md +8 -5
  8. package/funcs/auditorsCreate.d.ts +2 -1
  9. package/funcs/auditorsCreate.d.ts.map +1 -1
  10. package/funcs/auditorsCreate.js +15 -9
  11. package/funcs/auditorsCreate.js.map +1 -1
  12. package/funcs/auditsCreateCommentForEvidence.d.ts +2 -1
  13. package/funcs/auditsCreateCommentForEvidence.d.ts.map +1 -1
  14. package/funcs/auditsCreateCommentForEvidence.js +15 -9
  15. package/funcs/auditsCreateCommentForEvidence.js.map +1 -1
  16. package/funcs/auditsCreateCustomControl.d.ts +2 -1
  17. package/funcs/auditsCreateCustomControl.d.ts.map +1 -1
  18. package/funcs/auditsCreateCustomControl.js +15 -9
  19. package/funcs/auditsCreateCustomControl.js.map +1 -1
  20. package/funcs/auditsCreateCustomEvidenceRequest.d.ts +2 -1
  21. package/funcs/auditsCreateCustomEvidenceRequest.d.ts.map +1 -1
  22. package/funcs/auditsCreateCustomEvidenceRequest.js +15 -9
  23. package/funcs/auditsCreateCustomEvidenceRequest.js.map +1 -1
  24. package/funcs/auditsGetEvidenceUrls.d.ts +4 -2
  25. package/funcs/auditsGetEvidenceUrls.d.ts.map +1 -1
  26. package/funcs/auditsGetEvidenceUrls.js +17 -10
  27. package/funcs/auditsGetEvidenceUrls.js.map +1 -1
  28. package/funcs/auditsList.d.ts +2 -1
  29. package/funcs/auditsList.d.ts.map +1 -1
  30. package/funcs/auditsList.js +15 -9
  31. package/funcs/auditsList.js.map +1 -1
  32. package/funcs/auditsListComments.d.ts +2 -1
  33. package/funcs/auditsListComments.d.ts.map +1 -1
  34. package/funcs/auditsListComments.js +15 -9
  35. package/funcs/auditsListComments.js.map +1 -1
  36. package/funcs/auditsListControls.d.ts +2 -1
  37. package/funcs/auditsListControls.d.ts.map +1 -1
  38. package/funcs/auditsListControls.js +15 -9
  39. package/funcs/auditsListControls.js.map +1 -1
  40. package/funcs/auditsListEvidence.d.ts +2 -1
  41. package/funcs/auditsListEvidence.d.ts.map +1 -1
  42. package/funcs/auditsListEvidence.js +15 -9
  43. package/funcs/auditsListEvidence.js.map +1 -1
  44. package/funcs/auditsUpdateEvidence.d.ts +2 -1
  45. package/funcs/auditsUpdateEvidence.d.ts.map +1 -1
  46. package/funcs/auditsUpdateEvidence.js +15 -9
  47. package/funcs/auditsUpdateEvidence.js.map +1 -1
  48. package/hooks/types.d.ts +2 -1
  49. package/hooks/types.d.ts.map +1 -1
  50. package/jsr.json +27 -0
  51. package/lib/config.d.ts +7 -7
  52. package/lib/config.d.ts.map +1 -1
  53. package/lib/config.js +14 -3
  54. package/lib/config.js.map +1 -1
  55. package/lib/encodings.d.ts +10 -9
  56. package/lib/encodings.d.ts.map +1 -1
  57. package/lib/encodings.js +73 -47
  58. package/lib/encodings.js.map +1 -1
  59. package/lib/files.js.map +1 -1
  60. package/lib/matchers.d.ts +3 -1
  61. package/lib/matchers.d.ts.map +1 -1
  62. package/lib/matchers.js +12 -0
  63. package/lib/matchers.js.map +1 -1
  64. package/lib/primitives.d.ts +4 -0
  65. package/lib/primitives.d.ts.map +1 -1
  66. package/lib/primitives.js +17 -0
  67. package/lib/primitives.js.map +1 -1
  68. package/lib/retries.js +0 -1
  69. package/lib/retries.js.map +1 -1
  70. package/lib/schemas.d.ts +1 -1
  71. package/lib/schemas.d.ts.map +1 -1
  72. package/lib/schemas.js +4 -1
  73. package/lib/schemas.js.map +1 -1
  74. package/lib/sdks.d.ts +1 -1
  75. package/lib/sdks.d.ts.map +1 -1
  76. package/lib/sdks.js +13 -11
  77. package/lib/sdks.js.map +1 -1
  78. package/lib/security.d.ts +4 -3
  79. package/lib/security.d.ts.map +1 -1
  80. package/lib/security.js +6 -1
  81. package/lib/security.js.map +1 -1
  82. package/mcp-server/build.d.mts.map +1 -0
  83. package/mcp-server/build.mjs +14 -0
  84. package/mcp-server/build.mjs.map +1 -0
  85. package/mcp-server/cli/start/command.d.ts +2 -0
  86. package/mcp-server/cli/start/command.d.ts.map +1 -0
  87. package/mcp-server/cli/start/command.js +138 -0
  88. package/mcp-server/cli/start/command.js.map +1 -0
  89. package/mcp-server/cli/start/impl.d.ts +18 -0
  90. package/mcp-server/cli/start/impl.d.ts.map +1 -0
  91. package/mcp-server/cli/start/impl.js +104 -0
  92. package/mcp-server/cli/start/impl.js.map +1 -0
  93. package/mcp-server/cli.d.ts +6 -0
  94. package/mcp-server/cli.d.ts.map +1 -0
  95. package/mcp-server/cli.js +10 -0
  96. package/mcp-server/cli.js.map +1 -0
  97. package/mcp-server/console-logger.d.ts +7 -0
  98. package/mcp-server/console-logger.d.ts.map +1 -0
  99. package/mcp-server/console-logger.js +59 -0
  100. package/mcp-server/console-logger.js.map +1 -0
  101. package/mcp-server/extensions.d.ts +11 -0
  102. package/mcp-server/extensions.d.ts.map +1 -0
  103. package/mcp-server/extensions.js +6 -0
  104. package/mcp-server/extensions.js.map +1 -0
  105. package/mcp-server/mcp-server.d.ts +2 -0
  106. package/mcp-server/mcp-server.d.ts.map +1 -0
  107. package/mcp-server/mcp-server.js +29 -0
  108. package/mcp-server/mcp-server.js.map +1 -0
  109. package/mcp-server/prompts.d.ts +26 -0
  110. package/mcp-server/prompts.d.ts.map +1 -0
  111. package/mcp-server/prompts.js +51 -0
  112. package/mcp-server/prompts.js.map +1 -0
  113. package/mcp-server/resources.d.ts +32 -0
  114. package/mcp-server/resources.d.ts.map +1 -0
  115. package/mcp-server/resources.js +87 -0
  116. package/mcp-server/resources.js.map +1 -0
  117. package/mcp-server/scopes.d.ts +3 -0
  118. package/mcp-server/scopes.d.ts.map +1 -0
  119. package/mcp-server/scopes.js +8 -0
  120. package/mcp-server/scopes.js.map +1 -0
  121. package/mcp-server/server.d.ts +13 -0
  122. package/mcp-server/server.d.ts.map +1 -0
  123. package/mcp-server/server.js +52 -0
  124. package/mcp-server/server.js.map +1 -0
  125. package/mcp-server/shared.d.ts +7 -0
  126. package/mcp-server/shared.d.ts.map +1 -0
  127. package/mcp-server/shared.js +98 -0
  128. package/mcp-server/shared.js.map +1 -0
  129. package/mcp-server/tools/auditorsCreate.d.ts +8 -0
  130. package/mcp-server/tools/auditorsCreate.d.ts.map +1 -0
  131. package/mcp-server/tools/auditorsCreate.js +64 -0
  132. package/mcp-server/tools/auditorsCreate.js.map +1 -0
  133. package/mcp-server/tools/auditsCreateCommentForEvidence.d.ts +8 -0
  134. package/mcp-server/tools/auditsCreateCommentForEvidence.d.ts.map +1 -0
  135. package/mcp-server/tools/auditsCreateCommentForEvidence.js +64 -0
  136. package/mcp-server/tools/auditsCreateCommentForEvidence.js.map +1 -0
  137. package/mcp-server/tools/auditsCreateCustomControl.d.ts +8 -0
  138. package/mcp-server/tools/auditsCreateCustomControl.d.ts.map +1 -0
  139. package/mcp-server/tools/auditsCreateCustomControl.js +64 -0
  140. package/mcp-server/tools/auditsCreateCustomControl.js.map +1 -0
  141. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.d.ts +8 -0
  142. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.d.ts.map +1 -0
  143. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.js +64 -0
  144. package/mcp-server/tools/auditsCreateCustomEvidenceRequest.js.map +1 -0
  145. package/mcp-server/tools/auditsGetEvidenceUrls.d.ts +8 -0
  146. package/mcp-server/tools/auditsGetEvidenceUrls.d.ts.map +1 -0
  147. package/mcp-server/tools/auditsGetEvidenceUrls.js +65 -0
  148. package/mcp-server/tools/auditsGetEvidenceUrls.js.map +1 -0
  149. package/mcp-server/tools/auditsList.d.ts +8 -0
  150. package/mcp-server/tools/auditsList.d.ts.map +1 -0
  151. package/mcp-server/tools/auditsList.js +64 -0
  152. package/mcp-server/tools/auditsList.js.map +1 -0
  153. package/mcp-server/tools/auditsListComments.d.ts +8 -0
  154. package/mcp-server/tools/auditsListComments.d.ts.map +1 -0
  155. package/mcp-server/tools/auditsListComments.js +64 -0
  156. package/mcp-server/tools/auditsListComments.js.map +1 -0
  157. package/mcp-server/tools/auditsListControls.d.ts +8 -0
  158. package/mcp-server/tools/auditsListControls.d.ts.map +1 -0
  159. package/mcp-server/tools/auditsListControls.js +64 -0
  160. package/mcp-server/tools/auditsListControls.js.map +1 -0
  161. package/mcp-server/tools/auditsListEvidence.d.ts +8 -0
  162. package/mcp-server/tools/auditsListEvidence.d.ts.map +1 -0
  163. package/mcp-server/tools/auditsListEvidence.js +64 -0
  164. package/mcp-server/tools/auditsListEvidence.js.map +1 -0
  165. package/mcp-server/tools/auditsUpdateEvidence.d.ts +8 -0
  166. package/mcp-server/tools/auditsUpdateEvidence.d.ts.map +1 -0
  167. package/mcp-server/tools/auditsUpdateEvidence.js +64 -0
  168. package/mcp-server/tools/auditsUpdateEvidence.js.map +1 -0
  169. package/mcp-server/tools.d.ts +25 -0
  170. package/mcp-server/tools.d.ts.map +1 -0
  171. package/mcp-server/tools.js +82 -0
  172. package/mcp-server/tools.js.map +1 -0
  173. package/models/components/auditorcontrol.d.ts +14 -2
  174. package/models/components/auditorcontrol.d.ts.map +1 -1
  175. package/models/components/auditorcontrol.js +8 -2
  176. package/models/components/auditorcontrol.js.map +1 -1
  177. package/models/components/auditorenabledstatetransition.d.ts +3 -0
  178. package/models/components/auditorenabledstatetransition.d.ts.map +1 -1
  179. package/models/components/auditorenabledstatetransition.js +1 -0
  180. package/models/components/auditorenabledstatetransition.js.map +1 -1
  181. package/models/components/comment.d.ts +5 -0
  182. package/models/components/comment.d.ts.map +1 -1
  183. package/models/components/comment.js +2 -0
  184. package/models/components/comment.js.map +1 -1
  185. package/models/components/control.d.ts +8 -2
  186. package/models/components/control.d.ts.map +1 -1
  187. package/models/components/control.js +5 -2
  188. package/models/components/control.js.map +1 -1
  189. package/models/components/createcustomevidencerequestinput.d.ts +5 -0
  190. package/models/components/createcustomevidencerequestinput.d.ts.map +1 -1
  191. package/models/components/createcustomevidencerequestinput.js +2 -0
  192. package/models/components/createcustomevidencerequestinput.js.map +1 -1
  193. package/models/components/customfield.d.ts +52 -0
  194. package/models/components/customfield.d.ts.map +1 -0
  195. package/models/components/customfield.js +95 -0
  196. package/models/components/customfield.js.map +1 -0
  197. package/models/components/index.d.ts +2 -0
  198. package/models/components/index.d.ts.map +1 -1
  199. package/models/components/index.js +2 -0
  200. package/models/components/index.js.map +1 -1
  201. package/models/components/section.d.ts +37 -0
  202. package/models/components/section.d.ts.map +1 -0
  203. package/models/components/section.js +71 -0
  204. package/models/components/section.js.map +1 -0
  205. package/package.json +25 -8
  206. package/sdk/audits.d.ts +2 -1
  207. package/sdk/audits.d.ts.map +1 -1
  208. package/sdk/audits.js +2 -1
  209. package/sdk/audits.js.map +1 -1
  210. package/src/funcs/auditorsCreate.ts +40 -10
  211. package/src/funcs/auditsCreateCommentForEvidence.ts +40 -10
  212. package/src/funcs/auditsCreateCustomControl.ts +40 -10
  213. package/src/funcs/auditsCreateCustomEvidenceRequest.ts +40 -10
  214. package/src/funcs/auditsGetEvidenceUrls.ts +42 -11
  215. package/src/funcs/auditsList.ts +40 -10
  216. package/src/funcs/auditsListComments.ts +40 -10
  217. package/src/funcs/auditsListControls.ts +40 -10
  218. package/src/funcs/auditsListEvidence.ts +40 -10
  219. package/src/funcs/auditsUpdateEvidence.ts +40 -10
  220. package/src/hooks/types.ts +2 -1
  221. package/src/lib/config.ts +17 -6
  222. package/src/lib/encodings.ts +95 -61
  223. package/src/lib/files.ts +1 -1
  224. package/src/lib/matchers.ts +20 -0
  225. package/src/lib/primitives.ts +28 -0
  226. package/src/lib/retries.ts +0 -1
  227. package/src/lib/schemas.ts +5 -0
  228. package/src/lib/sdks.ts +15 -11
  229. package/src/lib/security.ts +10 -3
  230. package/src/mcp-server/cli/start/command.ts +107 -0
  231. package/src/mcp-server/cli/start/impl.ts +134 -0
  232. package/src/mcp-server/cli.ts +13 -0
  233. package/src/mcp-server/console-logger.ts +71 -0
  234. package/src/mcp-server/extensions.ts +17 -0
  235. package/src/mcp-server/mcp-server.ts +26 -0
  236. package/src/mcp-server/prompts.ts +117 -0
  237. package/src/mcp-server/resources.ts +172 -0
  238. package/src/mcp-server/scopes.ts +7 -0
  239. package/src/mcp-server/server.ts +79 -0
  240. package/src/mcp-server/shared.ts +75 -0
  241. package/src/mcp-server/tools/auditorsCreate.ts +37 -0
  242. package/src/mcp-server/tools/auditsCreateCommentForEvidence.ts +38 -0
  243. package/src/mcp-server/tools/auditsCreateCustomControl.ts +37 -0
  244. package/src/mcp-server/tools/auditsCreateCustomEvidenceRequest.ts +39 -0
  245. package/src/mcp-server/tools/auditsGetEvidenceUrls.ts +38 -0
  246. package/src/mcp-server/tools/auditsList.ts +37 -0
  247. package/src/mcp-server/tools/auditsListComments.ts +37 -0
  248. package/src/mcp-server/tools/auditsListControls.ts +37 -0
  249. package/src/mcp-server/tools/auditsListEvidence.ts +37 -0
  250. package/src/mcp-server/tools/auditsUpdateEvidence.ts +37 -0
  251. package/src/mcp-server/tools.ts +129 -0
  252. package/src/models/components/auditorcontrol.ts +30 -4
  253. package/src/models/components/auditorenabledstatetransition.ts +1 -0
  254. package/src/models/components/comment.ts +9 -0
  255. package/src/models/components/control.ts +17 -4
  256. package/src/models/components/createcustomevidencerequestinput.ts +7 -0
  257. package/src/models/components/customfield.ts +109 -0
  258. package/src/models/components/index.ts +2 -0
  259. package/src/models/components/section.ts +69 -0
  260. package/src/sdk/audits.ts +2 -1
  261. package/src/types/async.ts +68 -0
  262. package/tsconfig.json +41 -0
  263. package/types/async.d.ts +23 -0
  264. package/types/async.d.ts.map +1 -0
  265. package/types/async.js +44 -0
  266. package/types/async.js.map +1 -0
@@ -16,12 +16,16 @@ export function encodeMatrix(
16
16
  key: string,
17
17
  value: unknown,
18
18
  options?: { explode?: boolean; charEncoding?: "percent" | "none" },
19
- ): string {
19
+ ): string | undefined {
20
20
  let out = "";
21
21
  const pairs: [string, unknown][] = options?.explode
22
22
  ? explode(key, value)
23
23
  : [[key, value]];
24
24
 
25
+ if (pairs.every(([_, v]) => v == null)) {
26
+ return;
27
+ }
28
+
25
29
  const encodeString = (v: string) => {
26
30
  return options?.charEncoding === "percent" ? encodeURIComponent(v) : v;
27
31
  };
@@ -29,21 +33,25 @@ export function encodeMatrix(
29
33
 
30
34
  pairs.forEach(([pk, pv]) => {
31
35
  let tmp = "";
32
- let encValue = "";
36
+ let encValue: string | null | undefined = null;
33
37
 
34
- if (pv === undefined) {
38
+ if (pv == null) {
35
39
  return;
36
40
  } else if (Array.isArray(pv)) {
37
- encValue = mapDefined(pv, (v) => `${encodeValue(v)}`).join(",");
41
+ encValue = mapDefined(pv, (v) => `${encodeValue(v)}`)?.join(",");
38
42
  } else if (isPlainObject(pv)) {
39
- encValue = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
43
+ const mapped = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
40
44
  return `,${encodeString(k)},${encodeValue(v)}`;
41
- }).join("");
42
- encValue = encValue.slice(1);
45
+ });
46
+ encValue = mapped?.join("").slice(1);
43
47
  } else {
44
48
  encValue = `${encodeValue(pv)}`;
45
49
  }
46
50
 
51
+ if (encValue == null) {
52
+ return;
53
+ }
54
+
47
55
  const keyPrefix = encodeString(pk);
48
56
  tmp = `${keyPrefix}=${encValue}`;
49
57
  // trim trailing '=' if value was empty
@@ -66,36 +74,40 @@ export function encodeLabel(
66
74
  key: string,
67
75
  value: unknown,
68
76
  options?: { explode?: boolean; charEncoding?: "percent" | "none" },
69
- ): string {
77
+ ): string | undefined {
70
78
  let out = "";
71
79
  const pairs: [string, unknown][] = options?.explode
72
80
  ? explode(key, value)
73
81
  : [[key, value]];
74
82
 
83
+ if (pairs.every(([_, v]) => v == null)) {
84
+ return;
85
+ }
86
+
75
87
  const encodeString = (v: string) => {
76
88
  return options?.charEncoding === "percent" ? encodeURIComponent(v) : v;
77
89
  };
78
90
  const encodeValue = (v: unknown) => encodeString(serializeValue(v));
79
91
 
80
92
  pairs.forEach(([pk, pv]) => {
81
- let encValue = "";
93
+ let encValue: string | null | undefined = "";
82
94
 
83
- if (pv === undefined) {
95
+ if (pv == null) {
84
96
  return;
85
97
  } else if (Array.isArray(pv)) {
86
- encValue = mapDefined(pv, (v) => `${encodeValue(v)}`).join(".");
98
+ encValue = mapDefined(pv, (v) => `${encodeValue(v)}`)?.join(".");
87
99
  } else if (isPlainObject(pv)) {
88
- encValue = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
100
+ const mapped = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
89
101
  return `.${encodeString(k)}.${encodeValue(v)}`;
90
- }).join("");
91
- encValue = encValue.slice(1);
102
+ });
103
+ encValue = mapped?.join("").slice(1);
92
104
  } else {
93
105
  const k =
94
106
  options?.explode && isPlainObject(value) ? `${encodeString(pk)}=` : "";
95
107
  encValue = `${k}${encodeValue(pv)}`;
96
108
  }
97
109
 
98
- out += `.${encValue}`;
110
+ out += encValue == null ? "" : `.${encValue}`;
99
111
  });
100
112
 
101
113
  return out;
@@ -105,7 +117,7 @@ type FormEncoder = (
105
117
  key: string,
106
118
  value: unknown,
107
119
  options?: { explode?: boolean; charEncoding?: "percent" | "none" },
108
- ) => string;
120
+ ) => string | undefined;
109
121
 
110
122
  function formEncoder(sep: string): FormEncoder {
111
123
  return (
@@ -118,6 +130,10 @@ function formEncoder(sep: string): FormEncoder {
118
130
  ? explode(key, value)
119
131
  : [[key, value]];
120
132
 
133
+ if (pairs.every(([_, v]) => v == null)) {
134
+ return;
135
+ }
136
+
121
137
  const encodeString = (v: string) => {
122
138
  return options?.charEncoding === "percent" ? encodeURIComponent(v) : v;
123
139
  };
@@ -128,20 +144,24 @@ function formEncoder(sep: string): FormEncoder {
128
144
 
129
145
  pairs.forEach(([pk, pv]) => {
130
146
  let tmp = "";
131
- let encValue = "";
147
+ let encValue: string | null | undefined = null;
132
148
 
133
- if (pv === undefined) {
149
+ if (pv == null) {
134
150
  return;
135
151
  } else if (Array.isArray(pv)) {
136
- encValue = mapDefined(pv, (v) => `${encodeValue(v)}`).join(encodedSep);
152
+ encValue = mapDefined(pv, (v) => `${encodeValue(v)}`)?.join(encodedSep);
137
153
  } else if (isPlainObject(pv)) {
138
154
  encValue = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
139
155
  return `${encodeString(k)}${encodedSep}${encodeValue(v)}`;
140
- }).join(encodedSep);
156
+ })?.join(encodedSep);
141
157
  } else {
142
158
  encValue = `${encodeValue(pv)}`;
143
159
  }
144
160
 
161
+ if (encValue == null) {
162
+ return;
163
+ }
164
+
145
165
  tmp = `${encodeString(pk)}=${encValue}`;
146
166
 
147
167
  // If we end up with the nothing then skip forward
@@ -180,7 +200,7 @@ export function encodeBodyForm(
180
200
  let tmp = "";
181
201
  let encValue = "";
182
202
 
183
- if (pv === undefined) {
203
+ if (pv == null) {
184
204
  return;
185
205
  } else if (Array.isArray(pv)) {
186
206
  encValue = JSON.stringify(pv, jsonReplacer);
@@ -207,14 +227,14 @@ export function encodeDeepObject(
207
227
  key: string,
208
228
  value: unknown,
209
229
  options?: { charEncoding?: "percent" | "none" },
210
- ): string {
230
+ ): string | undefined {
211
231
  if (value == null) {
212
- return "";
232
+ return;
213
233
  }
214
234
 
215
235
  if (!isPlainObject(value)) {
216
236
  throw new EncodingError(
217
- `Value of parameter '${key}' which uses deepObject encoding must be an object`,
237
+ `Value of parameter '${key}' which uses deepObject encoding must be an object or null`,
218
238
  );
219
239
  }
220
240
 
@@ -225,9 +245,9 @@ export function encodeDeepObjectObject(
225
245
  key: string,
226
246
  value: unknown,
227
247
  options?: { charEncoding?: "percent" | "none" },
228
- ): string {
248
+ ): string | undefined {
229
249
  if (value == null) {
230
- return "";
250
+ return;
231
251
  }
232
252
 
233
253
  let out = "";
@@ -241,7 +261,7 @@ export function encodeDeepObjectObject(
241
261
  }
242
262
 
243
263
  Object.entries(value).forEach(([ck, cv]) => {
244
- if (cv === undefined) {
264
+ if (cv == null) {
245
265
  return;
246
266
  }
247
267
 
@@ -250,19 +270,17 @@ export function encodeDeepObjectObject(
250
270
  if (isPlainObject(cv)) {
251
271
  const objOut = encodeDeepObjectObject(pk, cv, options);
252
272
 
253
- out += `&${objOut}`;
273
+ out += objOut == null ? "" : `&${objOut}`;
254
274
 
255
275
  return;
256
276
  }
257
277
 
258
278
  const pairs: unknown[] = Array.isArray(cv) ? cv : [cv];
259
- let encoded = "";
260
-
261
- encoded = mapDefined(pairs, (v) => {
279
+ const encoded = mapDefined(pairs, (v) => {
262
280
  return `${encodeString(pk)}=${encodeString(serializeValue(v))}`;
263
- }).join("&");
281
+ })?.join("&");
264
282
 
265
- out += `&${encoded}`;
283
+ out += encoded == null ? "" : `&${encoded}`;
266
284
  });
267
285
 
268
286
  return out.slice(1);
@@ -272,9 +290,9 @@ export function encodeJSON(
272
290
  key: string,
273
291
  value: unknown,
274
292
  options?: { explode?: boolean; charEncoding?: "percent" | "none" },
275
- ): string {
293
+ ): string | undefined {
276
294
  if (typeof value === "undefined") {
277
- return "";
295
+ return;
278
296
  }
279
297
 
280
298
  const encodeString = (v: string) => {
@@ -290,40 +308,39 @@ export const encodeSimple = (
290
308
  key: string,
291
309
  value: unknown,
292
310
  options?: { explode?: boolean; charEncoding?: "percent" | "none" },
293
- ): string => {
311
+ ): string | undefined => {
294
312
  let out = "";
295
313
  const pairs: [string, unknown][] = options?.explode
296
314
  ? explode(key, value)
297
315
  : [[key, value]];
298
316
 
317
+ if (pairs.every(([_, v]) => v == null)) {
318
+ return;
319
+ }
320
+
299
321
  const encodeString = (v: string) => {
300
322
  return options?.charEncoding === "percent" ? encodeURIComponent(v) : v;
301
323
  };
302
324
  const encodeValue = (v: unknown) => encodeString(serializeValue(v));
303
325
 
304
326
  pairs.forEach(([pk, pv]) => {
305
- let tmp = "";
327
+ let tmp: string | null | undefined = "";
306
328
 
307
- if (pv === undefined) {
329
+ if (pv == null) {
308
330
  return;
309
331
  } else if (Array.isArray(pv)) {
310
- tmp = mapDefined(pv, (v) => `${encodeValue(v)}`).join(",");
332
+ tmp = mapDefined(pv, (v) => `${encodeValue(v)}`)?.join(",");
311
333
  } else if (isPlainObject(pv)) {
312
- tmp = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
334
+ const mapped = mapDefinedEntries(Object.entries(pv), ([k, v]) => {
313
335
  return `,${encodeString(k)},${encodeValue(v)}`;
314
- }).join("");
315
- tmp = tmp.slice(1);
336
+ });
337
+ tmp = mapped?.join("").slice(1);
316
338
  } else {
317
339
  const k = options?.explode && isPlainObject(value) ? `${pk}=` : "";
318
340
  tmp = `${k}${encodeValue(pv)}`;
319
341
  }
320
342
 
321
- // If we end up with the nothing then skip forward
322
- if (!tmp) {
323
- return;
324
- }
325
-
326
- out += `,${tmp}`;
343
+ out += tmp ? `,${tmp}` : "";
327
344
  });
328
345
 
329
346
  return out.slice(1);
@@ -341,9 +358,7 @@ function explode(key: string, value: unknown): [string, unknown][] {
341
358
  }
342
359
 
343
360
  function serializeValue(value: unknown): string {
344
- if (value === null) {
345
- return "null";
346
- } else if (typeof value === "undefined") {
361
+ if (value == null) {
347
362
  return "";
348
363
  } else if (value instanceof Date) {
349
364
  return value.toISOString();
@@ -364,14 +379,14 @@ function jsonReplacer(_: string, value: unknown): unknown {
364
379
  }
365
380
  }
366
381
 
367
- function mapDefined<T, R>(inp: T[], mapper: (v: T) => R): R[] {
368
- return inp.reduce<R[]>((acc, v) => {
369
- if (v === undefined) {
382
+ function mapDefined<T, R>(inp: T[], mapper: (v: T) => R): R[] | null {
383
+ const res = inp.reduce<R[]>((acc, v) => {
384
+ if (v == null) {
370
385
  return acc;
371
386
  }
372
387
 
373
388
  const m = mapper(v);
374
- if (m === undefined) {
389
+ if (m == null) {
375
390
  return acc;
376
391
  }
377
392
 
@@ -379,30 +394,32 @@ function mapDefined<T, R>(inp: T[], mapper: (v: T) => R): R[] {
379
394
 
380
395
  return acc;
381
396
  }, []);
397
+
398
+ return res.length ? res : null;
382
399
  }
383
400
 
384
401
  function mapDefinedEntries<K, V, R>(
385
402
  inp: Iterable<[K, V]>,
386
403
  mapper: (v: [K, V]) => R,
387
- ): R[] {
404
+ ): R[] | null {
388
405
  const acc: R[] = [];
389
406
  for (const [k, v] of inp) {
390
- if (v === undefined) {
407
+ if (v == null) {
391
408
  continue;
392
409
  }
393
410
 
394
411
  const m = mapper([k, v]);
395
- if (m === undefined) {
412
+ if (m == null) {
396
413
  continue;
397
414
  }
398
415
 
399
416
  acc.push(m);
400
417
  }
401
418
 
402
- return acc;
419
+ return acc.length ? acc : null;
403
420
  }
404
421
 
405
- export function queryJoin(...args: string[]): string {
422
+ export function queryJoin(...args: (string | undefined)[]): string {
406
423
  return args.filter(Boolean).join("&");
407
424
  }
408
425
 
@@ -415,7 +432,7 @@ type QueryEncoder = (
415
432
  key: string,
416
433
  value: unknown,
417
434
  options?: QueryEncoderOptions,
418
- ) => string;
435
+ ) => string | undefined;
419
436
 
420
437
  type BulkQueryEncoder = (
421
438
  values: Record<string, unknown>,
@@ -447,3 +464,20 @@ export const encodeFormQuery = queryEncoder(encodeForm);
447
464
  export const encodeSpaceDelimitedQuery = queryEncoder(encodeSpaceDelimited);
448
465
  export const encodePipeDelimitedQuery = queryEncoder(encodePipeDelimited);
449
466
  export const encodeDeepObjectQuery = queryEncoder(encodeDeepObject);
467
+
468
+ export function appendForm(
469
+ fd: FormData,
470
+ key: string,
471
+ value: unknown,
472
+ fileName?: string,
473
+ ): void {
474
+ if (value == null) {
475
+ return;
476
+ } else if (value instanceof Blob && fileName) {
477
+ fd.append(key, value, fileName);
478
+ } else if (value instanceof Blob) {
479
+ fd.append(key, value);
480
+ } else {
481
+ fd.append(key, String(value));
482
+ }
483
+ }
package/src/lib/files.ts CHANGED
@@ -36,5 +36,5 @@ export async function readableStreamToArrayBuffer(
36
36
  offset += chunk.length;
37
37
  }
38
38
 
39
- return concatenatedChunks.buffer;
39
+ return concatenatedChunks.buffer as ArrayBuffer;
40
40
  }
@@ -10,6 +10,7 @@ import { isPlainObject } from "./is-plain-object.js";
10
10
  import { safeParse } from "./schemas.js";
11
11
 
12
12
  export type Encoding =
13
+ | "jsonl"
13
14
  | "json"
14
15
  | "text"
15
16
  | "bytes"
@@ -19,6 +20,7 @@ export type Encoding =
19
20
  | "fail";
20
21
 
21
22
  const DEFAULT_CONTENT_TYPES: Record<Encoding, string> = {
23
+ jsonl: "application/jsonl",
22
24
  json: "application/json",
23
25
  text: "text/plain",
24
26
  bytes: "application/octet-stream",
@@ -72,6 +74,21 @@ export function json<T>(
72
74
  return { ...options, enc: "json", codes, schema };
73
75
  }
74
76
 
77
+ export function jsonl<T>(
78
+ codes: StatusCodePredicate,
79
+ schema: Schema<T>,
80
+ options?: MatchOptions,
81
+ ): ValueMatcher<T> {
82
+ return { ...options, enc: "jsonl", codes, schema };
83
+ }
84
+
85
+ export function jsonlErr<E>(
86
+ codes: StatusCodePredicate,
87
+ schema: Schema<E>,
88
+ options?: MatchOptions,
89
+ ): ErrorMatcher<E> {
90
+ return { ...options, err: true, enc: "jsonl", codes, schema };
91
+ }
75
92
  export function textErr<E>(
76
93
  codes: StatusCodePredicate,
77
94
  schema: Schema<E>,
@@ -204,6 +221,9 @@ export function match<T, E>(
204
221
  case "json":
205
222
  raw = await response.json();
206
223
  break;
224
+ case "jsonl":
225
+ raw = response.body;
226
+ break;
207
227
  case "bytes":
208
228
  raw = new Uint8Array(await response.arrayBuffer());
209
229
  break;
@@ -120,3 +120,31 @@ export function abortSignalAny(signals: AbortSignal[]): AbortSignal {
120
120
 
121
121
  return result;
122
122
  }
123
+
124
+ export function compactMap<T>(
125
+ values: Record<string, T | undefined>,
126
+ ): Record<string, T> {
127
+ const out: Record<string, T> = {};
128
+
129
+ for (const [k, v] of Object.entries(values)) {
130
+ if (typeof v !== "undefined") {
131
+ out[k] = v;
132
+ }
133
+ }
134
+
135
+ return out;
136
+ }
137
+
138
+ export function allRequired<V extends Record<string, unknown>>(
139
+ v: V,
140
+ ):
141
+ | {
142
+ [K in keyof V]: NonNullable<V[K]>;
143
+ }
144
+ | undefined {
145
+ if (Object.values(v).every((x) => x == null)) {
146
+ return void 0;
147
+ }
148
+
149
+ return v as ReturnType<typeof allRequired<V>>;
150
+ }
@@ -158,7 +158,6 @@ async function retryBackoff(
158
158
  const start = Date.now();
159
159
  let x = 0;
160
160
 
161
- // eslint-disable-next-line no-constant-condition
162
161
  while (true) {
163
162
  try {
164
163
  const res = await fn();
@@ -57,6 +57,7 @@ export function collectExtraKeys<
57
57
  >(
58
58
  obj: ZodObject<Shape, "strip", Catchall>,
59
59
  extrasKey: K,
60
+ optional: boolean,
60
61
  ): ZodEffects<
61
62
  typeof obj,
62
63
  & output<ZodObject<Shape, "strict">>
@@ -81,6 +82,10 @@ export function collectExtraKeys<
81
82
  delete val[key];
82
83
  }
83
84
 
85
+ if (optional && Object.keys(extras).length === 0) {
86
+ return val;
87
+ }
88
+
84
89
  return { ...val, [extrasKey]: extras };
85
90
  });
86
91
  }
package/src/lib/sdks.ts CHANGED
@@ -79,7 +79,7 @@ export class ClientSDK {
79
79
  readonly #httpClient: HTTPClient;
80
80
  readonly #hooks: SDKHooks;
81
81
  readonly #logger?: Logger | undefined;
82
- protected readonly _baseURL: URL | null;
82
+ public readonly _baseURL: URL | null;
83
83
  public readonly _options: SDKOptions & { hooks?: SDKHooks };
84
84
 
85
85
  constructor(options: SDKOptions = {}) {
@@ -135,7 +135,10 @@ export class ClientSDK {
135
135
 
136
136
  const secQuery: string[] = [];
137
137
  for (const [k, v] of Object.entries(security?.queryParams || {})) {
138
- secQuery.push(encodeForm(k, v, { charEncoding: "percent" }));
138
+ const q = encodeForm(k, v, { charEncoding: "percent" });
139
+ if (typeof q !== "undefined") {
140
+ secQuery.push(q);
141
+ }
139
142
  }
140
143
  if (secQuery.length) {
141
144
  finalQuery += `&${secQuery.join("&")}`;
@@ -192,14 +195,9 @@ export class ClientSDK {
192
195
 
193
196
  if (conf.body instanceof ReadableStream) {
194
197
  if (!fetchOptions) {
195
- fetchOptions = {
196
- // @ts-expect-error see https://github.com/node-fetch/node-fetch/issues/1769
197
- duplex: "half",
198
- };
199
- } else {
200
- // @ts-expect-error see https://github.com/node-fetch/node-fetch/issues/1769
201
- fetchOptions.duplex = "half";
198
+ fetchOptions = {};
202
199
  }
200
+ Object.assign(fetchOptions, { duplex: "half" });
203
201
  }
204
202
 
205
203
  let input;
@@ -304,7 +302,9 @@ export class ClientSDK {
304
302
  }
305
303
  }
306
304
 
307
- const jsonLikeContentTypeRE = /^application\/(?:.{0,100}\+)?json/;
305
+ const jsonLikeContentTypeRE = /(application|text)\/.*?\+*json.*/;
306
+ const jsonlLikeContentTypeRE =
307
+ /(application|text)\/(.*?\+*\bjsonl\b.*|.*?\+*\bx-ndjson\b.*)/;
308
308
  async function logRequest(logger: Logger | undefined, req: Request) {
309
309
  if (!logger) {
310
310
  return;
@@ -370,9 +370,13 @@ async function logResponse(
370
370
  logger.group("Body:");
371
371
  switch (true) {
372
372
  case matchContentType(res, "application/json")
373
- || jsonLikeContentTypeRE.test(ct):
373
+ || jsonLikeContentTypeRE.test(ct) && !jsonlLikeContentTypeRE.test(ct):
374
374
  logger.log(await res.clone().json());
375
375
  break;
376
+ case matchContentType(res, "application/jsonl")
377
+ || jsonlLikeContentTypeRE.test(ct):
378
+ logger.log(await res.clone().text());
379
+ break;
376
380
  case matchContentType(res, "text/event-stream"):
377
381
  logger.log(`<${contentType}>`);
378
382
  break;
@@ -86,7 +86,9 @@ type SecurityInputOAuth2ClientCredentials = {
86
86
  value:
87
87
  | { clientID?: string | undefined; clientSecret?: string | undefined }
88
88
  | null
89
+ | string
89
90
  | undefined;
91
+ fieldName?: string;
90
92
  };
91
93
 
92
94
  type SecurityInputOAuth2PasswordCredentials = {
@@ -95,13 +97,13 @@ type SecurityInputOAuth2PasswordCredentials = {
95
97
  | string
96
98
  | null
97
99
  | undefined;
98
- fieldName: string;
100
+ fieldName?: string;
99
101
  };
100
102
 
101
103
  type SecurityInputCustom = {
102
104
  type: "http:custom";
103
105
  value: any | null | undefined;
104
- fieldName: string;
106
+ fieldName?: string;
105
107
  };
106
108
 
107
109
  export type SecurityInput =
@@ -138,6 +140,9 @@ export function resolveSecurity(
138
140
  typeof o.value === "string" && !!o.value
139
141
  );
140
142
  } else if (o.type === "oauth2:client_credentials") {
143
+ if (typeof o.value == "string") {
144
+ return !!o.value;
145
+ }
141
146
  return o.value.clientID != null || o.value.clientSecret != null;
142
147
  } else if (typeof o.value === "string") {
143
148
  return !!o.value;
@@ -226,7 +231,9 @@ function applyBearer(
226
231
  value = `Bearer ${value}`;
227
232
  }
228
233
 
229
- state.headers[spec.fieldName] = value;
234
+ if (spec.fieldName !== undefined) {
235
+ state.headers[spec.fieldName] = value;
236
+ }
230
237
  }
231
238
 
232
239
  export function resolveGlobalSecurity(