@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,691 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { Supabase } from '../api';
5
+ import {
6
+ getProjectUrl,
7
+ setProjectUrl,
8
+ getServiceRoleKey,
9
+ setServiceRoleKey,
10
+ getAnonKey,
11
+ setAnonKey,
12
+ clearConfig,
13
+ getCurrentProfile,
14
+ setCurrentProfile,
15
+ listProfiles,
16
+ createProfile,
17
+ deleteProfile,
18
+ setProfileOverride,
19
+ getConfigDir,
20
+ loadProfile,
21
+ } from '../utils/config';
22
+ import type { User, Bucket } from '../types';
23
+
24
+ const program = new Command();
25
+
26
+ // Format bytes
27
+ function formatSize(bytes: number): string {
28
+ if (bytes < 1024) return `${bytes} B`;
29
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
30
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
31
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
32
+ }
33
+
34
+ // Helper to get authenticated client
35
+ function getClient(): Supabase {
36
+ const projectUrl = getProjectUrl();
37
+ const serviceRoleKey = getServiceRoleKey();
38
+ const anonKey = getAnonKey();
39
+
40
+ if (!projectUrl) {
41
+ console.error(chalk.red('Error: Project URL not configured. Run "connect-supabase auth set-url <url>" first or set SUPABASE_URL.'));
42
+ process.exit(1);
43
+ }
44
+ if (!serviceRoleKey && !anonKey) {
45
+ console.error(chalk.red('Error: No API key configured. Run "connect-supabase auth set-key <key>" first or set SUPABASE_SERVICE_ROLE_KEY.'));
46
+ process.exit(1);
47
+ }
48
+ return new Supabase({ projectUrl, serviceRoleKey, anonKey });
49
+ }
50
+
51
+ program
52
+ .name('connect-supabase')
53
+ .description('Supabase connector - Manage auth, database, storage, and edge functions')
54
+ .version('0.0.1')
55
+ .option('--profile <name>', 'Use a specific profile')
56
+ .hook('preAction', (thisCommand) => {
57
+ const opts = thisCommand.opts();
58
+ if (opts.profile) {
59
+ setProfileOverride(opts.profile);
60
+ }
61
+ });
62
+
63
+ // ============================================
64
+ // Auth Commands (Configuration)
65
+ // ============================================
66
+
67
+ const authCmd = program.command('auth').description('Authentication and configuration');
68
+
69
+ authCmd
70
+ .command('set-url')
71
+ .description('Set Supabase project URL')
72
+ .argument('<url>', 'Project URL (e.g., https://xxx.supabase.co)')
73
+ .action((url: string) => {
74
+ setProjectUrl(url);
75
+ console.log(chalk.green(`Project URL saved to profile "${getCurrentProfile()}"`));
76
+ });
77
+
78
+ authCmd
79
+ .command('set-key')
80
+ .description('Set service role key')
81
+ .argument('<key>', 'Service role key')
82
+ .action((key: string) => {
83
+ setServiceRoleKey(key);
84
+ console.log(chalk.green(`Service role key saved to profile "${getCurrentProfile()}"`));
85
+ });
86
+
87
+ authCmd
88
+ .command('set-anon-key')
89
+ .description('Set anon/public key')
90
+ .argument('<key>', 'Anon key')
91
+ .action((key: string) => {
92
+ setAnonKey(key);
93
+ console.log(chalk.green(`Anon key saved to profile "${getCurrentProfile()}"`));
94
+ });
95
+
96
+ authCmd
97
+ .command('status')
98
+ .description('Check authentication status')
99
+ .action(async () => {
100
+ const projectUrl = getProjectUrl();
101
+ const serviceRoleKey = getServiceRoleKey();
102
+ const anonKey = getAnonKey();
103
+
104
+ if (!projectUrl) {
105
+ console.log(chalk.yellow('Not configured'));
106
+ console.log(chalk.gray('Run "connect-supabase auth set-url <url>" to configure'));
107
+ return;
108
+ }
109
+
110
+ console.log(chalk.bold('Configuration:'));
111
+ console.log(` Profile: ${chalk.cyan(getCurrentProfile())}`);
112
+ console.log(` Project URL: ${chalk.white(projectUrl)}`);
113
+ console.log(` Service Role Key: ${serviceRoleKey ? chalk.green('Set') : chalk.gray('Not set')}`);
114
+ console.log(` Anon Key: ${anonKey ? chalk.green('Set') : chalk.gray('Not set')}`);
115
+
116
+ if (serviceRoleKey || anonKey) {
117
+ try {
118
+ const client = getClient();
119
+ const buckets = await client.listBuckets();
120
+ console.log(chalk.green('\nConnected successfully'));
121
+ console.log(` Storage Buckets: ${chalk.white(buckets.length)}`);
122
+ } catch (error) {
123
+ console.log(chalk.red('\nConnection failed'));
124
+ console.error(chalk.gray(error instanceof Error ? error.message : String(error)));
125
+ }
126
+ }
127
+ });
128
+
129
+ authCmd
130
+ .command('clear')
131
+ .description('Clear stored credentials')
132
+ .action(() => {
133
+ clearConfig();
134
+ console.log(chalk.green('Credentials cleared'));
135
+ });
136
+
137
+ // ============================================
138
+ // Profile Commands
139
+ // ============================================
140
+
141
+ const profileCmd = program.command('profile').description('Profile management');
142
+
143
+ profileCmd
144
+ .command('list')
145
+ .description('List all profiles')
146
+ .action(() => {
147
+ const profiles = listProfiles();
148
+ const current = getCurrentProfile();
149
+
150
+ if (profiles.length === 0) {
151
+ console.log(chalk.gray('No profiles configured'));
152
+ return;
153
+ }
154
+
155
+ console.log(chalk.bold('Profiles:'));
156
+ for (const profile of profiles) {
157
+ const marker = profile === current ? chalk.green(' (active)') : '';
158
+ console.log(` ${profile}${marker}`);
159
+ }
160
+ });
161
+
162
+ profileCmd
163
+ .command('use')
164
+ .description('Switch to a profile')
165
+ .argument('<name>', 'Profile name')
166
+ .action((name: string) => {
167
+ try {
168
+ setCurrentProfile(name);
169
+ console.log(chalk.green(`Switched to profile "${name}"`));
170
+ } catch (error) {
171
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
172
+ process.exit(1);
173
+ }
174
+ });
175
+
176
+ profileCmd
177
+ .command('create')
178
+ .description('Create a new profile')
179
+ .argument('<name>', 'Profile name')
180
+ .action((name: string) => {
181
+ try {
182
+ if (createProfile(name)) {
183
+ console.log(chalk.green(`Profile "${name}" created`));
184
+ } else {
185
+ console.log(chalk.yellow(`Profile "${name}" already exists`));
186
+ }
187
+ } catch (error) {
188
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
189
+ process.exit(1);
190
+ }
191
+ });
192
+
193
+ profileCmd
194
+ .command('delete')
195
+ .description('Delete a profile')
196
+ .argument('<name>', 'Profile name')
197
+ .action((name: string) => {
198
+ if (deleteProfile(name)) {
199
+ console.log(chalk.green(`Profile "${name}" deleted`));
200
+ } else {
201
+ console.log(chalk.yellow(`Cannot delete profile "${name}" (doesn't exist or is default)`));
202
+ }
203
+ });
204
+
205
+ profileCmd
206
+ .command('show')
207
+ .description('Show current profile')
208
+ .action(() => {
209
+ const config = loadProfile();
210
+ console.log(`Current profile: ${chalk.cyan(getCurrentProfile())}`);
211
+ console.log(`Config directory: ${chalk.gray(getConfigDir())}`);
212
+ console.log(`Project URL: ${config.projectUrl || chalk.gray('Not set')}`);
213
+ });
214
+
215
+ // ============================================
216
+ // Users Commands (Admin)
217
+ // ============================================
218
+
219
+ const usersCmd = program.command('users').description('User management (admin)');
220
+
221
+ usersCmd
222
+ .command('list')
223
+ .description('List all users')
224
+ .option('--page <n>', 'Page number', '1')
225
+ .option('--per-page <n>', 'Users per page', '50')
226
+ .option('--json', 'Output as JSON')
227
+ .action(async (options) => {
228
+ try {
229
+ const client = getClient();
230
+ const result = await client.listUsers({
231
+ page: parseInt(options.page),
232
+ per_page: parseInt(options.perPage),
233
+ });
234
+
235
+ if (options.json) {
236
+ console.log(JSON.stringify(result.users, null, 2));
237
+ return;
238
+ }
239
+
240
+ if (result.users.length === 0) {
241
+ console.log(chalk.gray('No users found'));
242
+ return;
243
+ }
244
+
245
+ console.log(chalk.bold(`Users (${result.users.length}):`));
246
+ for (const user of result.users) {
247
+ console.log(`\n ${chalk.white(user.email || user.phone || 'Anonymous')}`);
248
+ console.log(` ID: ${chalk.gray(user.id)}`);
249
+ console.log(` Created: ${user.created_at}`);
250
+ if (user.last_sign_in_at) {
251
+ console.log(` Last Sign In: ${user.last_sign_in_at}`);
252
+ }
253
+ if (user.banned_until) {
254
+ console.log(` Banned Until: ${chalk.red(user.banned_until)}`);
255
+ }
256
+ }
257
+ } catch (error) {
258
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
259
+ process.exit(1);
260
+ }
261
+ });
262
+
263
+ usersCmd
264
+ .command('get')
265
+ .description('Get user by ID')
266
+ .argument('<user-id>', 'User ID')
267
+ .option('--json', 'Output as JSON')
268
+ .action(async (userId: string, options) => {
269
+ try {
270
+ const client = getClient();
271
+ const user = await client.getUserById(userId);
272
+
273
+ if (options.json) {
274
+ console.log(JSON.stringify(user, null, 2));
275
+ return;
276
+ }
277
+
278
+ console.log(chalk.bold('User:'));
279
+ console.log(` ID: ${user.id}`);
280
+ console.log(` Email: ${user.email || chalk.gray('Not set')}`);
281
+ console.log(` Phone: ${user.phone || chalk.gray('Not set')}`);
282
+ console.log(` Created: ${user.created_at}`);
283
+ console.log(` Last Sign In: ${user.last_sign_in_at || chalk.gray('Never')}`);
284
+ console.log(` Email Verified: ${user.email_confirmed_at ? chalk.green('Yes') : chalk.yellow('No')}`);
285
+ console.log(` Phone Verified: ${user.phone_confirmed_at ? chalk.green('Yes') : chalk.yellow('No')}`);
286
+ } catch (error) {
287
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
288
+ process.exit(1);
289
+ }
290
+ });
291
+
292
+ usersCmd
293
+ .command('create')
294
+ .description('Create a new user')
295
+ .option('-e, --email <email>', 'User email')
296
+ .option('-p, --password <password>', 'User password')
297
+ .option('--phone <phone>', 'User phone')
298
+ .option('--confirm-email', 'Auto-confirm email')
299
+ .option('--confirm-phone', 'Auto-confirm phone')
300
+ .action(async (options) => {
301
+ try {
302
+ const client = getClient();
303
+ const user = await client.createUser({
304
+ email: options.email,
305
+ password: options.password,
306
+ phone: options.phone,
307
+ email_confirm: options.confirmEmail,
308
+ phone_confirm: options.confirmPhone,
309
+ });
310
+ console.log(chalk.green(`User created: ${user.id}`));
311
+ console.log(` Email: ${user.email || chalk.gray('Not set')}`);
312
+ } catch (error) {
313
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
314
+ process.exit(1);
315
+ }
316
+ });
317
+
318
+ usersCmd
319
+ .command('delete')
320
+ .description('Delete a user')
321
+ .argument('<user-id>', 'User ID')
322
+ .action(async (userId: string) => {
323
+ try {
324
+ const client = getClient();
325
+ await client.deleteUser(userId);
326
+ console.log(chalk.green('User deleted'));
327
+ } catch (error) {
328
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
329
+ process.exit(1);
330
+ }
331
+ });
332
+
333
+ usersCmd
334
+ .command('invite')
335
+ .description('Invite user by email')
336
+ .argument('<email>', 'User email')
337
+ .option('--redirect <url>', 'Redirect URL after confirmation')
338
+ .action(async (email: string, options) => {
339
+ try {
340
+ const client = getClient();
341
+ const user = await client.inviteUserByEmail(email, {
342
+ redirect_to: options.redirect,
343
+ });
344
+ console.log(chalk.green(`Invitation sent to ${email}`));
345
+ console.log(` User ID: ${user.id}`);
346
+ } catch (error) {
347
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
348
+ process.exit(1);
349
+ }
350
+ });
351
+
352
+ // ============================================
353
+ // Storage Commands
354
+ // ============================================
355
+
356
+ const storageCmd = program.command('storage').description('Storage operations');
357
+
358
+ storageCmd
359
+ .command('buckets')
360
+ .description('List storage buckets')
361
+ .action(async () => {
362
+ try {
363
+ const client = getClient();
364
+ const buckets = await client.listBuckets();
365
+
366
+ if (buckets.length === 0) {
367
+ console.log(chalk.gray('No buckets found'));
368
+ return;
369
+ }
370
+
371
+ console.log(chalk.bold(`Buckets (${buckets.length}):`));
372
+ for (const bucket of buckets) {
373
+ const visibility = bucket.public ? chalk.green('public') : chalk.yellow('private');
374
+ console.log(`\n ${chalk.blue(bucket.name)} [${visibility}]`);
375
+ console.log(` ID: ${chalk.gray(bucket.id)}`);
376
+ console.log(` Created: ${bucket.created_at}`);
377
+ if (bucket.file_size_limit) {
378
+ console.log(` Size Limit: ${formatSize(bucket.file_size_limit)}`);
379
+ }
380
+ if (bucket.allowed_mime_types) {
381
+ console.log(` Allowed Types: ${bucket.allowed_mime_types.join(', ')}`);
382
+ }
383
+ }
384
+ } catch (error) {
385
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
386
+ process.exit(1);
387
+ }
388
+ });
389
+
390
+ storageCmd
391
+ .command('create-bucket')
392
+ .description('Create a storage bucket')
393
+ .argument('<name>', 'Bucket name')
394
+ .option('--public', 'Make bucket public')
395
+ .option('--size-limit <bytes>', 'File size limit in bytes')
396
+ .action(async (name: string, options) => {
397
+ try {
398
+ const client = getClient();
399
+ const result = await client.createBucket({
400
+ name,
401
+ public: options.public || false,
402
+ file_size_limit: options.sizeLimit ? parseInt(options.sizeLimit) : undefined,
403
+ });
404
+ console.log(chalk.green(`Bucket created: ${result.name}`));
405
+ } catch (error) {
406
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
407
+ process.exit(1);
408
+ }
409
+ });
410
+
411
+ storageCmd
412
+ .command('delete-bucket')
413
+ .description('Delete a storage bucket (must be empty)')
414
+ .argument('<bucket>', 'Bucket name or ID')
415
+ .action(async (bucket: string) => {
416
+ try {
417
+ const client = getClient();
418
+ await client.deleteBucket(bucket);
419
+ console.log(chalk.green('Bucket deleted'));
420
+ } catch (error) {
421
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
422
+ process.exit(1);
423
+ }
424
+ });
425
+
426
+ storageCmd
427
+ .command('empty-bucket')
428
+ .description('Delete all files in a bucket')
429
+ .argument('<bucket>', 'Bucket name or ID')
430
+ .action(async (bucket: string) => {
431
+ try {
432
+ const client = getClient();
433
+ await client.emptyBucket(bucket);
434
+ console.log(chalk.green('Bucket emptied'));
435
+ } catch (error) {
436
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
437
+ process.exit(1);
438
+ }
439
+ });
440
+
441
+ storageCmd
442
+ .command('list')
443
+ .description('List files in a bucket')
444
+ .argument('<bucket>', 'Bucket name')
445
+ .option('--prefix <prefix>', 'Filter by path prefix')
446
+ .option('--limit <n>', 'Maximum files', '100')
447
+ .action(async (bucket: string, options) => {
448
+ try {
449
+ const client = getClient();
450
+ const files = await client.listFiles(bucket, {
451
+ prefix: options.prefix,
452
+ limit: parseInt(options.limit),
453
+ });
454
+
455
+ if (files.length === 0) {
456
+ console.log(chalk.gray('No files found'));
457
+ return;
458
+ }
459
+
460
+ console.log(chalk.bold(`Files (${files.length}):`));
461
+ for (const file of files) {
462
+ console.log(` ${chalk.white(file.name)}`);
463
+ }
464
+ } catch (error) {
465
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
466
+ process.exit(1);
467
+ }
468
+ });
469
+
470
+ storageCmd
471
+ .command('upload')
472
+ .description('Upload a file')
473
+ .argument('<bucket>', 'Bucket name')
474
+ .argument('<local>', 'Local file path')
475
+ .argument('<remote>', 'Remote path in bucket')
476
+ .action(async (bucket: string, local: string, remote: string) => {
477
+ try {
478
+ const content = await Bun.file(local).arrayBuffer();
479
+ const client = getClient();
480
+ const result = await client.uploadFile(bucket, remote, content);
481
+ console.log(chalk.green(`Uploaded: ${result.Key}`));
482
+ } catch (error) {
483
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
484
+ process.exit(1);
485
+ }
486
+ });
487
+
488
+ storageCmd
489
+ .command('download')
490
+ .description('Download a file')
491
+ .argument('<bucket>', 'Bucket name')
492
+ .argument('<remote>', 'Remote path in bucket')
493
+ .argument('[local]', 'Local file path')
494
+ .action(async (bucket: string, remote: string, local?: string) => {
495
+ try {
496
+ const client = getClient();
497
+ const content = await client.downloadFile(bucket, remote);
498
+ const localPath = local || remote.split('/').pop() || 'download';
499
+ await Bun.write(localPath, content);
500
+ console.log(chalk.green(`Downloaded: ${localPath}`));
501
+ } catch (error) {
502
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
503
+ process.exit(1);
504
+ }
505
+ });
506
+
507
+ storageCmd
508
+ .command('url')
509
+ .description('Get signed URL for a file')
510
+ .argument('<bucket>', 'Bucket name')
511
+ .argument('<path>', 'File path')
512
+ .option('--expires <seconds>', 'Expiration time in seconds', '3600')
513
+ .action(async (bucket: string, path: string, options) => {
514
+ try {
515
+ const client = getClient();
516
+ const result = await client.createSignedUrl(bucket, path, parseInt(options.expires));
517
+ console.log(chalk.bold('Signed URL:'));
518
+ console.log(result.signedUrl);
519
+ console.log(chalk.gray(`\nExpires in ${options.expires} seconds`));
520
+ } catch (error) {
521
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
522
+ process.exit(1);
523
+ }
524
+ });
525
+
526
+ storageCmd
527
+ .command('public-url')
528
+ .description('Get public URL for a file (bucket must be public)')
529
+ .argument('<bucket>', 'Bucket name')
530
+ .argument('<path>', 'File path')
531
+ .action((bucket: string, path: string) => {
532
+ const client = getClient();
533
+ const url = client.getPublicUrl(bucket, path);
534
+ console.log(chalk.bold('Public URL:'));
535
+ console.log(url);
536
+ });
537
+
538
+ // ============================================
539
+ // Database Commands
540
+ // ============================================
541
+
542
+ const dbCmd = program.command('db').description('Database operations (REST API)');
543
+
544
+ dbCmd
545
+ .command('select')
546
+ .description('Select records from a table')
547
+ .argument('<table>', 'Table name')
548
+ .option('-s, --select <columns>', 'Columns to select')
549
+ .option('-f, --filter <filter>', 'Filter (e.g., "id=eq.1")')
550
+ .option('-o, --order <order>', 'Order by (e.g., "created_at.desc")')
551
+ .option('-l, --limit <n>', 'Limit results')
552
+ .option('--json', 'Output as JSON')
553
+ .action(async (table: string, options) => {
554
+ try {
555
+ const client = getClient();
556
+ const filter: Record<string, string> = {};
557
+
558
+ if (options.filter) {
559
+ const [key, value] = options.filter.split('=');
560
+ filter[key] = value;
561
+ }
562
+
563
+ const result = await client.select(table, {
564
+ select: options.select,
565
+ filter: Object.keys(filter).length > 0 ? filter : undefined,
566
+ order: options.order,
567
+ limit: options.limit ? parseInt(options.limit) : undefined,
568
+ });
569
+
570
+ if (options.json) {
571
+ console.log(JSON.stringify(result, null, 2));
572
+ return;
573
+ }
574
+
575
+ if (result.length === 0) {
576
+ console.log(chalk.gray('No records found'));
577
+ return;
578
+ }
579
+
580
+ console.log(chalk.bold(`Records (${result.length}):`));
581
+ for (const record of result) {
582
+ console.log(JSON.stringify(record, null, 2));
583
+ }
584
+ } catch (error) {
585
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
586
+ process.exit(1);
587
+ }
588
+ });
589
+
590
+ dbCmd
591
+ .command('insert')
592
+ .description('Insert a record')
593
+ .argument('<table>', 'Table name')
594
+ .requiredOption('-d, --data <json>', 'Record data as JSON')
595
+ .action(async (table: string, options) => {
596
+ try {
597
+ const data = JSON.parse(options.data);
598
+ const client = getClient();
599
+ const result = await client.insert(table, data);
600
+ console.log(chalk.green('Record inserted'));
601
+ console.log(JSON.stringify(result, null, 2));
602
+ } catch (error) {
603
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
604
+ process.exit(1);
605
+ }
606
+ });
607
+
608
+ dbCmd
609
+ .command('update')
610
+ .description('Update records')
611
+ .argument('<table>', 'Table name')
612
+ .requiredOption('-d, --data <json>', 'Update data as JSON')
613
+ .requiredOption('-f, --filter <filter>', 'Filter (e.g., "id=eq.1")')
614
+ .action(async (table: string, options) => {
615
+ try {
616
+ const data = JSON.parse(options.data);
617
+ const [key, value] = options.filter.split('=');
618
+ const filter = { [key]: value };
619
+
620
+ const client = getClient();
621
+ const result = await client.update(table, data, filter);
622
+ console.log(chalk.green('Records updated'));
623
+ console.log(JSON.stringify(result, null, 2));
624
+ } catch (error) {
625
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
626
+ process.exit(1);
627
+ }
628
+ });
629
+
630
+ dbCmd
631
+ .command('delete')
632
+ .description('Delete records')
633
+ .argument('<table>', 'Table name')
634
+ .requiredOption('-f, --filter <filter>', 'Filter (e.g., "id=eq.1")')
635
+ .action(async (table: string, options) => {
636
+ try {
637
+ const [key, value] = options.filter.split('=');
638
+ const filter = { [key]: value };
639
+
640
+ const client = getClient();
641
+ const result = await client.deleteRecords(table, filter);
642
+ console.log(chalk.green('Records deleted'));
643
+ console.log(JSON.stringify(result, null, 2));
644
+ } catch (error) {
645
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
646
+ process.exit(1);
647
+ }
648
+ });
649
+
650
+ dbCmd
651
+ .command('rpc')
652
+ .description('Call an RPC function')
653
+ .argument('<function>', 'Function name')
654
+ .option('-p, --params <json>', 'Function parameters as JSON')
655
+ .action(async (functionName: string, options) => {
656
+ try {
657
+ const params = options.params ? JSON.parse(options.params) : undefined;
658
+ const client = getClient();
659
+ const result = await client.rpc(functionName, params);
660
+ console.log(JSON.stringify(result, null, 2));
661
+ } catch (error) {
662
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
663
+ process.exit(1);
664
+ }
665
+ });
666
+
667
+ // ============================================
668
+ // Functions Commands
669
+ // ============================================
670
+
671
+ const functionsCmd = program.command('functions').description('Edge Functions operations');
672
+
673
+ functionsCmd
674
+ .command('invoke')
675
+ .description('Invoke an edge function')
676
+ .argument('<function>', 'Function name')
677
+ .option('-d, --data <json>', 'Request body as JSON')
678
+ .action(async (functionName: string, options) => {
679
+ try {
680
+ const body = options.data ? JSON.parse(options.data) : undefined;
681
+ const client = getClient();
682
+ const result = await client.invokeFunction(functionName, { body });
683
+ console.log(JSON.stringify(result, null, 2));
684
+ } catch (error) {
685
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
686
+ process.exit(1);
687
+ }
688
+ });
689
+
690
+ // Parse and execute
691
+ program.parse();