@hasna/connectors 0.4.0 → 0.4.2

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 (390) hide show
  1. package/bin/index.js +189 -2
  2. package/bin/mcp.js +176 -1
  3. package/bin/serve.js +175 -0
  4. package/connectors/connect-airtable/.env.example +11 -0
  5. package/connectors/connect-airtable/CLAUDE.md +121 -0
  6. package/connectors/connect-airtable/README.md +193 -0
  7. package/connectors/connect-airtable/package.json +50 -0
  8. package/connectors/connect-airtable/src/api/client.ts +139 -0
  9. package/connectors/connect-airtable/src/api/index.ts +405 -0
  10. package/connectors/connect-airtable/src/cli/index.ts +637 -0
  11. package/connectors/connect-airtable/src/index.ts +20 -0
  12. package/connectors/connect-airtable/src/types/index.ts +349 -0
  13. package/connectors/connect-airtable/src/utils/config.ts +197 -0
  14. package/connectors/connect-airtable/tsconfig.json +16 -0
  15. package/connectors/connect-amplitude/.env.example +11 -0
  16. package/connectors/connect-amplitude/CLAUDE.md +121 -0
  17. package/connectors/connect-amplitude/README.md +193 -0
  18. package/connectors/connect-amplitude/package.json +51 -0
  19. package/connectors/connect-amplitude/src/api/client.ts +144 -0
  20. package/connectors/connect-amplitude/src/api/index.ts +215 -0
  21. package/connectors/connect-amplitude/src/cli/index.ts +532 -0
  22. package/connectors/connect-amplitude/src/index.ts +22 -0
  23. package/connectors/connect-amplitude/src/types/index.ts +329 -0
  24. package/connectors/connect-amplitude/src/utils/config.ts +208 -0
  25. package/connectors/connect-amplitude/tsconfig.json +16 -0
  26. package/connectors/connect-calendly/.env.example +11 -0
  27. package/connectors/connect-calendly/CLAUDE.md +272 -0
  28. package/connectors/connect-calendly/README.md +193 -0
  29. package/connectors/connect-calendly/package.json +51 -0
  30. package/connectors/connect-calendly/scripts/release.ts +179 -0
  31. package/connectors/connect-calendly/src/api/client.ts +213 -0
  32. package/connectors/connect-calendly/src/api/example.ts +48 -0
  33. package/connectors/connect-calendly/src/api/index.ts +51 -0
  34. package/connectors/connect-calendly/src/cli/index.ts +254 -0
  35. package/connectors/connect-calendly/src/index.ts +103 -0
  36. package/connectors/connect-calendly/src/types/index.ts +237 -0
  37. package/connectors/connect-calendly/src/utils/auth.ts +274 -0
  38. package/connectors/connect-calendly/src/utils/bulk.ts +212 -0
  39. package/connectors/connect-calendly/src/utils/config.ts +326 -0
  40. package/connectors/connect-calendly/src/utils/output.ts +175 -0
  41. package/connectors/connect-calendly/src/utils/settings.ts +114 -0
  42. package/connectors/connect-calendly/src/utils/storage.ts +198 -0
  43. package/connectors/connect-calendly/tsconfig.json +16 -0
  44. package/connectors/connect-convertkit/.env.example +11 -0
  45. package/connectors/connect-convertkit/CLAUDE.md +272 -0
  46. package/connectors/connect-convertkit/README.md +193 -0
  47. package/connectors/connect-convertkit/package.json +51 -0
  48. package/connectors/connect-convertkit/scripts/release.ts +179 -0
  49. package/connectors/connect-convertkit/src/api/client.ts +213 -0
  50. package/connectors/connect-convertkit/src/api/example.ts +48 -0
  51. package/connectors/connect-convertkit/src/api/index.ts +51 -0
  52. package/connectors/connect-convertkit/src/cli/index.ts +254 -0
  53. package/connectors/connect-convertkit/src/index.ts +103 -0
  54. package/connectors/connect-convertkit/src/types/index.ts +237 -0
  55. package/connectors/connect-convertkit/src/utils/auth.ts +274 -0
  56. package/connectors/connect-convertkit/src/utils/bulk.ts +212 -0
  57. package/connectors/connect-convertkit/src/utils/config.ts +326 -0
  58. package/connectors/connect-convertkit/src/utils/output.ts +175 -0
  59. package/connectors/connect-convertkit/src/utils/settings.ts +114 -0
  60. package/connectors/connect-convertkit/src/utils/storage.ts +198 -0
  61. package/connectors/connect-convertkit/tsconfig.json +16 -0
  62. package/connectors/connect-crisp/.env.example +11 -0
  63. package/connectors/connect-crisp/CLAUDE.md +272 -0
  64. package/connectors/connect-crisp/README.md +193 -0
  65. package/connectors/connect-crisp/package.json +51 -0
  66. package/connectors/connect-crisp/scripts/release.ts +179 -0
  67. package/connectors/connect-crisp/src/api/client.ts +213 -0
  68. package/connectors/connect-crisp/src/api/example.ts +48 -0
  69. package/connectors/connect-crisp/src/api/index.ts +51 -0
  70. package/connectors/connect-crisp/src/cli/index.ts +254 -0
  71. package/connectors/connect-crisp/src/index.ts +103 -0
  72. package/connectors/connect-crisp/src/types/index.ts +237 -0
  73. package/connectors/connect-crisp/src/utils/auth.ts +274 -0
  74. package/connectors/connect-crisp/src/utils/bulk.ts +212 -0
  75. package/connectors/connect-crisp/src/utils/config.ts +326 -0
  76. package/connectors/connect-crisp/src/utils/output.ts +175 -0
  77. package/connectors/connect-crisp/src/utils/settings.ts +114 -0
  78. package/connectors/connect-crisp/src/utils/storage.ts +198 -0
  79. package/connectors/connect-crisp/tsconfig.json +16 -0
  80. package/connectors/connect-docusign/.env.example +11 -0
  81. package/connectors/connect-docusign/CLAUDE.md +128 -0
  82. package/connectors/connect-docusign/README.md +193 -0
  83. package/connectors/connect-docusign/package.json +52 -0
  84. package/connectors/connect-docusign/src/api/client.ts +133 -0
  85. package/connectors/connect-docusign/src/api/index.ts +178 -0
  86. package/connectors/connect-docusign/src/cli/index.ts +381 -0
  87. package/connectors/connect-docusign/src/index.ts +23 -0
  88. package/connectors/connect-docusign/src/types/index.ts +208 -0
  89. package/connectors/connect-docusign/src/utils/config.ts +125 -0
  90. package/connectors/connect-docusign/src/utils/output.ts +119 -0
  91. package/connectors/connect-docusign/tsconfig.json +16 -0
  92. package/connectors/connect-drift/.env.example +11 -0
  93. package/connectors/connect-drift/CLAUDE.md +272 -0
  94. package/connectors/connect-drift/README.md +193 -0
  95. package/connectors/connect-drift/package.json +51 -0
  96. package/connectors/connect-drift/scripts/release.ts +179 -0
  97. package/connectors/connect-drift/src/api/client.ts +213 -0
  98. package/connectors/connect-drift/src/api/example.ts +48 -0
  99. package/connectors/connect-drift/src/api/index.ts +51 -0
  100. package/connectors/connect-drift/src/cli/index.ts +254 -0
  101. package/connectors/connect-drift/src/index.ts +103 -0
  102. package/connectors/connect-drift/src/types/index.ts +237 -0
  103. package/connectors/connect-drift/src/utils/auth.ts +274 -0
  104. package/connectors/connect-drift/src/utils/bulk.ts +212 -0
  105. package/connectors/connect-drift/src/utils/config.ts +326 -0
  106. package/connectors/connect-drift/src/utils/output.ts +175 -0
  107. package/connectors/connect-drift/src/utils/settings.ts +114 -0
  108. package/connectors/connect-drift/src/utils/storage.ts +198 -0
  109. package/connectors/connect-drift/tsconfig.json +16 -0
  110. package/connectors/connect-freshdesk/.env.example +11 -0
  111. package/connectors/connect-freshdesk/CLAUDE.md +272 -0
  112. package/connectors/connect-freshdesk/README.md +193 -0
  113. package/connectors/connect-freshdesk/package.json +51 -0
  114. package/connectors/connect-freshdesk/scripts/release.ts +179 -0
  115. package/connectors/connect-freshdesk/src/api/client.ts +213 -0
  116. package/connectors/connect-freshdesk/src/api/example.ts +48 -0
  117. package/connectors/connect-freshdesk/src/api/index.ts +51 -0
  118. package/connectors/connect-freshdesk/src/cli/index.ts +254 -0
  119. package/connectors/connect-freshdesk/src/index.ts +103 -0
  120. package/connectors/connect-freshdesk/src/types/index.ts +237 -0
  121. package/connectors/connect-freshdesk/src/utils/auth.ts +274 -0
  122. package/connectors/connect-freshdesk/src/utils/bulk.ts +212 -0
  123. package/connectors/connect-freshdesk/src/utils/config.ts +326 -0
  124. package/connectors/connect-freshdesk/src/utils/output.ts +175 -0
  125. package/connectors/connect-freshdesk/src/utils/settings.ts +114 -0
  126. package/connectors/connect-freshdesk/src/utils/storage.ts +198 -0
  127. package/connectors/connect-freshdesk/tsconfig.json +16 -0
  128. package/connectors/connect-gumroad/.env.example +11 -0
  129. package/connectors/connect-gumroad/CLAUDE.md +272 -0
  130. package/connectors/connect-gumroad/README.md +193 -0
  131. package/connectors/connect-gumroad/package.json +51 -0
  132. package/connectors/connect-gumroad/scripts/release.ts +179 -0
  133. package/connectors/connect-gumroad/src/api/client.ts +213 -0
  134. package/connectors/connect-gumroad/src/api/example.ts +48 -0
  135. package/connectors/connect-gumroad/src/api/index.ts +51 -0
  136. package/connectors/connect-gumroad/src/cli/index.ts +254 -0
  137. package/connectors/connect-gumroad/src/index.ts +103 -0
  138. package/connectors/connect-gumroad/src/types/index.ts +237 -0
  139. package/connectors/connect-gumroad/src/utils/auth.ts +274 -0
  140. package/connectors/connect-gumroad/src/utils/bulk.ts +212 -0
  141. package/connectors/connect-gumroad/src/utils/config.ts +326 -0
  142. package/connectors/connect-gumroad/src/utils/output.ts +175 -0
  143. package/connectors/connect-gumroad/src/utils/settings.ts +114 -0
  144. package/connectors/connect-gumroad/src/utils/storage.ts +198 -0
  145. package/connectors/connect-gumroad/tsconfig.json +16 -0
  146. package/connectors/connect-hubspot/.env.example +11 -0
  147. package/connectors/connect-hubspot/CLAUDE.md +128 -0
  148. package/connectors/connect-hubspot/README.md +193 -0
  149. package/connectors/connect-hubspot/package.json +52 -0
  150. package/connectors/connect-hubspot/src/api/client.ts +136 -0
  151. package/connectors/connect-hubspot/src/api/index.ts +379 -0
  152. package/connectors/connect-hubspot/src/cli/index.ts +589 -0
  153. package/connectors/connect-hubspot/src/index.ts +21 -0
  154. package/connectors/connect-hubspot/src/types/index.ts +285 -0
  155. package/connectors/connect-hubspot/src/utils/config.ts +205 -0
  156. package/connectors/connect-hubspot/src/utils/output.ts +119 -0
  157. package/connectors/connect-hubspot/tsconfig.json +16 -0
  158. package/connectors/connect-intercom/.env.example +11 -0
  159. package/connectors/connect-intercom/CLAUDE.md +131 -0
  160. package/connectors/connect-intercom/README.md +193 -0
  161. package/connectors/connect-intercom/package.json +52 -0
  162. package/connectors/connect-intercom/src/api/client.ts +132 -0
  163. package/connectors/connect-intercom/src/api/index.ts +366 -0
  164. package/connectors/connect-intercom/src/cli/index.ts +831 -0
  165. package/connectors/connect-intercom/src/index.ts +21 -0
  166. package/connectors/connect-intercom/src/types/index.ts +650 -0
  167. package/connectors/connect-intercom/src/utils/config.ts +157 -0
  168. package/connectors/connect-intercom/src/utils/output.ts +119 -0
  169. package/connectors/connect-intercom/tsconfig.json +16 -0
  170. package/connectors/connect-lemonsqueezy/.env.example +11 -0
  171. package/connectors/connect-lemonsqueezy/CLAUDE.md +128 -0
  172. package/connectors/connect-lemonsqueezy/README.md +193 -0
  173. package/connectors/connect-lemonsqueezy/package.json +52 -0
  174. package/connectors/connect-lemonsqueezy/src/api/client.ts +133 -0
  175. package/connectors/connect-lemonsqueezy/src/api/index.ts +502 -0
  176. package/connectors/connect-lemonsqueezy/src/cli/index.ts +723 -0
  177. package/connectors/connect-lemonsqueezy/src/index.ts +21 -0
  178. package/connectors/connect-lemonsqueezy/src/types/index.ts +353 -0
  179. package/connectors/connect-lemonsqueezy/src/utils/config.ts +205 -0
  180. package/connectors/connect-lemonsqueezy/src/utils/output.ts +119 -0
  181. package/connectors/connect-lemonsqueezy/tsconfig.json +16 -0
  182. package/connectors/connect-linkedin/.env.example +11 -0
  183. package/connectors/connect-linkedin/CLAUDE.md +124 -0
  184. package/connectors/connect-linkedin/README.md +193 -0
  185. package/connectors/connect-linkedin/package.json +52 -0
  186. package/connectors/connect-linkedin/src/api/client.ts +132 -0
  187. package/connectors/connect-linkedin/src/api/index.ts +313 -0
  188. package/connectors/connect-linkedin/src/cli/index.ts +548 -0
  189. package/connectors/connect-linkedin/src/index.ts +21 -0
  190. package/connectors/connect-linkedin/src/types/index.ts +472 -0
  191. package/connectors/connect-linkedin/src/utils/config.ts +157 -0
  192. package/connectors/connect-linkedin/src/utils/output.ts +119 -0
  193. package/connectors/connect-linkedin/tsconfig.json +16 -0
  194. package/connectors/connect-mailchimp/.env.example +11 -0
  195. package/connectors/connect-mailchimp/CLAUDE.md +127 -0
  196. package/connectors/connect-mailchimp/README.md +193 -0
  197. package/connectors/connect-mailchimp/package.json +52 -0
  198. package/connectors/connect-mailchimp/src/api/client.ts +162 -0
  199. package/connectors/connect-mailchimp/src/api/index.ts +580 -0
  200. package/connectors/connect-mailchimp/src/cli/index.ts +822 -0
  201. package/connectors/connect-mailchimp/src/index.ts +23 -0
  202. package/connectors/connect-mailchimp/src/types/index.ts +585 -0
  203. package/connectors/connect-mailchimp/src/utils/config.ts +208 -0
  204. package/connectors/connect-mailchimp/src/utils/output.ts +119 -0
  205. package/connectors/connect-mailchimp/tsconfig.json +16 -0
  206. package/connectors/connect-mongodb/.env.example +11 -0
  207. package/connectors/connect-mongodb/CLAUDE.md +272 -0
  208. package/connectors/connect-mongodb/README.md +193 -0
  209. package/connectors/connect-mongodb/package.json +51 -0
  210. package/connectors/connect-mongodb/scripts/release.ts +179 -0
  211. package/connectors/connect-mongodb/src/api/client.ts +213 -0
  212. package/connectors/connect-mongodb/src/api/example.ts +48 -0
  213. package/connectors/connect-mongodb/src/api/index.ts +51 -0
  214. package/connectors/connect-mongodb/src/cli/index.ts +254 -0
  215. package/connectors/connect-mongodb/src/index.ts +103 -0
  216. package/connectors/connect-mongodb/src/types/index.ts +237 -0
  217. package/connectors/connect-mongodb/src/utils/auth.ts +274 -0
  218. package/connectors/connect-mongodb/src/utils/bulk.ts +212 -0
  219. package/connectors/connect-mongodb/src/utils/config.ts +326 -0
  220. package/connectors/connect-mongodb/src/utils/output.ts +175 -0
  221. package/connectors/connect-mongodb/src/utils/settings.ts +114 -0
  222. package/connectors/connect-mongodb/src/utils/storage.ts +198 -0
  223. package/connectors/connect-mongodb/tsconfig.json +16 -0
  224. package/connectors/connect-netlify/.env.example +11 -0
  225. package/connectors/connect-netlify/CLAUDE.md +170 -0
  226. package/connectors/connect-netlify/README.md +193 -0
  227. package/connectors/connect-netlify/package.json +53 -0
  228. package/connectors/connect-netlify/src/api/client.ts +132 -0
  229. package/connectors/connect-netlify/src/api/index.ts +533 -0
  230. package/connectors/connect-netlify/src/cli/index.ts +985 -0
  231. package/connectors/connect-netlify/src/index.ts +22 -0
  232. package/connectors/connect-netlify/src/types/index.ts +423 -0
  233. package/connectors/connect-netlify/src/utils/config.ts +171 -0
  234. package/connectors/connect-netlify/src/utils/output.ts +119 -0
  235. package/connectors/connect-netlify/tsconfig.json +16 -0
  236. package/connectors/connect-paypal/.env.example +11 -0
  237. package/connectors/connect-paypal/CLAUDE.md +128 -0
  238. package/connectors/connect-paypal/README.md +193 -0
  239. package/connectors/connect-paypal/package.json +51 -0
  240. package/connectors/connect-paypal/src/api/client.ts +182 -0
  241. package/connectors/connect-paypal/src/api/index.ts +235 -0
  242. package/connectors/connect-paypal/src/cli/index.ts +559 -0
  243. package/connectors/connect-paypal/src/index.ts +23 -0
  244. package/connectors/connect-paypal/src/types/index.ts +377 -0
  245. package/connectors/connect-paypal/src/utils/config.ts +125 -0
  246. package/connectors/connect-paypal/src/utils/output.ts +119 -0
  247. package/connectors/connect-paypal/tsconfig.json +16 -0
  248. package/connectors/connect-pinterest/.env.example +11 -0
  249. package/connectors/connect-pinterest/CLAUDE.md +115 -0
  250. package/connectors/connect-pinterest/README.md +193 -0
  251. package/connectors/connect-pinterest/package.json +52 -0
  252. package/connectors/connect-pinterest/src/api/client.ts +125 -0
  253. package/connectors/connect-pinterest/src/api/index.ts +203 -0
  254. package/connectors/connect-pinterest/src/cli/index.ts +653 -0
  255. package/connectors/connect-pinterest/src/index.ts +21 -0
  256. package/connectors/connect-pinterest/src/types/index.ts +268 -0
  257. package/connectors/connect-pinterest/src/utils/config.ts +157 -0
  258. package/connectors/connect-pinterest/src/utils/output.ts +119 -0
  259. package/connectors/connect-pinterest/tsconfig.json +16 -0
  260. package/connectors/connect-posthog/.env.example +11 -0
  261. package/connectors/connect-posthog/CLAUDE.md +272 -0
  262. package/connectors/connect-posthog/README.md +193 -0
  263. package/connectors/connect-posthog/package.json +51 -0
  264. package/connectors/connect-posthog/scripts/release.ts +179 -0
  265. package/connectors/connect-posthog/src/api/client.ts +213 -0
  266. package/connectors/connect-posthog/src/api/example.ts +48 -0
  267. package/connectors/connect-posthog/src/api/index.ts +51 -0
  268. package/connectors/connect-posthog/src/cli/index.ts +254 -0
  269. package/connectors/connect-posthog/src/index.ts +103 -0
  270. package/connectors/connect-posthog/src/types/index.ts +237 -0
  271. package/connectors/connect-posthog/src/utils/auth.ts +274 -0
  272. package/connectors/connect-posthog/src/utils/bulk.ts +212 -0
  273. package/connectors/connect-posthog/src/utils/config.ts +326 -0
  274. package/connectors/connect-posthog/src/utils/output.ts +175 -0
  275. package/connectors/connect-posthog/src/utils/settings.ts +114 -0
  276. package/connectors/connect-posthog/src/utils/storage.ts +198 -0
  277. package/connectors/connect-posthog/tsconfig.json +16 -0
  278. package/connectors/connect-salesforce/.env.example +11 -0
  279. package/connectors/connect-salesforce/CLAUDE.md +128 -0
  280. package/connectors/connect-salesforce/README.md +193 -0
  281. package/connectors/connect-salesforce/package.json +53 -0
  282. package/connectors/connect-salesforce/src/api/client.ts +150 -0
  283. package/connectors/connect-salesforce/src/api/index.ts +367 -0
  284. package/connectors/connect-salesforce/src/cli/index.ts +594 -0
  285. package/connectors/connect-salesforce/src/index.ts +21 -0
  286. package/connectors/connect-salesforce/src/types/index.ts +292 -0
  287. package/connectors/connect-salesforce/src/utils/config.ts +208 -0
  288. package/connectors/connect-salesforce/src/utils/output.ts +119 -0
  289. package/connectors/connect-salesforce/tsconfig.json +16 -0
  290. package/connectors/connect-segment/.env.example +11 -0
  291. package/connectors/connect-segment/CLAUDE.md +272 -0
  292. package/connectors/connect-segment/README.md +193 -0
  293. package/connectors/connect-segment/package.json +51 -0
  294. package/connectors/connect-segment/scripts/release.ts +179 -0
  295. package/connectors/connect-segment/src/api/client.ts +213 -0
  296. package/connectors/connect-segment/src/api/example.ts +48 -0
  297. package/connectors/connect-segment/src/api/index.ts +51 -0
  298. package/connectors/connect-segment/src/cli/index.ts +254 -0
  299. package/connectors/connect-segment/src/index.ts +103 -0
  300. package/connectors/connect-segment/src/types/index.ts +237 -0
  301. package/connectors/connect-segment/src/utils/auth.ts +274 -0
  302. package/connectors/connect-segment/src/utils/bulk.ts +212 -0
  303. package/connectors/connect-segment/src/utils/config.ts +326 -0
  304. package/connectors/connect-segment/src/utils/output.ts +175 -0
  305. package/connectors/connect-segment/src/utils/settings.ts +114 -0
  306. package/connectors/connect-segment/src/utils/storage.ts +198 -0
  307. package/connectors/connect-segment/tsconfig.json +16 -0
  308. package/connectors/connect-sendgrid/.env.example +11 -0
  309. package/connectors/connect-sendgrid/CLAUDE.md +125 -0
  310. package/connectors/connect-sendgrid/README.md +193 -0
  311. package/connectors/connect-sendgrid/package.json +53 -0
  312. package/connectors/connect-sendgrid/src/api/client.ts +137 -0
  313. package/connectors/connect-sendgrid/src/api/index.ts +588 -0
  314. package/connectors/connect-sendgrid/src/cli/index.ts +764 -0
  315. package/connectors/connect-sendgrid/src/index.ts +21 -0
  316. package/connectors/connect-sendgrid/src/types/index.ts +403 -0
  317. package/connectors/connect-sendgrid/src/utils/config.ts +197 -0
  318. package/connectors/connect-sendgrid/src/utils/output.ts +119 -0
  319. package/connectors/connect-sendgrid/tsconfig.json +16 -0
  320. package/connectors/connect-supabase/.env.example +11 -0
  321. package/connectors/connect-supabase/CLAUDE.md +132 -0
  322. package/connectors/connect-supabase/README.md +193 -0
  323. package/connectors/connect-supabase/package.json +52 -0
  324. package/connectors/connect-supabase/src/api/client.ts +231 -0
  325. package/connectors/connect-supabase/src/api/index.ts +439 -0
  326. package/connectors/connect-supabase/src/cli/index.ts +691 -0
  327. package/connectors/connect-supabase/src/index.ts +24 -0
  328. package/connectors/connect-supabase/src/types/index.ts +215 -0
  329. package/connectors/connect-supabase/src/utils/config.ts +219 -0
  330. package/connectors/connect-supabase/tsconfig.json +16 -0
  331. package/connectors/connect-vercel/.env.example +11 -0
  332. package/connectors/connect-vercel/CLAUDE.md +142 -0
  333. package/connectors/connect-vercel/README.md +193 -0
  334. package/connectors/connect-vercel/package.json +52 -0
  335. package/connectors/connect-vercel/src/api/client.ts +139 -0
  336. package/connectors/connect-vercel/src/api/index.ts +384 -0
  337. package/connectors/connect-vercel/src/cli/index.ts +740 -0
  338. package/connectors/connect-vercel/src/index.ts +24 -0
  339. package/connectors/connect-vercel/src/types/index.ts +350 -0
  340. package/connectors/connect-vercel/src/utils/config.ts +182 -0
  341. package/connectors/connect-vercel/src/utils/output.ts +119 -0
  342. package/connectors/connect-vercel/tsconfig.json +16 -0
  343. package/connectors/connect-zendesk/.env.example +10 -0
  344. package/connectors/connect-zendesk/.github/workflows/deploy.yml +51 -0
  345. package/connectors/connect-zendesk/CLAUDE.md +78 -0
  346. package/connectors/connect-zendesk/Makefile +129 -0
  347. package/connectors/connect-zendesk/README.md +295 -0
  348. package/connectors/connect-zendesk/SCAFFOLD.md +178 -0
  349. package/connectors/connect-zendesk/nginx-connector.conf +218 -0
  350. package/connectors/connect-zendesk/nginx.conf +61 -0
  351. package/connectors/connect-zendesk/package.json +71 -0
  352. package/connectors/connect-zendesk/scripts/init.sh +62 -0
  353. package/connectors/connect-zendesk/scripts/publish.ts +210 -0
  354. package/connectors/connect-zendesk/server/index.js +142 -0
  355. package/connectors/connect-zendesk/src/api/automations.ts +95 -0
  356. package/connectors/connect-zendesk/src/api/brands.ts +80 -0
  357. package/connectors/connect-zendesk/src/api/bulk.ts +838 -0
  358. package/connectors/connect-zendesk/src/api/client.test.ts +315 -0
  359. package/connectors/connect-zendesk/src/api/client.ts +173 -0
  360. package/connectors/connect-zendesk/src/api/example.ts +59 -0
  361. package/connectors/connect-zendesk/src/api/groups.ts +60 -0
  362. package/connectors/connect-zendesk/src/api/index.test.ts +111 -0
  363. package/connectors/connect-zendesk/src/api/index.ts +131 -0
  364. package/connectors/connect-zendesk/src/api/macros.ts +124 -0
  365. package/connectors/connect-zendesk/src/api/organizations.ts +85 -0
  366. package/connectors/connect-zendesk/src/api/slas.ts +80 -0
  367. package/connectors/connect-zendesk/src/api/ticket-fields.ts +98 -0
  368. package/connectors/connect-zendesk/src/api/tickets.test.ts +215 -0
  369. package/connectors/connect-zendesk/src/api/tickets.ts +103 -0
  370. package/connectors/connect-zendesk/src/api/triggers.test.ts +204 -0
  371. package/connectors/connect-zendesk/src/api/triggers.ts +125 -0
  372. package/connectors/connect-zendesk/src/api/users.test.ts +180 -0
  373. package/connectors/connect-zendesk/src/api/users.ts +108 -0
  374. package/connectors/connect-zendesk/src/api/views.test.ts +223 -0
  375. package/connectors/connect-zendesk/src/api/views.ts +145 -0
  376. package/connectors/connect-zendesk/src/api/webhooks.test.ts +208 -0
  377. package/connectors/connect-zendesk/src/api/webhooks.ts +118 -0
  378. package/connectors/connect-zendesk/src/cli/index.ts +1478 -0
  379. package/connectors/connect-zendesk/src/index.ts +36 -0
  380. package/connectors/connect-zendesk/src/server/index.ts +204 -0
  381. package/connectors/connect-zendesk/src/types/index.ts +910 -0
  382. package/connectors/connect-zendesk/src/utils/config.test.ts +193 -0
  383. package/connectors/connect-zendesk/src/utils/config.ts +526 -0
  384. package/connectors/connect-zendesk/src/utils/export.ts +338 -0
  385. package/connectors/connect-zendesk/src/utils/logger.ts +105 -0
  386. package/connectors/connect-zendesk/src/utils/output.test.ts +137 -0
  387. package/connectors/connect-zendesk/src/utils/output.ts +119 -0
  388. package/connectors/connect-zendesk/tsconfig.json +31 -0
  389. package/dist/index.js +175 -0
  390. package/package.json +1 -1
@@ -0,0 +1,231 @@
1
+ import type { SupabaseConfig, OutputFormat, SupabaseErrorResponse } from '../types';
2
+ import { SupabaseApiError } from '../types';
3
+
4
+ export interface RequestOptions {
5
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
6
+ params?: Record<string, string | number | boolean | undefined>;
7
+ body?: Record<string, unknown> | unknown[] | string | ArrayBuffer;
8
+ headers?: Record<string, string>;
9
+ format?: OutputFormat;
10
+ apiType?: 'rest' | 'auth' | 'storage' | 'functions';
11
+ }
12
+
13
+ export class SupabaseClient {
14
+ private readonly projectUrl: string;
15
+ private readonly serviceRoleKey?: string;
16
+ private readonly anonKey?: string;
17
+
18
+ constructor(config: SupabaseConfig) {
19
+ if (!config.projectUrl) {
20
+ throw new Error('Project URL is required');
21
+ }
22
+ if (!config.serviceRoleKey && !config.anonKey) {
23
+ throw new Error('Service role key or anon key is required');
24
+ }
25
+ this.projectUrl = config.projectUrl.replace(/\/$/, ''); // Remove trailing slash
26
+ this.serviceRoleKey = config.serviceRoleKey;
27
+ this.anonKey = config.anonKey;
28
+ }
29
+
30
+ private getApiKey(): string {
31
+ return this.serviceRoleKey || this.anonKey || '';
32
+ }
33
+
34
+ private getBaseUrl(apiType: RequestOptions['apiType'] = 'rest'): string {
35
+ switch (apiType) {
36
+ case 'auth':
37
+ return `${this.projectUrl}/auth/v1`;
38
+ case 'storage':
39
+ return `${this.projectUrl}/storage/v1`;
40
+ case 'functions':
41
+ return `${this.projectUrl}/functions/v1`;
42
+ case 'rest':
43
+ default:
44
+ return `${this.projectUrl}/rest/v1`;
45
+ }
46
+ }
47
+
48
+ private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>, apiType?: RequestOptions['apiType']): string {
49
+ const url = new URL(`${this.getBaseUrl(apiType)}${path}`);
50
+
51
+ if (params) {
52
+ Object.entries(params).forEach(([key, value]) => {
53
+ if (value !== undefined && value !== null && value !== '') {
54
+ url.searchParams.append(key, String(value));
55
+ }
56
+ });
57
+ }
58
+
59
+ return url.toString();
60
+ }
61
+
62
+ /**
63
+ * Make an authenticated request to Supabase API
64
+ * Uses apikey header and Bearer token authentication
65
+ */
66
+ async request<T>(path: string, options: RequestOptions = {}): Promise<T> {
67
+ const { method = 'GET', params, body, headers = {}, apiType = 'rest' } = options;
68
+
69
+ const url = this.buildUrl(path, params, apiType);
70
+ const apiKey = this.getApiKey();
71
+
72
+ const requestHeaders: Record<string, string> = {
73
+ 'apikey': apiKey,
74
+ 'Authorization': `Bearer ${apiKey}`,
75
+ 'Accept': 'application/json',
76
+ ...headers,
77
+ };
78
+
79
+ // For service role operations, add admin flag
80
+ if (this.serviceRoleKey && apiType === 'auth') {
81
+ requestHeaders['Authorization'] = `Bearer ${this.serviceRoleKey}`;
82
+ }
83
+
84
+ if (body && ['POST', 'PUT', 'PATCH'].includes(method) && !(body instanceof ArrayBuffer)) {
85
+ requestHeaders['Content-Type'] = 'application/json';
86
+ }
87
+
88
+ const fetchOptions: RequestInit = {
89
+ method,
90
+ headers: requestHeaders,
91
+ };
92
+
93
+ if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {
94
+ if (body instanceof ArrayBuffer) {
95
+ fetchOptions.body = body;
96
+ } else {
97
+ fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);
98
+ }
99
+ }
100
+
101
+ const response = await fetch(url, fetchOptions);
102
+
103
+ // Handle 204 No Content
104
+ if (response.status === 204) {
105
+ return {} as T;
106
+ }
107
+
108
+ // Parse response
109
+ let data: unknown;
110
+ const contentType = response.headers.get('content-type') || '';
111
+
112
+ if (contentType.includes('application/json')) {
113
+ const text = await response.text();
114
+ if (text) {
115
+ try {
116
+ data = JSON.parse(text);
117
+ } catch {
118
+ data = text;
119
+ }
120
+ }
121
+ } else {
122
+ data = await response.text();
123
+ }
124
+
125
+ // Handle errors
126
+ if (!response.ok) {
127
+ let errorMessage: string;
128
+ let errorCode: string | undefined;
129
+ let hint: string | undefined;
130
+
131
+ if (typeof data === 'object' && data !== null) {
132
+ const errorData = data as SupabaseErrorResponse;
133
+ errorMessage = errorData.message || errorData.error_description || errorData.error || errorData.msg || JSON.stringify(data);
134
+ errorCode = errorData.code;
135
+ hint = errorData.hint;
136
+ } else {
137
+ errorMessage = String(data || response.statusText);
138
+ }
139
+
140
+ throw new SupabaseApiError(errorMessage, response.status, errorCode, hint);
141
+ }
142
+
143
+ return data as T;
144
+ }
145
+
146
+ async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, apiType?: RequestOptions['apiType']): Promise<T> {
147
+ return this.request<T>(path, { method: 'GET', params, apiType });
148
+ }
149
+
150
+ async post<T>(path: string, body?: Record<string, unknown> | unknown[] | string | object, apiType?: RequestOptions['apiType']): Promise<T> {
151
+ return this.request<T>(path, { method: 'POST', body: body as Record<string, unknown>, apiType });
152
+ }
153
+
154
+ async put<T>(path: string, body?: Record<string, unknown> | object, apiType?: RequestOptions['apiType']): Promise<T> {
155
+ return this.request<T>(path, { method: 'PUT', body: body as Record<string, unknown>, apiType });
156
+ }
157
+
158
+ async patch<T>(path: string, body?: Record<string, unknown> | object, apiType?: RequestOptions['apiType']): Promise<T> {
159
+ return this.request<T>(path, { method: 'PATCH', body: body as Record<string, unknown>, apiType });
160
+ }
161
+
162
+ async delete<T>(path: string, params?: Record<string, string | number | boolean | undefined>, apiType?: RequestOptions['apiType']): Promise<T> {
163
+ return this.request<T>(path, { method: 'DELETE', params, apiType });
164
+ }
165
+
166
+ /**
167
+ * Upload file to storage
168
+ */
169
+ async uploadFile(bucket: string, path: string, content: ArrayBuffer, contentType?: string): Promise<{ Key: string }> {
170
+ const url = `${this.getBaseUrl('storage')}/object/${bucket}/${path}`;
171
+ const apiKey = this.getApiKey();
172
+
173
+ const response = await fetch(url, {
174
+ method: 'POST',
175
+ headers: {
176
+ 'apikey': apiKey,
177
+ 'Authorization': `Bearer ${apiKey}`,
178
+ 'Content-Type': contentType || 'application/octet-stream',
179
+ },
180
+ body: content,
181
+ });
182
+
183
+ if (!response.ok) {
184
+ const text = await response.text();
185
+ throw new SupabaseApiError(text, response.status);
186
+ }
187
+
188
+ return response.json();
189
+ }
190
+
191
+ /**
192
+ * Download file from storage
193
+ */
194
+ async downloadFile(bucket: string, path: string): Promise<ArrayBuffer> {
195
+ const url = `${this.getBaseUrl('storage')}/object/${bucket}/${path}`;
196
+ const apiKey = this.getApiKey();
197
+
198
+ const response = await fetch(url, {
199
+ method: 'GET',
200
+ headers: {
201
+ 'apikey': apiKey,
202
+ 'Authorization': `Bearer ${apiKey}`,
203
+ },
204
+ });
205
+
206
+ if (!response.ok) {
207
+ const text = await response.text();
208
+ throw new SupabaseApiError(text, response.status);
209
+ }
210
+
211
+ return response.arrayBuffer();
212
+ }
213
+
214
+ /**
215
+ * Get a preview of the API key (for display/debugging)
216
+ */
217
+ getApiKeyPreview(): string {
218
+ const key = this.getApiKey();
219
+ if (key.length > 10) {
220
+ return `${key.substring(0, 6)}...${key.substring(key.length - 4)}`;
221
+ }
222
+ return '***';
223
+ }
224
+
225
+ /**
226
+ * Get project URL
227
+ */
228
+ getProjectUrl(): string {
229
+ return this.projectUrl;
230
+ }
231
+ }
@@ -0,0 +1,439 @@
1
+ import type {
2
+ SupabaseConfig,
3
+ User,
4
+ Session,
5
+ AuthResponse,
6
+ AdminUserAttributes,
7
+ ListUsersResult,
8
+ Factor,
9
+ Bucket,
10
+ FileObject,
11
+ SignedUrl,
12
+ EdgeFunction,
13
+ } from '../types';
14
+ import { SupabaseClient } from './client';
15
+
16
+ /**
17
+ * Supabase API wrapper
18
+ */
19
+ export class Supabase {
20
+ private readonly client: SupabaseClient;
21
+
22
+ constructor(config: SupabaseConfig) {
23
+ this.client = new SupabaseClient(config);
24
+ }
25
+
26
+ /**
27
+ * Create a client from environment variables
28
+ */
29
+ static fromEnv(): Supabase {
30
+ const projectUrl = process.env.SUPABASE_URL || process.env.SUPABASE_PROJECT_URL;
31
+ const serviceRoleKey = process.env.SUPABASE_SERVICE_ROLE_KEY || process.env.SUPABASE_SERVICE_KEY;
32
+ const anonKey = process.env.SUPABASE_ANON_KEY || process.env.SUPABASE_KEY;
33
+
34
+ if (!projectUrl) {
35
+ throw new Error('SUPABASE_URL environment variable is required');
36
+ }
37
+ if (!serviceRoleKey && !anonKey) {
38
+ throw new Error('SUPABASE_SERVICE_ROLE_KEY or SUPABASE_ANON_KEY environment variable is required');
39
+ }
40
+ return new Supabase({ projectUrl, serviceRoleKey, anonKey });
41
+ }
42
+
43
+ /**
44
+ * Get a preview of the API key (for debugging)
45
+ */
46
+ getApiKeyPreview(): string {
47
+ return this.client.getApiKeyPreview();
48
+ }
49
+
50
+ /**
51
+ * Get the underlying client for direct API access
52
+ */
53
+ getClient(): SupabaseClient {
54
+ return this.client;
55
+ }
56
+
57
+ /**
58
+ * Get project URL
59
+ */
60
+ getProjectUrl(): string {
61
+ return this.client.getProjectUrl();
62
+ }
63
+
64
+ // ============================================
65
+ // Auth Admin API
66
+ // ============================================
67
+
68
+ /**
69
+ * List all users (admin only)
70
+ */
71
+ async listUsers(params?: {
72
+ page?: number;
73
+ per_page?: number;
74
+ }): Promise<ListUsersResult> {
75
+ return this.client.get<ListUsersResult>('/admin/users', params, 'auth');
76
+ }
77
+
78
+ /**
79
+ * Get user by ID (admin only)
80
+ */
81
+ async getUserById(userId: string): Promise<User> {
82
+ return this.client.get<User>(`/admin/users/${userId}`, undefined, 'auth');
83
+ }
84
+
85
+ /**
86
+ * Create user (admin only)
87
+ */
88
+ async createUser(params: {
89
+ email?: string;
90
+ phone?: string;
91
+ password?: string;
92
+ email_confirm?: boolean;
93
+ phone_confirm?: boolean;
94
+ user_metadata?: Record<string, unknown>;
95
+ app_metadata?: Record<string, unknown>;
96
+ ban_duration?: string;
97
+ }): Promise<User> {
98
+ return this.client.post<User>('/admin/users', params, 'auth');
99
+ }
100
+
101
+ /**
102
+ * Update user (admin only)
103
+ */
104
+ async updateUser(userId: string, attributes: AdminUserAttributes): Promise<User> {
105
+ return this.client.put<User>(`/admin/users/${userId}`, attributes, 'auth');
106
+ }
107
+
108
+ /**
109
+ * Delete user (admin only)
110
+ */
111
+ async deleteUser(userId: string): Promise<void> {
112
+ await this.client.delete(`/admin/users/${userId}`, undefined, 'auth');
113
+ }
114
+
115
+ /**
116
+ * Invite user by email (admin only)
117
+ */
118
+ async inviteUserByEmail(email: string, options?: {
119
+ redirect_to?: string;
120
+ data?: Record<string, unknown>;
121
+ }): Promise<User> {
122
+ return this.client.post<User>('/admin/invite', { email, ...options }, 'auth');
123
+ }
124
+
125
+ /**
126
+ * Generate link for user (admin only)
127
+ */
128
+ async generateLink(params: {
129
+ type: 'signup' | 'invite' | 'magiclink' | 'recovery' | 'email_change_current' | 'email_change_new';
130
+ email: string;
131
+ password?: string;
132
+ new_email?: string;
133
+ redirect_to?: string;
134
+ data?: Record<string, unknown>;
135
+ }): Promise<{ action_link: string; email_otp?: string; hashed_token?: string; redirect_to?: string; verification_type?: string }> {
136
+ return this.client.post('/admin/generate_link', params, 'auth');
137
+ }
138
+
139
+ /**
140
+ * List user's MFA factors (admin only)
141
+ */
142
+ async listUserFactors(userId: string): Promise<Factor[]> {
143
+ return this.client.get<Factor[]>(`/admin/users/${userId}/factors`, undefined, 'auth');
144
+ }
145
+
146
+ /**
147
+ * Delete user's MFA factor (admin only)
148
+ */
149
+ async deleteUserFactor(userId: string, factorId: string): Promise<void> {
150
+ await this.client.delete(`/admin/users/${userId}/factors/${factorId}`, undefined, 'auth');
151
+ }
152
+
153
+ // ============================================
154
+ // Storage API
155
+ // ============================================
156
+
157
+ /**
158
+ * List all buckets
159
+ */
160
+ async listBuckets(): Promise<Bucket[]> {
161
+ return this.client.get<Bucket[]>('/bucket', undefined, 'storage');
162
+ }
163
+
164
+ /**
165
+ * Get bucket by ID
166
+ */
167
+ async getBucket(bucketId: string): Promise<Bucket> {
168
+ return this.client.get<Bucket>(`/bucket/${bucketId}`, undefined, 'storage');
169
+ }
170
+
171
+ /**
172
+ * Create bucket
173
+ */
174
+ async createBucket(params: {
175
+ id?: string;
176
+ name: string;
177
+ public?: boolean;
178
+ file_size_limit?: number;
179
+ allowed_mime_types?: string[];
180
+ }): Promise<{ name: string }> {
181
+ return this.client.post<{ name: string }>('/bucket', params, 'storage');
182
+ }
183
+
184
+ /**
185
+ * Update bucket
186
+ */
187
+ async updateBucket(bucketId: string, params: {
188
+ public?: boolean;
189
+ file_size_limit?: number;
190
+ allowed_mime_types?: string[];
191
+ }): Promise<{ message: string }> {
192
+ return this.client.put<{ message: string }>(`/bucket/${bucketId}`, params, 'storage');
193
+ }
194
+
195
+ /**
196
+ * Delete bucket (must be empty)
197
+ */
198
+ async deleteBucket(bucketId: string): Promise<{ message: string }> {
199
+ return this.client.delete<{ message: string }>(`/bucket/${bucketId}`, undefined, 'storage');
200
+ }
201
+
202
+ /**
203
+ * Empty bucket (delete all files)
204
+ */
205
+ async emptyBucket(bucketId: string): Promise<{ message: string }> {
206
+ return this.client.post<{ message: string }>(`/bucket/${bucketId}/empty`, {}, 'storage');
207
+ }
208
+
209
+ /**
210
+ * List files in bucket
211
+ */
212
+ async listFiles(bucket: string, params?: {
213
+ prefix?: string;
214
+ limit?: number;
215
+ offset?: number;
216
+ sortBy?: { column: string; order: 'asc' | 'desc' };
217
+ search?: string;
218
+ }): Promise<FileObject[]> {
219
+ return this.client.post<FileObject[]>(`/object/list/${bucket}`, params || {}, 'storage');
220
+ }
221
+
222
+ /**
223
+ * Upload file
224
+ */
225
+ async uploadFile(bucket: string, path: string, content: ArrayBuffer | Uint8Array, contentType?: string): Promise<{ Key: string }> {
226
+ const arrayBuffer = content instanceof Uint8Array ? content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength) : content;
227
+ return this.client.uploadFile(bucket, path, arrayBuffer, contentType);
228
+ }
229
+
230
+ /**
231
+ * Download file
232
+ */
233
+ async downloadFile(bucket: string, path: string): Promise<ArrayBuffer> {
234
+ return this.client.downloadFile(bucket, path);
235
+ }
236
+
237
+ /**
238
+ * Move/rename file
239
+ */
240
+ async moveFile(bucket: string, fromPath: string, toPath: string): Promise<{ message: string }> {
241
+ return this.client.post<{ message: string }>(`/object/move`, {
242
+ bucketId: bucket,
243
+ sourceKey: fromPath,
244
+ destinationKey: toPath,
245
+ }, 'storage');
246
+ }
247
+
248
+ /**
249
+ * Copy file
250
+ */
251
+ async copyFile(bucket: string, fromPath: string, toPath: string): Promise<{ Key: string }> {
252
+ return this.client.post<{ Key: string }>(`/object/copy`, {
253
+ bucketId: bucket,
254
+ sourceKey: fromPath,
255
+ destinationKey: toPath,
256
+ }, 'storage');
257
+ }
258
+
259
+ /**
260
+ * Delete files
261
+ */
262
+ async deleteFiles(bucket: string, paths: string[]): Promise<{ name: string }[]> {
263
+ return this.client.delete<{ name: string }[]>(`/object/${bucket}`, { prefixes: paths.join(',') }, 'storage');
264
+ }
265
+
266
+ /**
267
+ * Create signed URL for download
268
+ */
269
+ async createSignedUrl(bucket: string, path: string, expiresIn: number = 3600): Promise<SignedUrl> {
270
+ return this.client.post<SignedUrl>(`/object/sign/${bucket}/${path}`, { expiresIn }, 'storage');
271
+ }
272
+
273
+ /**
274
+ * Create signed URLs for multiple files
275
+ */
276
+ async createSignedUrls(bucket: string, paths: string[], expiresIn: number = 3600): Promise<SignedUrl[]> {
277
+ return this.client.post<SignedUrl[]>(`/object/sign/${bucket}`, { paths, expiresIn }, 'storage');
278
+ }
279
+
280
+ /**
281
+ * Get public URL for file (bucket must be public)
282
+ */
283
+ getPublicUrl(bucket: string, path: string): string {
284
+ return `${this.client.getProjectUrl()}/storage/v1/object/public/${bucket}/${path}`;
285
+ }
286
+
287
+ // ============================================
288
+ // Database REST API (PostgREST)
289
+ // ============================================
290
+
291
+ /**
292
+ * Select records from a table
293
+ */
294
+ async select<T = unknown>(table: string, params?: {
295
+ select?: string;
296
+ filter?: Record<string, string>;
297
+ order?: string;
298
+ limit?: number;
299
+ offset?: number;
300
+ single?: boolean;
301
+ }): Promise<T[]> {
302
+ const queryParams: Record<string, string | number | boolean | undefined> = {};
303
+
304
+ if (params?.select) {
305
+ queryParams.select = params.select;
306
+ }
307
+ if (params?.filter) {
308
+ Object.entries(params.filter).forEach(([key, value]) => {
309
+ queryParams[key] = value;
310
+ });
311
+ }
312
+ if (params?.order) {
313
+ queryParams.order = params.order;
314
+ }
315
+ if (params?.limit) {
316
+ queryParams.limit = params.limit;
317
+ }
318
+ if (params?.offset) {
319
+ queryParams.offset = params.offset;
320
+ }
321
+
322
+ const headers: Record<string, string> = {};
323
+ if (params?.single) {
324
+ headers['Accept'] = 'application/vnd.pgrst.object+json';
325
+ }
326
+
327
+ return this.client.request<T[]>(`/${table}`, {
328
+ method: 'GET',
329
+ params: queryParams,
330
+ headers,
331
+ apiType: 'rest',
332
+ });
333
+ }
334
+
335
+ /**
336
+ * Insert records into a table
337
+ */
338
+ async insert<T = unknown>(table: string, data: Record<string, unknown> | Record<string, unknown>[], options?: {
339
+ returning?: 'minimal' | 'representation';
340
+ onConflict?: string;
341
+ ignoreDuplicates?: boolean;
342
+ }): Promise<T[]> {
343
+ const headers: Record<string, string> = {};
344
+
345
+ if (options?.returning === 'minimal') {
346
+ headers['Prefer'] = 'return=minimal';
347
+ } else {
348
+ headers['Prefer'] = 'return=representation';
349
+ }
350
+
351
+ if (options?.onConflict) {
352
+ headers['Prefer'] = `${headers['Prefer'] || ''},resolution=merge-duplicates`;
353
+ }
354
+
355
+ if (options?.ignoreDuplicates) {
356
+ headers['Prefer'] = `${headers['Prefer'] || ''},resolution=ignore-duplicates`;
357
+ }
358
+
359
+ return this.client.request<T[]>(`/${table}`, {
360
+ method: 'POST',
361
+ body: data,
362
+ headers,
363
+ apiType: 'rest',
364
+ });
365
+ }
366
+
367
+ /**
368
+ * Update records in a table
369
+ */
370
+ async update<T = unknown>(table: string, data: Record<string, unknown>, filter: Record<string, string>, options?: {
371
+ returning?: 'minimal' | 'representation';
372
+ }): Promise<T[]> {
373
+ const queryParams: Record<string, string | number | boolean | undefined> = { ...filter };
374
+
375
+ const headers: Record<string, string> = {};
376
+ if (options?.returning === 'minimal') {
377
+ headers['Prefer'] = 'return=minimal';
378
+ } else {
379
+ headers['Prefer'] = 'return=representation';
380
+ }
381
+
382
+ return this.client.request<T[]>(`/${table}`, {
383
+ method: 'PATCH',
384
+ body: data,
385
+ params: queryParams,
386
+ headers,
387
+ apiType: 'rest',
388
+ });
389
+ }
390
+
391
+ /**
392
+ * Delete records from a table
393
+ */
394
+ async deleteRecords<T = unknown>(table: string, filter: Record<string, string>, options?: {
395
+ returning?: 'minimal' | 'representation';
396
+ }): Promise<T[]> {
397
+ const headers: Record<string, string> = {};
398
+ if (options?.returning === 'minimal') {
399
+ headers['Prefer'] = 'return=minimal';
400
+ } else {
401
+ headers['Prefer'] = 'return=representation';
402
+ }
403
+
404
+ return this.client.request<T[]>(`/${table}`, {
405
+ method: 'DELETE',
406
+ params: filter,
407
+ headers,
408
+ apiType: 'rest',
409
+ });
410
+ }
411
+
412
+ /**
413
+ * Call RPC function
414
+ */
415
+ async rpc<T = unknown>(functionName: string, params?: Record<string, unknown>): Promise<T> {
416
+ return this.client.post<T>(`/rpc/${functionName}`, params || {}, 'rest');
417
+ }
418
+
419
+ // ============================================
420
+ // Edge Functions API
421
+ // ============================================
422
+
423
+ /**
424
+ * Invoke an edge function
425
+ */
426
+ async invokeFunction<T = unknown>(functionName: string, options?: {
427
+ body?: Record<string, unknown> | string;
428
+ headers?: Record<string, string>;
429
+ }): Promise<T> {
430
+ return this.client.request<T>(`/${functionName}`, {
431
+ method: 'POST',
432
+ body: options?.body as Record<string, unknown>,
433
+ headers: options?.headers,
434
+ apiType: 'functions',
435
+ });
436
+ }
437
+ }
438
+
439
+ export { SupabaseClient } from './client';