@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,822 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { Mailchimp } 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
+ getServerPrefix,
19
+ } from '../utils/config';
20
+ import type { OutputFormat } from '../utils/output';
21
+ import { success, error, info, print } from '../utils/output';
22
+
23
+ const CONNECTOR_NAME = 'connect-mailchimp';
24
+ const VERSION = '0.0.2';
25
+
26
+ const program = new Command();
27
+
28
+ program
29
+ .name(CONNECTOR_NAME)
30
+ .description('Mailchimp connector - Manage audiences, campaigns, templates, and email marketing')
31
+ .version(VERSION)
32
+ .option('-k, --api-key <key>', 'API key (overrides config)')
33
+ .option('-f, --format <format>', 'Output format (json, pretty)', 'pretty')
34
+ .option('-p, --profile <profile>', 'Use a specific profile')
35
+ .hook('preAction', (thisCommand) => {
36
+ const opts = thisCommand.opts();
37
+ if (opts.profile) {
38
+ if (!profileExists(opts.profile)) {
39
+ error(`Profile "${opts.profile}" does not exist. Create it with "${CONNECTOR_NAME} profile create ${opts.profile}"`);
40
+ process.exit(1);
41
+ }
42
+ setProfileOverride(opts.profile);
43
+ }
44
+ if (opts.apiKey) {
45
+ process.env.MAILCHIMP_API_KEY = opts.apiKey;
46
+ }
47
+ });
48
+
49
+ function getFormat(cmd: Command): OutputFormat {
50
+ const parent = cmd.parent;
51
+ return (parent?.opts().format || 'pretty') as OutputFormat;
52
+ }
53
+
54
+ function getClient(): Mailchimp {
55
+ const apiKey = getApiKey();
56
+ if (!apiKey) {
57
+ error(`No API key configured. Run "${CONNECTOR_NAME} config set-key <key>" or set MAILCHIMP_API_KEY environment variable.`);
58
+ process.exit(1);
59
+ }
60
+ return new Mailchimp({ apiKey, serverPrefix: getServerPrefix() });
61
+ }
62
+
63
+ // ============================================
64
+ // Profile Commands
65
+ // ============================================
66
+ const profileCmd = program
67
+ .command('profile')
68
+ .description('Manage configuration profiles');
69
+
70
+ profileCmd
71
+ .command('list')
72
+ .description('List all profiles')
73
+ .action(() => {
74
+ const profiles = listProfiles();
75
+ const current = getCurrentProfile();
76
+
77
+ if (profiles.length === 0) {
78
+ info('No profiles found. Use "profile create <name>" to create one.');
79
+ return;
80
+ }
81
+
82
+ success(`Profiles:`);
83
+ profiles.forEach(p => {
84
+ const isActive = p === current ? chalk.green(' (active)') : '';
85
+ console.log(` ${p}${isActive}`);
86
+ });
87
+ });
88
+
89
+ profileCmd
90
+ .command('use <name>')
91
+ .description('Switch to a profile')
92
+ .action((name: string) => {
93
+ if (!profileExists(name)) {
94
+ error(`Profile "${name}" does not exist. Create it with "profile create ${name}"`);
95
+ process.exit(1);
96
+ }
97
+ setCurrentProfile(name);
98
+ success(`Switched to profile: ${name}`);
99
+ });
100
+
101
+ profileCmd
102
+ .command('create <name>')
103
+ .description('Create a new profile')
104
+ .option('--api-key <key>', 'API key')
105
+ .option('--use', 'Switch to this profile after creation')
106
+ .action((name: string, opts) => {
107
+ if (profileExists(name)) {
108
+ error(`Profile "${name}" already exists`);
109
+ process.exit(1);
110
+ }
111
+
112
+ createProfile(name, {
113
+ apiKey: opts.apiKey,
114
+ });
115
+ success(`Profile "${name}" created`);
116
+
117
+ if (opts.use) {
118
+ setCurrentProfile(name);
119
+ info(`Switched to profile: ${name}`);
120
+ }
121
+ });
122
+
123
+ profileCmd
124
+ .command('delete <name>')
125
+ .description('Delete a profile')
126
+ .action((name: string) => {
127
+ if (name === 'default') {
128
+ error('Cannot delete the default profile');
129
+ process.exit(1);
130
+ }
131
+ if (deleteProfile(name)) {
132
+ success(`Profile "${name}" deleted`);
133
+ } else {
134
+ error(`Profile "${name}" not found`);
135
+ process.exit(1);
136
+ }
137
+ });
138
+
139
+ profileCmd
140
+ .command('show [name]')
141
+ .description('Show profile configuration')
142
+ .action((name?: string) => {
143
+ const profileName = name || getCurrentProfile();
144
+ const config = loadProfile(profileName);
145
+ const active = getCurrentProfile();
146
+
147
+ console.log(chalk.bold(`Profile: ${profileName}${profileName === active ? chalk.green(' (active)') : ''}`));
148
+ info(`API Key: ${config.apiKey ? `${config.apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
149
+ });
150
+
151
+ // ============================================
152
+ // Config Commands
153
+ // ============================================
154
+ const configCmd = program
155
+ .command('config')
156
+ .description('Manage CLI configuration');
157
+
158
+ configCmd
159
+ .command('set-key <apiKey>')
160
+ .description('Set API key')
161
+ .action((apiKey: string) => {
162
+ setApiKey(apiKey);
163
+ success(`API key saved to profile: ${getCurrentProfile()}`);
164
+ });
165
+
166
+ configCmd
167
+ .command('show')
168
+ .description('Show current configuration')
169
+ .action(() => {
170
+ const profileName = getCurrentProfile();
171
+ const apiKey = getApiKey();
172
+
173
+ console.log(chalk.bold(`Active Profile: ${profileName}`));
174
+ info(`Config directory: ${getConfigDir()}`);
175
+ info(`API Key: ${apiKey ? `${apiKey.substring(0, 8)}...` : chalk.gray('not set')}`);
176
+ });
177
+
178
+ configCmd
179
+ .command('clear')
180
+ .description('Clear configuration')
181
+ .action(() => {
182
+ clearConfig();
183
+ success(`Configuration cleared for profile: ${getCurrentProfile()}`);
184
+ });
185
+
186
+ // ============================================
187
+ // Account Commands
188
+ // ============================================
189
+ const accountCmd = program
190
+ .command('account')
191
+ .description('Account operations');
192
+
193
+ accountCmd
194
+ .command('info')
195
+ .description('Get account information')
196
+ .action(async () => {
197
+ try {
198
+ const client = getClient();
199
+ const result = await client.getAccountInfo();
200
+ print(result, getFormat(accountCmd));
201
+ } catch (err) {
202
+ error(String(err));
203
+ process.exit(1);
204
+ }
205
+ });
206
+
207
+ accountCmd
208
+ .command('ping')
209
+ .description('Test API connection')
210
+ .action(async () => {
211
+ try {
212
+ const client = getClient();
213
+ const result = await client.ping();
214
+ success(`API is healthy: ${result.health_status}`);
215
+ } catch (err) {
216
+ error(String(err));
217
+ process.exit(1);
218
+ }
219
+ });
220
+
221
+ // ============================================
222
+ // List/Audience Commands
223
+ // ============================================
224
+ const listCmd = program
225
+ .command('list')
226
+ .description('Audience/list operations');
227
+
228
+ listCmd
229
+ .command('ls')
230
+ .description('List all audiences')
231
+ .option('-c, --count <number>', 'Number of results', '10')
232
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
233
+ .action(async (opts) => {
234
+ try {
235
+ const client = getClient();
236
+ const result = await client.listLists({
237
+ count: parseInt(opts.count),
238
+ offset: parseInt(opts.offset),
239
+ });
240
+ print(result, getFormat(listCmd));
241
+ } catch (err) {
242
+ error(String(err));
243
+ process.exit(1);
244
+ }
245
+ });
246
+
247
+ listCmd
248
+ .command('get <listId>')
249
+ .description('Get an audience by ID')
250
+ .action(async (listId: string) => {
251
+ try {
252
+ const client = getClient();
253
+ const result = await client.getList(listId);
254
+ print(result, getFormat(listCmd));
255
+ } catch (err) {
256
+ error(String(err));
257
+ process.exit(1);
258
+ }
259
+ });
260
+
261
+ listCmd
262
+ .command('delete <listId>')
263
+ .description('Delete an audience')
264
+ .action(async (listId: string) => {
265
+ try {
266
+ const client = getClient();
267
+ await client.deleteList(listId);
268
+ success(`Audience ${listId} deleted`);
269
+ } catch (err) {
270
+ error(String(err));
271
+ process.exit(1);
272
+ }
273
+ });
274
+
275
+ // ============================================
276
+ // Member Commands
277
+ // ============================================
278
+ const memberCmd = program
279
+ .command('member')
280
+ .description('Member/subscriber operations');
281
+
282
+ memberCmd
283
+ .command('ls <listId>')
284
+ .description('List members in an audience')
285
+ .option('-c, --count <number>', 'Number of results', '10')
286
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
287
+ .option('-s, --status <status>', 'Filter by status')
288
+ .action(async (listId: string, opts) => {
289
+ try {
290
+ const client = getClient();
291
+ const result = await client.listMembers(listId, {
292
+ count: parseInt(opts.count),
293
+ offset: parseInt(opts.offset),
294
+ status: opts.status,
295
+ });
296
+ print(result, getFormat(memberCmd));
297
+ } catch (err) {
298
+ error(String(err));
299
+ process.exit(1);
300
+ }
301
+ });
302
+
303
+ memberCmd
304
+ .command('get <listId> <email>')
305
+ .description('Get a member by email')
306
+ .action(async (listId: string, email: string) => {
307
+ try {
308
+ const client = getClient();
309
+ const result = await client.getMember(listId, email);
310
+ print(result, getFormat(memberCmd));
311
+ } catch (err) {
312
+ error(String(err));
313
+ process.exit(1);
314
+ }
315
+ });
316
+
317
+ memberCmd
318
+ .command('add <listId>')
319
+ .description('Add a member to an audience')
320
+ .requiredOption('-e, --email <email>', 'Email address')
321
+ .option('-s, --status <status>', 'Subscription status', 'subscribed')
322
+ .option('--first-name <name>', 'First name')
323
+ .option('--last-name <name>', 'Last name')
324
+ .action(async (listId: string, opts) => {
325
+ try {
326
+ const client = getClient();
327
+ const mergeFields: Record<string, unknown> = {};
328
+ if (opts.firstName) mergeFields.FNAME = opts.firstName;
329
+ if (opts.lastName) mergeFields.LNAME = opts.lastName;
330
+
331
+ const result = await client.addMember(listId, {
332
+ email_address: opts.email,
333
+ status: opts.status,
334
+ merge_fields: Object.keys(mergeFields).length > 0 ? mergeFields : undefined,
335
+ });
336
+ success('Member added!');
337
+ print(result, getFormat(memberCmd));
338
+ } catch (err) {
339
+ error(String(err));
340
+ process.exit(1);
341
+ }
342
+ });
343
+
344
+ memberCmd
345
+ .command('update <listId> <email>')
346
+ .description('Update a member')
347
+ .option('-s, --status <status>', 'Subscription status')
348
+ .option('--first-name <name>', 'First name')
349
+ .option('--last-name <name>', 'Last name')
350
+ .action(async (listId: string, email: string, opts) => {
351
+ try {
352
+ const client = getClient();
353
+ const params: Record<string, unknown> = {};
354
+ if (opts.status) params.status = opts.status;
355
+
356
+ const mergeFields: Record<string, unknown> = {};
357
+ if (opts.firstName) mergeFields.FNAME = opts.firstName;
358
+ if (opts.lastName) mergeFields.LNAME = opts.lastName;
359
+ if (Object.keys(mergeFields).length > 0) params.merge_fields = mergeFields;
360
+
361
+ const result = await client.updateMember(listId, email, params);
362
+ success('Member updated!');
363
+ print(result, getFormat(memberCmd));
364
+ } catch (err) {
365
+ error(String(err));
366
+ process.exit(1);
367
+ }
368
+ });
369
+
370
+ memberCmd
371
+ .command('archive <listId> <email>')
372
+ .description('Archive a member')
373
+ .action(async (listId: string, email: string) => {
374
+ try {
375
+ const client = getClient();
376
+ await client.archiveMember(listId, email);
377
+ success(`Member ${email} archived`);
378
+ } catch (err) {
379
+ error(String(err));
380
+ process.exit(1);
381
+ }
382
+ });
383
+
384
+ memberCmd
385
+ .command('tags <listId> <email>')
386
+ .description('Get tags for a member')
387
+ .action(async (listId: string, email: string) => {
388
+ try {
389
+ const client = getClient();
390
+ const result = await client.getMemberTags(listId, email);
391
+ print(result, getFormat(memberCmd));
392
+ } catch (err) {
393
+ error(String(err));
394
+ process.exit(1);
395
+ }
396
+ });
397
+
398
+ // ============================================
399
+ // Campaign Commands
400
+ // ============================================
401
+ const campaignCmd = program
402
+ .command('campaign')
403
+ .description('Campaign operations');
404
+
405
+ campaignCmd
406
+ .command('ls')
407
+ .description('List campaigns')
408
+ .option('-c, --count <number>', 'Number of results', '10')
409
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
410
+ .option('-s, --status <status>', 'Filter by status')
411
+ .option('-t, --type <type>', 'Filter by type')
412
+ .option('--list-id <id>', 'Filter by list ID')
413
+ .action(async (opts) => {
414
+ try {
415
+ const client = getClient();
416
+ const result = await client.listCampaigns({
417
+ count: parseInt(opts.count),
418
+ offset: parseInt(opts.offset),
419
+ status: opts.status,
420
+ type: opts.type,
421
+ list_id: opts.listId,
422
+ });
423
+ print(result, getFormat(campaignCmd));
424
+ } catch (err) {
425
+ error(String(err));
426
+ process.exit(1);
427
+ }
428
+ });
429
+
430
+ campaignCmd
431
+ .command('get <campaignId>')
432
+ .description('Get a campaign by ID')
433
+ .action(async (campaignId: string) => {
434
+ try {
435
+ const client = getClient();
436
+ const result = await client.getCampaign(campaignId);
437
+ print(result, getFormat(campaignCmd));
438
+ } catch (err) {
439
+ error(String(err));
440
+ process.exit(1);
441
+ }
442
+ });
443
+
444
+ campaignCmd
445
+ .command('create')
446
+ .description('Create a campaign')
447
+ .requiredOption('-t, --type <type>', 'Campaign type (regular, plaintext, absplit, rss, variate)')
448
+ .option('--list-id <id>', 'List ID to send to')
449
+ .option('--subject <subject>', 'Email subject line')
450
+ .option('--from-name <name>', 'From name')
451
+ .option('--reply-to <email>', 'Reply-to email')
452
+ .action(async (opts) => {
453
+ try {
454
+ const client = getClient();
455
+ const result = await client.createCampaign({
456
+ type: opts.type,
457
+ recipients: opts.listId ? { list_id: opts.listId } : undefined,
458
+ settings: {
459
+ subject_line: opts.subject,
460
+ from_name: opts.fromName,
461
+ reply_to: opts.replyTo,
462
+ },
463
+ });
464
+ success('Campaign created!');
465
+ print(result, getFormat(campaignCmd));
466
+ } catch (err) {
467
+ error(String(err));
468
+ process.exit(1);
469
+ }
470
+ });
471
+
472
+ campaignCmd
473
+ .command('send <campaignId>')
474
+ .description('Send a campaign')
475
+ .action(async (campaignId: string) => {
476
+ try {
477
+ const client = getClient();
478
+ await client.sendCampaign(campaignId);
479
+ success(`Campaign ${campaignId} sent!`);
480
+ } catch (err) {
481
+ error(String(err));
482
+ process.exit(1);
483
+ }
484
+ });
485
+
486
+ campaignCmd
487
+ .command('schedule <campaignId>')
488
+ .description('Schedule a campaign')
489
+ .requiredOption('--time <datetime>', 'Schedule time (ISO 8601 format)')
490
+ .action(async (campaignId: string, opts) => {
491
+ try {
492
+ const client = getClient();
493
+ await client.scheduleCampaign(campaignId, opts.time);
494
+ success(`Campaign ${campaignId} scheduled for ${opts.time}`);
495
+ } catch (err) {
496
+ error(String(err));
497
+ process.exit(1);
498
+ }
499
+ });
500
+
501
+ campaignCmd
502
+ .command('unschedule <campaignId>')
503
+ .description('Unschedule a campaign')
504
+ .action(async (campaignId: string) => {
505
+ try {
506
+ const client = getClient();
507
+ await client.unscheduleCampaign(campaignId);
508
+ success(`Campaign ${campaignId} unscheduled`);
509
+ } catch (err) {
510
+ error(String(err));
511
+ process.exit(1);
512
+ }
513
+ });
514
+
515
+ campaignCmd
516
+ .command('replicate <campaignId>')
517
+ .description('Replicate a campaign')
518
+ .action(async (campaignId: string) => {
519
+ try {
520
+ const client = getClient();
521
+ const result = await client.replicateCampaign(campaignId);
522
+ success('Campaign replicated!');
523
+ print(result, getFormat(campaignCmd));
524
+ } catch (err) {
525
+ error(String(err));
526
+ process.exit(1);
527
+ }
528
+ });
529
+
530
+ campaignCmd
531
+ .command('delete <campaignId>')
532
+ .description('Delete a campaign')
533
+ .action(async (campaignId: string) => {
534
+ try {
535
+ const client = getClient();
536
+ await client.deleteCampaign(campaignId);
537
+ success(`Campaign ${campaignId} deleted`);
538
+ } catch (err) {
539
+ error(String(err));
540
+ process.exit(1);
541
+ }
542
+ });
543
+
544
+ campaignCmd
545
+ .command('content <campaignId>')
546
+ .description('Get campaign content')
547
+ .action(async (campaignId: string) => {
548
+ try {
549
+ const client = getClient();
550
+ const result = await client.getCampaignContent(campaignId);
551
+ print(result, getFormat(campaignCmd));
552
+ } catch (err) {
553
+ error(String(err));
554
+ process.exit(1);
555
+ }
556
+ });
557
+
558
+ // ============================================
559
+ // Template Commands
560
+ // ============================================
561
+ const templateCmd = program
562
+ .command('template')
563
+ .description('Template operations');
564
+
565
+ templateCmd
566
+ .command('ls')
567
+ .description('List templates')
568
+ .option('-c, --count <number>', 'Number of results', '10')
569
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
570
+ .option('-t, --type <type>', 'Filter by type (user, base, gallery)')
571
+ .action(async (opts) => {
572
+ try {
573
+ const client = getClient();
574
+ const result = await client.listTemplates({
575
+ count: parseInt(opts.count),
576
+ offset: parseInt(opts.offset),
577
+ type: opts.type,
578
+ });
579
+ print(result, getFormat(templateCmd));
580
+ } catch (err) {
581
+ error(String(err));
582
+ process.exit(1);
583
+ }
584
+ });
585
+
586
+ templateCmd
587
+ .command('get <templateId>')
588
+ .description('Get a template by ID')
589
+ .action(async (templateId: string) => {
590
+ try {
591
+ const client = getClient();
592
+ const result = await client.getTemplate(parseInt(templateId));
593
+ print(result, getFormat(templateCmd));
594
+ } catch (err) {
595
+ error(String(err));
596
+ process.exit(1);
597
+ }
598
+ });
599
+
600
+ templateCmd
601
+ .command('create')
602
+ .description('Create a template')
603
+ .requiredOption('-n, --name <name>', 'Template name')
604
+ .requiredOption('--html <html>', 'HTML content')
605
+ .action(async (opts) => {
606
+ try {
607
+ const client = getClient();
608
+ const result = await client.createTemplate({
609
+ name: opts.name,
610
+ html: opts.html,
611
+ });
612
+ success('Template created!');
613
+ print(result, getFormat(templateCmd));
614
+ } catch (err) {
615
+ error(String(err));
616
+ process.exit(1);
617
+ }
618
+ });
619
+
620
+ templateCmd
621
+ .command('delete <templateId>')
622
+ .description('Delete a template')
623
+ .action(async (templateId: string) => {
624
+ try {
625
+ const client = getClient();
626
+ await client.deleteTemplate(parseInt(templateId));
627
+ success(`Template ${templateId} deleted`);
628
+ } catch (err) {
629
+ error(String(err));
630
+ process.exit(1);
631
+ }
632
+ });
633
+
634
+ // ============================================
635
+ // Tag Commands
636
+ // ============================================
637
+ const tagCmd = program
638
+ .command('tag')
639
+ .description('Tag operations');
640
+
641
+ tagCmd
642
+ .command('ls <listId>')
643
+ .description('List tags for an audience')
644
+ .option('-c, --count <number>', 'Number of results', '10')
645
+ .action(async (listId: string, opts) => {
646
+ try {
647
+ const client = getClient();
648
+ const result = await client.listTags(listId, {
649
+ count: parseInt(opts.count),
650
+ });
651
+ print(result, getFormat(tagCmd));
652
+ } catch (err) {
653
+ error(String(err));
654
+ process.exit(1);
655
+ }
656
+ });
657
+
658
+ // ============================================
659
+ // Segment Commands
660
+ // ============================================
661
+ const segmentCmd = program
662
+ .command('segment')
663
+ .description('Segment operations');
664
+
665
+ segmentCmd
666
+ .command('ls <listId>')
667
+ .description('List segments for an audience')
668
+ .option('-c, --count <number>', 'Number of results', '10')
669
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
670
+ .action(async (listId: string, opts) => {
671
+ try {
672
+ const client = getClient();
673
+ const result = await client.listSegments(listId, {
674
+ count: parseInt(opts.count),
675
+ offset: parseInt(opts.offset),
676
+ });
677
+ print(result, getFormat(segmentCmd));
678
+ } catch (err) {
679
+ error(String(err));
680
+ process.exit(1);
681
+ }
682
+ });
683
+
684
+ segmentCmd
685
+ .command('get <listId> <segmentId>')
686
+ .description('Get a segment by ID')
687
+ .action(async (listId: string, segmentId: string) => {
688
+ try {
689
+ const client = getClient();
690
+ const result = await client.getSegment(listId, parseInt(segmentId));
691
+ print(result, getFormat(segmentCmd));
692
+ } catch (err) {
693
+ error(String(err));
694
+ process.exit(1);
695
+ }
696
+ });
697
+
698
+ segmentCmd
699
+ .command('create <listId>')
700
+ .description('Create a segment')
701
+ .requiredOption('-n, --name <name>', 'Segment name')
702
+ .action(async (listId: string, opts) => {
703
+ try {
704
+ const client = getClient();
705
+ const result = await client.createSegment(listId, {
706
+ name: opts.name,
707
+ });
708
+ success('Segment created!');
709
+ print(result, getFormat(segmentCmd));
710
+ } catch (err) {
711
+ error(String(err));
712
+ process.exit(1);
713
+ }
714
+ });
715
+
716
+ segmentCmd
717
+ .command('delete <listId> <segmentId>')
718
+ .description('Delete a segment')
719
+ .action(async (listId: string, segmentId: string) => {
720
+ try {
721
+ const client = getClient();
722
+ await client.deleteSegment(listId, parseInt(segmentId));
723
+ success(`Segment ${segmentId} deleted`);
724
+ } catch (err) {
725
+ error(String(err));
726
+ process.exit(1);
727
+ }
728
+ });
729
+
730
+ // ============================================
731
+ // Report Commands
732
+ // ============================================
733
+ const reportCmd = program
734
+ .command('report')
735
+ .description('Campaign report operations');
736
+
737
+ reportCmd
738
+ .command('ls')
739
+ .description('List campaign reports')
740
+ .option('-c, --count <number>', 'Number of results', '10')
741
+ .option('-o, --offset <number>', 'Offset for pagination', '0')
742
+ .action(async (opts) => {
743
+ try {
744
+ const client = getClient();
745
+ const result = await client.listReports({
746
+ count: parseInt(opts.count),
747
+ offset: parseInt(opts.offset),
748
+ });
749
+ print(result, getFormat(reportCmd));
750
+ } catch (err) {
751
+ error(String(err));
752
+ process.exit(1);
753
+ }
754
+ });
755
+
756
+ reportCmd
757
+ .command('get <campaignId>')
758
+ .description('Get a campaign report')
759
+ .action(async (campaignId: string) => {
760
+ try {
761
+ const client = getClient();
762
+ const result = await client.getReport(campaignId);
763
+ print(result, getFormat(reportCmd));
764
+ } catch (err) {
765
+ error(String(err));
766
+ process.exit(1);
767
+ }
768
+ });
769
+
770
+ reportCmd
771
+ .command('clicks <campaignId>')
772
+ .description('Get click details for a campaign')
773
+ .option('-c, --count <number>', 'Number of results', '10')
774
+ .action(async (campaignId: string, opts) => {
775
+ try {
776
+ const client = getClient();
777
+ const result = await client.getClickDetails(campaignId, {
778
+ count: parseInt(opts.count),
779
+ });
780
+ print(result, getFormat(reportCmd));
781
+ } catch (err) {
782
+ error(String(err));
783
+ process.exit(1);
784
+ }
785
+ });
786
+
787
+ reportCmd
788
+ .command('opens <campaignId>')
789
+ .description('Get open details for a campaign')
790
+ .option('-c, --count <number>', 'Number of results', '10')
791
+ .action(async (campaignId: string, opts) => {
792
+ try {
793
+ const client = getClient();
794
+ const result = await client.getOpenDetails(campaignId, {
795
+ count: parseInt(opts.count),
796
+ });
797
+ print(result, getFormat(reportCmd));
798
+ } catch (err) {
799
+ error(String(err));
800
+ process.exit(1);
801
+ }
802
+ });
803
+
804
+ reportCmd
805
+ .command('unsubscribes <campaignId>')
806
+ .description('Get unsubscribe details for a campaign')
807
+ .option('-c, --count <number>', 'Number of results', '10')
808
+ .action(async (campaignId: string, opts) => {
809
+ try {
810
+ const client = getClient();
811
+ const result = await client.getUnsubscribes(campaignId, {
812
+ count: parseInt(opts.count),
813
+ });
814
+ print(result, getFormat(reportCmd));
815
+ } catch (err) {
816
+ error(String(err));
817
+ process.exit(1);
818
+ }
819
+ });
820
+
821
+ // Parse and execute
822
+ program.parse();