@hasna/connectors 0.4.0 → 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 (390) hide show
  1. package/bin/index.js +176 -1
  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,637 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { Airtable } from '../api';
5
+ import {
6
+ getAccessToken,
7
+ setAccessToken,
8
+ clearConfig,
9
+ getCurrentProfile,
10
+ setCurrentProfile,
11
+ listProfiles,
12
+ createProfile,
13
+ deleteProfile,
14
+ setProfileOverride,
15
+ getConfigDir,
16
+ } from '../utils/config';
17
+ import type { Record as AirtableRecord, Field } from '../types';
18
+
19
+ const program = new Command();
20
+
21
+ // Helper to get authenticated client
22
+ function getClient(): Airtable {
23
+ const accessToken = getAccessToken();
24
+ if (!accessToken) {
25
+ console.error(chalk.red('Error: Not authenticated. Run "connect-airtable auth set <token>" first or set AIRTABLE_ACCESS_TOKEN.'));
26
+ process.exit(1);
27
+ }
28
+ return new Airtable({ accessToken });
29
+ }
30
+
31
+ // Format field type
32
+ function formatFieldType(field: Field): string {
33
+ let typeStr = field.type;
34
+ if (field.options?.linkedTableId) {
35
+ typeStr += ` -> ${field.options.linkedTableId}`;
36
+ }
37
+ return typeStr;
38
+ }
39
+
40
+ // Format record for display
41
+ function formatRecord(record: AirtableRecord): void {
42
+ console.log(`\n${chalk.bold('Record ID:')} ${chalk.cyan(record.id)}`);
43
+ console.log(`${chalk.gray('Created:')} ${record.createdTime}`);
44
+ console.log(chalk.bold('Fields:'));
45
+ for (const [key, value] of Object.entries(record.fields)) {
46
+ const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
47
+ console.log(` ${chalk.white(key)}: ${displayValue}`);
48
+ }
49
+ }
50
+
51
+ program
52
+ .name('connect-airtable')
53
+ .description('Airtable connector - Manage bases, tables, records, and views')
54
+ .version('0.0.1')
55
+ .option('--profile <name>', 'Use a specific profile')
56
+ .hook('preAction', (thisCommand) => {
57
+ const opts = thisCommand.opts();
58
+ if (opts.profile) {
59
+ setProfileOverride(opts.profile);
60
+ }
61
+ });
62
+
63
+ // ============================================
64
+ // Auth Commands
65
+ // ============================================
66
+
67
+ const authCmd = program.command('auth').description('Authentication management');
68
+
69
+ authCmd
70
+ .command('set')
71
+ .description('Set access token for the current profile')
72
+ .argument('<token>', 'Airtable personal access token or API key')
73
+ .action((token: string) => {
74
+ setAccessToken(token);
75
+ console.log(chalk.green(`Access token saved to profile "${getCurrentProfile()}"`));
76
+ });
77
+
78
+ authCmd
79
+ .command('status')
80
+ .description('Check authentication status')
81
+ .action(async () => {
82
+ const token = getAccessToken();
83
+ if (!token) {
84
+ console.log(chalk.yellow('Not authenticated'));
85
+ console.log(chalk.gray('Run "connect-airtable auth set <token>" to authenticate'));
86
+ return;
87
+ }
88
+
89
+ try {
90
+ const client = getClient();
91
+ const result = await client.listBases();
92
+ console.log(chalk.green('Authenticated'));
93
+ console.log(` Profile: ${chalk.cyan(getCurrentProfile())}`);
94
+ console.log(` Accessible Bases: ${chalk.white(result.bases.length)}`);
95
+ } catch (error) {
96
+ console.log(chalk.red('Authentication failed'));
97
+ console.error(chalk.gray(error instanceof Error ? error.message : String(error)));
98
+ }
99
+ });
100
+
101
+ authCmd
102
+ .command('clear')
103
+ .description('Clear stored credentials')
104
+ .action(() => {
105
+ clearConfig();
106
+ console.log(chalk.green('Credentials cleared'));
107
+ });
108
+
109
+ // ============================================
110
+ // Profile Commands
111
+ // ============================================
112
+
113
+ const profileCmd = program.command('profile').description('Profile management');
114
+
115
+ profileCmd
116
+ .command('list')
117
+ .description('List all profiles')
118
+ .action(() => {
119
+ const profiles = listProfiles();
120
+ const current = getCurrentProfile();
121
+
122
+ if (profiles.length === 0) {
123
+ console.log(chalk.gray('No profiles configured'));
124
+ return;
125
+ }
126
+
127
+ console.log(chalk.bold('Profiles:'));
128
+ for (const profile of profiles) {
129
+ const marker = profile === current ? chalk.green(' (active)') : '';
130
+ console.log(` ${profile}${marker}`);
131
+ }
132
+ });
133
+
134
+ profileCmd
135
+ .command('use')
136
+ .description('Switch to a profile')
137
+ .argument('<name>', 'Profile name')
138
+ .action((name: string) => {
139
+ try {
140
+ setCurrentProfile(name);
141
+ console.log(chalk.green(`Switched to profile "${name}"`));
142
+ } catch (error) {
143
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
144
+ process.exit(1);
145
+ }
146
+ });
147
+
148
+ profileCmd
149
+ .command('create')
150
+ .description('Create a new profile')
151
+ .argument('<name>', 'Profile name')
152
+ .action((name: string) => {
153
+ try {
154
+ if (createProfile(name)) {
155
+ console.log(chalk.green(`Profile "${name}" created`));
156
+ } else {
157
+ console.log(chalk.yellow(`Profile "${name}" already exists`));
158
+ }
159
+ } catch (error) {
160
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
161
+ process.exit(1);
162
+ }
163
+ });
164
+
165
+ profileCmd
166
+ .command('delete')
167
+ .description('Delete a profile')
168
+ .argument('<name>', 'Profile name')
169
+ .action((name: string) => {
170
+ if (deleteProfile(name)) {
171
+ console.log(chalk.green(`Profile "${name}" deleted`));
172
+ } else {
173
+ console.log(chalk.yellow(`Cannot delete profile "${name}" (doesn't exist or is default)`));
174
+ }
175
+ });
176
+
177
+ profileCmd
178
+ .command('show')
179
+ .description('Show current profile')
180
+ .action(() => {
181
+ console.log(`Current profile: ${chalk.cyan(getCurrentProfile())}`);
182
+ console.log(`Config directory: ${chalk.gray(getConfigDir())}`);
183
+ });
184
+
185
+ // ============================================
186
+ // Bases Commands
187
+ // ============================================
188
+
189
+ const basesCmd = program.command('bases').description('Base operations');
190
+
191
+ basesCmd
192
+ .command('list')
193
+ .description('List all accessible bases')
194
+ .action(async () => {
195
+ try {
196
+ const client = getClient();
197
+ const result = await client.listBases();
198
+
199
+ if (result.bases.length === 0) {
200
+ console.log(chalk.gray('No bases found'));
201
+ return;
202
+ }
203
+
204
+ console.log(chalk.bold(`Bases (${result.bases.length}):`));
205
+ for (const base of result.bases) {
206
+ console.log(`\n ${chalk.white(base.name)}`);
207
+ console.log(` ID: ${chalk.gray(base.id)}`);
208
+ console.log(` Permission: ${base.permissionLevel}`);
209
+ }
210
+ } catch (error) {
211
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
212
+ process.exit(1);
213
+ }
214
+ });
215
+
216
+ basesCmd
217
+ .command('schema')
218
+ .description('Get base schema (tables and fields)')
219
+ .argument('<base-id>', 'Base ID')
220
+ .action(async (baseId: string) => {
221
+ try {
222
+ const client = getClient();
223
+ const result = await client.getBaseSchema(baseId);
224
+
225
+ console.log(chalk.bold(`Tables (${result.tables.length}):`));
226
+ for (const table of result.tables) {
227
+ console.log(`\n ${chalk.blue(table.name)}`);
228
+ console.log(` ID: ${chalk.gray(table.id)}`);
229
+ if (table.description) {
230
+ console.log(` Description: ${table.description}`);
231
+ }
232
+ console.log(` Primary Field: ${table.primaryFieldId}`);
233
+
234
+ console.log(chalk.gray(' Fields:'));
235
+ for (const field of table.fields) {
236
+ console.log(` - ${chalk.white(field.name)} (${formatFieldType(field)})`);
237
+ }
238
+
239
+ if (table.views.length > 0) {
240
+ console.log(chalk.gray(' Views:'));
241
+ for (const view of table.views) {
242
+ console.log(` - ${view.name} [${view.type}]`);
243
+ }
244
+ }
245
+ }
246
+ } catch (error) {
247
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
248
+ process.exit(1);
249
+ }
250
+ });
251
+
252
+ // ============================================
253
+ // Tables Commands
254
+ // ============================================
255
+
256
+ const tablesCmd = program.command('tables').description('Table operations');
257
+
258
+ tablesCmd
259
+ .command('create')
260
+ .description('Create a table in a base')
261
+ .argument('<base-id>', 'Base ID')
262
+ .requiredOption('-n, --name <name>', 'Table name')
263
+ .option('-d, --description <description>', 'Table description')
264
+ .action(async (baseId: string, options) => {
265
+ try {
266
+ const client = getClient();
267
+ const table = await client.createTable(baseId, {
268
+ name: options.name,
269
+ description: options.description,
270
+ fields: [
271
+ { name: 'Name', type: 'singleLineText' },
272
+ ],
273
+ });
274
+ console.log(chalk.green(`Table created: ${table.name}`));
275
+ console.log(` ID: ${chalk.gray(table.id)}`);
276
+ } catch (error) {
277
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
278
+ process.exit(1);
279
+ }
280
+ });
281
+
282
+ tablesCmd
283
+ .command('update')
284
+ .description('Update table metadata')
285
+ .argument('<base-id>', 'Base ID')
286
+ .argument('<table-id>', 'Table ID')
287
+ .option('-n, --name <name>', 'New table name')
288
+ .option('-d, --description <description>', 'New description')
289
+ .action(async (baseId: string, tableId: string, options) => {
290
+ try {
291
+ const client = getClient();
292
+ const table = await client.updateTable(baseId, tableId, {
293
+ name: options.name,
294
+ description: options.description,
295
+ });
296
+ console.log(chalk.green(`Table updated: ${table.name}`));
297
+ } catch (error) {
298
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
299
+ process.exit(1);
300
+ }
301
+ });
302
+
303
+ // ============================================
304
+ // Records Commands
305
+ // ============================================
306
+
307
+ const recordsCmd = program.command('records').description('Record operations');
308
+
309
+ recordsCmd
310
+ .command('list')
311
+ .description('List records in a table')
312
+ .argument('<base-id>', 'Base ID')
313
+ .argument('<table>', 'Table ID or name')
314
+ .option('-f, --filter <formula>', 'Filter by formula')
315
+ .option('-v, --view <view>', 'View to use')
316
+ .option('--max <n>', 'Maximum records', '100')
317
+ .option('--fields <fields>', 'Comma-separated field names')
318
+ .option('--json', 'Output as JSON')
319
+ .action(async (baseId: string, table: string, options) => {
320
+ try {
321
+ const client = getClient();
322
+ const result = await client.listRecords(baseId, table, {
323
+ filterByFormula: options.filter,
324
+ view: options.view,
325
+ maxRecords: parseInt(options.max),
326
+ fields: options.fields?.split(','),
327
+ });
328
+
329
+ if (options.json) {
330
+ console.log(JSON.stringify(result.records, null, 2));
331
+ return;
332
+ }
333
+
334
+ if (result.records.length === 0) {
335
+ console.log(chalk.gray('No records found'));
336
+ return;
337
+ }
338
+
339
+ console.log(chalk.bold(`Records (${result.records.length}):`));
340
+ for (const record of result.records) {
341
+ formatRecord(record);
342
+ }
343
+
344
+ if (result.offset) {
345
+ console.log(chalk.gray(`\n... more records available (offset: ${result.offset})`));
346
+ }
347
+ } catch (error) {
348
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
349
+ process.exit(1);
350
+ }
351
+ });
352
+
353
+ recordsCmd
354
+ .command('get')
355
+ .description('Get a single record')
356
+ .argument('<base-id>', 'Base ID')
357
+ .argument('<table>', 'Table ID or name')
358
+ .argument('<record-id>', 'Record ID')
359
+ .option('--json', 'Output as JSON')
360
+ .action(async (baseId: string, table: string, recordId: string, options) => {
361
+ try {
362
+ const client = getClient();
363
+ const record = await client.getRecord(baseId, table, recordId);
364
+
365
+ if (options.json) {
366
+ console.log(JSON.stringify(record, null, 2));
367
+ return;
368
+ }
369
+
370
+ formatRecord(record);
371
+ } catch (error) {
372
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
373
+ process.exit(1);
374
+ }
375
+ });
376
+
377
+ recordsCmd
378
+ .command('create')
379
+ .description('Create a record')
380
+ .argument('<base-id>', 'Base ID')
381
+ .argument('<table>', 'Table ID or name')
382
+ .requiredOption('-d, --data <json>', 'Field data as JSON')
383
+ .option('--typecast', 'Enable typecast for automatic field conversion')
384
+ .action(async (baseId: string, table: string, options) => {
385
+ try {
386
+ const fields = JSON.parse(options.data);
387
+ const client = getClient();
388
+ const record = await client.createRecord(baseId, table, fields, {
389
+ typecast: options.typecast,
390
+ });
391
+ console.log(chalk.green(`Record created: ${record.id}`));
392
+ formatRecord(record as AirtableRecord);
393
+ } catch (error) {
394
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
395
+ process.exit(1);
396
+ }
397
+ });
398
+
399
+ recordsCmd
400
+ .command('update')
401
+ .description('Update a record')
402
+ .argument('<base-id>', 'Base ID')
403
+ .argument('<table>', 'Table ID or name')
404
+ .argument('<record-id>', 'Record ID')
405
+ .requiredOption('-d, --data <json>', 'Field data as JSON')
406
+ .option('--typecast', 'Enable typecast for automatic field conversion')
407
+ .action(async (baseId: string, table: string, recordId: string, options) => {
408
+ try {
409
+ const fields = JSON.parse(options.data);
410
+ const client = getClient();
411
+ const record = await client.updateRecord(baseId, table, recordId, fields, {
412
+ typecast: options.typecast,
413
+ });
414
+ console.log(chalk.green(`Record updated: ${record.id}`));
415
+ formatRecord(record as AirtableRecord);
416
+ } catch (error) {
417
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
418
+ process.exit(1);
419
+ }
420
+ });
421
+
422
+ recordsCmd
423
+ .command('delete')
424
+ .description('Delete a record')
425
+ .argument('<base-id>', 'Base ID')
426
+ .argument('<table>', 'Table ID or name')
427
+ .argument('<record-id>', 'Record ID')
428
+ .action(async (baseId: string, table: string, recordId: string) => {
429
+ try {
430
+ const client = getClient();
431
+ const result = await client.deleteRecord(baseId, table, recordId);
432
+ console.log(chalk.green(`Record deleted: ${result.id}`));
433
+ } catch (error) {
434
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
435
+ process.exit(1);
436
+ }
437
+ });
438
+
439
+ // ============================================
440
+ // Fields Commands
441
+ // ============================================
442
+
443
+ const fieldsCmd = program.command('fields').description('Field operations');
444
+
445
+ fieldsCmd
446
+ .command('create')
447
+ .description('Create a field in a table')
448
+ .argument('<base-id>', 'Base ID')
449
+ .argument('<table-id>', 'Table ID')
450
+ .requiredOption('-n, --name <name>', 'Field name')
451
+ .requiredOption('-t, --type <type>', 'Field type')
452
+ .option('-d, --description <description>', 'Field description')
453
+ .option('--options <json>', 'Field options as JSON')
454
+ .action(async (baseId: string, tableId: string, options) => {
455
+ try {
456
+ const client = getClient();
457
+ const field = await client.createField(baseId, tableId, {
458
+ name: options.name,
459
+ type: options.type,
460
+ description: options.description,
461
+ options: options.options ? JSON.parse(options.options) : undefined,
462
+ });
463
+ console.log(chalk.green(`Field created: ${field.name}`));
464
+ console.log(` ID: ${chalk.gray(field.id)}`);
465
+ console.log(` Type: ${field.type}`);
466
+ } catch (error) {
467
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
468
+ process.exit(1);
469
+ }
470
+ });
471
+
472
+ fieldsCmd
473
+ .command('update')
474
+ .description('Update a field')
475
+ .argument('<base-id>', 'Base ID')
476
+ .argument('<table-id>', 'Table ID')
477
+ .argument('<field-id>', 'Field ID')
478
+ .option('-n, --name <name>', 'New field name')
479
+ .option('-d, --description <description>', 'New description')
480
+ .action(async (baseId: string, tableId: string, fieldId: string, options) => {
481
+ try {
482
+ const client = getClient();
483
+ const field = await client.updateField(baseId, tableId, fieldId, {
484
+ name: options.name,
485
+ description: options.description,
486
+ });
487
+ console.log(chalk.green(`Field updated: ${field.name}`));
488
+ } catch (error) {
489
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
490
+ process.exit(1);
491
+ }
492
+ });
493
+
494
+ // ============================================
495
+ // Comments Commands
496
+ // ============================================
497
+
498
+ const commentsCmd = program.command('comments').description('Comment operations');
499
+
500
+ commentsCmd
501
+ .command('list')
502
+ .description('List comments on a record')
503
+ .argument('<base-id>', 'Base ID')
504
+ .argument('<table>', 'Table ID or name')
505
+ .argument('<record-id>', 'Record ID')
506
+ .action(async (baseId: string, table: string, recordId: string) => {
507
+ try {
508
+ const client = getClient();
509
+ const result = await client.listComments(baseId, table, recordId);
510
+
511
+ if (result.comments.length === 0) {
512
+ console.log(chalk.gray('No comments'));
513
+ return;
514
+ }
515
+
516
+ console.log(chalk.bold(`Comments (${result.comments.length}):`));
517
+ for (const comment of result.comments) {
518
+ console.log(`\n ${chalk.white(comment.author.name || comment.author.email)}`);
519
+ console.log(` ${chalk.gray(comment.createdTime)}`);
520
+ console.log(` ${comment.text}`);
521
+ }
522
+ } catch (error) {
523
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
524
+ process.exit(1);
525
+ }
526
+ });
527
+
528
+ commentsCmd
529
+ .command('create')
530
+ .description('Create a comment on a record')
531
+ .argument('<base-id>', 'Base ID')
532
+ .argument('<table>', 'Table ID or name')
533
+ .argument('<record-id>', 'Record ID')
534
+ .argument('<text>', 'Comment text')
535
+ .action(async (baseId: string, table: string, recordId: string, text: string) => {
536
+ try {
537
+ const client = getClient();
538
+ const comment = await client.createComment(baseId, table, recordId, text);
539
+ console.log(chalk.green('Comment created'));
540
+ console.log(` ID: ${chalk.gray(comment.id)}`);
541
+ } catch (error) {
542
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
543
+ process.exit(1);
544
+ }
545
+ });
546
+
547
+ commentsCmd
548
+ .command('delete')
549
+ .description('Delete a comment')
550
+ .argument('<base-id>', 'Base ID')
551
+ .argument('<table>', 'Table ID or name')
552
+ .argument('<record-id>', 'Record ID')
553
+ .argument('<comment-id>', 'Comment ID')
554
+ .action(async (baseId: string, table: string, recordId: string, commentId: string) => {
555
+ try {
556
+ const client = getClient();
557
+ await client.deleteComment(baseId, table, recordId, commentId);
558
+ console.log(chalk.green('Comment deleted'));
559
+ } catch (error) {
560
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
561
+ process.exit(1);
562
+ }
563
+ });
564
+
565
+ // ============================================
566
+ // Webhooks Commands
567
+ // ============================================
568
+
569
+ const webhooksCmd = program.command('webhooks').description('Webhook operations');
570
+
571
+ webhooksCmd
572
+ .command('list')
573
+ .description('List webhooks for a base')
574
+ .argument('<base-id>', 'Base ID')
575
+ .action(async (baseId: string) => {
576
+ try {
577
+ const client = getClient();
578
+ const result = await client.listWebhooks(baseId);
579
+
580
+ if (result.webhooks.length === 0) {
581
+ console.log(chalk.gray('No webhooks'));
582
+ return;
583
+ }
584
+
585
+ console.log(chalk.bold(`Webhooks (${result.webhooks.length}):`));
586
+ for (const webhook of result.webhooks) {
587
+ console.log(`\n ID: ${chalk.white(webhook.id)}`);
588
+ console.log(` Enabled: ${webhook.isHookEnabled ? chalk.green('Yes') : chalk.red('No')}`);
589
+ console.log(` Notifications: ${webhook.areNotificationsEnabled ? chalk.green('Yes') : chalk.red('No')}`);
590
+ if (webhook.notificationUrl) {
591
+ console.log(` URL: ${webhook.notificationUrl}`);
592
+ }
593
+ if (webhook.expirationTime) {
594
+ console.log(` Expires: ${webhook.expirationTime}`);
595
+ }
596
+ }
597
+ } catch (error) {
598
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
599
+ process.exit(1);
600
+ }
601
+ });
602
+
603
+ webhooksCmd
604
+ .command('delete')
605
+ .description('Delete a webhook')
606
+ .argument('<base-id>', 'Base ID')
607
+ .argument('<webhook-id>', 'Webhook ID')
608
+ .action(async (baseId: string, webhookId: string) => {
609
+ try {
610
+ const client = getClient();
611
+ await client.deleteWebhook(baseId, webhookId);
612
+ console.log(chalk.green('Webhook deleted'));
613
+ } catch (error) {
614
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
615
+ process.exit(1);
616
+ }
617
+ });
618
+
619
+ webhooksCmd
620
+ .command('refresh')
621
+ .description('Refresh a webhook (extend expiration)')
622
+ .argument('<base-id>', 'Base ID')
623
+ .argument('<webhook-id>', 'Webhook ID')
624
+ .action(async (baseId: string, webhookId: string) => {
625
+ try {
626
+ const client = getClient();
627
+ const result = await client.refreshWebhook(baseId, webhookId);
628
+ console.log(chalk.green('Webhook refreshed'));
629
+ console.log(` New expiration: ${result.expirationTime}`);
630
+ } catch (error) {
631
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
632
+ process.exit(1);
633
+ }
634
+ });
635
+
636
+ // Parse and execute
637
+ program.parse();
@@ -0,0 +1,20 @@
1
+ // Airtable Connector
2
+ // A TypeScript wrapper for the Airtable API
3
+
4
+ export { Airtable } from './api';
5
+ export { AirtableClient } from './api/client';
6
+ export * from './types';
7
+
8
+ // Export config utilities
9
+ export {
10
+ getAccessToken,
11
+ setAccessToken,
12
+ getCurrentProfile,
13
+ setCurrentProfile,
14
+ listProfiles,
15
+ createProfile,
16
+ deleteProfile,
17
+ loadProfile,
18
+ saveProfile,
19
+ clearConfig,
20
+ } from './utils/config';