@hasna/connectors 0.9.3 → 1.0.0

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 (596) hide show
  1. package/bin/index.js +239 -1
  2. package/bin/mcp.js +239 -1
  3. package/bin/serve.js +238 -0
  4. package/connectors/connect-focuster/.env.example +11 -0
  5. package/connectors/connect-focuster/CLAUDE.md +272 -0
  6. package/connectors/connect-focuster/README.md +193 -0
  7. package/connectors/connect-focuster/package.json +49 -0
  8. package/connectors/connect-focuster/src/api/client.ts +213 -0
  9. package/connectors/connect-focuster/src/api/example.ts +48 -0
  10. package/connectors/connect-focuster/src/api/index.ts +51 -0
  11. package/connectors/connect-focuster/src/cli/index.ts +254 -0
  12. package/connectors/connect-focuster/src/index.ts +103 -0
  13. package/connectors/connect-focuster/src/types/index.ts +237 -0
  14. package/connectors/connect-focuster/src/utils/auth.ts +274 -0
  15. package/connectors/connect-focuster/src/utils/bulk.ts +212 -0
  16. package/connectors/connect-focuster/src/utils/config.ts +326 -0
  17. package/connectors/connect-focuster/src/utils/output.ts +175 -0
  18. package/connectors/connect-focuster/src/utils/settings.ts +114 -0
  19. package/connectors/connect-focuster/src/utils/storage.ts +198 -0
  20. package/connectors/connect-focuster/tsconfig.json +16 -0
  21. package/connectors/connect-formcarry/.env.example +11 -0
  22. package/connectors/connect-formcarry/CLAUDE.md +272 -0
  23. package/connectors/connect-formcarry/README.md +193 -0
  24. package/connectors/connect-formcarry/package.json +49 -0
  25. package/connectors/connect-formcarry/src/api/client.ts +213 -0
  26. package/connectors/connect-formcarry/src/api/example.ts +48 -0
  27. package/connectors/connect-formcarry/src/api/index.ts +51 -0
  28. package/connectors/connect-formcarry/src/cli/index.ts +254 -0
  29. package/connectors/connect-formcarry/src/index.ts +103 -0
  30. package/connectors/connect-formcarry/src/types/index.ts +237 -0
  31. package/connectors/connect-formcarry/src/utils/auth.ts +274 -0
  32. package/connectors/connect-formcarry/src/utils/bulk.ts +212 -0
  33. package/connectors/connect-formcarry/src/utils/config.ts +326 -0
  34. package/connectors/connect-formcarry/src/utils/output.ts +175 -0
  35. package/connectors/connect-formcarry/src/utils/settings.ts +114 -0
  36. package/connectors/connect-formcarry/src/utils/storage.ts +198 -0
  37. package/connectors/connect-formcarry/tsconfig.json +16 -0
  38. package/connectors/connect-formdesk/.env.example +11 -0
  39. package/connectors/connect-formdesk/CLAUDE.md +272 -0
  40. package/connectors/connect-formdesk/README.md +193 -0
  41. package/connectors/connect-formdesk/package.json +49 -0
  42. package/connectors/connect-formdesk/src/api/client.ts +213 -0
  43. package/connectors/connect-formdesk/src/api/example.ts +48 -0
  44. package/connectors/connect-formdesk/src/api/index.ts +51 -0
  45. package/connectors/connect-formdesk/src/cli/index.ts +254 -0
  46. package/connectors/connect-formdesk/src/index.ts +103 -0
  47. package/connectors/connect-formdesk/src/types/index.ts +237 -0
  48. package/connectors/connect-formdesk/src/utils/auth.ts +274 -0
  49. package/connectors/connect-formdesk/src/utils/bulk.ts +212 -0
  50. package/connectors/connect-formdesk/src/utils/config.ts +326 -0
  51. package/connectors/connect-formdesk/src/utils/output.ts +175 -0
  52. package/connectors/connect-formdesk/src/utils/settings.ts +114 -0
  53. package/connectors/connect-formdesk/src/utils/storage.ts +198 -0
  54. package/connectors/connect-formdesk/tsconfig.json +16 -0
  55. package/connectors/connect-formsite/.env.example +11 -0
  56. package/connectors/connect-formsite/CLAUDE.md +272 -0
  57. package/connectors/connect-formsite/README.md +193 -0
  58. package/connectors/connect-formsite/package.json +49 -0
  59. package/connectors/connect-formsite/src/api/client.ts +213 -0
  60. package/connectors/connect-formsite/src/api/example.ts +48 -0
  61. package/connectors/connect-formsite/src/api/index.ts +51 -0
  62. package/connectors/connect-formsite/src/cli/index.ts +254 -0
  63. package/connectors/connect-formsite/src/index.ts +103 -0
  64. package/connectors/connect-formsite/src/types/index.ts +237 -0
  65. package/connectors/connect-formsite/src/utils/auth.ts +274 -0
  66. package/connectors/connect-formsite/src/utils/bulk.ts +212 -0
  67. package/connectors/connect-formsite/src/utils/config.ts +326 -0
  68. package/connectors/connect-formsite/src/utils/output.ts +175 -0
  69. package/connectors/connect-formsite/src/utils/settings.ts +114 -0
  70. package/connectors/connect-formsite/src/utils/storage.ts +198 -0
  71. package/connectors/connect-formsite/tsconfig.json +16 -0
  72. package/connectors/connect-formsonfire/.env.example +11 -0
  73. package/connectors/connect-formsonfire/CLAUDE.md +272 -0
  74. package/connectors/connect-formsonfire/README.md +193 -0
  75. package/connectors/connect-formsonfire/package.json +49 -0
  76. package/connectors/connect-formsonfire/src/api/client.ts +213 -0
  77. package/connectors/connect-formsonfire/src/api/example.ts +48 -0
  78. package/connectors/connect-formsonfire/src/api/index.ts +51 -0
  79. package/connectors/connect-formsonfire/src/cli/index.ts +254 -0
  80. package/connectors/connect-formsonfire/src/index.ts +103 -0
  81. package/connectors/connect-formsonfire/src/types/index.ts +237 -0
  82. package/connectors/connect-formsonfire/src/utils/auth.ts +274 -0
  83. package/connectors/connect-formsonfire/src/utils/bulk.ts +212 -0
  84. package/connectors/connect-formsonfire/src/utils/config.ts +326 -0
  85. package/connectors/connect-formsonfire/src/utils/output.ts +175 -0
  86. package/connectors/connect-formsonfire/src/utils/settings.ts +114 -0
  87. package/connectors/connect-formsonfire/src/utils/storage.ts +198 -0
  88. package/connectors/connect-formsonfire/tsconfig.json +16 -0
  89. package/connectors/connect-formstackdocuments/.env.example +11 -0
  90. package/connectors/connect-formstackdocuments/CLAUDE.md +272 -0
  91. package/connectors/connect-formstackdocuments/README.md +193 -0
  92. package/connectors/connect-formstackdocuments/package.json +49 -0
  93. package/connectors/connect-formstackdocuments/src/api/client.ts +213 -0
  94. package/connectors/connect-formstackdocuments/src/api/example.ts +48 -0
  95. package/connectors/connect-formstackdocuments/src/api/index.ts +51 -0
  96. package/connectors/connect-formstackdocuments/src/cli/index.ts +254 -0
  97. package/connectors/connect-formstackdocuments/src/index.ts +103 -0
  98. package/connectors/connect-formstackdocuments/src/types/index.ts +237 -0
  99. package/connectors/connect-formstackdocuments/src/utils/auth.ts +274 -0
  100. package/connectors/connect-formstackdocuments/src/utils/bulk.ts +212 -0
  101. package/connectors/connect-formstackdocuments/src/utils/config.ts +326 -0
  102. package/connectors/connect-formstackdocuments/src/utils/output.ts +175 -0
  103. package/connectors/connect-formstackdocuments/src/utils/settings.ts +114 -0
  104. package/connectors/connect-formstackdocuments/src/utils/storage.ts +198 -0
  105. package/connectors/connect-formstackdocuments/tsconfig.json +16 -0
  106. package/connectors/connect-fortinetfortigate/.env.example +11 -0
  107. package/connectors/connect-fortinetfortigate/CLAUDE.md +272 -0
  108. package/connectors/connect-fortinetfortigate/README.md +193 -0
  109. package/connectors/connect-fortinetfortigate/package.json +49 -0
  110. package/connectors/connect-fortinetfortigate/src/api/client.ts +213 -0
  111. package/connectors/connect-fortinetfortigate/src/api/example.ts +48 -0
  112. package/connectors/connect-fortinetfortigate/src/api/index.ts +51 -0
  113. package/connectors/connect-fortinetfortigate/src/cli/index.ts +254 -0
  114. package/connectors/connect-fortinetfortigate/src/index.ts +103 -0
  115. package/connectors/connect-fortinetfortigate/src/types/index.ts +237 -0
  116. package/connectors/connect-fortinetfortigate/src/utils/auth.ts +274 -0
  117. package/connectors/connect-fortinetfortigate/src/utils/bulk.ts +212 -0
  118. package/connectors/connect-fortinetfortigate/src/utils/config.ts +326 -0
  119. package/connectors/connect-fortinetfortigate/src/utils/output.ts +175 -0
  120. package/connectors/connect-fortinetfortigate/src/utils/settings.ts +114 -0
  121. package/connectors/connect-fortinetfortigate/src/utils/storage.ts +198 -0
  122. package/connectors/connect-fortinetfortigate/tsconfig.json +16 -0
  123. package/connectors/connect-foursquare/.env.example +11 -0
  124. package/connectors/connect-foursquare/CLAUDE.md +272 -0
  125. package/connectors/connect-foursquare/README.md +193 -0
  126. package/connectors/connect-foursquare/package.json +49 -0
  127. package/connectors/connect-foursquare/src/api/client.ts +213 -0
  128. package/connectors/connect-foursquare/src/api/example.ts +48 -0
  129. package/connectors/connect-foursquare/src/api/index.ts +51 -0
  130. package/connectors/connect-foursquare/src/cli/index.ts +254 -0
  131. package/connectors/connect-foursquare/src/index.ts +103 -0
  132. package/connectors/connect-foursquare/src/types/index.ts +237 -0
  133. package/connectors/connect-foursquare/src/utils/auth.ts +274 -0
  134. package/connectors/connect-foursquare/src/utils/bulk.ts +212 -0
  135. package/connectors/connect-foursquare/src/utils/config.ts +326 -0
  136. package/connectors/connect-foursquare/src/utils/output.ts +175 -0
  137. package/connectors/connect-foursquare/src/utils/settings.ts +114 -0
  138. package/connectors/connect-foursquare/src/utils/storage.ts +198 -0
  139. package/connectors/connect-foursquare/tsconfig.json +16 -0
  140. package/connectors/connect-freedictionary/.env.example +11 -0
  141. package/connectors/connect-freedictionary/CLAUDE.md +272 -0
  142. package/connectors/connect-freedictionary/README.md +193 -0
  143. package/connectors/connect-freedictionary/package.json +49 -0
  144. package/connectors/connect-freedictionary/src/api/client.ts +213 -0
  145. package/connectors/connect-freedictionary/src/api/example.ts +48 -0
  146. package/connectors/connect-freedictionary/src/api/index.ts +51 -0
  147. package/connectors/connect-freedictionary/src/cli/index.ts +254 -0
  148. package/connectors/connect-freedictionary/src/index.ts +103 -0
  149. package/connectors/connect-freedictionary/src/types/index.ts +237 -0
  150. package/connectors/connect-freedictionary/src/utils/auth.ts +274 -0
  151. package/connectors/connect-freedictionary/src/utils/bulk.ts +212 -0
  152. package/connectors/connect-freedictionary/src/utils/config.ts +326 -0
  153. package/connectors/connect-freedictionary/src/utils/output.ts +175 -0
  154. package/connectors/connect-freedictionary/src/utils/settings.ts +114 -0
  155. package/connectors/connect-freedictionary/src/utils/storage.ts +198 -0
  156. package/connectors/connect-freedictionary/tsconfig.json +16 -0
  157. package/connectors/connect-freshping/.env.example +11 -0
  158. package/connectors/connect-freshping/CLAUDE.md +272 -0
  159. package/connectors/connect-freshping/README.md +193 -0
  160. package/connectors/connect-freshping/package.json +49 -0
  161. package/connectors/connect-freshping/src/api/client.ts +213 -0
  162. package/connectors/connect-freshping/src/api/example.ts +48 -0
  163. package/connectors/connect-freshping/src/api/index.ts +51 -0
  164. package/connectors/connect-freshping/src/cli/index.ts +254 -0
  165. package/connectors/connect-freshping/src/index.ts +103 -0
  166. package/connectors/connect-freshping/src/types/index.ts +237 -0
  167. package/connectors/connect-freshping/src/utils/auth.ts +274 -0
  168. package/connectors/connect-freshping/src/utils/bulk.ts +212 -0
  169. package/connectors/connect-freshping/src/utils/config.ts +326 -0
  170. package/connectors/connect-freshping/src/utils/output.ts +175 -0
  171. package/connectors/connect-freshping/src/utils/settings.ts +114 -0
  172. package/connectors/connect-freshping/src/utils/storage.ts +198 -0
  173. package/connectors/connect-freshping/tsconfig.json +16 -0
  174. package/connectors/connect-freshservice/.env.example +11 -0
  175. package/connectors/connect-freshservice/CLAUDE.md +272 -0
  176. package/connectors/connect-freshservice/README.md +193 -0
  177. package/connectors/connect-freshservice/package.json +51 -0
  178. package/connectors/connect-freshservice/scripts/release.ts +179 -0
  179. package/connectors/connect-freshservice/src/api/client.ts +213 -0
  180. package/connectors/connect-freshservice/src/api/example.ts +48 -0
  181. package/connectors/connect-freshservice/src/api/index.ts +51 -0
  182. package/connectors/connect-freshservice/src/cli/index.ts +254 -0
  183. package/connectors/connect-freshservice/src/index.ts +103 -0
  184. package/connectors/connect-freshservice/src/types/index.ts +237 -0
  185. package/connectors/connect-freshservice/src/utils/auth.ts +274 -0
  186. package/connectors/connect-freshservice/src/utils/bulk.ts +212 -0
  187. package/connectors/connect-freshservice/src/utils/config.ts +326 -0
  188. package/connectors/connect-freshservice/src/utils/output.ts +175 -0
  189. package/connectors/connect-freshservice/src/utils/settings.ts +114 -0
  190. package/connectors/connect-freshservice/src/utils/storage.ts +198 -0
  191. package/connectors/connect-freshservice/tsconfig.json +16 -0
  192. package/connectors/connect-freshworkscrm/.env.example +11 -0
  193. package/connectors/connect-freshworkscrm/CLAUDE.md +272 -0
  194. package/connectors/connect-freshworkscrm/README.md +193 -0
  195. package/connectors/connect-freshworkscrm/package.json +51 -0
  196. package/connectors/connect-freshworkscrm/scripts/release.ts +179 -0
  197. package/connectors/connect-freshworkscrm/src/api/client.ts +213 -0
  198. package/connectors/connect-freshworkscrm/src/api/example.ts +48 -0
  199. package/connectors/connect-freshworkscrm/src/api/index.ts +51 -0
  200. package/connectors/connect-freshworkscrm/src/cli/index.ts +254 -0
  201. package/connectors/connect-freshworkscrm/src/index.ts +103 -0
  202. package/connectors/connect-freshworkscrm/src/types/index.ts +237 -0
  203. package/connectors/connect-freshworkscrm/src/utils/auth.ts +274 -0
  204. package/connectors/connect-freshworkscrm/src/utils/bulk.ts +212 -0
  205. package/connectors/connect-freshworkscrm/src/utils/config.ts +326 -0
  206. package/connectors/connect-freshworkscrm/src/utils/output.ts +175 -0
  207. package/connectors/connect-freshworkscrm/src/utils/settings.ts +114 -0
  208. package/connectors/connect-freshworkscrm/src/utils/storage.ts +198 -0
  209. package/connectors/connect-freshworkscrm/tsconfig.json +16 -0
  210. package/connectors/connect-fullcontact/.env.example +11 -0
  211. package/connectors/connect-fullcontact/CLAUDE.md +272 -0
  212. package/connectors/connect-fullcontact/README.md +193 -0
  213. package/connectors/connect-fullcontact/package.json +51 -0
  214. package/connectors/connect-fullcontact/scripts/release.ts +179 -0
  215. package/connectors/connect-fullcontact/src/api/client.ts +213 -0
  216. package/connectors/connect-fullcontact/src/api/example.ts +48 -0
  217. package/connectors/connect-fullcontact/src/api/index.ts +51 -0
  218. package/connectors/connect-fullcontact/src/cli/index.ts +254 -0
  219. package/connectors/connect-fullcontact/src/index.ts +103 -0
  220. package/connectors/connect-fullcontact/src/types/index.ts +237 -0
  221. package/connectors/connect-fullcontact/src/utils/auth.ts +274 -0
  222. package/connectors/connect-fullcontact/src/utils/bulk.ts +212 -0
  223. package/connectors/connect-fullcontact/src/utils/config.ts +326 -0
  224. package/connectors/connect-fullcontact/src/utils/output.ts +175 -0
  225. package/connectors/connect-fullcontact/src/utils/settings.ts +114 -0
  226. package/connectors/connect-fullcontact/src/utils/storage.ts +198 -0
  227. package/connectors/connect-fullcontact/tsconfig.json +16 -0
  228. package/connectors/connect-fusioo/.env.example +11 -0
  229. package/connectors/connect-fusioo/CLAUDE.md +272 -0
  230. package/connectors/connect-fusioo/README.md +193 -0
  231. package/connectors/connect-fusioo/package.json +51 -0
  232. package/connectors/connect-fusioo/scripts/release.ts +179 -0
  233. package/connectors/connect-fusioo/src/api/client.ts +213 -0
  234. package/connectors/connect-fusioo/src/api/example.ts +48 -0
  235. package/connectors/connect-fusioo/src/api/index.ts +51 -0
  236. package/connectors/connect-fusioo/src/cli/index.ts +254 -0
  237. package/connectors/connect-fusioo/src/index.ts +103 -0
  238. package/connectors/connect-fusioo/src/types/index.ts +237 -0
  239. package/connectors/connect-fusioo/src/utils/auth.ts +274 -0
  240. package/connectors/connect-fusioo/src/utils/bulk.ts +212 -0
  241. package/connectors/connect-fusioo/src/utils/config.ts +326 -0
  242. package/connectors/connect-fusioo/src/utils/output.ts +175 -0
  243. package/connectors/connect-fusioo/src/utils/settings.ts +114 -0
  244. package/connectors/connect-fusioo/src/utils/storage.ts +198 -0
  245. package/connectors/connect-fusioo/tsconfig.json +16 -0
  246. package/connectors/connect-gali/.env.example +11 -0
  247. package/connectors/connect-gali/CLAUDE.md +272 -0
  248. package/connectors/connect-gali/README.md +193 -0
  249. package/connectors/connect-gali/package.json +51 -0
  250. package/connectors/connect-gali/scripts/release.ts +179 -0
  251. package/connectors/connect-gali/src/api/client.ts +213 -0
  252. package/connectors/connect-gali/src/api/example.ts +48 -0
  253. package/connectors/connect-gali/src/api/index.ts +51 -0
  254. package/connectors/connect-gali/src/cli/index.ts +254 -0
  255. package/connectors/connect-gali/src/index.ts +103 -0
  256. package/connectors/connect-gali/src/types/index.ts +237 -0
  257. package/connectors/connect-gali/src/utils/auth.ts +274 -0
  258. package/connectors/connect-gali/src/utils/bulk.ts +212 -0
  259. package/connectors/connect-gali/src/utils/config.ts +326 -0
  260. package/connectors/connect-gali/src/utils/output.ts +175 -0
  261. package/connectors/connect-gali/src/utils/settings.ts +114 -0
  262. package/connectors/connect-gali/src/utils/storage.ts +198 -0
  263. package/connectors/connect-gali/tsconfig.json +16 -0
  264. package/connectors/connect-gatekeeper/.env.example +11 -0
  265. package/connectors/connect-gatekeeper/CLAUDE.md +272 -0
  266. package/connectors/connect-gatekeeper/README.md +193 -0
  267. package/connectors/connect-gatekeeper/package.json +51 -0
  268. package/connectors/connect-gatekeeper/scripts/release.ts +179 -0
  269. package/connectors/connect-gatekeeper/src/api/client.ts +213 -0
  270. package/connectors/connect-gatekeeper/src/api/example.ts +48 -0
  271. package/connectors/connect-gatekeeper/src/api/index.ts +51 -0
  272. package/connectors/connect-gatekeeper/src/cli/index.ts +254 -0
  273. package/connectors/connect-gatekeeper/src/index.ts +103 -0
  274. package/connectors/connect-gatekeeper/src/types/index.ts +237 -0
  275. package/connectors/connect-gatekeeper/src/utils/auth.ts +274 -0
  276. package/connectors/connect-gatekeeper/src/utils/bulk.ts +212 -0
  277. package/connectors/connect-gatekeeper/src/utils/config.ts +326 -0
  278. package/connectors/connect-gatekeeper/src/utils/output.ts +175 -0
  279. package/connectors/connect-gatekeeper/src/utils/settings.ts +114 -0
  280. package/connectors/connect-gatekeeper/src/utils/storage.ts +198 -0
  281. package/connectors/connect-gatekeeper/tsconfig.json +16 -0
  282. package/connectors/connect-genderapi/.env.example +11 -0
  283. package/connectors/connect-genderapi/CLAUDE.md +272 -0
  284. package/connectors/connect-genderapi/README.md +193 -0
  285. package/connectors/connect-genderapi/package.json +51 -0
  286. package/connectors/connect-genderapi/scripts/release.ts +179 -0
  287. package/connectors/connect-genderapi/src/api/client.ts +213 -0
  288. package/connectors/connect-genderapi/src/api/example.ts +48 -0
  289. package/connectors/connect-genderapi/src/api/index.ts +51 -0
  290. package/connectors/connect-genderapi/src/cli/index.ts +254 -0
  291. package/connectors/connect-genderapi/src/index.ts +103 -0
  292. package/connectors/connect-genderapi/src/types/index.ts +237 -0
  293. package/connectors/connect-genderapi/src/utils/auth.ts +274 -0
  294. package/connectors/connect-genderapi/src/utils/bulk.ts +212 -0
  295. package/connectors/connect-genderapi/src/utils/config.ts +326 -0
  296. package/connectors/connect-genderapi/src/utils/output.ts +175 -0
  297. package/connectors/connect-genderapi/src/utils/settings.ts +114 -0
  298. package/connectors/connect-genderapi/src/utils/storage.ts +198 -0
  299. package/connectors/connect-genderapi/tsconfig.json +16 -0
  300. package/connectors/connect-getresponse/.env.example +11 -0
  301. package/connectors/connect-getresponse/CLAUDE.md +272 -0
  302. package/connectors/connect-getresponse/README.md +193 -0
  303. package/connectors/connect-getresponse/package.json +51 -0
  304. package/connectors/connect-getresponse/scripts/release.ts +179 -0
  305. package/connectors/connect-getresponse/src/api/client.ts +213 -0
  306. package/connectors/connect-getresponse/src/api/example.ts +48 -0
  307. package/connectors/connect-getresponse/src/api/index.ts +51 -0
  308. package/connectors/connect-getresponse/src/cli/index.ts +254 -0
  309. package/connectors/connect-getresponse/src/index.ts +103 -0
  310. package/connectors/connect-getresponse/src/types/index.ts +237 -0
  311. package/connectors/connect-getresponse/src/utils/auth.ts +274 -0
  312. package/connectors/connect-getresponse/src/utils/bulk.ts +212 -0
  313. package/connectors/connect-getresponse/src/utils/config.ts +326 -0
  314. package/connectors/connect-getresponse/src/utils/output.ts +175 -0
  315. package/connectors/connect-getresponse/src/utils/settings.ts +114 -0
  316. package/connectors/connect-getresponse/src/utils/storage.ts +198 -0
  317. package/connectors/connect-getresponse/tsconfig.json +16 -0
  318. package/connectors/connect-getscreenshot/.env.example +11 -0
  319. package/connectors/connect-getscreenshot/CLAUDE.md +272 -0
  320. package/connectors/connect-getscreenshot/README.md +193 -0
  321. package/connectors/connect-getscreenshot/package.json +51 -0
  322. package/connectors/connect-getscreenshot/scripts/release.ts +179 -0
  323. package/connectors/connect-getscreenshot/src/api/client.ts +213 -0
  324. package/connectors/connect-getscreenshot/src/api/example.ts +48 -0
  325. package/connectors/connect-getscreenshot/src/api/index.ts +51 -0
  326. package/connectors/connect-getscreenshot/src/cli/index.ts +254 -0
  327. package/connectors/connect-getscreenshot/src/index.ts +103 -0
  328. package/connectors/connect-getscreenshot/src/types/index.ts +237 -0
  329. package/connectors/connect-getscreenshot/src/utils/auth.ts +274 -0
  330. package/connectors/connect-getscreenshot/src/utils/bulk.ts +212 -0
  331. package/connectors/connect-getscreenshot/src/utils/config.ts +326 -0
  332. package/connectors/connect-getscreenshot/src/utils/output.ts +175 -0
  333. package/connectors/connect-getscreenshot/src/utils/settings.ts +114 -0
  334. package/connectors/connect-getscreenshot/src/utils/storage.ts +198 -0
  335. package/connectors/connect-getscreenshot/tsconfig.json +16 -0
  336. package/connectors/connect-ghost/.env.example +11 -0
  337. package/connectors/connect-ghost/CLAUDE.md +272 -0
  338. package/connectors/connect-ghost/README.md +193 -0
  339. package/connectors/connect-ghost/package.json +51 -0
  340. package/connectors/connect-ghost/scripts/release.ts +179 -0
  341. package/connectors/connect-ghost/src/api/client.ts +213 -0
  342. package/connectors/connect-ghost/src/api/example.ts +48 -0
  343. package/connectors/connect-ghost/src/api/index.ts +51 -0
  344. package/connectors/connect-ghost/src/cli/index.ts +254 -0
  345. package/connectors/connect-ghost/src/index.ts +103 -0
  346. package/connectors/connect-ghost/src/types/index.ts +237 -0
  347. package/connectors/connect-ghost/src/utils/auth.ts +274 -0
  348. package/connectors/connect-ghost/src/utils/bulk.ts +212 -0
  349. package/connectors/connect-ghost/src/utils/config.ts +326 -0
  350. package/connectors/connect-ghost/src/utils/output.ts +175 -0
  351. package/connectors/connect-ghost/src/utils/settings.ts +114 -0
  352. package/connectors/connect-ghost/src/utils/storage.ts +198 -0
  353. package/connectors/connect-ghost/tsconfig.json +16 -0
  354. package/connectors/connect-gitea/.env.example +11 -0
  355. package/connectors/connect-gitea/CLAUDE.md +272 -0
  356. package/connectors/connect-gitea/README.md +39 -0
  357. package/connectors/connect-gitea/package.json +49 -0
  358. package/connectors/connect-gitea/src/api/client.ts +213 -0
  359. package/connectors/connect-gitea/src/api/example.ts +48 -0
  360. package/connectors/connect-gitea/src/api/index.ts +51 -0
  361. package/connectors/connect-gitea/src/cli/index.ts +254 -0
  362. package/connectors/connect-gitea/src/index.ts +103 -0
  363. package/connectors/connect-gitea/src/types/index.ts +237 -0
  364. package/connectors/connect-gitea/src/utils/auth.ts +274 -0
  365. package/connectors/connect-gitea/src/utils/bulk.ts +212 -0
  366. package/connectors/connect-gitea/src/utils/config.ts +326 -0
  367. package/connectors/connect-gitea/src/utils/output.ts +175 -0
  368. package/connectors/connect-gitea/src/utils/settings.ts +114 -0
  369. package/connectors/connect-gitea/src/utils/storage.ts +198 -0
  370. package/connectors/connect-gitea/tsconfig.json +16 -0
  371. package/connectors/connect-gleap/.env.example +11 -0
  372. package/connectors/connect-gleap/CLAUDE.md +272 -0
  373. package/connectors/connect-gleap/README.md +39 -0
  374. package/connectors/connect-gleap/package.json +49 -0
  375. package/connectors/connect-gleap/src/api/client.ts +213 -0
  376. package/connectors/connect-gleap/src/api/example.ts +48 -0
  377. package/connectors/connect-gleap/src/api/index.ts +51 -0
  378. package/connectors/connect-gleap/src/cli/index.ts +254 -0
  379. package/connectors/connect-gleap/src/index.ts +103 -0
  380. package/connectors/connect-gleap/src/types/index.ts +237 -0
  381. package/connectors/connect-gleap/src/utils/auth.ts +274 -0
  382. package/connectors/connect-gleap/src/utils/bulk.ts +212 -0
  383. package/connectors/connect-gleap/src/utils/config.ts +326 -0
  384. package/connectors/connect-gleap/src/utils/output.ts +175 -0
  385. package/connectors/connect-gleap/src/utils/settings.ts +114 -0
  386. package/connectors/connect-gleap/src/utils/storage.ts +198 -0
  387. package/connectors/connect-gleap/tsconfig.json +16 -0
  388. package/connectors/connect-gocanvas/.env.example +11 -0
  389. package/connectors/connect-gocanvas/CLAUDE.md +272 -0
  390. package/connectors/connect-gocanvas/README.md +39 -0
  391. package/connectors/connect-gocanvas/package.json +49 -0
  392. package/connectors/connect-gocanvas/src/api/client.ts +213 -0
  393. package/connectors/connect-gocanvas/src/api/example.ts +48 -0
  394. package/connectors/connect-gocanvas/src/api/index.ts +51 -0
  395. package/connectors/connect-gocanvas/src/cli/index.ts +254 -0
  396. package/connectors/connect-gocanvas/src/index.ts +103 -0
  397. package/connectors/connect-gocanvas/src/types/index.ts +237 -0
  398. package/connectors/connect-gocanvas/src/utils/auth.ts +274 -0
  399. package/connectors/connect-gocanvas/src/utils/bulk.ts +212 -0
  400. package/connectors/connect-gocanvas/src/utils/config.ts +326 -0
  401. package/connectors/connect-gocanvas/src/utils/output.ts +175 -0
  402. package/connectors/connect-gocanvas/src/utils/settings.ts +114 -0
  403. package/connectors/connect-gocanvas/src/utils/storage.ts +198 -0
  404. package/connectors/connect-gocanvas/tsconfig.json +16 -0
  405. package/connectors/connect-godaddy/.env.example +11 -0
  406. package/connectors/connect-godaddy/CLAUDE.md +272 -0
  407. package/connectors/connect-godaddy/README.md +39 -0
  408. package/connectors/connect-godaddy/package.json +49 -0
  409. package/connectors/connect-godaddy/src/api/client.ts +213 -0
  410. package/connectors/connect-godaddy/src/api/example.ts +48 -0
  411. package/connectors/connect-godaddy/src/api/index.ts +51 -0
  412. package/connectors/connect-godaddy/src/cli/index.ts +254 -0
  413. package/connectors/connect-godaddy/src/index.ts +103 -0
  414. package/connectors/connect-godaddy/src/types/index.ts +237 -0
  415. package/connectors/connect-godaddy/src/utils/auth.ts +274 -0
  416. package/connectors/connect-godaddy/src/utils/bulk.ts +212 -0
  417. package/connectors/connect-godaddy/src/utils/config.ts +326 -0
  418. package/connectors/connect-godaddy/src/utils/output.ts +175 -0
  419. package/connectors/connect-godaddy/src/utils/settings.ts +114 -0
  420. package/connectors/connect-godaddy/src/utils/storage.ts +198 -0
  421. package/connectors/connect-godaddy/tsconfig.json +16 -0
  422. package/connectors/connect-gong/.env.example +11 -0
  423. package/connectors/connect-gong/CLAUDE.md +272 -0
  424. package/connectors/connect-gong/README.md +39 -0
  425. package/connectors/connect-gong/package.json +49 -0
  426. package/connectors/connect-gong/src/api/client.ts +213 -0
  427. package/connectors/connect-gong/src/api/example.ts +48 -0
  428. package/connectors/connect-gong/src/api/index.ts +51 -0
  429. package/connectors/connect-gong/src/cli/index.ts +254 -0
  430. package/connectors/connect-gong/src/index.ts +103 -0
  431. package/connectors/connect-gong/src/types/index.ts +237 -0
  432. package/connectors/connect-gong/src/utils/auth.ts +274 -0
  433. package/connectors/connect-gong/src/utils/bulk.ts +212 -0
  434. package/connectors/connect-gong/src/utils/config.ts +326 -0
  435. package/connectors/connect-gong/src/utils/output.ts +175 -0
  436. package/connectors/connect-gong/src/utils/settings.ts +114 -0
  437. package/connectors/connect-gong/src/utils/storage.ts +198 -0
  438. package/connectors/connect-gong/tsconfig.json +16 -0
  439. package/connectors/connect-googleads/CLAUDE.md +55 -0
  440. package/connectors/connect-googleads/README.md +39 -0
  441. package/connectors/connect-googleads/package.json +52 -0
  442. package/connectors/connect-googleads/src/api/adGroups.ts +170 -0
  443. package/connectors/connect-googleads/src/api/ads.ts +171 -0
  444. package/connectors/connect-googleads/src/api/campaigns.ts +252 -0
  445. package/connectors/connect-googleads/src/api/client.ts +214 -0
  446. package/connectors/connect-googleads/src/api/index.ts +76 -0
  447. package/connectors/connect-googleads/src/api/keywords.ts +308 -0
  448. package/connectors/connect-googleads/src/api/reports.ts +430 -0
  449. package/connectors/connect-googleads/src/cli/index.ts +1259 -0
  450. package/connectors/connect-googleads/src/index.ts +40 -0
  451. package/connectors/connect-googleads/src/types/index.ts +433 -0
  452. package/connectors/connect-googleads/src/utils/auth.ts +208 -0
  453. package/connectors/connect-googleads/src/utils/config.ts +342 -0
  454. package/connectors/connect-googleads/src/utils/output.ts +62 -0
  455. package/connectors/connect-googleads/tsconfig.json +16 -0
  456. package/connectors/connect-googleanalytics/.env.example +11 -0
  457. package/connectors/connect-googleanalytics/CLAUDE.md +272 -0
  458. package/connectors/connect-googleanalytics/README.md +39 -0
  459. package/connectors/connect-googleanalytics/package.json +49 -0
  460. package/connectors/connect-googleanalytics/src/api/client.ts +213 -0
  461. package/connectors/connect-googleanalytics/src/api/example.ts +48 -0
  462. package/connectors/connect-googleanalytics/src/api/index.ts +51 -0
  463. package/connectors/connect-googleanalytics/src/cli/index.ts +254 -0
  464. package/connectors/connect-googleanalytics/src/index.ts +103 -0
  465. package/connectors/connect-googleanalytics/src/types/index.ts +237 -0
  466. package/connectors/connect-googleanalytics/src/utils/auth.ts +274 -0
  467. package/connectors/connect-googleanalytics/src/utils/bulk.ts +212 -0
  468. package/connectors/connect-googleanalytics/src/utils/config.ts +326 -0
  469. package/connectors/connect-googleanalytics/src/utils/output.ts +175 -0
  470. package/connectors/connect-googleanalytics/src/utils/settings.ts +114 -0
  471. package/connectors/connect-googleanalytics/src/utils/storage.ts +198 -0
  472. package/connectors/connect-googleanalytics/tsconfig.json +16 -0
  473. package/connectors/connect-googlebigquery/.env.example +11 -0
  474. package/connectors/connect-googlebigquery/CLAUDE.md +272 -0
  475. package/connectors/connect-googlebigquery/README.md +39 -0
  476. package/connectors/connect-googlebigquery/package.json +49 -0
  477. package/connectors/connect-googlebigquery/src/api/client.ts +213 -0
  478. package/connectors/connect-googlebigquery/src/api/example.ts +48 -0
  479. package/connectors/connect-googlebigquery/src/api/index.ts +51 -0
  480. package/connectors/connect-googlebigquery/src/cli/index.ts +254 -0
  481. package/connectors/connect-googlebigquery/src/index.ts +103 -0
  482. package/connectors/connect-googlebigquery/src/types/index.ts +237 -0
  483. package/connectors/connect-googlebigquery/src/utils/auth.ts +274 -0
  484. package/connectors/connect-googlebigquery/src/utils/bulk.ts +212 -0
  485. package/connectors/connect-googlebigquery/src/utils/config.ts +326 -0
  486. package/connectors/connect-googlebigquery/src/utils/output.ts +175 -0
  487. package/connectors/connect-googlebigquery/src/utils/settings.ts +114 -0
  488. package/connectors/connect-googlebigquery/src/utils/storage.ts +198 -0
  489. package/connectors/connect-googlebigquery/tsconfig.json +16 -0
  490. package/connectors/connect-googlebooks/.env.example +11 -0
  491. package/connectors/connect-googlebooks/CLAUDE.md +272 -0
  492. package/connectors/connect-googlebooks/README.md +39 -0
  493. package/connectors/connect-googlebooks/package.json +49 -0
  494. package/connectors/connect-googlebooks/src/api/client.ts +213 -0
  495. package/connectors/connect-googlebooks/src/api/example.ts +48 -0
  496. package/connectors/connect-googlebooks/src/api/index.ts +51 -0
  497. package/connectors/connect-googlebooks/src/cli/index.ts +254 -0
  498. package/connectors/connect-googlebooks/src/index.ts +103 -0
  499. package/connectors/connect-googlebooks/src/types/index.ts +237 -0
  500. package/connectors/connect-googlebooks/src/utils/auth.ts +274 -0
  501. package/connectors/connect-googlebooks/src/utils/bulk.ts +212 -0
  502. package/connectors/connect-googlebooks/src/utils/config.ts +326 -0
  503. package/connectors/connect-googlebooks/src/utils/output.ts +175 -0
  504. package/connectors/connect-googlebooks/src/utils/settings.ts +114 -0
  505. package/connectors/connect-googlebooks/src/utils/storage.ts +198 -0
  506. package/connectors/connect-googlebooks/tsconfig.json +16 -0
  507. package/connectors/connect-googlebusinessprofile/.env.example +11 -0
  508. package/connectors/connect-googlebusinessprofile/CLAUDE.md +272 -0
  509. package/connectors/connect-googlebusinessprofile/README.md +39 -0
  510. package/connectors/connect-googlebusinessprofile/package.json +49 -0
  511. package/connectors/connect-googlebusinessprofile/src/api/client.ts +213 -0
  512. package/connectors/connect-googlebusinessprofile/src/api/example.ts +48 -0
  513. package/connectors/connect-googlebusinessprofile/src/api/index.ts +51 -0
  514. package/connectors/connect-googlebusinessprofile/src/cli/index.ts +254 -0
  515. package/connectors/connect-googlebusinessprofile/src/index.ts +103 -0
  516. package/connectors/connect-googlebusinessprofile/src/types/index.ts +237 -0
  517. package/connectors/connect-googlebusinessprofile/src/utils/auth.ts +274 -0
  518. package/connectors/connect-googlebusinessprofile/src/utils/bulk.ts +212 -0
  519. package/connectors/connect-googlebusinessprofile/src/utils/config.ts +326 -0
  520. package/connectors/connect-googlebusinessprofile/src/utils/output.ts +175 -0
  521. package/connectors/connect-googlebusinessprofile/src/utils/settings.ts +114 -0
  522. package/connectors/connect-googlebusinessprofile/src/utils/storage.ts +198 -0
  523. package/connectors/connect-googlebusinessprofile/tsconfig.json +16 -0
  524. package/connectors/connect-googlechat/.env.example +11 -0
  525. package/connectors/connect-googlechat/CLAUDE.md +272 -0
  526. package/connectors/connect-googlechat/README.md +194 -0
  527. package/connectors/connect-googlechat/package.json +53 -0
  528. package/connectors/connect-googlechat/scripts/release.ts +179 -0
  529. package/connectors/connect-googlechat/src/api/client.ts +213 -0
  530. package/connectors/connect-googlechat/src/api/example.ts +48 -0
  531. package/connectors/connect-googlechat/src/api/index.ts +51 -0
  532. package/connectors/connect-googlechat/src/cli/index.ts +254 -0
  533. package/connectors/connect-googlechat/src/index.ts +103 -0
  534. package/connectors/connect-googlechat/src/types/index.ts +237 -0
  535. package/connectors/connect-googlechat/src/utils/auth.ts +274 -0
  536. package/connectors/connect-googlechat/src/utils/bulk.ts +212 -0
  537. package/connectors/connect-googlechat/src/utils/config.ts +326 -0
  538. package/connectors/connect-googlechat/src/utils/output.ts +175 -0
  539. package/connectors/connect-googlechat/src/utils/settings.ts +114 -0
  540. package/connectors/connect-googlechat/src/utils/storage.ts +198 -0
  541. package/connectors/connect-googlechat/tsconfig.json +16 -0
  542. package/connectors/connect-googleforms/.env.example +11 -0
  543. package/connectors/connect-googleforms/CLAUDE.md +272 -0
  544. package/connectors/connect-googleforms/README.md +194 -0
  545. package/connectors/connect-googleforms/package.json +53 -0
  546. package/connectors/connect-googleforms/scripts/release.ts +179 -0
  547. package/connectors/connect-googleforms/src/api/client.ts +213 -0
  548. package/connectors/connect-googleforms/src/api/example.ts +48 -0
  549. package/connectors/connect-googleforms/src/api/index.ts +51 -0
  550. package/connectors/connect-googleforms/src/cli/index.ts +254 -0
  551. package/connectors/connect-googleforms/src/index.ts +103 -0
  552. package/connectors/connect-googleforms/src/types/index.ts +237 -0
  553. package/connectors/connect-googleforms/src/utils/auth.ts +274 -0
  554. package/connectors/connect-googleforms/src/utils/bulk.ts +212 -0
  555. package/connectors/connect-googleforms/src/utils/config.ts +326 -0
  556. package/connectors/connect-googleforms/src/utils/output.ts +175 -0
  557. package/connectors/connect-googleforms/src/utils/settings.ts +114 -0
  558. package/connectors/connect-googleforms/src/utils/storage.ts +198 -0
  559. package/connectors/connect-googleforms/tsconfig.json +16 -0
  560. package/connectors/connect-googleperspective/.env.example +11 -0
  561. package/connectors/connect-googleperspective/CLAUDE.md +272 -0
  562. package/connectors/connect-googleperspective/README.md +194 -0
  563. package/connectors/connect-googleperspective/package.json +54 -0
  564. package/connectors/connect-googleperspective/scripts/release.ts +179 -0
  565. package/connectors/connect-googleperspective/src/api/client.ts +213 -0
  566. package/connectors/connect-googleperspective/src/api/example.ts +48 -0
  567. package/connectors/connect-googleperspective/src/api/index.ts +51 -0
  568. package/connectors/connect-googleperspective/src/cli/index.ts +254 -0
  569. package/connectors/connect-googleperspective/src/index.ts +103 -0
  570. package/connectors/connect-googleperspective/src/types/index.ts +237 -0
  571. package/connectors/connect-googleperspective/src/utils/auth.ts +274 -0
  572. package/connectors/connect-googleperspective/src/utils/bulk.ts +212 -0
  573. package/connectors/connect-googleperspective/src/utils/config.ts +326 -0
  574. package/connectors/connect-googleperspective/src/utils/output.ts +175 -0
  575. package/connectors/connect-googleperspective/src/utils/settings.ts +114 -0
  576. package/connectors/connect-googleperspective/src/utils/storage.ts +198 -0
  577. package/connectors/connect-googleperspective/tsconfig.json +16 -0
  578. package/connectors/connect-googlephotos/.env.example +4 -0
  579. package/connectors/connect-googlephotos/CLAUDE.md +107 -0
  580. package/connectors/connect-googlephotos/README.md +194 -0
  581. package/connectors/connect-googlephotos/package.json +54 -0
  582. package/connectors/connect-googlephotos/scripts/publish.ts +74 -0
  583. package/connectors/connect-googlephotos/src/api/albums.ts +180 -0
  584. package/connectors/connect-googlephotos/src/api/client.ts +159 -0
  585. package/connectors/connect-googlephotos/src/api/index.ts +53 -0
  586. package/connectors/connect-googlephotos/src/api/media.ts +238 -0
  587. package/connectors/connect-googlephotos/src/api/upload.ts +204 -0
  588. package/connectors/connect-googlephotos/src/cli/index.ts +754 -0
  589. package/connectors/connect-googlephotos/src/index.ts +35 -0
  590. package/connectors/connect-googlephotos/src/types/index.ts +336 -0
  591. package/connectors/connect-googlephotos/src/utils/auth.ts +258 -0
  592. package/connectors/connect-googlephotos/src/utils/config.ts +419 -0
  593. package/connectors/connect-googlephotos/src/utils/output.ts +239 -0
  594. package/connectors/connect-googlephotos/tsconfig.json +15 -0
  595. package/dist/index.js +238 -0
  596. package/package.json +1 -1
@@ -0,0 +1,419 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, rmSync, renameSync, cpSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ import type { CliConfig, OAuth2Tokens } from '../types';
5
+
6
+ const DEFAULT_PROFILE = 'default';
7
+ const CURRENT_PROFILE_FILE = 'current_profile';
8
+ const PROFILES_DIR = 'profiles';
9
+
10
+ // Store for --profile flag override (set by CLI before commands run)
11
+ let profileOverride: string | undefined;
12
+
13
+ // Store config in ~/.connect/connect-googlephotos/ (always in home directory)
14
+ function resolveBaseConfigDir(): string {
15
+ return join(homedir(), '.connect', 'connect-googlephotos');
16
+ }
17
+
18
+ const BASE_CONFIG_DIR = resolveBaseConfigDir();
19
+
20
+ // ============================================
21
+ // Profile Management
22
+ // ============================================
23
+
24
+ export function setProfileOverride(profile: string | undefined): void {
25
+ profileOverride = profile;
26
+ }
27
+
28
+ export function getProfileOverride(): string | undefined {
29
+ return profileOverride;
30
+ }
31
+
32
+ function ensureBaseConfigDir(): void {
33
+ if (!existsSync(BASE_CONFIG_DIR)) {
34
+ mkdirSync(BASE_CONFIG_DIR, { recursive: true });
35
+ }
36
+ }
37
+
38
+ function getProfilesDir(): string {
39
+ return join(BASE_CONFIG_DIR, PROFILES_DIR);
40
+ }
41
+
42
+ function getCurrentProfileFile(): string {
43
+ return join(BASE_CONFIG_DIR, CURRENT_PROFILE_FILE);
44
+ }
45
+
46
+ /**
47
+ * Migrate old config structure to new profile-based structure
48
+ */
49
+ function migrateToProfileStructure(): void {
50
+ const profilesDir = getProfilesDir();
51
+ const defaultProfileDir = join(profilesDir, DEFAULT_PROFILE);
52
+
53
+ // If profiles directory already exists, no migration needed
54
+ if (existsSync(profilesDir)) {
55
+ return;
56
+ }
57
+
58
+ // Check if old structure exists (config.json directly in base dir)
59
+ const oldConfigFile = join(BASE_CONFIG_DIR, 'config.json');
60
+ const oldTokensFile = join(BASE_CONFIG_DIR, 'tokens.json');
61
+
62
+ const hasOldStructure = existsSync(oldConfigFile) || existsSync(oldTokensFile);
63
+
64
+ if (!hasOldStructure) {
65
+ // Fresh install, just create the profiles directory
66
+ mkdirSync(profilesDir, { recursive: true });
67
+ return;
68
+ }
69
+
70
+ // Migrate to default profile
71
+ mkdirSync(defaultProfileDir, { recursive: true });
72
+
73
+ // Move files to default profile
74
+ if (existsSync(oldConfigFile)) {
75
+ renameSync(oldConfigFile, join(defaultProfileDir, 'config.json'));
76
+ }
77
+ if (existsSync(oldTokensFile)) {
78
+ renameSync(oldTokensFile, join(defaultProfileDir, 'tokens.json'));
79
+ }
80
+
81
+ // Set default as current profile
82
+ writeFileSync(getCurrentProfileFile(), DEFAULT_PROFILE);
83
+ }
84
+
85
+ /**
86
+ * Get the current active profile name
87
+ */
88
+ export function getCurrentProfile(): string {
89
+ // CLI override takes priority
90
+ if (profileOverride) {
91
+ return profileOverride;
92
+ }
93
+
94
+ ensureBaseConfigDir();
95
+ migrateToProfileStructure();
96
+
97
+ const currentProfileFile = getCurrentProfileFile();
98
+ if (existsSync(currentProfileFile)) {
99
+ try {
100
+ const profile = readFileSync(currentProfileFile, 'utf-8').trim();
101
+ if (profile && profileExists(profile)) {
102
+ return profile;
103
+ }
104
+ } catch {
105
+ // Fall through to default
106
+ }
107
+ }
108
+
109
+ return DEFAULT_PROFILE;
110
+ }
111
+
112
+ /**
113
+ * Set the current active profile
114
+ */
115
+ export function setCurrentProfile(profile: string): void {
116
+ ensureBaseConfigDir();
117
+ migrateToProfileStructure();
118
+
119
+ if (!profileExists(profile)) {
120
+ throw new Error(`Profile "${profile}" does not exist. Create it first with "profile create ${profile}"`);
121
+ }
122
+
123
+ writeFileSync(getCurrentProfileFile(), profile);
124
+ }
125
+
126
+ /**
127
+ * Check if a profile exists
128
+ */
129
+ export function profileExists(profile: string): boolean {
130
+ const profileDir = join(getProfilesDir(), profile);
131
+ return existsSync(profileDir);
132
+ }
133
+
134
+ /**
135
+ * List all available profiles
136
+ */
137
+ export function listProfiles(): string[] {
138
+ ensureBaseConfigDir();
139
+ migrateToProfileStructure();
140
+
141
+ const profilesDir = getProfilesDir();
142
+ if (!existsSync(profilesDir)) {
143
+ return [];
144
+ }
145
+
146
+ return readdirSync(profilesDir, { withFileTypes: true })
147
+ .filter(dirent => dirent.isDirectory())
148
+ .map(dirent => dirent.name)
149
+ .sort();
150
+ }
151
+
152
+ /**
153
+ * Create a new profile
154
+ */
155
+ export function createProfile(profile: string): void {
156
+ ensureBaseConfigDir();
157
+ migrateToProfileStructure();
158
+
159
+ if (profileExists(profile)) {
160
+ throw new Error(`Profile "${profile}" already exists`);
161
+ }
162
+
163
+ // Validate profile name
164
+ if (!/^[a-zA-Z0-9_-]+$/.test(profile)) {
165
+ throw new Error('Profile name can only contain letters, numbers, hyphens, and underscores');
166
+ }
167
+
168
+ const profileDir = join(getProfilesDir(), profile);
169
+ mkdirSync(profileDir, { recursive: true });
170
+ }
171
+
172
+ /**
173
+ * Delete a profile
174
+ */
175
+ export function deleteProfile(profile: string): void {
176
+ if (profile === DEFAULT_PROFILE) {
177
+ throw new Error('Cannot delete the default profile');
178
+ }
179
+
180
+ if (!profileExists(profile)) {
181
+ throw new Error(`Profile "${profile}" does not exist`);
182
+ }
183
+
184
+ const currentProfile = getCurrentProfile();
185
+ if (currentProfile === profile) {
186
+ // Switch to default before deleting
187
+ setCurrentProfile(DEFAULT_PROFILE);
188
+ }
189
+
190
+ const profileDir = join(getProfilesDir(), profile);
191
+ rmSync(profileDir, { recursive: true });
192
+ }
193
+
194
+ /**
195
+ * Get the config directory for the current profile
196
+ */
197
+ function resolveConfigDir(): string {
198
+ ensureBaseConfigDir();
199
+ migrateToProfileStructure();
200
+
201
+ const profile = getCurrentProfile();
202
+ const profileDir = join(getProfilesDir(), profile);
203
+
204
+ // Ensure profile directory exists
205
+ if (!existsSync(profileDir)) {
206
+ mkdirSync(profileDir, { recursive: true });
207
+ }
208
+
209
+ return profileDir;
210
+ }
211
+
212
+ // Always compute config dir dynamically (no caching - profiles can change)
213
+ function getConfigDirInternal(): string {
214
+ return resolveConfigDir();
215
+ }
216
+
217
+ export function getConfigDir(): string {
218
+ return getConfigDirInternal();
219
+ }
220
+
221
+ export function getBaseConfigDir(): string {
222
+ return BASE_CONFIG_DIR;
223
+ }
224
+
225
+ export function ensureConfigDir(): void {
226
+ const configDir = getConfigDirInternal();
227
+ if (!existsSync(configDir)) {
228
+ mkdirSync(configDir, { recursive: true });
229
+ }
230
+ }
231
+
232
+ // ============================================
233
+ // Downloads Directory
234
+ // ============================================
235
+
236
+ export function getDownloadsDir(): string {
237
+ return join(getConfigDirInternal(), 'downloads');
238
+ }
239
+
240
+ export function ensureDownloadsDir(): string {
241
+ const dir = getDownloadsDir();
242
+ if (!existsSync(dir)) {
243
+ mkdirSync(dir, { recursive: true });
244
+ }
245
+ return dir;
246
+ }
247
+
248
+ export function loadConfig(): CliConfig {
249
+ ensureConfigDir();
250
+ const configFile = join(getConfigDirInternal(), 'config.json');
251
+
252
+ if (!existsSync(configFile)) {
253
+ return {};
254
+ }
255
+
256
+ try {
257
+ const content = readFileSync(configFile, 'utf-8');
258
+ return JSON.parse(content);
259
+ } catch {
260
+ return {};
261
+ }
262
+ }
263
+
264
+ export function saveConfig(config: CliConfig): void {
265
+ ensureConfigDir();
266
+ const configFile = join(getConfigDirInternal(), 'config.json');
267
+ writeFileSync(configFile, JSON.stringify(config, null, 2));
268
+ }
269
+
270
+ // ============================================
271
+ // OAuth2 Credentials (Client ID/Secret) - Stored at BASE level (shared across profiles)
272
+ // ============================================
273
+
274
+ function loadBaseConfig(): CliConfig {
275
+ ensureBaseConfigDir();
276
+ const configFile = join(BASE_CONFIG_DIR, 'credentials.json');
277
+
278
+ if (!existsSync(configFile)) {
279
+ // Migration: check if credentials exist in any profile and copy to base
280
+ const profiles = listProfiles();
281
+ for (const profile of profiles) {
282
+ // Read directly from profile's config file (not via loadConfig which uses current profile)
283
+ const profileConfigFile = join(getProfilesDir(), profile, 'config.json');
284
+ if (existsSync(profileConfigFile)) {
285
+ try {
286
+ const content = readFileSync(profileConfigFile, 'utf-8');
287
+ const profileConfig = JSON.parse(content) as CliConfig;
288
+ if (profileConfig.clientId && profileConfig.clientSecret) {
289
+ // Found credentials in a profile, save to base
290
+ writeFileSync(configFile, JSON.stringify({
291
+ clientId: profileConfig.clientId,
292
+ clientSecret: profileConfig.clientSecret,
293
+ }, null, 2));
294
+ return { clientId: profileConfig.clientId, clientSecret: profileConfig.clientSecret };
295
+ }
296
+ } catch {
297
+ // Continue to next profile
298
+ }
299
+ }
300
+ }
301
+ return {};
302
+ }
303
+
304
+ try {
305
+ const content = readFileSync(configFile, 'utf-8');
306
+ return JSON.parse(content);
307
+ } catch {
308
+ return {};
309
+ }
310
+ }
311
+
312
+ function saveBaseConfig(config: CliConfig): void {
313
+ ensureBaseConfigDir();
314
+ const configFile = join(BASE_CONFIG_DIR, 'credentials.json');
315
+ writeFileSync(configFile, JSON.stringify(config, null, 2));
316
+ }
317
+
318
+ export function getClientId(): string | undefined {
319
+ return process.env.GOOGLE_PHOTOS_CLIENT_ID || loadBaseConfig().clientId;
320
+ }
321
+
322
+ export function getClientSecret(): string | undefined {
323
+ return process.env.GOOGLE_PHOTOS_CLIENT_SECRET || loadBaseConfig().clientSecret;
324
+ }
325
+
326
+ export function setClientId(clientId: string): void {
327
+ const config = loadBaseConfig();
328
+ config.clientId = clientId;
329
+ saveBaseConfig(config);
330
+ }
331
+
332
+ export function setClientSecret(clientSecret: string): void {
333
+ const config = loadBaseConfig();
334
+ config.clientSecret = clientSecret;
335
+ saveBaseConfig(config);
336
+ }
337
+
338
+ export function setCredentials(clientId: string, clientSecret: string): void {
339
+ const config = loadBaseConfig();
340
+ config.clientId = clientId;
341
+ config.clientSecret = clientSecret;
342
+ saveBaseConfig(config);
343
+ }
344
+
345
+ // ============================================
346
+ // OAuth2 Tokens (Access/Refresh)
347
+ // ============================================
348
+
349
+ export function loadTokens(): OAuth2Tokens | null {
350
+ ensureConfigDir();
351
+ const tokensFile = join(getConfigDirInternal(), 'tokens.json');
352
+
353
+ if (!existsSync(tokensFile)) {
354
+ return null;
355
+ }
356
+
357
+ try {
358
+ const content = readFileSync(tokensFile, 'utf-8');
359
+ return JSON.parse(content);
360
+ } catch {
361
+ return null;
362
+ }
363
+ }
364
+
365
+ export function saveTokens(tokens: OAuth2Tokens): void {
366
+ ensureConfigDir();
367
+ const tokensFile = join(getConfigDirInternal(), 'tokens.json');
368
+ writeFileSync(tokensFile, JSON.stringify(tokens, null, 2), { mode: 0o600 });
369
+ }
370
+
371
+ export function getAccessToken(): string | undefined {
372
+ return process.env.GOOGLE_PHOTOS_ACCESS_TOKEN || loadTokens()?.accessToken;
373
+ }
374
+
375
+ export function getRefreshToken(): string | undefined {
376
+ return process.env.GOOGLE_PHOTOS_REFRESH_TOKEN || loadTokens()?.refreshToken;
377
+ }
378
+
379
+ export function isTokenExpired(): boolean {
380
+ const tokens = loadTokens();
381
+ if (!tokens) return true;
382
+ // Add 5 minute buffer
383
+ return Date.now() >= tokens.expiresAt - 5 * 60 * 1000;
384
+ }
385
+
386
+ // ============================================
387
+ // User Profile
388
+ // ============================================
389
+
390
+ export function getUserEmail(): string | undefined {
391
+ return loadConfig().userEmail;
392
+ }
393
+
394
+ export function setUserEmail(email: string): void {
395
+ const config = loadConfig();
396
+ config.userEmail = email;
397
+ saveConfig(config);
398
+ }
399
+
400
+ // ============================================
401
+ // Clear Config
402
+ // ============================================
403
+
404
+ export function clearTokens(): void {
405
+ const tokensFile = join(getConfigDirInternal(), 'tokens.json');
406
+ if (existsSync(tokensFile)) {
407
+ writeFileSync(tokensFile, '{}');
408
+ }
409
+ }
410
+
411
+ export function clearConfig(): void {
412
+ saveConfig({});
413
+ clearTokens();
414
+ }
415
+
416
+ export function isAuthenticated(): boolean {
417
+ const tokens = loadTokens();
418
+ return tokens !== null && tokens.accessToken !== undefined && tokens.refreshToken !== undefined;
419
+ }
@@ -0,0 +1,239 @@
1
+ import chalk from 'chalk';
2
+
3
+ export type OutputFormat = 'json' | 'table' | 'pretty';
4
+
5
+ /**
6
+ * Print success message
7
+ */
8
+ export function success(message: string): void {
9
+ console.log(chalk.green('✓'), message);
10
+ }
11
+
12
+ /**
13
+ * Print error message
14
+ */
15
+ export function error(message: string): void {
16
+ console.error(chalk.red('✗'), message);
17
+ }
18
+
19
+ /**
20
+ * Print info message
21
+ */
22
+ export function info(message: string): void {
23
+ console.log(chalk.blue('ℹ'), message);
24
+ }
25
+
26
+ /**
27
+ * Print warning message
28
+ */
29
+ export function warn(message: string): void {
30
+ console.log(chalk.yellow('⚠'), message);
31
+ }
32
+
33
+ /**
34
+ * Print data in specified format
35
+ */
36
+ export function print(data: unknown, format: OutputFormat = 'pretty'): void {
37
+ switch (format) {
38
+ case 'json':
39
+ console.log(JSON.stringify(data, null, 2));
40
+ break;
41
+ case 'table':
42
+ printTable(data);
43
+ break;
44
+ case 'pretty':
45
+ default:
46
+ printPretty(data);
47
+ break;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Print data as table
53
+ */
54
+ function printTable(data: unknown): void {
55
+ if (Array.isArray(data)) {
56
+ if (data.length === 0) {
57
+ console.log('No data');
58
+ return;
59
+ }
60
+
61
+ // Get all unique keys from all objects
62
+ const keys = Array.from(
63
+ new Set(data.flatMap(item => (typeof item === 'object' && item ? Object.keys(item) : [])))
64
+ );
65
+
66
+ if (keys.length === 0) {
67
+ console.log(data);
68
+ return;
69
+ }
70
+
71
+ // Calculate column widths
72
+ const widths: Record<string, number> = {};
73
+ for (const key of keys) {
74
+ widths[key] = Math.max(
75
+ key.length,
76
+ ...data.map(item => {
77
+ const val = (item as Record<string, unknown>)?.[key];
78
+ return String(val ?? '').substring(0, 50).length;
79
+ })
80
+ );
81
+ }
82
+
83
+ // Print header
84
+ const header = keys.map(k => k.padEnd(widths[k])).join(' | ');
85
+ console.log(chalk.bold(header));
86
+ console.log(keys.map(k => '-'.repeat(widths[k])).join('-+-'));
87
+
88
+ // Print rows
89
+ for (const item of data) {
90
+ const row = keys.map(k => {
91
+ const val = (item as Record<string, unknown>)?.[k];
92
+ return String(val ?? '').substring(0, 50).padEnd(widths[k]);
93
+ }).join(' | ');
94
+ console.log(row);
95
+ }
96
+ } else if (typeof data === 'object' && data !== null) {
97
+ const entries = Object.entries(data);
98
+ const maxKeyLen = Math.max(...entries.map(([k]) => k.length));
99
+
100
+ for (const [key, value] of entries) {
101
+ const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
102
+ console.log(`${chalk.cyan(key.padEnd(maxKeyLen))}: ${displayValue}`);
103
+ }
104
+ } else {
105
+ console.log(data);
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Print data in pretty format
111
+ */
112
+ function printPretty(data: unknown): void {
113
+ if (Array.isArray(data)) {
114
+ if (data.length === 0) {
115
+ console.log('No data');
116
+ return;
117
+ }
118
+
119
+ for (let i = 0; i < data.length; i++) {
120
+ if (i > 0) console.log('');
121
+ printPrettyObject(data[i], i + 1);
122
+ }
123
+ } else if (typeof data === 'object' && data !== null) {
124
+ printPrettyObject(data);
125
+ } else {
126
+ console.log(data);
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Print a single object in pretty format
132
+ */
133
+ function printPrettyObject(obj: unknown, index?: number): void {
134
+ if (typeof obj !== 'object' || obj === null) {
135
+ console.log(obj);
136
+ return;
137
+ }
138
+
139
+ const entries = Object.entries(obj);
140
+
141
+ if (index !== undefined) {
142
+ console.log(chalk.gray(`[${index}]`));
143
+ }
144
+
145
+ for (const [key, value] of entries) {
146
+ const displayKey = formatKey(key);
147
+ const displayValue = formatValue(value);
148
+ console.log(` ${chalk.cyan(displayKey)}: ${displayValue}`);
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Format a key for display
154
+ */
155
+ function formatKey(key: string): string {
156
+ // Convert camelCase to Title Case
157
+ return key
158
+ .replace(/([A-Z])/g, ' $1')
159
+ .replace(/^./, str => str.toUpperCase())
160
+ .trim();
161
+ }
162
+
163
+ /**
164
+ * Format a value for display
165
+ */
166
+ function formatValue(value: unknown): string {
167
+ if (value === null || value === undefined) {
168
+ return chalk.gray('—');
169
+ }
170
+
171
+ if (typeof value === 'boolean') {
172
+ return value ? chalk.green('Yes') : chalk.red('No');
173
+ }
174
+
175
+ if (typeof value === 'number') {
176
+ return chalk.yellow(String(value));
177
+ }
178
+
179
+ if (typeof value === 'string') {
180
+ // Check if it's a URL
181
+ if (value.startsWith('http://') || value.startsWith('https://')) {
182
+ return chalk.blue(value);
183
+ }
184
+ // Check if it's a date
185
+ if (/^\d{4}-\d{2}-\d{2}/.test(value)) {
186
+ return chalk.magenta(value);
187
+ }
188
+ // Truncate long strings
189
+ if (value.length > 100) {
190
+ return value.substring(0, 100) + chalk.gray('...');
191
+ }
192
+ return value;
193
+ }
194
+
195
+ if (Array.isArray(value)) {
196
+ if (value.length === 0) {
197
+ return chalk.gray('[]');
198
+ }
199
+ return chalk.gray(`[${value.length} items]`);
200
+ }
201
+
202
+ if (typeof value === 'object') {
203
+ const keys = Object.keys(value);
204
+ if (keys.length === 0) {
205
+ return chalk.gray('{}');
206
+ }
207
+ return chalk.gray(`{${keys.join(', ')}}`);
208
+ }
209
+
210
+ return String(value);
211
+ }
212
+
213
+ /**
214
+ * Format bytes to human readable
215
+ */
216
+ export function formatBytes(bytes: number): string {
217
+ if (bytes === 0) return '0 B';
218
+ const k = 1024;
219
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
220
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
221
+ return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
222
+ }
223
+
224
+ /**
225
+ * Format duration in seconds to human readable
226
+ */
227
+ export function formatDuration(seconds: number): string {
228
+ if (seconds < 60) {
229
+ return `${seconds}s`;
230
+ }
231
+ const minutes = Math.floor(seconds / 60);
232
+ const remainingSeconds = seconds % 60;
233
+ if (minutes < 60) {
234
+ return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
235
+ }
236
+ const hours = Math.floor(minutes / 60);
237
+ const remainingMinutes = minutes % 60;
238
+ return `${hours}h ${remainingMinutes}m`;
239
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "outDir": "./dist",
10
+ "declaration": true,
11
+ "types": ["bun-types"]
12
+ },
13
+ "include": ["src/**/*"],
14
+ "exclude": ["node_modules", "dist", "bin"]
15
+ }