@hasna/connectors 0.3.16 → 0.4.1

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 (512) hide show
  1. package/bin/index.js +246 -1
  2. package/bin/mcp.js +246 -1
  3. package/bin/serve.js +245 -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-asana/.env.example +11 -0
  27. package/connectors/connect-asana/CLAUDE.md +128 -0
  28. package/connectors/connect-asana/README.md +193 -0
  29. package/connectors/connect-asana/package.json +52 -0
  30. package/connectors/connect-asana/src/api/client.ts +119 -0
  31. package/connectors/connect-asana/src/api/index.ts +319 -0
  32. package/connectors/connect-asana/src/cli/index.ts +731 -0
  33. package/connectors/connect-asana/src/index.ts +19 -0
  34. package/connectors/connect-asana/src/types/index.ts +270 -0
  35. package/connectors/connect-asana/src/utils/config.ts +171 -0
  36. package/connectors/connect-asana/src/utils/output.ts +119 -0
  37. package/connectors/connect-asana/tsconfig.json +16 -0
  38. package/connectors/connect-calendly/.env.example +11 -0
  39. package/connectors/connect-calendly/CLAUDE.md +272 -0
  40. package/connectors/connect-calendly/README.md +193 -0
  41. package/connectors/connect-calendly/package.json +51 -0
  42. package/connectors/connect-calendly/scripts/release.ts +179 -0
  43. package/connectors/connect-calendly/src/api/client.ts +213 -0
  44. package/connectors/connect-calendly/src/api/example.ts +48 -0
  45. package/connectors/connect-calendly/src/api/index.ts +51 -0
  46. package/connectors/connect-calendly/src/cli/index.ts +254 -0
  47. package/connectors/connect-calendly/src/index.ts +103 -0
  48. package/connectors/connect-calendly/src/types/index.ts +237 -0
  49. package/connectors/connect-calendly/src/utils/auth.ts +274 -0
  50. package/connectors/connect-calendly/src/utils/bulk.ts +212 -0
  51. package/connectors/connect-calendly/src/utils/config.ts +326 -0
  52. package/connectors/connect-calendly/src/utils/output.ts +175 -0
  53. package/connectors/connect-calendly/src/utils/settings.ts +114 -0
  54. package/connectors/connect-calendly/src/utils/storage.ts +198 -0
  55. package/connectors/connect-calendly/tsconfig.json +16 -0
  56. package/connectors/connect-clickup/.env.example +11 -0
  57. package/connectors/connect-clickup/CLAUDE.md +128 -0
  58. package/connectors/connect-clickup/README.md +193 -0
  59. package/connectors/connect-clickup/package.json +52 -0
  60. package/connectors/connect-clickup/src/api/client.ts +116 -0
  61. package/connectors/connect-clickup/src/api/index.ts +400 -0
  62. package/connectors/connect-clickup/src/cli/index.ts +625 -0
  63. package/connectors/connect-clickup/src/index.ts +19 -0
  64. package/connectors/connect-clickup/src/types/index.ts +591 -0
  65. package/connectors/connect-clickup/src/utils/config.ts +157 -0
  66. package/connectors/connect-clickup/src/utils/output.ts +119 -0
  67. package/connectors/connect-clickup/tsconfig.json +16 -0
  68. package/connectors/connect-confluence/.env.example +11 -0
  69. package/connectors/connect-confluence/CLAUDE.md +272 -0
  70. package/connectors/connect-confluence/README.md +193 -0
  71. package/connectors/connect-confluence/package.json +53 -0
  72. package/connectors/connect-confluence/scripts/release.ts +179 -0
  73. package/connectors/connect-confluence/src/api/client.ts +213 -0
  74. package/connectors/connect-confluence/src/api/example.ts +48 -0
  75. package/connectors/connect-confluence/src/api/index.ts +51 -0
  76. package/connectors/connect-confluence/src/cli/index.ts +254 -0
  77. package/connectors/connect-confluence/src/index.ts +103 -0
  78. package/connectors/connect-confluence/src/types/index.ts +237 -0
  79. package/connectors/connect-confluence/src/utils/auth.ts +274 -0
  80. package/connectors/connect-confluence/src/utils/bulk.ts +212 -0
  81. package/connectors/connect-confluence/src/utils/config.ts +326 -0
  82. package/connectors/connect-confluence/src/utils/output.ts +175 -0
  83. package/connectors/connect-confluence/src/utils/settings.ts +114 -0
  84. package/connectors/connect-confluence/src/utils/storage.ts +198 -0
  85. package/connectors/connect-confluence/tsconfig.json +16 -0
  86. package/connectors/connect-convertkit/.env.example +11 -0
  87. package/connectors/connect-convertkit/CLAUDE.md +272 -0
  88. package/connectors/connect-convertkit/README.md +193 -0
  89. package/connectors/connect-convertkit/package.json +51 -0
  90. package/connectors/connect-convertkit/scripts/release.ts +179 -0
  91. package/connectors/connect-convertkit/src/api/client.ts +213 -0
  92. package/connectors/connect-convertkit/src/api/example.ts +48 -0
  93. package/connectors/connect-convertkit/src/api/index.ts +51 -0
  94. package/connectors/connect-convertkit/src/cli/index.ts +254 -0
  95. package/connectors/connect-convertkit/src/index.ts +103 -0
  96. package/connectors/connect-convertkit/src/types/index.ts +237 -0
  97. package/connectors/connect-convertkit/src/utils/auth.ts +274 -0
  98. package/connectors/connect-convertkit/src/utils/bulk.ts +212 -0
  99. package/connectors/connect-convertkit/src/utils/config.ts +326 -0
  100. package/connectors/connect-convertkit/src/utils/output.ts +175 -0
  101. package/connectors/connect-convertkit/src/utils/settings.ts +114 -0
  102. package/connectors/connect-convertkit/src/utils/storage.ts +198 -0
  103. package/connectors/connect-convertkit/tsconfig.json +16 -0
  104. package/connectors/connect-crisp/.env.example +11 -0
  105. package/connectors/connect-crisp/CLAUDE.md +272 -0
  106. package/connectors/connect-crisp/README.md +193 -0
  107. package/connectors/connect-crisp/package.json +51 -0
  108. package/connectors/connect-crisp/scripts/release.ts +179 -0
  109. package/connectors/connect-crisp/src/api/client.ts +213 -0
  110. package/connectors/connect-crisp/src/api/example.ts +48 -0
  111. package/connectors/connect-crisp/src/api/index.ts +51 -0
  112. package/connectors/connect-crisp/src/cli/index.ts +254 -0
  113. package/connectors/connect-crisp/src/index.ts +103 -0
  114. package/connectors/connect-crisp/src/types/index.ts +237 -0
  115. package/connectors/connect-crisp/src/utils/auth.ts +274 -0
  116. package/connectors/connect-crisp/src/utils/bulk.ts +212 -0
  117. package/connectors/connect-crisp/src/utils/config.ts +326 -0
  118. package/connectors/connect-crisp/src/utils/output.ts +175 -0
  119. package/connectors/connect-crisp/src/utils/settings.ts +114 -0
  120. package/connectors/connect-crisp/src/utils/storage.ts +198 -0
  121. package/connectors/connect-crisp/tsconfig.json +16 -0
  122. package/connectors/connect-docusign/.env.example +11 -0
  123. package/connectors/connect-docusign/CLAUDE.md +128 -0
  124. package/connectors/connect-docusign/README.md +193 -0
  125. package/connectors/connect-docusign/package.json +52 -0
  126. package/connectors/connect-docusign/src/api/client.ts +133 -0
  127. package/connectors/connect-docusign/src/api/index.ts +178 -0
  128. package/connectors/connect-docusign/src/cli/index.ts +381 -0
  129. package/connectors/connect-docusign/src/index.ts +23 -0
  130. package/connectors/connect-docusign/src/types/index.ts +208 -0
  131. package/connectors/connect-docusign/src/utils/config.ts +125 -0
  132. package/connectors/connect-docusign/src/utils/output.ts +119 -0
  133. package/connectors/connect-docusign/tsconfig.json +16 -0
  134. package/connectors/connect-drift/.env.example +11 -0
  135. package/connectors/connect-drift/CLAUDE.md +272 -0
  136. package/connectors/connect-drift/README.md +193 -0
  137. package/connectors/connect-drift/package.json +51 -0
  138. package/connectors/connect-drift/scripts/release.ts +179 -0
  139. package/connectors/connect-drift/src/api/client.ts +213 -0
  140. package/connectors/connect-drift/src/api/example.ts +48 -0
  141. package/connectors/connect-drift/src/api/index.ts +51 -0
  142. package/connectors/connect-drift/src/cli/index.ts +254 -0
  143. package/connectors/connect-drift/src/index.ts +103 -0
  144. package/connectors/connect-drift/src/types/index.ts +237 -0
  145. package/connectors/connect-drift/src/utils/auth.ts +274 -0
  146. package/connectors/connect-drift/src/utils/bulk.ts +212 -0
  147. package/connectors/connect-drift/src/utils/config.ts +326 -0
  148. package/connectors/connect-drift/src/utils/output.ts +175 -0
  149. package/connectors/connect-drift/src/utils/settings.ts +114 -0
  150. package/connectors/connect-drift/src/utils/storage.ts +198 -0
  151. package/connectors/connect-drift/tsconfig.json +16 -0
  152. package/connectors/connect-freshdesk/.env.example +11 -0
  153. package/connectors/connect-freshdesk/CLAUDE.md +272 -0
  154. package/connectors/connect-freshdesk/README.md +193 -0
  155. package/connectors/connect-freshdesk/package.json +51 -0
  156. package/connectors/connect-freshdesk/scripts/release.ts +179 -0
  157. package/connectors/connect-freshdesk/src/api/client.ts +213 -0
  158. package/connectors/connect-freshdesk/src/api/example.ts +48 -0
  159. package/connectors/connect-freshdesk/src/api/index.ts +51 -0
  160. package/connectors/connect-freshdesk/src/cli/index.ts +254 -0
  161. package/connectors/connect-freshdesk/src/index.ts +103 -0
  162. package/connectors/connect-freshdesk/src/types/index.ts +237 -0
  163. package/connectors/connect-freshdesk/src/utils/auth.ts +274 -0
  164. package/connectors/connect-freshdesk/src/utils/bulk.ts +212 -0
  165. package/connectors/connect-freshdesk/src/utils/config.ts +326 -0
  166. package/connectors/connect-freshdesk/src/utils/output.ts +175 -0
  167. package/connectors/connect-freshdesk/src/utils/settings.ts +114 -0
  168. package/connectors/connect-freshdesk/src/utils/storage.ts +198 -0
  169. package/connectors/connect-freshdesk/tsconfig.json +16 -0
  170. package/connectors/connect-gumroad/.env.example +11 -0
  171. package/connectors/connect-gumroad/CLAUDE.md +272 -0
  172. package/connectors/connect-gumroad/README.md +193 -0
  173. package/connectors/connect-gumroad/package.json +51 -0
  174. package/connectors/connect-gumroad/scripts/release.ts +179 -0
  175. package/connectors/connect-gumroad/src/api/client.ts +213 -0
  176. package/connectors/connect-gumroad/src/api/example.ts +48 -0
  177. package/connectors/connect-gumroad/src/api/index.ts +51 -0
  178. package/connectors/connect-gumroad/src/cli/index.ts +254 -0
  179. package/connectors/connect-gumroad/src/index.ts +103 -0
  180. package/connectors/connect-gumroad/src/types/index.ts +237 -0
  181. package/connectors/connect-gumroad/src/utils/auth.ts +274 -0
  182. package/connectors/connect-gumroad/src/utils/bulk.ts +212 -0
  183. package/connectors/connect-gumroad/src/utils/config.ts +326 -0
  184. package/connectors/connect-gumroad/src/utils/output.ts +175 -0
  185. package/connectors/connect-gumroad/src/utils/settings.ts +114 -0
  186. package/connectors/connect-gumroad/src/utils/storage.ts +198 -0
  187. package/connectors/connect-gumroad/tsconfig.json +16 -0
  188. package/connectors/connect-hubspot/.env.example +11 -0
  189. package/connectors/connect-hubspot/CLAUDE.md +128 -0
  190. package/connectors/connect-hubspot/README.md +193 -0
  191. package/connectors/connect-hubspot/package.json +52 -0
  192. package/connectors/connect-hubspot/src/api/client.ts +136 -0
  193. package/connectors/connect-hubspot/src/api/index.ts +379 -0
  194. package/connectors/connect-hubspot/src/cli/index.ts +589 -0
  195. package/connectors/connect-hubspot/src/index.ts +21 -0
  196. package/connectors/connect-hubspot/src/types/index.ts +285 -0
  197. package/connectors/connect-hubspot/src/utils/config.ts +205 -0
  198. package/connectors/connect-hubspot/src/utils/output.ts +119 -0
  199. package/connectors/connect-hubspot/tsconfig.json +16 -0
  200. package/connectors/connect-intercom/.env.example +11 -0
  201. package/connectors/connect-intercom/CLAUDE.md +131 -0
  202. package/connectors/connect-intercom/README.md +193 -0
  203. package/connectors/connect-intercom/package.json +52 -0
  204. package/connectors/connect-intercom/src/api/client.ts +132 -0
  205. package/connectors/connect-intercom/src/api/index.ts +366 -0
  206. package/connectors/connect-intercom/src/cli/index.ts +831 -0
  207. package/connectors/connect-intercom/src/index.ts +21 -0
  208. package/connectors/connect-intercom/src/types/index.ts +650 -0
  209. package/connectors/connect-intercom/src/utils/config.ts +157 -0
  210. package/connectors/connect-intercom/src/utils/output.ts +119 -0
  211. package/connectors/connect-intercom/tsconfig.json +16 -0
  212. package/connectors/connect-jira/.env.example +11 -0
  213. package/connectors/connect-jira/CLAUDE.md +128 -0
  214. package/connectors/connect-jira/README.md +193 -0
  215. package/connectors/connect-jira/package.json +53 -0
  216. package/connectors/connect-jira/src/api/client.ts +131 -0
  217. package/connectors/connect-jira/src/api/index.ts +266 -0
  218. package/connectors/connect-jira/src/cli/index.ts +653 -0
  219. package/connectors/connect-jira/src/index.ts +23 -0
  220. package/connectors/connect-jira/src/types/index.ts +448 -0
  221. package/connectors/connect-jira/src/utils/config.ts +179 -0
  222. package/connectors/connect-jira/src/utils/output.ts +119 -0
  223. package/connectors/connect-jira/tsconfig.json +16 -0
  224. package/connectors/connect-lemonsqueezy/.env.example +11 -0
  225. package/connectors/connect-lemonsqueezy/CLAUDE.md +128 -0
  226. package/connectors/connect-lemonsqueezy/README.md +193 -0
  227. package/connectors/connect-lemonsqueezy/package.json +52 -0
  228. package/connectors/connect-lemonsqueezy/src/api/client.ts +133 -0
  229. package/connectors/connect-lemonsqueezy/src/api/index.ts +502 -0
  230. package/connectors/connect-lemonsqueezy/src/cli/index.ts +723 -0
  231. package/connectors/connect-lemonsqueezy/src/index.ts +21 -0
  232. package/connectors/connect-lemonsqueezy/src/types/index.ts +353 -0
  233. package/connectors/connect-lemonsqueezy/src/utils/config.ts +205 -0
  234. package/connectors/connect-lemonsqueezy/src/utils/output.ts +119 -0
  235. package/connectors/connect-lemonsqueezy/tsconfig.json +16 -0
  236. package/connectors/connect-linear/CLAUDE.md +88 -0
  237. package/connectors/connect-linear/README.md +201 -0
  238. package/connectors/connect-linear/package.json +45 -0
  239. package/connectors/connect-linear/src/api/client.ts +62 -0
  240. package/connectors/connect-linear/src/api/index.ts +46 -0
  241. package/connectors/connect-linear/src/api/issues.ts +247 -0
  242. package/connectors/connect-linear/src/api/projects.ts +179 -0
  243. package/connectors/connect-linear/src/api/teams.ts +125 -0
  244. package/connectors/connect-linear/src/api/users.ts +112 -0
  245. package/connectors/connect-linear/src/cli/index.ts +560 -0
  246. package/connectors/connect-linear/src/index.ts +27 -0
  247. package/connectors/connect-linear/src/types/index.ts +275 -0
  248. package/connectors/connect-linear/src/utils/config.ts +249 -0
  249. package/connectors/connect-linear/src/utils/output.ts +119 -0
  250. package/connectors/connect-linear/tsconfig.json +16 -0
  251. package/connectors/connect-linkedin/.env.example +11 -0
  252. package/connectors/connect-linkedin/CLAUDE.md +124 -0
  253. package/connectors/connect-linkedin/README.md +193 -0
  254. package/connectors/connect-linkedin/package.json +52 -0
  255. package/connectors/connect-linkedin/src/api/client.ts +132 -0
  256. package/connectors/connect-linkedin/src/api/index.ts +313 -0
  257. package/connectors/connect-linkedin/src/cli/index.ts +548 -0
  258. package/connectors/connect-linkedin/src/index.ts +21 -0
  259. package/connectors/connect-linkedin/src/types/index.ts +472 -0
  260. package/connectors/connect-linkedin/src/utils/config.ts +157 -0
  261. package/connectors/connect-linkedin/src/utils/output.ts +119 -0
  262. package/connectors/connect-linkedin/tsconfig.json +16 -0
  263. package/connectors/connect-mailchimp/.env.example +11 -0
  264. package/connectors/connect-mailchimp/CLAUDE.md +127 -0
  265. package/connectors/connect-mailchimp/README.md +193 -0
  266. package/connectors/connect-mailchimp/package.json +52 -0
  267. package/connectors/connect-mailchimp/src/api/client.ts +162 -0
  268. package/connectors/connect-mailchimp/src/api/index.ts +580 -0
  269. package/connectors/connect-mailchimp/src/cli/index.ts +822 -0
  270. package/connectors/connect-mailchimp/src/index.ts +23 -0
  271. package/connectors/connect-mailchimp/src/types/index.ts +585 -0
  272. package/connectors/connect-mailchimp/src/utils/config.ts +208 -0
  273. package/connectors/connect-mailchimp/src/utils/output.ts +119 -0
  274. package/connectors/connect-mailchimp/tsconfig.json +16 -0
  275. package/connectors/connect-mongodb/.env.example +11 -0
  276. package/connectors/connect-mongodb/CLAUDE.md +272 -0
  277. package/connectors/connect-mongodb/README.md +193 -0
  278. package/connectors/connect-mongodb/package.json +51 -0
  279. package/connectors/connect-mongodb/scripts/release.ts +179 -0
  280. package/connectors/connect-mongodb/src/api/client.ts +213 -0
  281. package/connectors/connect-mongodb/src/api/example.ts +48 -0
  282. package/connectors/connect-mongodb/src/api/index.ts +51 -0
  283. package/connectors/connect-mongodb/src/cli/index.ts +254 -0
  284. package/connectors/connect-mongodb/src/index.ts +103 -0
  285. package/connectors/connect-mongodb/src/types/index.ts +237 -0
  286. package/connectors/connect-mongodb/src/utils/auth.ts +274 -0
  287. package/connectors/connect-mongodb/src/utils/bulk.ts +212 -0
  288. package/connectors/connect-mongodb/src/utils/config.ts +326 -0
  289. package/connectors/connect-mongodb/src/utils/output.ts +175 -0
  290. package/connectors/connect-mongodb/src/utils/settings.ts +114 -0
  291. package/connectors/connect-mongodb/src/utils/storage.ts +198 -0
  292. package/connectors/connect-mongodb/tsconfig.json +16 -0
  293. package/connectors/connect-netlify/.env.example +11 -0
  294. package/connectors/connect-netlify/CLAUDE.md +170 -0
  295. package/connectors/connect-netlify/README.md +193 -0
  296. package/connectors/connect-netlify/package.json +53 -0
  297. package/connectors/connect-netlify/src/api/client.ts +132 -0
  298. package/connectors/connect-netlify/src/api/index.ts +533 -0
  299. package/connectors/connect-netlify/src/cli/index.ts +985 -0
  300. package/connectors/connect-netlify/src/index.ts +22 -0
  301. package/connectors/connect-netlify/src/types/index.ts +423 -0
  302. package/connectors/connect-netlify/src/utils/config.ts +171 -0
  303. package/connectors/connect-netlify/src/utils/output.ts +119 -0
  304. package/connectors/connect-netlify/tsconfig.json +16 -0
  305. package/connectors/connect-paypal/.env.example +11 -0
  306. package/connectors/connect-paypal/CLAUDE.md +128 -0
  307. package/connectors/connect-paypal/README.md +193 -0
  308. package/connectors/connect-paypal/package.json +51 -0
  309. package/connectors/connect-paypal/src/api/client.ts +182 -0
  310. package/connectors/connect-paypal/src/api/index.ts +235 -0
  311. package/connectors/connect-paypal/src/cli/index.ts +559 -0
  312. package/connectors/connect-paypal/src/index.ts +23 -0
  313. package/connectors/connect-paypal/src/types/index.ts +377 -0
  314. package/connectors/connect-paypal/src/utils/config.ts +125 -0
  315. package/connectors/connect-paypal/src/utils/output.ts +119 -0
  316. package/connectors/connect-paypal/tsconfig.json +16 -0
  317. package/connectors/connect-pinterest/.env.example +11 -0
  318. package/connectors/connect-pinterest/CLAUDE.md +115 -0
  319. package/connectors/connect-pinterest/README.md +193 -0
  320. package/connectors/connect-pinterest/package.json +52 -0
  321. package/connectors/connect-pinterest/src/api/client.ts +125 -0
  322. package/connectors/connect-pinterest/src/api/index.ts +203 -0
  323. package/connectors/connect-pinterest/src/cli/index.ts +653 -0
  324. package/connectors/connect-pinterest/src/index.ts +21 -0
  325. package/connectors/connect-pinterest/src/types/index.ts +268 -0
  326. package/connectors/connect-pinterest/src/utils/config.ts +157 -0
  327. package/connectors/connect-pinterest/src/utils/output.ts +119 -0
  328. package/connectors/connect-pinterest/tsconfig.json +16 -0
  329. package/connectors/connect-posthog/.env.example +11 -0
  330. package/connectors/connect-posthog/CLAUDE.md +272 -0
  331. package/connectors/connect-posthog/README.md +193 -0
  332. package/connectors/connect-posthog/package.json +51 -0
  333. package/connectors/connect-posthog/scripts/release.ts +179 -0
  334. package/connectors/connect-posthog/src/api/client.ts +213 -0
  335. package/connectors/connect-posthog/src/api/example.ts +48 -0
  336. package/connectors/connect-posthog/src/api/index.ts +51 -0
  337. package/connectors/connect-posthog/src/cli/index.ts +254 -0
  338. package/connectors/connect-posthog/src/index.ts +103 -0
  339. package/connectors/connect-posthog/src/types/index.ts +237 -0
  340. package/connectors/connect-posthog/src/utils/auth.ts +274 -0
  341. package/connectors/connect-posthog/src/utils/bulk.ts +212 -0
  342. package/connectors/connect-posthog/src/utils/config.ts +326 -0
  343. package/connectors/connect-posthog/src/utils/output.ts +175 -0
  344. package/connectors/connect-posthog/src/utils/settings.ts +114 -0
  345. package/connectors/connect-posthog/src/utils/storage.ts +198 -0
  346. package/connectors/connect-posthog/tsconfig.json +16 -0
  347. package/connectors/connect-salesforce/.env.example +11 -0
  348. package/connectors/connect-salesforce/CLAUDE.md +128 -0
  349. package/connectors/connect-salesforce/README.md +193 -0
  350. package/connectors/connect-salesforce/package.json +53 -0
  351. package/connectors/connect-salesforce/src/api/client.ts +150 -0
  352. package/connectors/connect-salesforce/src/api/index.ts +367 -0
  353. package/connectors/connect-salesforce/src/cli/index.ts +594 -0
  354. package/connectors/connect-salesforce/src/index.ts +21 -0
  355. package/connectors/connect-salesforce/src/types/index.ts +292 -0
  356. package/connectors/connect-salesforce/src/utils/config.ts +208 -0
  357. package/connectors/connect-salesforce/src/utils/output.ts +119 -0
  358. package/connectors/connect-salesforce/tsconfig.json +16 -0
  359. package/connectors/connect-segment/.env.example +11 -0
  360. package/connectors/connect-segment/CLAUDE.md +272 -0
  361. package/connectors/connect-segment/README.md +193 -0
  362. package/connectors/connect-segment/package.json +51 -0
  363. package/connectors/connect-segment/scripts/release.ts +179 -0
  364. package/connectors/connect-segment/src/api/client.ts +213 -0
  365. package/connectors/connect-segment/src/api/example.ts +48 -0
  366. package/connectors/connect-segment/src/api/index.ts +51 -0
  367. package/connectors/connect-segment/src/cli/index.ts +254 -0
  368. package/connectors/connect-segment/src/index.ts +103 -0
  369. package/connectors/connect-segment/src/types/index.ts +237 -0
  370. package/connectors/connect-segment/src/utils/auth.ts +274 -0
  371. package/connectors/connect-segment/src/utils/bulk.ts +212 -0
  372. package/connectors/connect-segment/src/utils/config.ts +326 -0
  373. package/connectors/connect-segment/src/utils/output.ts +175 -0
  374. package/connectors/connect-segment/src/utils/settings.ts +114 -0
  375. package/connectors/connect-segment/src/utils/storage.ts +198 -0
  376. package/connectors/connect-segment/tsconfig.json +16 -0
  377. package/connectors/connect-sendgrid/.env.example +11 -0
  378. package/connectors/connect-sendgrid/CLAUDE.md +125 -0
  379. package/connectors/connect-sendgrid/README.md +193 -0
  380. package/connectors/connect-sendgrid/package.json +53 -0
  381. package/connectors/connect-sendgrid/src/api/client.ts +137 -0
  382. package/connectors/connect-sendgrid/src/api/index.ts +588 -0
  383. package/connectors/connect-sendgrid/src/cli/index.ts +764 -0
  384. package/connectors/connect-sendgrid/src/index.ts +21 -0
  385. package/connectors/connect-sendgrid/src/types/index.ts +403 -0
  386. package/connectors/connect-sendgrid/src/utils/config.ts +197 -0
  387. package/connectors/connect-sendgrid/src/utils/output.ts +119 -0
  388. package/connectors/connect-sendgrid/tsconfig.json +16 -0
  389. package/connectors/connect-slack/.env.example +7 -0
  390. package/connectors/connect-slack/CLAUDE.md +69 -0
  391. package/connectors/connect-slack/README.md +150 -0
  392. package/connectors/connect-slack/package.json +44 -0
  393. package/connectors/connect-slack/src/api/channels.ts +112 -0
  394. package/connectors/connect-slack/src/api/client.ts +97 -0
  395. package/connectors/connect-slack/src/api/index.ts +42 -0
  396. package/connectors/connect-slack/src/api/messages.ts +127 -0
  397. package/connectors/connect-slack/src/api/users.ts +110 -0
  398. package/connectors/connect-slack/src/cli/index.ts +494 -0
  399. package/connectors/connect-slack/src/index.ts +21 -0
  400. package/connectors/connect-slack/src/types/index.ts +263 -0
  401. package/connectors/connect-slack/src/utils/config.ts +297 -0
  402. package/connectors/connect-slack/src/utils/output.ts +119 -0
  403. package/connectors/connect-slack/tsconfig.json +16 -0
  404. package/connectors/connect-supabase/.env.example +11 -0
  405. package/connectors/connect-supabase/CLAUDE.md +132 -0
  406. package/connectors/connect-supabase/README.md +193 -0
  407. package/connectors/connect-supabase/package.json +52 -0
  408. package/connectors/connect-supabase/src/api/client.ts +231 -0
  409. package/connectors/connect-supabase/src/api/index.ts +439 -0
  410. package/connectors/connect-supabase/src/cli/index.ts +691 -0
  411. package/connectors/connect-supabase/src/index.ts +24 -0
  412. package/connectors/connect-supabase/src/types/index.ts +215 -0
  413. package/connectors/connect-supabase/src/utils/config.ts +219 -0
  414. package/connectors/connect-supabase/tsconfig.json +16 -0
  415. package/connectors/connect-telegram/.env.example +2 -0
  416. package/connectors/connect-telegram/package.json +49 -0
  417. package/connectors/connect-todoist/.env.example +11 -0
  418. package/connectors/connect-todoist/CLAUDE.md +104 -0
  419. package/connectors/connect-todoist/README.md +193 -0
  420. package/connectors/connect-todoist/package.json +52 -0
  421. package/connectors/connect-todoist/src/api/client.ts +117 -0
  422. package/connectors/connect-todoist/src/api/index.ts +188 -0
  423. package/connectors/connect-todoist/src/cli/index.ts +990 -0
  424. package/connectors/connect-todoist/src/index.ts +21 -0
  425. package/connectors/connect-todoist/src/types/index.ts +240 -0
  426. package/connectors/connect-todoist/src/utils/config.ts +157 -0
  427. package/connectors/connect-todoist/src/utils/output.ts +119 -0
  428. package/connectors/connect-todoist/tsconfig.json +16 -0
  429. package/connectors/connect-trello/.env.example +11 -0
  430. package/connectors/connect-trello/CLAUDE.md +128 -0
  431. package/connectors/connect-trello/README.md +193 -0
  432. package/connectors/connect-trello/package.json +53 -0
  433. package/connectors/connect-trello/src/api/client.ts +128 -0
  434. package/connectors/connect-trello/src/api/index.ts +278 -0
  435. package/connectors/connect-trello/src/cli/index.ts +737 -0
  436. package/connectors/connect-trello/src/index.ts +21 -0
  437. package/connectors/connect-trello/src/types/index.ts +314 -0
  438. package/connectors/connect-trello/src/utils/config.ts +182 -0
  439. package/connectors/connect-trello/src/utils/output.ts +119 -0
  440. package/connectors/connect-trello/tsconfig.json +16 -0
  441. package/connectors/connect-vercel/.env.example +11 -0
  442. package/connectors/connect-vercel/CLAUDE.md +142 -0
  443. package/connectors/connect-vercel/README.md +193 -0
  444. package/connectors/connect-vercel/package.json +52 -0
  445. package/connectors/connect-vercel/src/api/client.ts +139 -0
  446. package/connectors/connect-vercel/src/api/index.ts +384 -0
  447. package/connectors/connect-vercel/src/cli/index.ts +740 -0
  448. package/connectors/connect-vercel/src/index.ts +24 -0
  449. package/connectors/connect-vercel/src/types/index.ts +350 -0
  450. package/connectors/connect-vercel/src/utils/config.ts +182 -0
  451. package/connectors/connect-vercel/src/utils/output.ts +119 -0
  452. package/connectors/connect-vercel/tsconfig.json +16 -0
  453. package/connectors/connect-whatsapp/.env.example +11 -0
  454. package/connectors/connect-whatsapp/CLAUDE.md +113 -0
  455. package/connectors/connect-whatsapp/README.md +193 -0
  456. package/connectors/connect-whatsapp/package.json +53 -0
  457. package/connectors/connect-whatsapp/src/api/client.ts +133 -0
  458. package/connectors/connect-whatsapp/src/api/index.ts +365 -0
  459. package/connectors/connect-whatsapp/src/cli/index.ts +686 -0
  460. package/connectors/connect-whatsapp/src/index.ts +25 -0
  461. package/connectors/connect-whatsapp/src/types/index.ts +502 -0
  462. package/connectors/connect-whatsapp/src/utils/config.ts +179 -0
  463. package/connectors/connect-whatsapp/src/utils/output.ts +119 -0
  464. package/connectors/connect-whatsapp/tsconfig.json +16 -0
  465. package/connectors/connect-zendesk/.env.example +10 -0
  466. package/connectors/connect-zendesk/.github/workflows/deploy.yml +51 -0
  467. package/connectors/connect-zendesk/CLAUDE.md +78 -0
  468. package/connectors/connect-zendesk/Makefile +129 -0
  469. package/connectors/connect-zendesk/README.md +295 -0
  470. package/connectors/connect-zendesk/SCAFFOLD.md +178 -0
  471. package/connectors/connect-zendesk/nginx-connector.conf +218 -0
  472. package/connectors/connect-zendesk/nginx.conf +61 -0
  473. package/connectors/connect-zendesk/package.json +71 -0
  474. package/connectors/connect-zendesk/scripts/init.sh +62 -0
  475. package/connectors/connect-zendesk/scripts/publish.ts +210 -0
  476. package/connectors/connect-zendesk/server/index.js +142 -0
  477. package/connectors/connect-zendesk/src/api/automations.ts +95 -0
  478. package/connectors/connect-zendesk/src/api/brands.ts +80 -0
  479. package/connectors/connect-zendesk/src/api/bulk.ts +838 -0
  480. package/connectors/connect-zendesk/src/api/client.test.ts +315 -0
  481. package/connectors/connect-zendesk/src/api/client.ts +173 -0
  482. package/connectors/connect-zendesk/src/api/example.ts +59 -0
  483. package/connectors/connect-zendesk/src/api/groups.ts +60 -0
  484. package/connectors/connect-zendesk/src/api/index.test.ts +111 -0
  485. package/connectors/connect-zendesk/src/api/index.ts +131 -0
  486. package/connectors/connect-zendesk/src/api/macros.ts +124 -0
  487. package/connectors/connect-zendesk/src/api/organizations.ts +85 -0
  488. package/connectors/connect-zendesk/src/api/slas.ts +80 -0
  489. package/connectors/connect-zendesk/src/api/ticket-fields.ts +98 -0
  490. package/connectors/connect-zendesk/src/api/tickets.test.ts +215 -0
  491. package/connectors/connect-zendesk/src/api/tickets.ts +103 -0
  492. package/connectors/connect-zendesk/src/api/triggers.test.ts +204 -0
  493. package/connectors/connect-zendesk/src/api/triggers.ts +125 -0
  494. package/connectors/connect-zendesk/src/api/users.test.ts +180 -0
  495. package/connectors/connect-zendesk/src/api/users.ts +108 -0
  496. package/connectors/connect-zendesk/src/api/views.test.ts +223 -0
  497. package/connectors/connect-zendesk/src/api/views.ts +145 -0
  498. package/connectors/connect-zendesk/src/api/webhooks.test.ts +208 -0
  499. package/connectors/connect-zendesk/src/api/webhooks.ts +118 -0
  500. package/connectors/connect-zendesk/src/cli/index.ts +1478 -0
  501. package/connectors/connect-zendesk/src/index.ts +36 -0
  502. package/connectors/connect-zendesk/src/server/index.ts +204 -0
  503. package/connectors/connect-zendesk/src/types/index.ts +910 -0
  504. package/connectors/connect-zendesk/src/utils/config.test.ts +193 -0
  505. package/connectors/connect-zendesk/src/utils/config.ts +526 -0
  506. package/connectors/connect-zendesk/src/utils/export.ts +338 -0
  507. package/connectors/connect-zendesk/src/utils/logger.ts +105 -0
  508. package/connectors/connect-zendesk/src/utils/output.test.ts +137 -0
  509. package/connectors/connect-zendesk/src/utils/output.ts +119 -0
  510. package/connectors/connect-zendesk/tsconfig.json +31 -0
  511. package/dist/index.js +245 -0
  512. package/package.json +1 -1
@@ -0,0 +1,338 @@
1
+ import { writeFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { getExportsDir } from './config';
4
+
5
+ export type ExportFormat = 'json' | 'csv';
6
+
7
+ /**
8
+ * Export data to a file in the specified format
9
+ */
10
+ export function exportData(
11
+ data: unknown[],
12
+ filename: string,
13
+ format: ExportFormat = 'csv'
14
+ ): string {
15
+ const exportsDir = getExportsDir();
16
+
17
+ // Ensure exports directory exists
18
+ if (!existsSync(exportsDir)) {
19
+ mkdirSync(exportsDir, { recursive: true });
20
+ }
21
+
22
+ // Add extension if not present
23
+ const extension = format === 'csv' ? '.csv' : '.json';
24
+ const finalFilename = filename.endsWith(extension) ? filename : `${filename}${extension}`;
25
+ const filepath = join(exportsDir, finalFilename);
26
+
27
+ let content: string;
28
+ if (format === 'csv') {
29
+ content = convertToCSV(data);
30
+ } else {
31
+ content = JSON.stringify(data, null, 2);
32
+ }
33
+
34
+ writeFileSync(filepath, content, 'utf-8');
35
+ return filepath;
36
+ }
37
+
38
+ /**
39
+ * Convert array of objects to CSV format
40
+ */
41
+ export function convertToCSV(data: unknown[]): string {
42
+ if (!Array.isArray(data) || data.length === 0) {
43
+ return '';
44
+ }
45
+
46
+ // Get all unique headers from all objects
47
+ const headers = new Set<string>();
48
+ for (const item of data) {
49
+ if (typeof item === 'object' && item !== null) {
50
+ Object.keys(item).forEach(key => headers.add(key));
51
+ }
52
+ }
53
+
54
+ const headerArray = Array.from(headers);
55
+
56
+ // Create header row
57
+ const headerRow = headerArray.map(escapeCSVField).join(',');
58
+
59
+ // Create data rows
60
+ const dataRows = data.map(item => {
61
+ if (typeof item !== 'object' || item === null) {
62
+ return '';
63
+ }
64
+ return headerArray
65
+ .map(header => {
66
+ const value = (item as Record<string, unknown>)[header];
67
+ return escapeCSVField(formatValue(value));
68
+ })
69
+ .join(',');
70
+ });
71
+
72
+ return [headerRow, ...dataRows].join('\n');
73
+ }
74
+
75
+ /**
76
+ * Format a value for CSV export
77
+ */
78
+ function formatValue(value: unknown): string {
79
+ if (value === null || value === undefined) {
80
+ return '';
81
+ }
82
+
83
+ if (Array.isArray(value)) {
84
+ return value.map(v => formatValue(v)).join('; ');
85
+ }
86
+
87
+ if (typeof value === 'object') {
88
+ // Handle common Zendesk object patterns
89
+ const obj = value as Record<string, unknown>;
90
+
91
+ // Handle nested objects with common patterns
92
+ if ('name' in obj) return String(obj.name);
93
+ if ('value' in obj) return String(obj.value);
94
+ if ('title' in obj) return String(obj.title);
95
+ if ('body' in obj) return String(obj.body);
96
+
97
+ // Fallback to JSON for complex objects
98
+ return JSON.stringify(value);
99
+ }
100
+
101
+ return String(value);
102
+ }
103
+
104
+ /**
105
+ * Escape a field for CSV (handles quotes and commas)
106
+ */
107
+ function escapeCSVField(value: string): string {
108
+ if (value.includes(',') || value.includes('"') || value.includes('\n') || value.includes('\r')) {
109
+ // Escape quotes by doubling them and wrap in quotes
110
+ return `"${value.replace(/"/g, '""')}"`;
111
+ }
112
+ return value;
113
+ }
114
+
115
+ /**
116
+ * Export tickets to CSV with common fields
117
+ */
118
+ export function exportTicketsToCSV(tickets: unknown[]): string {
119
+ const formattedTickets = tickets.map(ticket => {
120
+ const t = ticket as Record<string, unknown>;
121
+ return {
122
+ id: t.id,
123
+ subject: t.subject,
124
+ description: t.description,
125
+ status: t.status,
126
+ priority: t.priority,
127
+ type: t.type,
128
+ requester_id: t.requester_id,
129
+ assignee_id: t.assignee_id,
130
+ group_id: t.group_id,
131
+ organization_id: t.organization_id,
132
+ tags: Array.isArray(t.tags) ? t.tags.join('; ') : t.tags,
133
+ created_at: t.created_at,
134
+ updated_at: t.updated_at,
135
+ due_at: t.due_at,
136
+ url: t.url,
137
+ };
138
+ });
139
+ return convertToCSV(formattedTickets);
140
+ }
141
+
142
+ /**
143
+ * Export users to CSV with common fields
144
+ */
145
+ export function exportUsersToCSV(users: unknown[]): string {
146
+ const formattedUsers = users.map(user => {
147
+ const u = user as Record<string, unknown>;
148
+ return {
149
+ id: u.id,
150
+ name: u.name,
151
+ email: u.email,
152
+ role: u.role,
153
+ organization_id: u.organization_id,
154
+ phone: u.phone,
155
+ time_zone: u.time_zone,
156
+ locale: u.locale,
157
+ active: u.active,
158
+ verified: u.verified,
159
+ suspended: u.suspended,
160
+ tags: Array.isArray(u.tags) ? u.tags.join('; ') : u.tags,
161
+ created_at: u.created_at,
162
+ updated_at: u.updated_at,
163
+ last_login_at: u.last_login_at,
164
+ url: u.url,
165
+ };
166
+ });
167
+ return convertToCSV(formattedUsers);
168
+ }
169
+
170
+ /**
171
+ * Export organizations to CSV with common fields
172
+ */
173
+ export function exportOrganizationsToCSV(organizations: unknown[]): string {
174
+ const formattedOrgs = organizations.map(org => {
175
+ const o = org as Record<string, unknown>;
176
+ return {
177
+ id: o.id,
178
+ name: o.name,
179
+ external_id: o.external_id,
180
+ domain_names: Array.isArray(o.domain_names) ? o.domain_names.join('; ') : o.domain_names,
181
+ details: o.details,
182
+ notes: o.notes,
183
+ group_id: o.group_id,
184
+ shared_tickets: o.shared_tickets,
185
+ shared_comments: o.shared_comments,
186
+ tags: Array.isArray(o.tags) ? o.tags.join('; ') : o.tags,
187
+ created_at: o.created_at,
188
+ updated_at: o.updated_at,
189
+ url: o.url,
190
+ };
191
+ });
192
+ return convertToCSV(formattedOrgs);
193
+ }
194
+
195
+ /**
196
+ * Export groups to CSV
197
+ */
198
+ export function exportGroupsToCSV(groups: unknown[]): string {
199
+ const formattedGroups = groups.map(group => {
200
+ const g = group as Record<string, unknown>;
201
+ return {
202
+ id: g.id,
203
+ name: g.name,
204
+ description: g.description,
205
+ default: g.default,
206
+ deleted: g.deleted,
207
+ is_public: g.is_public,
208
+ created_at: g.created_at,
209
+ updated_at: g.updated_at,
210
+ url: g.url,
211
+ };
212
+ });
213
+ return convertToCSV(formattedGroups);
214
+ }
215
+
216
+ /**
217
+ * Export views to CSV
218
+ */
219
+ export function exportViewsToCSV(views: unknown[]): string {
220
+ const formattedViews = views.map(view => {
221
+ const v = view as Record<string, unknown>;
222
+ return {
223
+ id: v.id,
224
+ title: v.title,
225
+ active: v.active,
226
+ position: v.position,
227
+ description: v.description,
228
+ created_at: v.created_at,
229
+ updated_at: v.updated_at,
230
+ url: v.url,
231
+ };
232
+ });
233
+ return convertToCSV(formattedViews);
234
+ }
235
+
236
+ /**
237
+ * Export triggers to CSV
238
+ */
239
+ export function exportTriggersToCSV(triggers: unknown[]): string {
240
+ const formattedTriggers = triggers.map(trigger => {
241
+ const t = trigger as Record<string, unknown>;
242
+ return {
243
+ id: t.id,
244
+ title: t.title,
245
+ active: t.active,
246
+ position: t.position,
247
+ description: t.description,
248
+ category_id: t.category_id,
249
+ created_at: t.created_at,
250
+ updated_at: t.updated_at,
251
+ url: t.url,
252
+ };
253
+ });
254
+ return convertToCSV(formattedTriggers);
255
+ }
256
+
257
+ /**
258
+ * Export automations to CSV
259
+ */
260
+ export function exportAutomationsToCSV(automations: unknown[]): string {
261
+ const formattedAutomations = automations.map(automation => {
262
+ const a = automation as Record<string, unknown>;
263
+ return {
264
+ id: a.id,
265
+ title: a.title,
266
+ active: a.active,
267
+ position: a.position,
268
+ description: a.description,
269
+ created_at: a.created_at,
270
+ updated_at: a.updated_at,
271
+ url: a.url,
272
+ };
273
+ });
274
+ return convertToCSV(formattedAutomations);
275
+ }
276
+
277
+ /**
278
+ * Export macros to CSV
279
+ */
280
+ export function exportMacrosToCSV(macros: unknown[]): string {
281
+ const formattedMacros = macros.map(macro => {
282
+ const m = macro as Record<string, unknown>;
283
+ return {
284
+ id: m.id,
285
+ title: m.title,
286
+ active: m.active,
287
+ position: m.position,
288
+ description: m.description,
289
+ created_at: m.created_at,
290
+ updated_at: m.updated_at,
291
+ url: m.url,
292
+ };
293
+ });
294
+ return convertToCSV(formattedMacros);
295
+ }
296
+
297
+ /**
298
+ * Export webhooks to CSV
299
+ */
300
+ export function exportWebhooksToCSV(webhooks: unknown[]): string {
301
+ const formattedWebhooks = webhooks.map(webhook => {
302
+ const w = webhook as Record<string, unknown>;
303
+ return {
304
+ id: w.id,
305
+ name: w.name,
306
+ status: w.status,
307
+ endpoint: w.endpoint,
308
+ http_method: w.http_method,
309
+ request_format: w.request_format,
310
+ created_at: w.created_at,
311
+ updated_at: w.updated_at,
312
+ };
313
+ });
314
+ return convertToCSV(formattedWebhooks);
315
+ }
316
+
317
+ /**
318
+ * Export brands to CSV
319
+ */
320
+ export function exportBrandsToCSV(brands: unknown[]): string {
321
+ const formattedBrands = brands.map(brand => {
322
+ const b = brand as Record<string, unknown>;
323
+ return {
324
+ id: b.id,
325
+ name: b.name,
326
+ subdomain: b.subdomain,
327
+ brand_url: b.brand_url,
328
+ active: b.active,
329
+ default: b.default,
330
+ has_help_center: b.has_help_center,
331
+ host_mapping: b.host_mapping,
332
+ created_at: b.created_at,
333
+ updated_at: b.updated_at,
334
+ url: b.url,
335
+ };
336
+ });
337
+ return convertToCSV(formattedBrands);
338
+ }
@@ -0,0 +1,105 @@
1
+ import { appendFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+
5
+ const CONFIG_DIR = join(homedir(), '.connect-zendesk');
6
+ const LOG_FILE = join(CONFIG_DIR, 'connect-zendesk.log');
7
+
8
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
9
+
10
+ function ensureLogDir(): void {
11
+ if (!existsSync(CONFIG_DIR)) {
12
+ mkdirSync(CONFIG_DIR, { recursive: true });
13
+ }
14
+ }
15
+
16
+ function formatTimestamp(): string {
17
+ return new Date().toISOString();
18
+ }
19
+
20
+ function formatMessage(level: LogLevel, message: string, meta?: Record<string, unknown>): string {
21
+ const timestamp = formatTimestamp();
22
+ const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';
23
+ return `[${timestamp}] [${level.toUpperCase()}] ${message}${metaStr}\n`;
24
+ }
25
+
26
+ /**
27
+ * Write a log entry to the log file
28
+ */
29
+ function writeLog(level: LogLevel, message: string, meta?: Record<string, unknown>): void {
30
+ try {
31
+ ensureLogDir();
32
+ const logEntry = formatMessage(level, message, meta);
33
+ appendFileSync(LOG_FILE, logEntry, 'utf-8');
34
+ } catch {
35
+ // Silently fail if logging fails - don't crash the CLI
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Logger utility for connect-zendesk
41
+ */
42
+ export const logger = {
43
+ /**
44
+ * Log debug message
45
+ */
46
+ debug(message: string, meta?: Record<string, unknown>): void {
47
+ writeLog('debug', message, meta);
48
+ },
49
+
50
+ /**
51
+ * Log info message
52
+ */
53
+ info(message: string, meta?: Record<string, unknown>): void {
54
+ writeLog('info', message, meta);
55
+ },
56
+
57
+ /**
58
+ * Log warning message
59
+ */
60
+ warn(message: string, meta?: Record<string, unknown>): void {
61
+ writeLog('warn', message, meta);
62
+ },
63
+
64
+ /**
65
+ * Log error message
66
+ */
67
+ error(message: string, meta?: Record<string, unknown>): void {
68
+ writeLog('error', message, meta);
69
+ },
70
+
71
+ /**
72
+ * Log API request
73
+ */
74
+ request(method: string, path: string, statusCode?: number, duration?: number): void {
75
+ writeLog('info', `${method} ${path}`, {
76
+ statusCode,
77
+ duration: duration ? `${duration}ms` : undefined,
78
+ });
79
+ },
80
+
81
+ /**
82
+ * Log CLI command execution
83
+ */
84
+ command(command: string, args?: Record<string, unknown>): void {
85
+ writeLog('info', `Command: ${command}`, args);
86
+ },
87
+
88
+ /**
89
+ * Log export operation
90
+ */
91
+ export(resource: string, format: string, filepath: string, count?: number): void {
92
+ writeLog('info', `Export: ${resource}`, {
93
+ format,
94
+ filepath,
95
+ count,
96
+ });
97
+ },
98
+
99
+ /**
100
+ * Get log file path
101
+ */
102
+ getLogPath(): string {
103
+ return LOG_FILE;
104
+ },
105
+ };
@@ -0,0 +1,137 @@
1
+ import { describe, test, expect } from 'bun:test';
2
+ import { formatOutput } from './output';
3
+
4
+ describe('Output utilities', () => {
5
+ describe('formatOutput', () => {
6
+ describe('json format', () => {
7
+ test('formats object as JSON', () => {
8
+ const data = { id: 1, name: 'Test' };
9
+ const result = formatOutput(data, 'json');
10
+ expect(result).toBe(JSON.stringify(data, null, 2));
11
+ });
12
+
13
+ test('formats array as JSON', () => {
14
+ const data = [{ id: 1 }, { id: 2 }];
15
+ const result = formatOutput(data, 'json');
16
+ expect(result).toBe(JSON.stringify(data, null, 2));
17
+ });
18
+
19
+ test('formats primitive as JSON', () => {
20
+ const result = formatOutput('hello', 'json');
21
+ expect(result).toBe('"hello"');
22
+ });
23
+
24
+ test('formats null as JSON', () => {
25
+ const result = formatOutput(null, 'json');
26
+ expect(result).toBe('null');
27
+ });
28
+ });
29
+
30
+ describe('table format', () => {
31
+ test('formats array of objects as table', () => {
32
+ const data = [
33
+ { id: 1, name: 'Alice' },
34
+ { id: 2, name: 'Bob' },
35
+ ];
36
+ const result = formatOutput(data, 'table');
37
+
38
+ expect(result).toContain('id');
39
+ expect(result).toContain('name');
40
+ expect(result).toContain('Alice');
41
+ expect(result).toContain('Bob');
42
+ expect(result).toContain('|');
43
+ expect(result).toContain('-');
44
+ });
45
+
46
+ test('wraps single object in array for table', () => {
47
+ const data = { id: 1, name: 'Test' };
48
+ const result = formatOutput(data, 'table');
49
+
50
+ expect(result).toContain('id');
51
+ expect(result).toContain('name');
52
+ expect(result).toContain('Test');
53
+ });
54
+
55
+ test('returns "No data" for empty array', () => {
56
+ const result = formatOutput([], 'table');
57
+ expect(result).toBe('No data');
58
+ });
59
+
60
+ test('truncates long values', () => {
61
+ const data = [{ long: 'a'.repeat(50) }];
62
+ const result = formatOutput(data, 'table');
63
+
64
+ expect(result).toContain('...');
65
+ });
66
+ });
67
+
68
+ describe('pretty format', () => {
69
+ test('formats object with color codes', () => {
70
+ const data = { id: 1, name: 'Test' };
71
+ const result = formatOutput(data, 'pretty');
72
+
73
+ expect(result).toContain('id');
74
+ expect(result).toContain('name');
75
+ expect(result).toContain('Test');
76
+ });
77
+
78
+ test('formats array with indices', () => {
79
+ const data = [{ id: 1 }, { id: 2 }];
80
+ const result = formatOutput(data, 'pretty');
81
+
82
+ expect(result).toContain('[1]');
83
+ expect(result).toContain('[2]');
84
+ });
85
+
86
+ test('handles null values', () => {
87
+ const data = { value: null };
88
+ const result = formatOutput(data, 'pretty');
89
+
90
+ expect(result).toContain('null');
91
+ });
92
+
93
+ test('handles nested objects', () => {
94
+ const data = {
95
+ user: {
96
+ name: 'Alice',
97
+ email: 'alice@example.com',
98
+ },
99
+ };
100
+ const result = formatOutput(data, 'pretty');
101
+
102
+ expect(result).toContain('user');
103
+ expect(result).toContain('name');
104
+ expect(result).toContain('Alice');
105
+ });
106
+
107
+ test('handles arrays in objects', () => {
108
+ const data = {
109
+ tags: ['urgent', 'vip', 'new'],
110
+ };
111
+ const result = formatOutput(data, 'pretty');
112
+
113
+ expect(result).toContain('tags');
114
+ expect(result).toContain('urgent');
115
+ expect(result).toContain('vip');
116
+ });
117
+
118
+ test('handles empty arrays', () => {
119
+ const data = { tags: [] };
120
+ const result = formatOutput(data, 'pretty');
121
+
122
+ expect(result).toContain('tags');
123
+ expect(result).toContain('[]');
124
+ });
125
+ });
126
+
127
+ describe('default format', () => {
128
+ test('defaults to pretty format', () => {
129
+ const data = { id: 1 };
130
+ const defaultResult = formatOutput(data);
131
+ const prettyResult = formatOutput(data, 'pretty');
132
+
133
+ expect(defaultResult).toBe(prettyResult);
134
+ });
135
+ });
136
+ });
137
+ });
@@ -0,0 +1,119 @@
1
+ import chalk from 'chalk';
2
+
3
+ export type OutputFormat = 'json' | 'table' | 'pretty';
4
+
5
+ export function formatOutput(data: unknown, format: OutputFormat = 'pretty'): string {
6
+ switch (format) {
7
+ case 'json':
8
+ return JSON.stringify(data, null, 2);
9
+ case 'table':
10
+ return formatAsTable(data);
11
+ case 'pretty':
12
+ default:
13
+ return formatPretty(data);
14
+ }
15
+ }
16
+
17
+ function formatAsTable(data: unknown): string {
18
+ if (!Array.isArray(data)) {
19
+ data = [data];
20
+ }
21
+
22
+ const items = data as Record<string, unknown>[];
23
+ if (items.length === 0) {
24
+ return 'No data';
25
+ }
26
+
27
+ const firstItem = items[0];
28
+ if (!firstItem || typeof firstItem !== 'object') {
29
+ return 'No data';
30
+ }
31
+
32
+ const keys = Object.keys(firstItem);
33
+ const colWidths = keys.map(key => {
34
+ const maxValue = Math.max(
35
+ key.length,
36
+ ...items.map(item => String(item[key] ?? '').length)
37
+ );
38
+ return Math.min(maxValue, 40);
39
+ });
40
+
41
+ const header = keys.map((key, i) => key.padEnd(colWidths[i] ?? 10)).join(' | ');
42
+ const separator = colWidths.map(w => '-'.repeat(w)).join('-+-');
43
+
44
+ const rows = items.map(item =>
45
+ keys.map((key, i) => {
46
+ const value = String(item[key] ?? '');
47
+ const width = colWidths[i] ?? 10;
48
+ return value.length > width
49
+ ? value.substring(0, width - 3) + '...'
50
+ : value.padEnd(width);
51
+ }).join(' | ')
52
+ );
53
+
54
+ return [header, separator, ...rows].join('\n');
55
+ }
56
+
57
+ function formatPretty(data: unknown): string {
58
+ if (Array.isArray(data)) {
59
+ return data.map((item, i) => `${chalk.cyan(`[${i + 1}]`)} ${formatPrettyItem(item)}`).join('\n\n');
60
+ }
61
+ return formatPrettyItem(data);
62
+ }
63
+
64
+ function formatPrettyItem(item: unknown, indent = 0): string {
65
+ if (item === null || item === undefined) {
66
+ return chalk.gray('null');
67
+ }
68
+
69
+ if (typeof item !== 'object') {
70
+ return String(item);
71
+ }
72
+
73
+ const spaces = ' '.repeat(indent);
74
+ const entries = Object.entries(item as Record<string, unknown>);
75
+
76
+ return entries
77
+ .map(([key, value]) => {
78
+ if (Array.isArray(value)) {
79
+ if (value.length === 0) {
80
+ return `${spaces}${chalk.blue(key)}: ${chalk.gray('[]')}`;
81
+ }
82
+ if (typeof value[0] === 'object') {
83
+ return `${spaces}${chalk.blue(key)}:\n${value.map(v => formatPrettyItem(v, indent + 1)).join('\n')}`;
84
+ }
85
+ return `${spaces}${chalk.blue(key)}: ${value.join(', ')}`;
86
+ }
87
+
88
+ if (typeof value === 'object' && value !== null) {
89
+ return `${spaces}${chalk.blue(key)}:\n${formatPrettyItem(value, indent + 1)}`;
90
+ }
91
+
92
+ return `${spaces}${chalk.blue(key)}: ${chalk.white(String(value))}`;
93
+ })
94
+ .join('\n');
95
+ }
96
+
97
+ export function success(message: string): void {
98
+ console.log(chalk.green('✓'), message);
99
+ }
100
+
101
+ export function error(message: string): void {
102
+ console.error(chalk.red('✗'), message);
103
+ }
104
+
105
+ export function warn(message: string): void {
106
+ console.warn(chalk.yellow('⚠'), message);
107
+ }
108
+
109
+ export function info(message: string): void {
110
+ console.log(chalk.blue('ℹ'), message);
111
+ }
112
+
113
+ export function heading(message: string): void {
114
+ console.log(chalk.bold.cyan(`\n${message}\n`));
115
+ }
116
+
117
+ export function print(data: unknown, format: OutputFormat = 'pretty'): void {
118
+ console.log(formatOutput(data, format));
119
+ }