@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,764 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { SendGrid } from '../api';
5
+ import {
6
+ getApiKey,
7
+ setApiKey,
8
+ clearConfig,
9
+ getConfigDir,
10
+ setProfileOverride,
11
+ getCurrentProfile,
12
+ setCurrentProfile,
13
+ listProfiles,
14
+ createProfile,
15
+ deleteProfile,
16
+ profileExists,
17
+ loadProfile,
18
+ } from '../utils/config';
19
+ import type { OutputFormat } from '../utils/output';
20
+ import { success, error, info, print } from '../utils/output';
21
+
22
+ const CONNECTOR_NAME = 'connect-sendgrid';
23
+ const VERSION = '0.0.2';
24
+
25
+ const program = new Command();
26
+
27
+ program
28
+ .name(CONNECTOR_NAME)
29
+ .description('SendGrid connector - Send emails, manage contacts, templates, and email marketing')
30
+ .version(VERSION)
31
+ .option('-k, --api-key <key>', 'API key (overrides config)')
32
+ .option('-f, --format <format>', 'Output format (json, pretty)', 'pretty')
33
+ .option('-p, --profile <profile>', 'Use a specific profile')
34
+ .hook('preAction', (thisCommand) => {
35
+ const opts = thisCommand.opts();
36
+ if (opts.profile) {
37
+ if (!profileExists(opts.profile)) {
38
+ error(`Profile "${opts.profile}" does not exist. Create it with "${CONNECTOR_NAME} profile create ${opts.profile}"`);
39
+ process.exit(1);
40
+ }
41
+ setProfileOverride(opts.profile);
42
+ }
43
+ if (opts.apiKey) {
44
+ process.env.SENDGRID_API_KEY = opts.apiKey;
45
+ }
46
+ });
47
+
48
+ function getFormat(cmd: Command): OutputFormat {
49
+ const parent = cmd.parent;
50
+ return (parent?.opts().format || 'pretty') as OutputFormat;
51
+ }
52
+
53
+ function getClient(): SendGrid {
54
+ const apiKey = getApiKey();
55
+ if (!apiKey) {
56
+ error(`No API key configured. Run "${CONNECTOR_NAME} config set-key <key>" or set SENDGRID_API_KEY environment variable.`);
57
+ process.exit(1);
58
+ }
59
+ return new SendGrid({ apiKey });
60
+ }
61
+
62
+ // ============================================
63
+ // Profile Commands
64
+ // ============================================
65
+ const profileCmd = program
66
+ .command('profile')
67
+ .description('Manage configuration profiles');
68
+
69
+ profileCmd
70
+ .command('list')
71
+ .description('List all profiles')
72
+ .action(() => {
73
+ const profiles = listProfiles();
74
+ const current = getCurrentProfile();
75
+
76
+ if (profiles.length === 0) {
77
+ info('No profiles found. Use "profile create <name>" to create one.');
78
+ return;
79
+ }
80
+
81
+ success(`Profiles:`);
82
+ profiles.forEach(p => {
83
+ const isActive = p === current ? chalk.green(' (active)') : '';
84
+ console.log(` ${p}${isActive}`);
85
+ });
86
+ });
87
+
88
+ profileCmd
89
+ .command('use <name>')
90
+ .description('Switch to a profile')
91
+ .action((name: string) => {
92
+ if (!profileExists(name)) {
93
+ error(`Profile "${name}" does not exist. Create it with "profile create ${name}"`);
94
+ process.exit(1);
95
+ }
96
+ setCurrentProfile(name);
97
+ success(`Switched to profile: ${name}`);
98
+ });
99
+
100
+ profileCmd
101
+ .command('create <name>')
102
+ .description('Create a new profile')
103
+ .option('--api-key <key>', 'API key')
104
+ .option('--use', 'Switch to this profile after creation')
105
+ .action((name: string, opts) => {
106
+ if (profileExists(name)) {
107
+ error(`Profile "${name}" already exists`);
108
+ process.exit(1);
109
+ }
110
+
111
+ createProfile(name, {
112
+ apiKey: opts.apiKey,
113
+ });
114
+ success(`Profile "${name}" created`);
115
+
116
+ if (opts.use) {
117
+ setCurrentProfile(name);
118
+ info(`Switched to profile: ${name}`);
119
+ }
120
+ });
121
+
122
+ profileCmd
123
+ .command('delete <name>')
124
+ .description('Delete a profile')
125
+ .action((name: string) => {
126
+ if (name === 'default') {
127
+ error('Cannot delete the default profile');
128
+ process.exit(1);
129
+ }
130
+ if (deleteProfile(name)) {
131
+ success(`Profile "${name}" deleted`);
132
+ } else {
133
+ error(`Profile "${name}" not found`);
134
+ process.exit(1);
135
+ }
136
+ });
137
+
138
+ profileCmd
139
+ .command('show [name]')
140
+ .description('Show profile configuration')
141
+ .action((name?: string) => {
142
+ const profileName = name || getCurrentProfile();
143
+ const config = loadProfile(profileName);
144
+ const active = getCurrentProfile();
145
+
146
+ console.log(chalk.bold(`Profile: ${profileName}${profileName === active ? chalk.green(' (active)') : ''}`));
147
+ info(`API Key: ${config.apiKey ? `${config.apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
148
+ });
149
+
150
+ // ============================================
151
+ // Config Commands
152
+ // ============================================
153
+ const configCmd = program
154
+ .command('config')
155
+ .description('Manage CLI configuration');
156
+
157
+ configCmd
158
+ .command('set-key <apiKey>')
159
+ .description('Set API key')
160
+ .action((apiKey: string) => {
161
+ setApiKey(apiKey);
162
+ success(`API key saved to profile: ${getCurrentProfile()}`);
163
+ });
164
+
165
+ configCmd
166
+ .command('show')
167
+ .description('Show current configuration')
168
+ .action(() => {
169
+ const profileName = getCurrentProfile();
170
+ const apiKey = getApiKey();
171
+
172
+ console.log(chalk.bold(`Active Profile: ${profileName}`));
173
+ info(`Config directory: ${getConfigDir()}`);
174
+ info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
175
+ });
176
+
177
+ configCmd
178
+ .command('clear')
179
+ .description('Clear configuration')
180
+ .action(() => {
181
+ clearConfig();
182
+ success(`Configuration cleared for profile: ${getCurrentProfile()}`);
183
+ });
184
+
185
+ // ============================================
186
+ // Mail Send Commands
187
+ // ============================================
188
+ const mailCmd = program
189
+ .command('mail')
190
+ .description('Send email operations');
191
+
192
+ mailCmd
193
+ .command('send')
194
+ .description('Send an email')
195
+ .requiredOption('--to <emails>', 'Recipient email(s), comma-separated')
196
+ .requiredOption('--from <email>', 'Sender email')
197
+ .requiredOption('--subject <subject>', 'Email subject')
198
+ .option('--text <text>', 'Plain text content')
199
+ .option('--html <html>', 'HTML content')
200
+ .option('--from-name <name>', 'Sender name')
201
+ .option('--reply-to <email>', 'Reply-to email')
202
+ .action(async (opts) => {
203
+ try {
204
+ const client = getClient();
205
+ const toEmails = opts.to.split(',').map((e: string) => e.trim());
206
+
207
+ await client.sendSimpleEmail({
208
+ to: toEmails,
209
+ from: opts.from,
210
+ fromName: opts.fromName,
211
+ subject: opts.subject,
212
+ text: opts.text,
213
+ html: opts.html,
214
+ replyTo: opts.replyTo,
215
+ });
216
+ success('Email sent successfully!');
217
+ } catch (err) {
218
+ error(String(err));
219
+ process.exit(1);
220
+ }
221
+ });
222
+
223
+ // ============================================
224
+ // Contact Commands
225
+ // ============================================
226
+ const contactCmd = program
227
+ .command('contact')
228
+ .description('Contact operations');
229
+
230
+ contactCmd
231
+ .command('ls')
232
+ .description('List all contacts')
233
+ .action(async () => {
234
+ try {
235
+ const client = getClient();
236
+ const result = await client.listContacts();
237
+ print(result, getFormat(contactCmd));
238
+ } catch (err) {
239
+ error(String(err));
240
+ process.exit(1);
241
+ }
242
+ });
243
+
244
+ contactCmd
245
+ .command('get <contactId>')
246
+ .description('Get a contact by ID')
247
+ .action(async (contactId: string) => {
248
+ try {
249
+ const client = getClient();
250
+ const result = await client.getContact(contactId);
251
+ print(result, getFormat(contactCmd));
252
+ } catch (err) {
253
+ error(String(err));
254
+ process.exit(1);
255
+ }
256
+ });
257
+
258
+ contactCmd
259
+ .command('search <query>')
260
+ .description('Search contacts by email')
261
+ .action(async (query: string) => {
262
+ try {
263
+ const client = getClient();
264
+ const result = await client.searchContacts(query);
265
+ print(result, getFormat(contactCmd));
266
+ } catch (err) {
267
+ error(String(err));
268
+ process.exit(1);
269
+ }
270
+ });
271
+
272
+ contactCmd
273
+ .command('add')
274
+ .description('Add a contact')
275
+ .requiredOption('-e, --email <email>', 'Contact email')
276
+ .option('--first-name <name>', 'First name')
277
+ .option('--last-name <name>', 'Last name')
278
+ .option('--list-id <id>', 'List ID to add contact to')
279
+ .action(async (opts) => {
280
+ try {
281
+ const client = getClient();
282
+ const contact = {
283
+ email: opts.email,
284
+ first_name: opts.firstName,
285
+ last_name: opts.lastName,
286
+ };
287
+ const listIds = opts.listId ? [opts.listId] : undefined;
288
+ const result = await client.upsertContacts([contact], listIds);
289
+ success('Contact added!');
290
+ print(result, getFormat(contactCmd));
291
+ } catch (err) {
292
+ error(String(err));
293
+ process.exit(1);
294
+ }
295
+ });
296
+
297
+ contactCmd
298
+ .command('count')
299
+ .description('Get contact count')
300
+ .action(async () => {
301
+ try {
302
+ const client = getClient();
303
+ const result = await client.getContactCount();
304
+ print(result, getFormat(contactCmd));
305
+ } catch (err) {
306
+ error(String(err));
307
+ process.exit(1);
308
+ }
309
+ });
310
+
311
+ // ============================================
312
+ // List Commands
313
+ // ============================================
314
+ const listCmd = program
315
+ .command('list')
316
+ .description('Contact list operations');
317
+
318
+ listCmd
319
+ .command('ls')
320
+ .description('List all contact lists')
321
+ .action(async () => {
322
+ try {
323
+ const client = getClient();
324
+ const result = await client.listContactLists();
325
+ print(result, getFormat(listCmd));
326
+ } catch (err) {
327
+ error(String(err));
328
+ process.exit(1);
329
+ }
330
+ });
331
+
332
+ listCmd
333
+ .command('get <listId>')
334
+ .description('Get a list by ID')
335
+ .action(async (listId: string) => {
336
+ try {
337
+ const client = getClient();
338
+ const result = await client.getContactList(listId);
339
+ print(result, getFormat(listCmd));
340
+ } catch (err) {
341
+ error(String(err));
342
+ process.exit(1);
343
+ }
344
+ });
345
+
346
+ listCmd
347
+ .command('create <name>')
348
+ .description('Create a contact list')
349
+ .action(async (name: string) => {
350
+ try {
351
+ const client = getClient();
352
+ const result = await client.createContactList(name);
353
+ success('List created!');
354
+ print(result, getFormat(listCmd));
355
+ } catch (err) {
356
+ error(String(err));
357
+ process.exit(1);
358
+ }
359
+ });
360
+
361
+ listCmd
362
+ .command('delete <listId>')
363
+ .description('Delete a list')
364
+ .option('--delete-contacts', 'Also delete contacts in the list')
365
+ .action(async (listId: string, opts) => {
366
+ try {
367
+ const client = getClient();
368
+ await client.deleteContactList(listId, opts.deleteContacts);
369
+ success(`List ${listId} deleted`);
370
+ } catch (err) {
371
+ error(String(err));
372
+ process.exit(1);
373
+ }
374
+ });
375
+
376
+ // ============================================
377
+ // Template Commands
378
+ // ============================================
379
+ const templateCmd = program
380
+ .command('template')
381
+ .description('Template operations');
382
+
383
+ templateCmd
384
+ .command('ls')
385
+ .description('List all templates')
386
+ .option('-g, --generations <type>', 'Template generations (legacy, dynamic, legacy,dynamic)', 'dynamic')
387
+ .action(async (opts) => {
388
+ try {
389
+ const client = getClient();
390
+ const result = await client.listTemplates(opts.generations);
391
+ print(result, getFormat(templateCmd));
392
+ } catch (err) {
393
+ error(String(err));
394
+ process.exit(1);
395
+ }
396
+ });
397
+
398
+ templateCmd
399
+ .command('get <templateId>')
400
+ .description('Get a template by ID')
401
+ .action(async (templateId: string) => {
402
+ try {
403
+ const client = getClient();
404
+ const result = await client.getTemplate(templateId);
405
+ print(result, getFormat(templateCmd));
406
+ } catch (err) {
407
+ error(String(err));
408
+ process.exit(1);
409
+ }
410
+ });
411
+
412
+ templateCmd
413
+ .command('create <name>')
414
+ .description('Create a template')
415
+ .option('-g, --generation <type>', 'Template generation (legacy, dynamic)', 'dynamic')
416
+ .action(async (name: string, opts) => {
417
+ try {
418
+ const client = getClient();
419
+ const result = await client.createTemplate({
420
+ name,
421
+ generation: opts.generation,
422
+ });
423
+ success('Template created!');
424
+ print(result, getFormat(templateCmd));
425
+ } catch (err) {
426
+ error(String(err));
427
+ process.exit(1);
428
+ }
429
+ });
430
+
431
+ templateCmd
432
+ .command('delete <templateId>')
433
+ .description('Delete a template')
434
+ .action(async (templateId: string) => {
435
+ try {
436
+ const client = getClient();
437
+ await client.deleteTemplate(templateId);
438
+ success(`Template ${templateId} deleted`);
439
+ } catch (err) {
440
+ error(String(err));
441
+ process.exit(1);
442
+ }
443
+ });
444
+
445
+ // ============================================
446
+ // Sender Commands
447
+ // ============================================
448
+ const senderCmd = program
449
+ .command('sender')
450
+ .description('Sender operations');
451
+
452
+ senderCmd
453
+ .command('ls')
454
+ .description('List all senders')
455
+ .action(async () => {
456
+ try {
457
+ const client = getClient();
458
+ const result = await client.listSenders();
459
+ print(result, getFormat(senderCmd));
460
+ } catch (err) {
461
+ error(String(err));
462
+ process.exit(1);
463
+ }
464
+ });
465
+
466
+ senderCmd
467
+ .command('get <senderId>')
468
+ .description('Get a sender by ID')
469
+ .action(async (senderId: string) => {
470
+ try {
471
+ const client = getClient();
472
+ const result = await client.getSender(parseInt(senderId));
473
+ print(result, getFormat(senderCmd));
474
+ } catch (err) {
475
+ error(String(err));
476
+ process.exit(1);
477
+ }
478
+ });
479
+
480
+ senderCmd
481
+ .command('delete <senderId>')
482
+ .description('Delete a sender')
483
+ .action(async (senderId: string) => {
484
+ try {
485
+ const client = getClient();
486
+ await client.deleteSender(parseInt(senderId));
487
+ success(`Sender ${senderId} deleted`);
488
+ } catch (err) {
489
+ error(String(err));
490
+ process.exit(1);
491
+ }
492
+ });
493
+
494
+ senderCmd
495
+ .command('verify <senderId>')
496
+ .description('Resend sender verification')
497
+ .action(async (senderId: string) => {
498
+ try {
499
+ const client = getClient();
500
+ await client.resendSenderVerification(parseInt(senderId));
501
+ success(`Verification email sent for sender ${senderId}`);
502
+ } catch (err) {
503
+ error(String(err));
504
+ process.exit(1);
505
+ }
506
+ });
507
+
508
+ // ============================================
509
+ // Stats Commands
510
+ // ============================================
511
+ const statsCmd = program
512
+ .command('stats')
513
+ .description('Email statistics');
514
+
515
+ statsCmd
516
+ .command('global')
517
+ .description('Get global email stats')
518
+ .requiredOption('--start-date <date>', 'Start date (YYYY-MM-DD)')
519
+ .option('--end-date <date>', 'End date (YYYY-MM-DD)')
520
+ .option('--aggregated-by <period>', 'Aggregation period (day, week, month)')
521
+ .action(async (opts) => {
522
+ try {
523
+ const client = getClient();
524
+ const result = await client.getStats({
525
+ start_date: opts.startDate,
526
+ end_date: opts.endDate,
527
+ aggregated_by: opts.aggregatedBy,
528
+ });
529
+ print(result, getFormat(statsCmd));
530
+ } catch (err) {
531
+ error(String(err));
532
+ process.exit(1);
533
+ }
534
+ });
535
+
536
+ // ============================================
537
+ // Suppression Commands
538
+ // ============================================
539
+ const suppressionCmd = program
540
+ .command('suppression')
541
+ .description('Suppression management');
542
+
543
+ suppressionCmd
544
+ .command('bounces')
545
+ .description('List bounces')
546
+ .option('-l, --limit <number>', 'Limit results', '100')
547
+ .action(async (opts) => {
548
+ try {
549
+ const client = getClient();
550
+ const result = await client.listBounces({
551
+ limit: parseInt(opts.limit),
552
+ });
553
+ print(result, getFormat(suppressionCmd));
554
+ } catch (err) {
555
+ error(String(err));
556
+ process.exit(1);
557
+ }
558
+ });
559
+
560
+ suppressionCmd
561
+ .command('blocks')
562
+ .description('List blocks')
563
+ .option('-l, --limit <number>', 'Limit results', '100')
564
+ .action(async (opts) => {
565
+ try {
566
+ const client = getClient();
567
+ const result = await client.listBlocks({
568
+ limit: parseInt(opts.limit),
569
+ });
570
+ print(result, getFormat(suppressionCmd));
571
+ } catch (err) {
572
+ error(String(err));
573
+ process.exit(1);
574
+ }
575
+ });
576
+
577
+ suppressionCmd
578
+ .command('spam-reports')
579
+ .description('List spam reports')
580
+ .option('-l, --limit <number>', 'Limit results', '100')
581
+ .action(async (opts) => {
582
+ try {
583
+ const client = getClient();
584
+ const result = await client.listSpamReports({
585
+ limit: parseInt(opts.limit),
586
+ });
587
+ print(result, getFormat(suppressionCmd));
588
+ } catch (err) {
589
+ error(String(err));
590
+ process.exit(1);
591
+ }
592
+ });
593
+
594
+ suppressionCmd
595
+ .command('invalid-emails')
596
+ .description('List invalid emails')
597
+ .option('-l, --limit <number>', 'Limit results', '100')
598
+ .action(async (opts) => {
599
+ try {
600
+ const client = getClient();
601
+ const result = await client.listInvalidEmails({
602
+ limit: parseInt(opts.limit),
603
+ });
604
+ print(result, getFormat(suppressionCmd));
605
+ } catch (err) {
606
+ error(String(err));
607
+ process.exit(1);
608
+ }
609
+ });
610
+
611
+ suppressionCmd
612
+ .command('unsubscribes')
613
+ .description('List global unsubscribes')
614
+ .option('-l, --limit <number>', 'Limit results', '100')
615
+ .action(async (opts) => {
616
+ try {
617
+ const client = getClient();
618
+ const result = await client.listGlobalUnsubscribes({
619
+ limit: parseInt(opts.limit),
620
+ });
621
+ print(result, getFormat(suppressionCmd));
622
+ } catch (err) {
623
+ error(String(err));
624
+ process.exit(1);
625
+ }
626
+ });
627
+
628
+ // ============================================
629
+ // Unsubscribe Group Commands
630
+ // ============================================
631
+ const groupCmd = program
632
+ .command('group')
633
+ .description('Unsubscribe group operations');
634
+
635
+ groupCmd
636
+ .command('ls')
637
+ .description('List unsubscribe groups')
638
+ .action(async () => {
639
+ try {
640
+ const client = getClient();
641
+ const result = await client.listUnsubscribeGroups();
642
+ print(result, getFormat(groupCmd));
643
+ } catch (err) {
644
+ error(String(err));
645
+ process.exit(1);
646
+ }
647
+ });
648
+
649
+ groupCmd
650
+ .command('get <groupId>')
651
+ .description('Get an unsubscribe group')
652
+ .action(async (groupId: string) => {
653
+ try {
654
+ const client = getClient();
655
+ const result = await client.getUnsubscribeGroup(parseInt(groupId));
656
+ print(result, getFormat(groupCmd));
657
+ } catch (err) {
658
+ error(String(err));
659
+ process.exit(1);
660
+ }
661
+ });
662
+
663
+ groupCmd
664
+ .command('create')
665
+ .description('Create an unsubscribe group')
666
+ .requiredOption('-n, --name <name>', 'Group name')
667
+ .option('-d, --description <desc>', 'Group description')
668
+ .action(async (opts) => {
669
+ try {
670
+ const client = getClient();
671
+ const result = await client.createUnsubscribeGroup({
672
+ name: opts.name,
673
+ description: opts.description,
674
+ });
675
+ success('Unsubscribe group created!');
676
+ print(result, getFormat(groupCmd));
677
+ } catch (err) {
678
+ error(String(err));
679
+ process.exit(1);
680
+ }
681
+ });
682
+
683
+ groupCmd
684
+ .command('delete <groupId>')
685
+ .description('Delete an unsubscribe group')
686
+ .action(async (groupId: string) => {
687
+ try {
688
+ const client = getClient();
689
+ await client.deleteUnsubscribeGroup(parseInt(groupId));
690
+ success(`Unsubscribe group ${groupId} deleted`);
691
+ } catch (err) {
692
+ error(String(err));
693
+ process.exit(1);
694
+ }
695
+ });
696
+
697
+ // ============================================
698
+ // API Key Commands
699
+ // ============================================
700
+ const apiKeyCmd = program
701
+ .command('api-key')
702
+ .description('API key operations');
703
+
704
+ apiKeyCmd
705
+ .command('ls')
706
+ .description('List API keys')
707
+ .action(async () => {
708
+ try {
709
+ const client = getClient();
710
+ const result = await client.listApiKeys();
711
+ print(result, getFormat(apiKeyCmd));
712
+ } catch (err) {
713
+ error(String(err));
714
+ process.exit(1);
715
+ }
716
+ });
717
+
718
+ apiKeyCmd
719
+ .command('get <keyId>')
720
+ .description('Get an API key')
721
+ .action(async (keyId: string) => {
722
+ try {
723
+ const client = getClient();
724
+ const result = await client.getApiKey(keyId);
725
+ print(result, getFormat(apiKeyCmd));
726
+ } catch (err) {
727
+ error(String(err));
728
+ process.exit(1);
729
+ }
730
+ });
731
+
732
+ apiKeyCmd
733
+ .command('create <name>')
734
+ .description('Create an API key')
735
+ .option('-s, --scopes <scopes>', 'Comma-separated scopes')
736
+ .action(async (name: string, opts) => {
737
+ try {
738
+ const client = getClient();
739
+ const scopes = opts.scopes ? opts.scopes.split(',').map((s: string) => s.trim()) : undefined;
740
+ const result = await client.createApiKey({ name, scopes });
741
+ success('API key created!');
742
+ print(result, getFormat(apiKeyCmd));
743
+ } catch (err) {
744
+ error(String(err));
745
+ process.exit(1);
746
+ }
747
+ });
748
+
749
+ apiKeyCmd
750
+ .command('delete <keyId>')
751
+ .description('Delete an API key')
752
+ .action(async (keyId: string) => {
753
+ try {
754
+ const client = getClient();
755
+ await client.deleteApiKey(keyId);
756
+ success(`API key ${keyId} deleted`);
757
+ } catch (err) {
758
+ error(String(err));
759
+ process.exit(1);
760
+ }
761
+ });
762
+
763
+ // Parse and execute
764
+ program.parse();