@zapier/zapier-sdk 0.4.0 → 0.5.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 (374) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/api/auth.d.ts +9 -0
  3. package/dist/api/auth.d.ts.map +1 -0
  4. package/dist/api/auth.js +25 -0
  5. package/dist/api/client.d.ts +9 -0
  6. package/dist/api/client.d.ts.map +1 -0
  7. package/dist/api/client.js +322 -0
  8. package/dist/api/debug.d.ts +13 -0
  9. package/dist/api/debug.d.ts.map +1 -0
  10. package/dist/api/debug.js +55 -0
  11. package/dist/api/index.d.ts +29 -0
  12. package/dist/api/index.d.ts.map +1 -0
  13. package/dist/api/index.js +41 -0
  14. package/dist/api/polling.d.ts +16 -0
  15. package/dist/api/polling.d.ts.map +1 -0
  16. package/dist/api/polling.js +45 -0
  17. package/dist/api/schemas.d.ts +2473 -0
  18. package/dist/api/schemas.d.ts.map +1 -0
  19. package/dist/api/schemas.js +355 -0
  20. package/dist/api/types.d.ts +75 -0
  21. package/dist/api/types.d.ts.map +1 -0
  22. package/dist/api/types.js +11 -0
  23. package/dist/auth.d.ts +34 -0
  24. package/dist/auth.d.ts.map +1 -0
  25. package/dist/auth.js +47 -0
  26. package/dist/constants.d.ts +10 -0
  27. package/dist/constants.d.ts.map +1 -0
  28. package/dist/constants.js +9 -0
  29. package/dist/index.cjs +2134 -1444
  30. package/dist/index.d.mts +2456 -584
  31. package/dist/index.d.ts +17 -840
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +20 -0
  34. package/dist/index.mjs +2118 -1428
  35. package/dist/plugins/api/index.d.ts +14 -0
  36. package/dist/plugins/api/index.d.ts.map +1 -0
  37. package/dist/plugins/api/index.js +21 -0
  38. package/dist/plugins/apps/index.d.ts +11 -0
  39. package/dist/plugins/apps/index.d.ts.map +1 -0
  40. package/dist/plugins/apps/index.js +91 -0
  41. package/dist/plugins/apps/types.d.ts +30 -0
  42. package/dist/plugins/apps/types.d.ts.map +1 -0
  43. package/dist/plugins/apps/types.js +2 -0
  44. package/dist/plugins/fetch/index.d.ts +21 -0
  45. package/dist/plugins/fetch/index.d.ts.map +1 -0
  46. package/dist/plugins/fetch/index.js +20 -0
  47. package/dist/plugins/findFirstAuthentication/index.d.ts +20 -0
  48. package/dist/plugins/findFirstAuthentication/index.d.ts.map +1 -0
  49. package/dist/plugins/findFirstAuthentication/index.js +24 -0
  50. package/dist/plugins/findFirstAuthentication/index.test.d.ts +2 -0
  51. package/dist/plugins/findFirstAuthentication/index.test.d.ts.map +1 -0
  52. package/dist/plugins/findFirstAuthentication/index.test.js +171 -0
  53. package/dist/plugins/findFirstAuthentication/schemas.d.ts +29 -0
  54. package/dist/plugins/findFirstAuthentication/schemas.d.ts.map +1 -0
  55. package/dist/plugins/findFirstAuthentication/schemas.js +18 -0
  56. package/dist/plugins/findUniqueAuthentication/index.d.ts +20 -0
  57. package/dist/plugins/findUniqueAuthentication/index.d.ts.map +1 -0
  58. package/dist/plugins/findUniqueAuthentication/index.js +31 -0
  59. package/dist/plugins/findUniqueAuthentication/index.test.d.ts +2 -0
  60. package/dist/plugins/findUniqueAuthentication/index.test.d.ts.map +1 -0
  61. package/dist/plugins/findUniqueAuthentication/index.test.js +152 -0
  62. package/dist/plugins/findUniqueAuthentication/schemas.d.ts +29 -0
  63. package/dist/plugins/findUniqueAuthentication/schemas.d.ts.map +1 -0
  64. package/dist/plugins/findUniqueAuthentication/schemas.js +18 -0
  65. package/dist/plugins/getAction/index.d.ts +23 -0
  66. package/dist/plugins/getAction/index.d.ts.map +1 -0
  67. package/dist/plugins/getAction/index.js +28 -0
  68. package/dist/plugins/getAction/index.test.d.ts +2 -0
  69. package/dist/plugins/getAction/index.test.d.ts.map +1 -0
  70. package/dist/plugins/getAction/index.test.js +186 -0
  71. package/dist/plugins/getAction/schemas.d.ts +23 -0
  72. package/dist/plugins/getAction/schemas.d.ts.map +1 -0
  73. package/dist/plugins/getAction/schemas.js +10 -0
  74. package/dist/plugins/getApp/index.d.ts +22 -0
  75. package/dist/plugins/getApp/index.d.ts.map +1 -0
  76. package/dist/plugins/getApp/index.js +39 -0
  77. package/dist/plugins/getApp/index.test.d.ts +2 -0
  78. package/dist/plugins/getApp/index.test.d.ts.map +1 -0
  79. package/dist/plugins/getApp/index.test.js +100 -0
  80. package/dist/plugins/getApp/schemas.d.ts +18 -0
  81. package/dist/plugins/getApp/schemas.d.ts.map +1 -0
  82. package/dist/plugins/getApp/schemas.js +10 -0
  83. package/dist/plugins/getAuthentication/index.d.ts +22 -0
  84. package/dist/plugins/getAuthentication/index.d.ts.map +1 -0
  85. package/dist/plugins/getAuthentication/index.js +41 -0
  86. package/dist/plugins/getAuthentication/index.test.d.ts +2 -0
  87. package/dist/plugins/getAuthentication/index.test.d.ts.map +1 -0
  88. package/dist/plugins/getAuthentication/index.test.js +205 -0
  89. package/dist/plugins/getAuthentication/schemas.d.ts +17 -0
  90. package/dist/plugins/getAuthentication/schemas.d.ts.map +1 -0
  91. package/dist/plugins/getAuthentication/schemas.js +11 -0
  92. package/dist/plugins/getProfile/index.d.ts +23 -0
  93. package/dist/plugins/getProfile/index.d.ts.map +1 -0
  94. package/dist/plugins/getProfile/index.js +29 -0
  95. package/dist/plugins/getProfile/schemas.d.ts +13 -0
  96. package/dist/plugins/getProfile/schemas.d.ts.map +1 -0
  97. package/dist/plugins/getProfile/schemas.js +5 -0
  98. package/dist/plugins/listActions/index.d.ts +28 -0
  99. package/dist/plugins/listActions/index.d.ts.map +1 -0
  100. package/dist/plugins/listActions/index.js +61 -0
  101. package/dist/plugins/listActions/index.test.d.ts +2 -0
  102. package/dist/plugins/listActions/index.test.d.ts.map +1 -0
  103. package/dist/plugins/listActions/index.test.js +467 -0
  104. package/dist/plugins/listActions/schemas.d.ts +29 -0
  105. package/dist/plugins/listActions/schemas.d.ts.map +1 -0
  106. package/dist/plugins/listActions/schemas.js +21 -0
  107. package/dist/plugins/listApps/index.d.ts +28 -0
  108. package/dist/plugins/listApps/index.d.ts.map +1 -0
  109. package/dist/plugins/listApps/index.js +62 -0
  110. package/dist/plugins/listApps/index.test.d.ts +2 -0
  111. package/dist/plugins/listApps/index.test.d.ts.map +1 -0
  112. package/dist/plugins/listApps/index.test.js +313 -0
  113. package/dist/plugins/listApps/schemas.d.ts +30 -0
  114. package/dist/plugins/listApps/schemas.d.ts.map +1 -0
  115. package/dist/plugins/listApps/schemas.js +23 -0
  116. package/dist/plugins/listAuthentications/index.d.ts +28 -0
  117. package/dist/plugins/listAuthentications/index.d.ts.map +1 -0
  118. package/dist/plugins/listAuthentications/index.js +77 -0
  119. package/dist/plugins/listAuthentications/index.test.d.ts +2 -0
  120. package/dist/plugins/listAuthentications/index.test.d.ts.map +1 -0
  121. package/dist/plugins/listAuthentications/index.test.js +564 -0
  122. package/dist/plugins/listAuthentications/schemas.d.ts +38 -0
  123. package/dist/plugins/listAuthentications/schemas.d.ts.map +1 -0
  124. package/dist/plugins/listAuthentications/schemas.js +28 -0
  125. package/dist/plugins/listInputFields/index.d.ts +28 -0
  126. package/dist/plugins/listInputFields/index.d.ts.map +1 -0
  127. package/dist/plugins/listInputFields/index.js +133 -0
  128. package/dist/plugins/listInputFields/index.test.d.ts +2 -0
  129. package/dist/plugins/listInputFields/index.test.d.ts.map +1 -0
  130. package/dist/plugins/listInputFields/index.test.js +325 -0
  131. package/dist/plugins/listInputFields/schemas.d.ts +38 -0
  132. package/dist/plugins/listInputFields/schemas.d.ts.map +1 -0
  133. package/dist/plugins/listInputFields/schemas.js +22 -0
  134. package/dist/plugins/registry/index.d.ts +11 -0
  135. package/dist/plugins/registry/index.d.ts.map +1 -0
  136. package/dist/plugins/registry/index.js +14 -0
  137. package/dist/plugins/request/index.d.ts +19 -0
  138. package/dist/plugins/request/index.d.ts.map +1 -0
  139. package/dist/plugins/request/index.js +62 -0
  140. package/dist/plugins/request/index.test.d.ts +2 -0
  141. package/dist/plugins/request/index.test.d.ts.map +1 -0
  142. package/dist/plugins/request/index.test.js +256 -0
  143. package/dist/plugins/request/schemas.d.ts +69 -0
  144. package/dist/plugins/request/schemas.d.ts.map +1 -0
  145. package/dist/plugins/request/schemas.js +42 -0
  146. package/dist/plugins/runAction/index.d.ts +28 -0
  147. package/dist/plugins/runAction/index.d.ts.map +1 -0
  148. package/dist/plugins/runAction/index.js +86 -0
  149. package/dist/plugins/runAction/index.test.d.ts +2 -0
  150. package/dist/plugins/runAction/index.test.d.ts.map +1 -0
  151. package/dist/plugins/runAction/index.test.js +320 -0
  152. package/dist/plugins/runAction/schemas.d.ts +37 -0
  153. package/dist/plugins/runAction/schemas.d.ts.map +1 -0
  154. package/dist/plugins/runAction/schemas.js +22 -0
  155. package/dist/resolvers/actionKey.d.ts +9 -0
  156. package/dist/resolvers/actionKey.d.ts.map +1 -0
  157. package/dist/resolvers/actionKey.js +19 -0
  158. package/dist/resolvers/actionType.d.ts +9 -0
  159. package/dist/resolvers/actionType.d.ts.map +1 -0
  160. package/dist/resolvers/actionType.js +22 -0
  161. package/dist/resolvers/appKey.d.ts +7 -0
  162. package/dist/resolvers/appKey.d.ts.map +1 -0
  163. package/dist/resolvers/appKey.js +5 -0
  164. package/dist/resolvers/authenticationId.d.ts +9 -0
  165. package/dist/resolvers/authenticationId.d.ts.map +1 -0
  166. package/dist/resolvers/authenticationId.js +33 -0
  167. package/dist/resolvers/index.d.ts +40 -0
  168. package/dist/resolvers/index.d.ts.map +1 -0
  169. package/dist/resolvers/index.js +91 -0
  170. package/dist/resolvers/inputs.d.ts +8 -0
  171. package/dist/resolvers/inputs.d.ts.map +1 -0
  172. package/dist/resolvers/inputs.js +14 -0
  173. package/dist/schemas/Action.d.ts +243 -0
  174. package/dist/schemas/Action.d.ts.map +1 -0
  175. package/dist/schemas/Action.js +34 -0
  176. package/dist/schemas/App.d.ts +26 -0
  177. package/dist/schemas/App.d.ts.map +1 -0
  178. package/dist/schemas/App.js +22 -0
  179. package/dist/schemas/Auth.d.ts +161 -0
  180. package/dist/schemas/Auth.d.ts.map +1 -0
  181. package/dist/schemas/Auth.js +41 -0
  182. package/dist/schemas/Field.d.ts +144 -0
  183. package/dist/schemas/Field.d.ts.map +1 -0
  184. package/dist/schemas/Field.js +105 -0
  185. package/dist/schemas/UserProfile.d.ts +163 -0
  186. package/dist/schemas/UserProfile.d.ts.map +1 -0
  187. package/dist/schemas/UserProfile.js +29 -0
  188. package/dist/sdk.d.ts +10 -0
  189. package/dist/sdk.d.ts.map +1 -0
  190. package/dist/sdk.js +94 -0
  191. package/dist/sdk.test.d.ts +2 -0
  192. package/dist/sdk.test.d.ts.map +1 -0
  193. package/dist/sdk.test.js +135 -0
  194. package/dist/types/domain.d.ts +36 -0
  195. package/dist/types/domain.d.ts.map +1 -0
  196. package/dist/types/domain.js +1 -0
  197. package/dist/types/domain.test.d.ts +2 -0
  198. package/dist/types/domain.test.d.ts.map +1 -0
  199. package/dist/types/domain.test.js +39 -0
  200. package/dist/types/errors.d.ts +143 -0
  201. package/dist/types/errors.d.ts.map +1 -0
  202. package/dist/types/errors.js +187 -0
  203. package/dist/types/events.d.ts +38 -0
  204. package/dist/types/events.d.ts.map +1 -0
  205. package/dist/types/events.js +7 -0
  206. package/dist/types/functions.d.ts +26 -0
  207. package/dist/types/functions.d.ts.map +1 -0
  208. package/dist/types/functions.js +4 -0
  209. package/dist/types/plugin.d.ts +61 -0
  210. package/dist/types/plugin.d.ts.map +1 -0
  211. package/dist/types/plugin.js +9 -0
  212. package/dist/types/properties.d.ts +22 -0
  213. package/dist/types/properties.d.ts.map +1 -0
  214. package/dist/types/properties.js +50 -0
  215. package/dist/types/sdk.d.ts +43 -0
  216. package/dist/types/sdk.d.ts.map +1 -0
  217. package/dist/types/sdk.js +4 -0
  218. package/dist/utils/array-utils.d.ts +31 -0
  219. package/dist/utils/array-utils.d.ts.map +1 -0
  220. package/dist/utils/array-utils.js +36 -0
  221. package/dist/utils/array-utils.test.d.ts +2 -0
  222. package/dist/utils/array-utils.test.d.ts.map +1 -0
  223. package/dist/utils/array-utils.test.js +107 -0
  224. package/dist/utils/domain-utils.d.ts +78 -0
  225. package/dist/utils/domain-utils.d.ts.map +1 -0
  226. package/dist/utils/domain-utils.js +218 -0
  227. package/dist/utils/domain-utils.test.d.ts +2 -0
  228. package/dist/utils/domain-utils.test.d.ts.map +1 -0
  229. package/dist/utils/domain-utils.test.js +192 -0
  230. package/dist/utils/function-utils.d.ts +45 -0
  231. package/dist/utils/function-utils.d.ts.map +1 -0
  232. package/dist/utils/function-utils.js +158 -0
  233. package/dist/utils/function-utils.test.d.ts +2 -0
  234. package/dist/utils/function-utils.test.d.ts.map +1 -0
  235. package/dist/utils/function-utils.test.js +110 -0
  236. package/dist/utils/pagination-utils.d.ts +37 -0
  237. package/dist/utils/pagination-utils.d.ts.map +1 -0
  238. package/dist/utils/pagination-utils.js +165 -0
  239. package/dist/utils/pagination-utils.test.d.ts +17 -0
  240. package/dist/utils/pagination-utils.test.d.ts.map +1 -0
  241. package/dist/utils/pagination-utils.test.js +461 -0
  242. package/dist/utils/schema-utils.d.ts +45 -0
  243. package/dist/utils/schema-utils.d.ts.map +1 -0
  244. package/dist/utils/schema-utils.js +65 -0
  245. package/dist/utils/validation.d.ts +4 -0
  246. package/dist/utils/validation.d.ts.map +1 -0
  247. package/dist/utils/validation.js +30 -0
  248. package/dist/utils/validation.test.d.ts +2 -0
  249. package/dist/utils/validation.test.d.ts.map +1 -0
  250. package/dist/utils/validation.test.js +43 -0
  251. package/package.json +12 -3
  252. package/src/api/client.ts +403 -167
  253. package/src/api/debug.ts +10 -1
  254. package/src/api/index.ts +0 -2
  255. package/src/api/polling.ts +31 -14
  256. package/src/api/schemas.ts +387 -0
  257. package/src/api/types.ts +73 -138
  258. package/src/constants.ts +10 -0
  259. package/src/index.ts +45 -20
  260. package/src/plugins/api/index.ts +47 -0
  261. package/src/plugins/apps/index.ts +36 -31
  262. package/src/plugins/apps/types.ts +24 -12
  263. package/src/plugins/fetch/index.ts +58 -0
  264. package/src/plugins/findFirstAuthentication/index.test.ts +206 -0
  265. package/src/plugins/findFirstAuthentication/index.ts +55 -0
  266. package/src/plugins/findFirstAuthentication/schemas.ts +41 -0
  267. package/src/plugins/findUniqueAuthentication/index.test.ts +197 -0
  268. package/src/plugins/findUniqueAuthentication/index.ts +72 -0
  269. package/src/plugins/findUniqueAuthentication/schemas.ts +42 -0
  270. package/src/plugins/getAction/index.test.ts +239 -0
  271. package/src/plugins/getAction/index.ts +57 -0
  272. package/src/plugins/getAction/schemas.ts +33 -0
  273. package/src/plugins/getApp/index.test.ts +127 -0
  274. package/src/plugins/getApp/index.ts +66 -0
  275. package/src/plugins/getApp/schemas.ts +38 -0
  276. package/src/plugins/getAuthentication/index.test.ts +284 -0
  277. package/src/plugins/getAuthentication/index.ts +86 -0
  278. package/src/plugins/getAuthentication/schemas.ts +31 -0
  279. package/src/plugins/getProfile/index.ts +55 -0
  280. package/src/plugins/getProfile/schemas.ts +26 -0
  281. package/src/plugins/listActions/index.test.ts +582 -0
  282. package/src/plugins/listActions/index.ts +115 -0
  283. package/src/plugins/listActions/schemas.ts +54 -0
  284. package/src/plugins/listApps/index.test.ts +357 -0
  285. package/src/plugins/listApps/index.ts +121 -0
  286. package/src/plugins/listApps/schemas.ts +49 -0
  287. package/src/plugins/listAuthentications/index.test.ts +709 -0
  288. package/src/plugins/listAuthentications/index.ts +136 -0
  289. package/src/plugins/listAuthentications/schemas.ts +60 -0
  290. package/src/plugins/listInputFields/index.test.ts +408 -0
  291. package/src/plugins/listInputFields/index.ts +204 -0
  292. package/src/plugins/listInputFields/schemas.ts +56 -0
  293. package/src/plugins/registry/index.ts +30 -0
  294. package/src/plugins/request/index.test.ts +329 -0
  295. package/src/plugins/request/index.ts +103 -0
  296. package/src/plugins/request/schemas.ts +64 -0
  297. package/src/plugins/runAction/index.test.ts +387 -0
  298. package/src/plugins/runAction/index.ts +176 -0
  299. package/src/plugins/runAction/schemas.ts +53 -0
  300. package/src/resolvers/actionKey.ts +6 -4
  301. package/src/resolvers/actionType.ts +7 -2
  302. package/src/resolvers/appKey.ts +1 -1
  303. package/src/resolvers/authenticationId.ts +12 -3
  304. package/src/resolvers/inputs.ts +3 -1
  305. package/src/schemas/Action.ts +18 -12
  306. package/src/schemas/App.ts +11 -19
  307. package/src/schemas/Auth.ts +18 -13
  308. package/src/schemas/Field.ts +106 -11
  309. package/src/schemas/UserProfile.ts +43 -0
  310. package/src/sdk.test.ts +212 -0
  311. package/src/sdk.ts +133 -105
  312. package/src/types/domain.test.ts +50 -0
  313. package/src/types/domain.ts +43 -75
  314. package/src/types/errors.ts +275 -0
  315. package/src/types/functions.ts +27 -0
  316. package/src/types/optional-zapier-sdk-cli-login.d.ts +37 -0
  317. package/src/types/plugin.ts +105 -0
  318. package/src/types/properties.ts +4 -3
  319. package/src/types/sdk.ts +71 -46
  320. package/src/utils/array-utils.test.ts +131 -0
  321. package/src/utils/array-utils.ts +41 -0
  322. package/src/utils/domain-utils.test.ts +239 -0
  323. package/src/utils/domain-utils.ts +283 -0
  324. package/src/utils/function-utils.test.ts +141 -0
  325. package/src/utils/function-utils.ts +245 -0
  326. package/src/utils/pagination-utils.test.ts +620 -0
  327. package/src/utils/pagination-utils.ts +242 -0
  328. package/src/utils/validation.test.ts +50 -0
  329. package/src/utils/validation.ts +44 -0
  330. package/tsconfig.build.json +16 -2
  331. package/tsconfig.json +3 -1
  332. package/tsconfig.tsbuildinfo +1 -0
  333. package/tsup.config.ts +2 -0
  334. package/src/functions/bundleCode/index.ts +0 -78
  335. package/src/functions/bundleCode/info.ts +0 -9
  336. package/src/functions/bundleCode/schemas.ts +0 -30
  337. package/src/functions/fetch/index.ts +0 -180
  338. package/src/functions/fetch/info.ts +0 -8
  339. package/src/functions/fetch/schemas.ts +0 -46
  340. package/src/functions/findFirstAuthentication/index.ts +0 -24
  341. package/src/functions/findFirstAuthentication/info.ts +0 -9
  342. package/src/functions/findFirstAuthentication/schemas.ts +0 -50
  343. package/src/functions/findUniqueAuthentication/index.ts +0 -35
  344. package/src/functions/findUniqueAuthentication/info.ts +0 -9
  345. package/src/functions/findUniqueAuthentication/schemas.ts +0 -50
  346. package/src/functions/generateTypes/index.ts +0 -363
  347. package/src/functions/generateTypes/info.ts +0 -9
  348. package/src/functions/generateTypes/schemas.ts +0 -31
  349. package/src/functions/getAction/index.ts +0 -33
  350. package/src/functions/getAction/info.ts +0 -9
  351. package/src/functions/getAction/schemas.ts +0 -25
  352. package/src/functions/getApp/index.ts +0 -41
  353. package/src/functions/getApp/info.ts +0 -9
  354. package/src/functions/getApp/schemas.ts +0 -20
  355. package/src/functions/getAuthentication/index.ts +0 -50
  356. package/src/functions/getAuthentication/info.ts +0 -9
  357. package/src/functions/getAuthentication/schemas.ts +0 -29
  358. package/src/functions/listActions/index.ts +0 -149
  359. package/src/functions/listActions/info.ts +0 -9
  360. package/src/functions/listActions/schemas.ts +0 -30
  361. package/src/functions/listApps/index.ts +0 -60
  362. package/src/functions/listApps/info.ts +0 -9
  363. package/src/functions/listApps/schemas.ts +0 -32
  364. package/src/functions/listAuthentications/index.ts +0 -162
  365. package/src/functions/listAuthentications/info.ts +0 -9
  366. package/src/functions/listAuthentications/schemas.ts +0 -50
  367. package/src/functions/listFields/index.ts +0 -86
  368. package/src/functions/listFields/info.ts +0 -9
  369. package/src/functions/listFields/schemas.ts +0 -36
  370. package/src/functions/runAction/index.ts +0 -127
  371. package/src/functions/runAction/info.ts +0 -9
  372. package/src/functions/runAction/schemas.ts +0 -34
  373. package/src/plugins/apps/info.ts +0 -12
  374. /package/src/{schema-utils.ts → utils/schema-utils.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zapier/zapier-sdk",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Complete Zapier SDK - combines all Zapier SDK packages",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -31,13 +31,21 @@
31
31
  "access": "restricted"
32
32
  },
33
33
  "dependencies": {
34
- "esbuild": "^0.25.5",
35
34
  "zod": "^3.25.67"
36
35
  },
36
+ "peerDependencies": {
37
+ "@zapier/zapier-sdk-cli-login": "*"
38
+ },
39
+ "peerDependenciesMeta": {
40
+ "@zapier/zapier-sdk-cli-login": {
41
+ "optional": true
42
+ }
43
+ },
37
44
  "devDependencies": {
38
45
  "@types/node": "^24.0.1",
39
46
  "tsup": "^8.5.0",
40
47
  "typescript": "^5.8.3",
48
+ "vitest": "^3.2.3",
41
49
  "@zapier/zapier-sdk-cli-login": "0.3.1"
42
50
  },
43
51
  "scripts": {
@@ -45,6 +53,7 @@
45
53
  "clean": "rm -rf dist",
46
54
  "rebuild": "pnpm clean && pnpm build",
47
55
  "dev": "tsc --watch",
48
- "typecheck": "tsc --project tsconfig.build.json --noEmit"
56
+ "typecheck": "tsc --project tsconfig.build.json --noEmit",
57
+ "test": "vitest"
49
58
  }
50
59
  }
package/src/api/client.ts CHANGED
@@ -15,157 +15,307 @@ import { getAuthorizationHeader } from "./auth";
15
15
  import { createDebugLogger, createDebugFetch } from "./debug";
16
16
  import { pollUntilComplete } from "./polling";
17
17
  import { getTokenFromEnvOrConfig } from "../auth";
18
+ import {
19
+ ZapierApiError,
20
+ ZapierAuthenticationError,
21
+ ZapierValidationError,
22
+ ZapierNotFoundError,
23
+ type ApiError,
24
+ } from "../types/errors";
25
+
26
+ // Configuration for path prefixes that should be treated as subdomains
27
+ type SubdomainConfigMap = typeof SubdomainConfigMap;
28
+ type SubdomainConfig = SubdomainConfigMap[keyof SubdomainConfigMap];
29
+ const SubdomainConfigMap = {
30
+ // e.g. https://relay.zapier.com
31
+ relay: {
32
+ authHeader: "X-Relay-Authorization",
33
+ },
34
+ } as const;
35
+
36
+ class ZapierApiClient implements ApiClient {
37
+ constructor(
38
+ private readonly options: ApiClientOptions &
39
+ Required<Pick<ApiClientOptions, "fetch">>,
40
+ ) {}
41
+
42
+ // Helper to parse response data
43
+ private async parseResult<TOutput = unknown>(
44
+ response: Response,
45
+ ): Promise<{ type: "json"; data: TOutput } | { type: "text"; data: string }> {
46
+ try {
47
+ return { type: "json", data: await response.json() };
48
+ } catch {
49
+ return { type: "text", data: await response.text() };
50
+ }
51
+ }
18
52
 
19
- // Set of path prefixes that should be treated as subdomains
20
- const SUBDOMAIN_PREFIXES = new Set(["relay"]);
53
+ // Helper to get a token from the different places it could be gotten
54
+ private async getAuthToken(): Promise<string | undefined> {
55
+ if (this.options.token) {
56
+ return this.options.token;
57
+ }
58
+ if (this.options.getToken) {
59
+ const token = await this.options.getToken();
60
+ if (token) {
61
+ return token;
62
+ }
63
+ }
64
+ return getTokenFromEnvOrConfig({
65
+ onEvent: this.options.onEvent,
66
+ fetch: this.options.fetch,
67
+ });
68
+ }
21
69
 
22
- export function createZapierApi(options: ApiClientOptions): ApiClient {
23
- const {
24
- baseUrl,
25
- token,
26
- getToken,
27
- debug = false,
28
- fetch: originalFetch = globalThis.fetch,
29
- onEvent,
30
- } = options;
70
+ // Helper to handle responses
71
+ private async handleResponse<TOutput = unknown>(params: {
72
+ response: Response;
73
+ customErrorHandler?: RequestOptions["customErrorHandler"];
74
+ wasMissingAuthToken?: boolean;
75
+ }): Promise<string | TOutput> {
76
+ const { response, customErrorHandler, wasMissingAuthToken } = params;
77
+ const { data: responseData } = await this.parseResult<TOutput>(response);
78
+ if (response.ok) {
79
+ return responseData;
80
+ }
31
81
 
32
- const debugLog = createDebugLogger(debug);
33
- const fetch = createDebugFetch({ originalFetch, debugLog });
82
+ const errorInfo = {
83
+ status: response.status,
84
+ statusText: response.statusText,
85
+ data: responseData,
86
+ };
34
87
 
35
- // Helper to build full URLs
36
- function buildUrl(
37
- path: string,
38
- searchParams?: Record<string, string>,
39
- ): string {
40
- // Check if this is a path that needs subdomain routing
41
- const pathSegments = path.split("/").filter(Boolean);
42
- let finalBaseUrl = baseUrl;
88
+ // Check for custom error handling first
89
+ if (customErrorHandler) {
90
+ const customError = customErrorHandler(errorInfo);
91
+ if (customError) {
92
+ // javascript may not respect customErrorHandler return type, so we need to throw a proper error if it's not an Error
93
+ if (customError instanceof Error) {
94
+ throw customError;
95
+ } else {
96
+ throw new Error(
97
+ `customErrorHandler returned a non-Error: ${JSON.stringify(customError)}`,
98
+ );
99
+ }
100
+ }
101
+ }
43
102
 
44
- if (pathSegments.length > 0 && SUBDOMAIN_PREFIXES.has(pathSegments[0])) {
45
- // Transform paths to use subdomain routing
46
- // /prefix/domain/path -> prefix.zapier.com/domain/path
47
- const subdomain = pathSegments[0];
48
- const baseUrlObj = new URL(baseUrl);
49
- baseUrlObj.hostname = `${subdomain}.${baseUrlObj.hostname}`;
50
- finalBaseUrl = baseUrlObj.toString();
103
+ // Parse the error response
104
+ const { message, errors } = this.parseErrorResponse(errorInfo);
105
+
106
+ const errorOptions = {
107
+ statusCode: response.status,
108
+ errors,
109
+ };
51
110
 
52
- // Remove the subdomain prefix from the path
53
- path = "/" + pathSegments.slice(1).join("/");
111
+ // Use appropriate error type based on status code
112
+ if (response.status === 404) {
113
+ throw new ZapierNotFoundError(message, errorOptions);
54
114
  }
55
115
 
56
- const url = new URL(path, finalBaseUrl);
57
- if (searchParams) {
58
- Object.entries(searchParams).forEach(([key, value]) => {
59
- url.searchParams.set(key, value);
60
- });
116
+ if (response.status === 401 || response.status === 403) {
117
+ // If we get a 401/403 error and no auth token was provided, give helpful message
118
+ if (wasMissingAuthToken) {
119
+ throw new ZapierAuthenticationError(
120
+ `Authentication required (HTTP ${response.status}). Please provide a token in options or set ZAPIER_TOKEN environment variable.`,
121
+ errorOptions,
122
+ );
123
+ }
124
+ throw new ZapierAuthenticationError(message, errorOptions);
61
125
  }
62
- return url.toString();
126
+
127
+ if (response.status === 400) {
128
+ throw new ZapierValidationError(message, errorOptions);
129
+ }
130
+
131
+ // Generic API error for other status codes
132
+ throw new ZapierApiError(message, errorOptions);
63
133
  }
64
134
 
65
- // Helper to build headers
66
- async function buildHeaders(
67
- options: RequestOptions = {},
68
- ): Promise<Record<string, string>> {
69
- const headers: Record<string, string> = {
70
- ...options.headers,
71
- };
135
+ private hasErrorArray<TOutput = unknown>(
136
+ data: TOutput | string,
137
+ ): data is { errors: unknown[] } & Exclude<TOutput, string> {
138
+ return (
139
+ typeof data === "object" &&
140
+ data !== null &&
141
+ "errors" in data &&
142
+ Array.isArray(data.errors)
143
+ );
144
+ }
72
145
 
73
- // Add auth header if token provided and not explicitly disabled
74
- if (options.authRequired !== false) {
75
- let resolvedToken = token;
146
+ // Helper to check if data has API errors
147
+ private isApiErrorArray(dataArray: unknown[]): dataArray is ApiError[] {
148
+ const data = dataArray[0];
149
+ return (
150
+ typeof data === "object" &&
151
+ data !== null &&
152
+ "message" in data &&
153
+ "code" in data &&
154
+ "title" in data &&
155
+ "detail" in data
156
+ );
157
+ }
76
158
 
77
- // Token resolution precedence: explicit token > getToken() > env/config fallback
78
- if (!resolvedToken && getToken) {
79
- resolvedToken = await getToken();
159
+ // Do our best to extract an error message from the response data
160
+ private extractErrorMessage<TOutput = unknown>(
161
+ data: TOutput | string,
162
+ ): string | undefined {
163
+ if (typeof data === "string") {
164
+ return data;
165
+ }
166
+ if (typeof data === "object" && data !== null) {
167
+ if ("message" in data && typeof data.message === "string") {
168
+ return data.message;
80
169
  }
81
-
82
- if (!resolvedToken) {
83
- resolvedToken = await getTokenFromEnvOrConfig({
84
- onEvent,
85
- fetch: originalFetch,
86
- });
170
+ if ("error" in data) {
171
+ if (typeof data.error === "string") {
172
+ return data.error;
173
+ }
174
+ if (typeof data.error === "object" && data.error !== null) {
175
+ if (
176
+ "message" in data.error &&
177
+ typeof data.error.message === "string"
178
+ ) {
179
+ return data.error.message;
180
+ }
181
+ }
182
+ try {
183
+ return JSON.stringify(data.error);
184
+ } catch {
185
+ /* defend against circular objects, even though they shouldn't be coming back from the wire */
186
+ }
87
187
  }
88
-
89
- if (resolvedToken) {
90
- headers.Authorization = getAuthorizationHeader(resolvedToken);
188
+ if ("errors" in data && Array.isArray(data.errors)) {
189
+ if (this.isApiErrorArray(data.errors)) {
190
+ return data.errors[0].detail || data.errors[0].title;
191
+ }
91
192
  }
92
193
  }
93
-
94
- return headers;
194
+ return undefined;
95
195
  }
96
196
 
97
- // Helper to handle responses
98
- async function handleResponse(
99
- response: Response,
100
- customErrorHandler?: (response: Response) => Error | undefined,
101
- hadAuthToken?: boolean,
102
- ): Promise<any> {
103
- if (!response.ok) {
104
- // Check for custom error handling first
105
- if (customErrorHandler) {
106
- const customError = customErrorHandler(response);
107
- if (customError) {
108
- throw customError;
109
- }
197
+ // Helper to parse API error response
198
+ private parseErrorResponse<TOutput = unknown>(errorInfo: {
199
+ status: number;
200
+ statusText: string;
201
+ data: TOutput | string;
202
+ }): { message: string; errors?: ApiError[] } {
203
+ // If we can't parse data, use status text
204
+ const fallbackMessage = `HTTP ${errorInfo.status}: ${errorInfo.statusText}`;
205
+ try {
206
+ // Check if the response has the standard error format
207
+ if (typeof errorInfo.data === "string") {
208
+ return { message: `${fallbackMessage}: ${errorInfo.data}` };
110
209
  }
111
210
 
112
- // If we get a 4xx error and no auth token was provided, give helpful message
113
- if (response.status >= 400 && response.status < 500 && !hadAuthToken) {
114
- throw new Error(
115
- `Authentication required (HTTP ${response.status}). Please provide a token in options or set ZAPIER_TOKEN environment variable.`,
116
- );
211
+ const errorMessage =
212
+ this.extractErrorMessage(errorInfo.data) || fallbackMessage;
213
+
214
+ if (this.hasErrorArray(errorInfo.data)) {
215
+ if (this.isApiErrorArray(errorInfo.data.errors)) {
216
+ return {
217
+ message: errorMessage,
218
+ errors: errorInfo.data.errors,
219
+ };
220
+ } else {
221
+ return {
222
+ message: errorMessage,
223
+ errors: errorInfo.data.errors.map((e) => ({
224
+ status: errorInfo.status,
225
+ code: String(errorInfo.status),
226
+ title: errorInfo.statusText,
227
+ detail: JSON.stringify(e),
228
+ })),
229
+ };
230
+ }
117
231
  }
118
232
 
119
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
120
- }
121
-
122
- // Try to parse JSON, fall back to text if that fails
123
- try {
124
- return await response.json();
233
+ return { message: errorMessage };
125
234
  } catch {
126
- return await response.text();
235
+ return { message: fallbackMessage };
127
236
  }
128
237
  }
129
238
 
130
- // Plain fetch method that matches the standard fetch signature
131
- async function plainFetch(
132
- input: string | URL,
133
- init?: RequestInit & {
134
- searchParams?: Record<string, string>;
135
- authRequired?: boolean;
136
- customErrorHandler?: (response: Response) => Error | undefined;
137
- },
138
- ): Promise<Response> {
139
- const url =
140
- typeof input === "string" && !input.startsWith("http")
141
- ? buildUrl(input, init?.searchParams)
142
- : input.toString();
143
-
144
- const headers = await buildHeaders(init as RequestOptions);
145
-
146
- // Merge headers from init with our built headers
147
- const finalHeaders = {
148
- ...headers,
149
- ...(init?.headers
150
- ? init.headers instanceof Headers
151
- ? Object.fromEntries(init.headers.entries())
152
- : (init.headers as Record<string, string>)
153
- : {}),
239
+ // Check if this is a path that needs subdomain routing
240
+ // e.g. /relay/workflows -> relay.zapier.com/workflows
241
+ private applySubdomainBehavior(path: string): {
242
+ url: URL;
243
+ subdomainConfig?: SubdomainConfig;
244
+ } {
245
+ const pathSegments = path.split("/").filter(Boolean);
246
+
247
+ if (pathSegments.length > 0 && pathSegments[0] in SubdomainConfigMap) {
248
+ // Transform paths to use subdomain routing
249
+ // /prefix/domain/path -> prefix.zapier.com/domain/path
250
+ const domainPrefix = pathSegments[0] as keyof typeof SubdomainConfigMap;
251
+ const subdomainConfig = SubdomainConfigMap[domainPrefix];
252
+ const originalBaseUrl = new URL(this.options.baseUrl);
253
+ const finalBaseUrl = `https://${domainPrefix}.${originalBaseUrl.hostname}`;
254
+ const pathWithoutPrefix = "/" + pathSegments.slice(1).join("/");
255
+ return { url: new URL(pathWithoutPrefix, finalBaseUrl), subdomainConfig };
256
+ }
257
+
258
+ return {
259
+ url: new URL(path, this.options.baseUrl),
260
+ subdomainConfig: undefined,
154
261
  };
262
+ }
155
263
 
156
- return await fetch(url, {
157
- ...init,
158
- headers: finalHeaders,
159
- });
264
+ // Helper to build full URLs and return routing info
265
+ private buildUrl(
266
+ path: string,
267
+ searchParams?: Record<string, string>,
268
+ ): {
269
+ url: string;
270
+ subdomainConfig?: SubdomainConfig;
271
+ } {
272
+ const { url, subdomainConfig } = this.applySubdomainBehavior(path);
273
+ if (searchParams) {
274
+ Object.entries(searchParams).forEach(([key, value]) => {
275
+ url.searchParams.set(key, value);
276
+ });
277
+ }
278
+ return { url: url.toString(), subdomainConfig };
279
+ }
280
+
281
+ // Helper to build headers
282
+ private async buildHeaders(
283
+ options: RequestOptions = {},
284
+ subdomainConfig?: (typeof SubdomainConfigMap)[keyof typeof SubdomainConfigMap],
285
+ ): Promise<Headers> {
286
+ const headers = new Headers(options.headers ?? {});
287
+
288
+ // Even if auth is not required, we still want to add it in case it adds
289
+ // useful context to the API. The session is a good example of this. Auth
290
+ // is not required, but if we don't add auth, then we won't get the user's
291
+ // session!
292
+ const authToken = await this.getAuthToken();
293
+
294
+ if (authToken) {
295
+ const authHeaderName = subdomainConfig?.authHeader || "Authorization";
296
+ headers.set(authHeaderName, getAuthorizationHeader(authToken));
297
+ }
298
+
299
+ // If we know auth is required, and we don't have a token, throw an error
300
+ // before we even make a request.
301
+ if (options.authRequired) {
302
+ if (headers.get("Authorization") == null && authToken == null) {
303
+ throw new ZapierAuthenticationError(
304
+ `Authentication required but no token available. Please set ZAPIER_TOKEN, or run the 'login' command with the CLI.`,
305
+ );
306
+ }
307
+ }
308
+
309
+ return headers;
160
310
  }
161
311
 
162
312
  // Helper to perform HTTP requests with JSON handling
163
- async function fetchJson(
313
+ private async fetchJson<TOutput = unknown>(
164
314
  method: string,
165
315
  path: string,
166
- data?: any,
316
+ data?: TOutput,
167
317
  options: RequestOptions = {},
168
- ): Promise<any> {
318
+ ): Promise<TOutput> {
169
319
  const headers = { ...options.headers };
170
320
 
171
321
  // Add Content-Type for JSON requests with body data
@@ -173,70 +323,156 @@ export function createZapierApi(options: ApiClientOptions): ApiClient {
173
323
  headers["Content-Type"] = "application/json";
174
324
  }
175
325
 
176
- const response = await plainFetch(path, {
326
+ // Check if we have an auth token available
327
+ const wasMissingAuthToken =
328
+ options.authRequired && (await this.getAuthToken()) == null;
329
+
330
+ const response = await this.plainFetch(path, {
331
+ ...options,
177
332
  method,
178
- body: data ? JSON.stringify(data) : undefined,
333
+ body: data != null ? JSON.stringify(data) : undefined,
179
334
  headers,
180
- searchParams: options.searchParams,
181
- authRequired: options.authRequired,
335
+ });
336
+
337
+ // plainFetch already handled all auth and headers
338
+ const result = await this.handleResponse<TOutput>({
339
+ response,
182
340
  customErrorHandler: options.customErrorHandler,
341
+ wasMissingAuthToken,
183
342
  });
184
343
 
185
- const hadAuthToken = !!(await buildHeaders(options)).Authorization;
186
- return handleResponse(response, options.customErrorHandler, hadAuthToken);
344
+ if (typeof result === "string") {
345
+ throw new ZapierValidationError(
346
+ `Response could not be parsed as JSON: ${result}`,
347
+ );
348
+ }
349
+
350
+ return result;
187
351
  }
188
352
 
189
- return {
190
- async get(path: string, options: RequestOptions = {}): Promise<any> {
191
- return fetchJson("GET", path, undefined, options);
353
+ // Plain fetch method for API paths (must start with /)
354
+ private async plainFetch(
355
+ path: string,
356
+ fetchOptions?: RequestInit & {
357
+ searchParams?: Record<string, string>;
358
+ authRequired?: boolean;
192
359
  },
360
+ ): Promise<Response> {
361
+ if (!path.startsWith("/")) {
362
+ throw new ZapierValidationError(
363
+ `plainFetch expects a path starting with '/', got: ${path}`,
364
+ );
365
+ }
193
366
 
194
- async post(
195
- path: string,
196
- data?: any,
197
- options: RequestOptions = {},
198
- ): Promise<any> {
199
- return fetchJson("POST", path, data, options);
200
- },
367
+ if (fetchOptions?.body && typeof fetchOptions.body === "object") {
368
+ fetchOptions.body = JSON.stringify(fetchOptions.body);
369
+ }
201
370
 
202
- async put(
203
- path: string,
204
- data?: any,
205
- options: RequestOptions = {},
206
- ): Promise<any> {
207
- return fetchJson("PUT", path, data, options);
208
- },
371
+ const { url, subdomainConfig } = this.buildUrl(
372
+ path,
373
+ fetchOptions?.searchParams,
374
+ );
209
375
 
210
- async delete(path: string, options: RequestOptions = {}): Promise<any> {
211
- return fetchJson("DELETE", path, undefined, options);
212
- },
376
+ const builtHeaders = await this.buildHeaders(
377
+ fetchOptions as RequestOptions,
378
+ subdomainConfig,
379
+ );
380
+ const inputHeaders = new Headers(fetchOptions?.headers ?? {});
213
381
 
214
- async poll(path: string, options: PollOptions = {}): Promise<any> {
215
- const url = buildUrl(path, options.searchParams);
216
- const headers = await buildHeaders(options);
217
-
218
- return pollUntilComplete({
219
- fetch,
220
- url,
221
- headers,
222
- maxAttempts: options.maxAttempts,
223
- initialDelay: options.initialDelay,
224
- maxDelay: options.maxDelay,
225
- successStatus: options.successStatus,
226
- pendingStatus: options.pendingStatus,
227
- resultExtractor: options.resultExtractor,
228
- });
229
- },
382
+ const mergedHeaders = new Headers();
383
+ builtHeaders.forEach((value, key) => {
384
+ mergedHeaders.set(key, value);
385
+ });
386
+ inputHeaders.forEach((value, key) => {
387
+ mergedHeaders.set(key, value);
388
+ });
389
+
390
+ return await this.options.fetch(url, {
391
+ ...fetchOptions,
392
+ headers: mergedHeaders,
393
+ });
394
+ }
230
395
 
231
- async fetch(
232
- input: string | URL,
233
- init?: RequestInit & {
234
- searchParams?: Record<string, string>;
235
- authRequired?: boolean;
236
- customErrorHandler?: (response: Response) => Error | undefined;
237
- },
238
- ): Promise<Response> {
239
- return plainFetch(input, init);
396
+ public fetch = async (
397
+ path: string,
398
+ init?: RequestInit & {
399
+ searchParams?: Record<string, string>;
400
+ authRequired?: boolean;
240
401
  },
402
+ ): Promise<Response> => {
403
+ return this.plainFetch(path, init);
404
+ };
405
+
406
+ public get = async <TOutput = unknown>(
407
+ path: string,
408
+ options: RequestOptions = {},
409
+ ): Promise<TOutput> => {
410
+ return this.fetchJson<TOutput>("GET", path, undefined, options);
411
+ };
412
+
413
+ public post = async <TOutput = unknown>(
414
+ path: string,
415
+ data?: TOutput,
416
+ options: RequestOptions = {},
417
+ ): Promise<TOutput> => {
418
+ return this.fetchJson<TOutput>("POST", path, data, options);
419
+ };
420
+
421
+ public put = async <TOutput = unknown>(
422
+ path: string,
423
+ data?: TOutput,
424
+ options: RequestOptions = {},
425
+ ): Promise<TOutput> => {
426
+ return this.fetchJson<TOutput>("PUT", path, data, options);
427
+ };
428
+
429
+ public delete = async <TOutput = unknown>(
430
+ path: string,
431
+ options: RequestOptions = {},
432
+ ): Promise<TOutput> => {
433
+ return this.fetchJson<TOutput>("DELETE", path, undefined, options);
434
+ };
435
+
436
+ public poll = async <TOutput = unknown>(
437
+ path: string,
438
+ options: PollOptions = {},
439
+ ): Promise<TOutput> => {
440
+ return pollUntilComplete({
441
+ fetchPoll: () =>
442
+ this.plainFetch(path, {
443
+ method: "GET",
444
+ searchParams: options.searchParams,
445
+ authRequired: options.authRequired,
446
+ }),
447
+ maxAttempts: options.maxAttempts,
448
+ initialDelay: options.initialDelay,
449
+ maxDelay: options.maxDelay,
450
+ successStatus: options.successStatus,
451
+ pendingStatus: options.pendingStatus,
452
+ resultExtractor: options.resultExtractor,
453
+ });
241
454
  };
242
455
  }
456
+
457
+ export const createZapierApi = (options: ApiClientOptions): ApiClient => {
458
+ const {
459
+ baseUrl,
460
+ token,
461
+ getToken,
462
+ debug = false,
463
+ fetch: originalFetch = globalThis.fetch,
464
+ onEvent,
465
+ } = options;
466
+
467
+ const debugLog = createDebugLogger(debug);
468
+ const debugFetch = createDebugFetch({ originalFetch, debugLog });
469
+
470
+ return new ZapierApiClient({
471
+ baseUrl,
472
+ token,
473
+ getToken,
474
+ debug,
475
+ fetch: debugFetch,
476
+ onEvent,
477
+ });
478
+ };