@hubspot/cli 7.7.19-experimental.3 → 7.7.21-experimental.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 (696) hide show
  1. package/api/__tests__/migrate.test.d.ts +1 -0
  2. package/api/__tests__/migrate.test.js +181 -0
  3. package/api/migrate.js +14 -22
  4. package/bin/cli.js +92 -97
  5. package/bin/hs +2 -2
  6. package/bin/hscms +2 -2
  7. package/bin/silenceErrors.js +1 -2
  8. package/commands/__tests__/account.test.d.ts +1 -0
  9. package/commands/__tests__/account.test.js +69 -0
  10. package/commands/__tests__/auth.test.d.ts +1 -0
  11. package/commands/__tests__/auth.test.js +38 -0
  12. package/commands/__tests__/cms.test.d.ts +1 -0
  13. package/commands/__tests__/cms.test.js +44 -0
  14. package/commands/__tests__/config.test.d.ts +1 -0
  15. package/commands/__tests__/config.test.js +44 -0
  16. package/commands/__tests__/create.test.d.ts +1 -0
  17. package/commands/__tests__/create.test.js +33 -0
  18. package/commands/__tests__/customObject.test.d.ts +1 -0
  19. package/commands/__tests__/customObject.test.js +49 -0
  20. package/commands/__tests__/doctor.test.d.ts +1 -0
  21. package/commands/__tests__/doctor.test.js +134 -0
  22. package/commands/__tests__/feedback.test.d.ts +1 -0
  23. package/commands/__tests__/feedback.test.js +24 -0
  24. package/commands/__tests__/fetch.test.d.ts +1 -0
  25. package/commands/__tests__/fetch.test.js +57 -0
  26. package/commands/__tests__/filemanager.test.d.ts +1 -0
  27. package/commands/__tests__/filemanager.test.js +45 -0
  28. package/commands/__tests__/function.test.d.ts +1 -0
  29. package/commands/__tests__/function.test.js +46 -0
  30. package/commands/__tests__/getStarted.test.d.ts +1 -0
  31. package/commands/__tests__/getStarted.test.js +165 -0
  32. package/commands/__tests__/hubdb.test.d.ts +1 -0
  33. package/commands/__tests__/hubdb.test.js +50 -0
  34. package/commands/__tests__/init.test.d.ts +1 -0
  35. package/commands/__tests__/init.test.js +42 -0
  36. package/commands/__tests__/lint.test.d.ts +1 -0
  37. package/commands/__tests__/lint.test.js +33 -0
  38. package/commands/__tests__/list.test.d.ts +1 -0
  39. package/commands/__tests__/list.test.js +42 -0
  40. package/commands/__tests__/logs.test.d.ts +1 -0
  41. package/commands/__tests__/logs.test.js +71 -0
  42. package/commands/__tests__/mcp.test.d.ts +1 -0
  43. package/commands/__tests__/mcp.test.js +46 -0
  44. package/commands/__tests__/mv.test.d.ts +1 -0
  45. package/commands/__tests__/mv.test.js +46 -0
  46. package/commands/__tests__/open.test.d.ts +1 -0
  47. package/commands/__tests__/open.test.js +58 -0
  48. package/commands/__tests__/project.test.d.ts +1 -0
  49. package/commands/__tests__/project.test.js +95 -0
  50. package/commands/__tests__/remove.test.d.ts +1 -0
  51. package/commands/__tests__/remove.test.js +39 -0
  52. package/commands/__tests__/sandbox.test.d.ts +1 -0
  53. package/commands/__tests__/sandbox.test.js +44 -0
  54. package/commands/__tests__/secret.test.d.ts +1 -0
  55. package/commands/__tests__/secret.test.js +49 -0
  56. package/commands/__tests__/testAccount.test.d.ts +1 -0
  57. package/commands/__tests__/testAccount.test.js +55 -0
  58. package/commands/__tests__/theme.test.d.ts +1 -0
  59. package/commands/__tests__/theme.test.js +47 -0
  60. package/commands/account/__tests__/auth.test.d.ts +1 -0
  61. package/commands/account/__tests__/auth.test.js +26 -0
  62. package/commands/account/__tests__/clean.test.d.ts +1 -0
  63. package/commands/account/__tests__/clean.test.js +28 -0
  64. package/commands/account/__tests__/createOverride.test.d.ts +1 -0
  65. package/commands/account/__tests__/createOverride.test.js +32 -0
  66. package/commands/account/__tests__/info.test.d.ts +1 -0
  67. package/commands/account/__tests__/info.test.js +28 -0
  68. package/commands/account/__tests__/list.test.d.ts +1 -0
  69. package/commands/account/__tests__/list.test.js +28 -0
  70. package/commands/account/__tests__/remove.test.d.ts +1 -0
  71. package/commands/account/__tests__/remove.test.js +36 -0
  72. package/commands/account/__tests__/removeOverride.d.ts +1 -0
  73. package/commands/account/__tests__/removeOverride.js +25 -0
  74. package/commands/account/__tests__/rename.test.d.ts +1 -0
  75. package/commands/account/__tests__/rename.test.js +42 -0
  76. package/commands/account/__tests__/use.test.d.ts +1 -0
  77. package/commands/account/__tests__/use.test.js +32 -0
  78. package/commands/account/auth.d.ts +1 -1
  79. package/commands/account/auth.js +65 -67
  80. package/commands/account/clean.d.ts +1 -1
  81. package/commands/account/clean.js +55 -60
  82. package/commands/account/createOverride.d.ts +1 -1
  83. package/commands/account/createOverride.js +52 -57
  84. package/commands/account/info.d.ts +1 -1
  85. package/commands/account/info.js +33 -35
  86. package/commands/account/list.d.ts +1 -1
  87. package/commands/account/list.js +43 -45
  88. package/commands/account/remove.d.ts +1 -1
  89. package/commands/account/remove.js +37 -42
  90. package/commands/account/removeOverride.d.ts +1 -1
  91. package/commands/account/removeOverride.js +38 -43
  92. package/commands/account/rename.d.ts +1 -1
  93. package/commands/account/rename.js +18 -20
  94. package/commands/account/use.d.ts +1 -1
  95. package/commands/account/use.js +29 -31
  96. package/commands/account.d.ts +1 -1
  97. package/commands/account.js +23 -28
  98. package/commands/app/__tests__/migrate.test.d.ts +1 -0
  99. package/commands/app/__tests__/migrate.test.js +124 -0
  100. package/commands/app/migrate.d.ts +2 -2
  101. package/commands/app/migrate.js +40 -43
  102. package/commands/app/secret/__tests__/add.test.d.ts +1 -0
  103. package/commands/app/secret/__tests__/add.test.js +28 -0
  104. package/commands/app/secret/__tests__/delete.test.d.ts +1 -0
  105. package/commands/app/secret/__tests__/delete.test.js +28 -0
  106. package/commands/app/secret/__tests__/list.test.d.ts +1 -0
  107. package/commands/app/secret/__tests__/list.test.js +25 -0
  108. package/commands/app/secret/__tests__/update.test.d.ts +1 -0
  109. package/commands/app/secret/__tests__/update.test.js +28 -0
  110. package/commands/app/secret/add.d.ts +1 -1
  111. package/commands/app/secret/add.js +28 -30
  112. package/commands/app/secret/delete.d.ts +1 -1
  113. package/commands/app/secret/delete.js +34 -36
  114. package/commands/app/secret/list.d.ts +1 -1
  115. package/commands/app/secret/list.js +25 -27
  116. package/commands/app/secret/update.d.ts +1 -1
  117. package/commands/app/secret/update.js +32 -34
  118. package/commands/app/secret.d.ts +1 -1
  119. package/commands/app/secret.js +12 -17
  120. package/commands/app.d.ts +1 -1
  121. package/commands/app.js +6 -16
  122. package/commands/auth.d.ts +1 -1
  123. package/commands/auth.js +70 -72
  124. package/commands/cms/convertFields.d.ts +1 -1
  125. package/commands/cms/convertFields.js +34 -39
  126. package/commands/cms/getReactModule.d.ts +1 -1
  127. package/commands/cms/getReactModule.js +32 -37
  128. package/commands/cms/lighthouseScore.d.ts +1 -1
  129. package/commands/cms/lighthouseScore.js +67 -72
  130. package/commands/cms.d.ts +1 -1
  131. package/commands/cms.js +11 -16
  132. package/commands/completion.d.ts +1 -1
  133. package/commands/completion.js +10 -15
  134. package/commands/config/migrate.d.ts +1 -1
  135. package/commands/config/migrate.js +27 -32
  136. package/commands/config/set.d.ts +1 -1
  137. package/commands/config/set.js +23 -25
  138. package/commands/config.d.ts +1 -1
  139. package/commands/config.js +8 -13
  140. package/commands/create/api-sample.d.ts +1 -1
  141. package/commands/create/api-sample.js +28 -33
  142. package/commands/create/app.d.ts +1 -1
  143. package/commands/create/app.js +3 -5
  144. package/commands/create/function.d.ts +1 -1
  145. package/commands/create/function.js +9 -11
  146. package/commands/create/index.d.ts +1 -1
  147. package/commands/create/index.js +19 -24
  148. package/commands/create/module.d.ts +1 -1
  149. package/commands/create/module.js +12 -14
  150. package/commands/create/react-app.d.ts +1 -1
  151. package/commands/create/react-app.js +3 -5
  152. package/commands/create/template.d.ts +1 -1
  153. package/commands/create/template.js +12 -14
  154. package/commands/create/vue-app.d.ts +1 -1
  155. package/commands/create/vue-app.js +3 -5
  156. package/commands/create/webpack-serverless.d.ts +1 -1
  157. package/commands/create/webpack-serverless.js +3 -5
  158. package/commands/create/website-theme.d.ts +1 -1
  159. package/commands/create/website-theme.js +5 -7
  160. package/commands/create.d.ts +2 -2
  161. package/commands/create.js +30 -35
  162. package/commands/customObject/__tests__/create.test.d.ts +1 -0
  163. package/commands/customObject/__tests__/create.test.js +40 -0
  164. package/commands/customObject/__tests__/schema.test.d.ts +1 -0
  165. package/commands/customObject/__tests__/schema.test.js +53 -0
  166. package/commands/customObject/create.d.ts +1 -1
  167. package/commands/customObject/create.js +28 -30
  168. package/commands/customObject/schema/__tests__/create.test.d.ts +1 -0
  169. package/commands/customObject/schema/__tests__/create.test.js +28 -0
  170. package/commands/customObject/schema/__tests__/delete.test.d.ts +1 -0
  171. package/commands/customObject/schema/__tests__/delete.test.js +42 -0
  172. package/commands/customObject/schema/__tests__/fetch-all.test.d.ts +1 -0
  173. package/commands/customObject/schema/__tests__/fetch-all.test.js +41 -0
  174. package/commands/customObject/schema/__tests__/fetch.test.d.ts +1 -0
  175. package/commands/customObject/schema/__tests__/fetch.test.js +45 -0
  176. package/commands/customObject/schema/__tests__/list.test.d.ts +1 -0
  177. package/commands/customObject/schema/__tests__/list.test.js +29 -0
  178. package/commands/customObject/schema/__tests__/update.test.d.ts +1 -0
  179. package/commands/customObject/schema/__tests__/update.test.js +40 -0
  180. package/commands/customObject/schema/create.d.ts +1 -1
  181. package/commands/customObject/schema/create.js +28 -30
  182. package/commands/customObject/schema/delete.d.ts +1 -1
  183. package/commands/customObject/schema/delete.js +24 -26
  184. package/commands/customObject/schema/fetch-all.d.ts +1 -1
  185. package/commands/customObject/schema/fetch-all.js +22 -24
  186. package/commands/customObject/schema/fetch.d.ts +1 -1
  187. package/commands/customObject/schema/fetch.js +24 -26
  188. package/commands/customObject/schema/list.d.ts +1 -1
  189. package/commands/customObject/schema/list.js +13 -15
  190. package/commands/customObject/schema/update.d.ts +1 -1
  191. package/commands/customObject/schema/update.js +32 -34
  192. package/commands/customObject/schema.d.ts +1 -1
  193. package/commands/customObject/schema.js +17 -22
  194. package/commands/customObject.d.ts +1 -1
  195. package/commands/customObject.js +13 -18
  196. package/commands/doctor.d.ts +1 -1
  197. package/commands/doctor.js +28 -33
  198. package/commands/feedback.d.ts +1 -1
  199. package/commands/feedback.js +19 -24
  200. package/commands/fetch.d.ts +1 -1
  201. package/commands/fetch.js +28 -31
  202. package/commands/filemanager/__tests__/fetch.test.d.ts +1 -0
  203. package/commands/filemanager/__tests__/fetch.test.js +32 -0
  204. package/commands/filemanager/__tests__/upload.test.d.ts +1 -0
  205. package/commands/filemanager/__tests__/upload.test.js +30 -0
  206. package/commands/filemanager/fetch.d.ts +1 -1
  207. package/commands/filemanager/fetch.js +23 -25
  208. package/commands/filemanager/upload.d.ts +1 -1
  209. package/commands/filemanager/upload.js +39 -44
  210. package/commands/filemanager.d.ts +1 -1
  211. package/commands/filemanager.js +8 -13
  212. package/commands/function/deploy.d.ts +1 -1
  213. package/commands/function/deploy.js +35 -40
  214. package/commands/function/list.d.ts +1 -1
  215. package/commands/function/list.js +24 -29
  216. package/commands/function/server.d.ts +1 -1
  217. package/commands/function/server.js +15 -17
  218. package/commands/function.d.ts +1 -1
  219. package/commands/function.js +12 -18
  220. package/commands/getStarted.d.ts +1 -1
  221. package/commands/getStarted.js +124 -130
  222. package/commands/hubdb/__tests__/clear.test.d.ts +1 -0
  223. package/commands/hubdb/__tests__/clear.test.js +28 -0
  224. package/commands/hubdb/__tests__/create.test.d.ts +1 -0
  225. package/commands/hubdb/__tests__/create.test.js +28 -0
  226. package/commands/hubdb/__tests__/delete.test.d.ts +1 -0
  227. package/commands/hubdb/__tests__/delete.test.js +28 -0
  228. package/commands/hubdb/__tests__/fetch.test.d.ts +1 -0
  229. package/commands/hubdb/__tests__/fetch.test.js +28 -0
  230. package/commands/hubdb/__tests__/list.test.d.ts +1 -0
  231. package/commands/hubdb/__tests__/list.test.js +96 -0
  232. package/commands/hubdb/clear.d.ts +1 -1
  233. package/commands/hubdb/clear.js +20 -22
  234. package/commands/hubdb/create.d.ts +1 -1
  235. package/commands/hubdb/create.js +30 -35
  236. package/commands/hubdb/delete.d.ts +1 -1
  237. package/commands/hubdb/delete.js +24 -26
  238. package/commands/hubdb/fetch.d.ts +1 -1
  239. package/commands/hubdb/fetch.js +17 -19
  240. package/commands/hubdb/list.d.ts +1 -1
  241. package/commands/hubdb/list.js +33 -35
  242. package/commands/hubdb.d.ts +1 -1
  243. package/commands/hubdb.js +18 -24
  244. package/commands/init.d.ts +1 -1
  245. package/commands/init.js +83 -88
  246. package/commands/lint.d.ts +1 -1
  247. package/commands/lint.js +24 -26
  248. package/commands/list.d.ts +1 -1
  249. package/commands/list.js +32 -37
  250. package/commands/logs.d.ts +1 -1
  251. package/commands/logs.js +35 -38
  252. package/commands/mcp/__tests__/setup.test.d.ts +1 -0
  253. package/commands/mcp/__tests__/setup.test.js +26 -0
  254. package/commands/mcp/__tests__/start.test.d.ts +1 -0
  255. package/commands/mcp/__tests__/start.test.js +27 -0
  256. package/commands/mcp/setup.d.ts +1 -1
  257. package/commands/mcp/setup.js +17 -19
  258. package/commands/mcp/start.d.ts +1 -1
  259. package/commands/mcp/start.js +29 -34
  260. package/commands/mcp.d.ts +1 -1
  261. package/commands/mcp.js +7 -12
  262. package/commands/module/marketplace-validate.d.ts +1 -1
  263. package/commands/module/marketplace-validate.js +21 -26
  264. package/commands/module.d.ts +1 -1
  265. package/commands/module.js +7 -13
  266. package/commands/mv.d.ts +1 -1
  267. package/commands/mv.js +20 -22
  268. package/commands/open.d.ts +1 -1
  269. package/commands/open.js +19 -21
  270. package/commands/project/__tests__/add.test.d.ts +1 -0
  271. package/commands/project/__tests__/add.test.js +43 -0
  272. package/commands/project/__tests__/create.test.d.ts +1 -0
  273. package/commands/project/__tests__/create.test.js +40 -0
  274. package/commands/project/__tests__/deploy.test.d.ts +1 -0
  275. package/commands/project/__tests__/deploy.test.js +306 -0
  276. package/commands/project/__tests__/devUnifiedFlow.test.d.ts +1 -0
  277. package/commands/project/__tests__/devUnifiedFlow.test.js +414 -0
  278. package/commands/project/__tests__/download.test.d.ts +1 -0
  279. package/commands/project/__tests__/download.test.js +39 -0
  280. package/commands/project/__tests__/fixtures/exampleProject.json +33 -0
  281. package/commands/project/__tests__/installDeps.test.d.ts +1 -0
  282. package/commands/project/__tests__/installDeps.test.js +142 -0
  283. package/commands/project/__tests__/listBuilds.test.d.ts +1 -0
  284. package/commands/project/__tests__/listBuilds.test.js +38 -0
  285. package/commands/project/__tests__/logs.test.d.ts +1 -0
  286. package/commands/project/__tests__/logs.test.js +208 -0
  287. package/commands/project/__tests__/migrate.test.d.ts +1 -0
  288. package/commands/project/__tests__/migrate.test.js +111 -0
  289. package/commands/project/__tests__/migrateApp.test.d.ts +1 -0
  290. package/commands/project/__tests__/migrateApp.test.js +82 -0
  291. package/commands/project/__tests__/open.test.d.ts +1 -0
  292. package/commands/project/__tests__/open.test.js +39 -0
  293. package/commands/project/__tests__/profile.test.d.ts +1 -0
  294. package/commands/project/__tests__/profile.test.js +42 -0
  295. package/commands/project/__tests__/upload.test.d.ts +1 -0
  296. package/commands/project/__tests__/upload.test.js +43 -0
  297. package/commands/project/__tests__/watch.test.d.ts +1 -0
  298. package/commands/project/__tests__/watch.test.js +35 -0
  299. package/commands/project/add.d.ts +1 -1
  300. package/commands/project/add.js +34 -36
  301. package/commands/project/cloneApp.d.ts +1 -1
  302. package/commands/project/cloneApp.js +67 -72
  303. package/commands/project/create.d.ts +2 -2
  304. package/commands/project/create.js +62 -67
  305. package/commands/project/deploy.d.ts +1 -1
  306. package/commands/project/deploy.js +72 -77
  307. package/commands/project/dev/deprecatedFlow.d.ts +2 -2
  308. package/commands/project/dev/deprecatedFlow.js +52 -58
  309. package/commands/project/dev/index.d.ts +1 -1
  310. package/commands/project/dev/index.js +44 -47
  311. package/commands/project/dev/unifiedFlow.d.ts +3 -3
  312. package/commands/project/dev/unifiedFlow.js +62 -68
  313. package/commands/project/download.d.ts +1 -1
  314. package/commands/project/download.js +35 -40
  315. package/commands/project/installDeps.d.ts +1 -1
  316. package/commands/project/installDeps.js +29 -34
  317. package/commands/project/listBuilds.d.ts +1 -1
  318. package/commands/project/listBuilds.js +40 -45
  319. package/commands/project/logs.d.ts +1 -1
  320. package/commands/project/logs.js +52 -54
  321. package/commands/project/migrate.d.ts +1 -1
  322. package/commands/project/migrate.js +24 -26
  323. package/commands/project/migrateApp.d.ts +2 -2
  324. package/commands/project/migrateApp.js +18 -20
  325. package/commands/project/open.d.ts +1 -1
  326. package/commands/project/open.js +25 -30
  327. package/commands/project/profile/add.d.ts +1 -1
  328. package/commands/project/profile/add.js +68 -73
  329. package/commands/project/profile/delete.d.ts +1 -1
  330. package/commands/project/profile/delete.js +51 -56
  331. package/commands/project/profile.d.ts +1 -1
  332. package/commands/project/profile.js +9 -14
  333. package/commands/project/upload.d.ts +1 -1
  334. package/commands/project/upload.js +50 -55
  335. package/commands/project/validate.d.ts +1 -1
  336. package/commands/project/validate.js +35 -40
  337. package/commands/project/watch.d.ts +1 -1
  338. package/commands/project/watch.js +59 -61
  339. package/commands/project.d.ts +1 -1
  340. package/commands/project.js +38 -43
  341. package/commands/remove.d.ts +1 -1
  342. package/commands/remove.js +15 -17
  343. package/commands/sandbox/__tests__/create.test.d.ts +1 -0
  344. package/commands/sandbox/__tests__/create.test.js +31 -0
  345. package/commands/sandbox/__tests__/delete.test.d.ts +1 -0
  346. package/commands/sandbox/__tests__/delete.test.js +31 -0
  347. package/commands/sandbox/create.d.ts +1 -1
  348. package/commands/sandbox/create.js +67 -69
  349. package/commands/sandbox/delete.d.ts +1 -1
  350. package/commands/sandbox/delete.js +94 -96
  351. package/commands/sandbox.d.ts +1 -1
  352. package/commands/sandbox.js +9 -14
  353. package/commands/secret/__tests__/addSecret.test.d.ts +1 -0
  354. package/commands/secret/__tests__/addSecret.test.js +29 -0
  355. package/commands/secret/__tests__/deleteSecret.test.d.ts +1 -0
  356. package/commands/secret/__tests__/deleteSecret.test.js +41 -0
  357. package/commands/secret/__tests__/listSecret.test.d.ts +1 -0
  358. package/commands/secret/__tests__/listSecret.test.js +29 -0
  359. package/commands/secret/__tests__/updateSecret.test.d.ts +1 -0
  360. package/commands/secret/__tests__/updateSecret.test.js +29 -0
  361. package/commands/secret/addSecret.d.ts +1 -1
  362. package/commands/secret/addSecret.js +26 -28
  363. package/commands/secret/deleteSecret.d.ts +1 -1
  364. package/commands/secret/deleteSecret.js +27 -29
  365. package/commands/secret/listSecret.d.ts +1 -1
  366. package/commands/secret/listSecret.js +19 -21
  367. package/commands/secret/updateSecret.d.ts +1 -1
  368. package/commands/secret/updateSecret.js +25 -27
  369. package/commands/secret.d.ts +1 -1
  370. package/commands/secret.js +13 -18
  371. package/commands/testAccount/__tests__/create.test.d.ts +1 -0
  372. package/commands/testAccount/__tests__/create.test.js +33 -0
  373. package/commands/testAccount/__tests__/createConfig.test.d.ts +1 -0
  374. package/commands/testAccount/__tests__/createConfig.test.js +35 -0
  375. package/commands/testAccount/__tests__/delete.test.d.ts +1 -0
  376. package/commands/testAccount/__tests__/delete.test.js +31 -0
  377. package/commands/testAccount/create.d.ts +1 -1
  378. package/commands/testAccount/create.js +62 -57
  379. package/commands/testAccount/createConfig.d.ts +2 -2
  380. package/commands/testAccount/createConfig.js +36 -41
  381. package/commands/testAccount/delete.d.ts +1 -1
  382. package/commands/testAccount/delete.js +17 -19
  383. package/commands/testAccount.d.ts +1 -1
  384. package/commands/testAccount.js +10 -15
  385. package/commands/theme/__tests__/generate-selectors.test.d.ts +1 -0
  386. package/commands/theme/__tests__/generate-selectors.test.js +28 -0
  387. package/commands/theme/__tests__/marketplace-validate.test.d.ts +1 -0
  388. package/commands/theme/__tests__/marketplace-validate.test.js +36 -0
  389. package/commands/theme/__tests__/preview.test.d.ts +1 -0
  390. package/commands/theme/__tests__/preview.test.js +60 -0
  391. package/commands/theme/generate-selectors.d.ts +1 -1
  392. package/commands/theme/generate-selectors.js +23 -28
  393. package/commands/theme/marketplace-validate.d.ts +1 -1
  394. package/commands/theme/marketplace-validate.js +19 -24
  395. package/commands/theme/preview.d.ts +1 -1
  396. package/commands/theme/preview.js +60 -65
  397. package/commands/theme.d.ts +1 -1
  398. package/commands/theme.js +11 -16
  399. package/commands/upload.d.ts +1 -1
  400. package/commands/upload.js +77 -82
  401. package/commands/watch.d.ts +1 -1
  402. package/commands/watch.js +45 -51
  403. package/lang/en.d.ts +5 -65
  404. package/lang/en.js +374 -440
  405. package/lib/__tests__/accountTypes.test.d.ts +1 -0
  406. package/lib/__tests__/accountTypes.test.js +98 -0
  407. package/lib/__tests__/buildAccount.test.d.ts +1 -0
  408. package/lib/__tests__/buildAccount.test.js +196 -0
  409. package/lib/__tests__/commonOpts.test.d.ts +1 -0
  410. package/lib/__tests__/commonOpts.test.js +85 -0
  411. package/lib/__tests__/dependencyManagement.test.d.ts +1 -0
  412. package/lib/__tests__/dependencyManagement.test.js +175 -0
  413. package/lib/__tests__/developerTestAccounts.test.d.ts +1 -0
  414. package/lib/__tests__/developerTestAccounts.test.js +145 -0
  415. package/lib/__tests__/hasFeature.test.d.ts +1 -0
  416. package/lib/__tests__/hasFeature.test.js +35 -0
  417. package/lib/__tests__/npm.test.d.ts +1 -0
  418. package/lib/__tests__/npm.test.js +57 -0
  419. package/lib/__tests__/oauth.test.d.ts +1 -0
  420. package/lib/__tests__/oauth.test.js +108 -0
  421. package/lib/__tests__/parsing.test.d.ts +1 -0
  422. package/lib/__tests__/parsing.test.js +34 -0
  423. package/lib/__tests__/polling.test.d.ts +1 -0
  424. package/lib/__tests__/polling.test.js +76 -0
  425. package/lib/__tests__/process.test.d.ts +1 -0
  426. package/lib/__tests__/process.test.js +85 -0
  427. package/lib/__tests__/projectProfiles.test.d.ts +1 -0
  428. package/lib/__tests__/projectProfiles.test.js +129 -0
  429. package/lib/__tests__/sandboxSync.test.d.ts +1 -0
  430. package/lib/__tests__/sandboxSync.test.js +126 -0
  431. package/lib/__tests__/sandboxes.test.d.ts +1 -0
  432. package/lib/__tests__/sandboxes.test.js +146 -0
  433. package/lib/__tests__/serverlessLogs.test.d.ts +1 -0
  434. package/lib/__tests__/serverlessLogs.test.js +149 -0
  435. package/lib/__tests__/usageTracking.test.d.ts +1 -0
  436. package/lib/__tests__/usageTracking.test.js +170 -0
  437. package/lib/__tests__/validation.test.d.ts +1 -0
  438. package/lib/__tests__/validation.test.js +143 -0
  439. package/lib/__tests__/yargsUtils.test.d.ts +1 -0
  440. package/lib/__tests__/yargsUtils.test.js +39 -0
  441. package/lib/accountTypes.js +24 -34
  442. package/lib/app/__tests__/migrate.test.d.ts +1 -0
  443. package/lib/app/__tests__/migrate.test.js +490 -0
  444. package/lib/app/__tests__/migrate_legacy.test.d.ts +1 -0
  445. package/lib/app/__tests__/migrate_legacy.test.js +134 -0
  446. package/lib/app/migrate.d.ts +3 -3
  447. package/lib/app/migrate.js +127 -145
  448. package/lib/app/migrate_legacy.d.ts +1 -1
  449. package/lib/app/migrate_legacy.js +72 -78
  450. package/lib/app/urls.js +5 -9
  451. package/lib/buildAccount.d.ts +2 -8
  452. package/lib/buildAccount.js +61 -119
  453. package/lib/commonOpts.d.ts +1 -1
  454. package/lib/commonOpts.js +42 -59
  455. package/lib/configMigrate.js +34 -38
  456. package/lib/configOptions.js +34 -40
  457. package/lib/constants.js +31 -34
  458. package/lib/customObject.js +2 -6
  459. package/lib/dependencyManagement.js +37 -45
  460. package/lib/developerTestAccounts.d.ts +1 -1
  461. package/lib/developerTestAccounts.js +34 -39
  462. package/lib/doctor/Diagnosis.d.ts +1 -1
  463. package/lib/doctor/Diagnosis.js +15 -19
  464. package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
  465. package/lib/doctor/DiagnosticInfoBuilder.js +30 -37
  466. package/lib/doctor/Doctor.d.ts +1 -1
  467. package/lib/doctor/Doctor.js +56 -63
  468. package/lib/doctor/__tests__/Diagnosis.test.d.ts +1 -0
  469. package/lib/doctor/__tests__/Diagnosis.test.js +82 -0
  470. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.d.ts +1 -0
  471. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +167 -0
  472. package/lib/doctor/__tests__/Doctor.test.d.ts +1 -0
  473. package/lib/doctor/__tests__/Doctor.test.js +396 -0
  474. package/lib/enums/exitCodes.js +1 -4
  475. package/lib/errorHandlers/index.js +32 -41
  476. package/lib/errorHandlers/suppressError.d.ts +1 -1
  477. package/lib/errorHandlers/suppressError.js +28 -31
  478. package/lib/filesystem.js +8 -15
  479. package/lib/generateSelectors.js +18 -29
  480. package/lib/hasFeature.d.ts +1 -1
  481. package/lib/hasFeature.js +3 -6
  482. package/lib/interpolation.js +11 -18
  483. package/lib/lang.d.ts +1 -1
  484. package/lib/lang.js +22 -27
  485. package/lib/links.js +16 -24
  486. package/lib/marketplaceValidate.js +29 -39
  487. package/lib/mcp/setup.js +68 -80
  488. package/lib/middleware/__test__/configMiddleware.test.js +32 -67
  489. package/lib/middleware/__test__/gitMiddleware.test.js +11 -46
  490. package/lib/middleware/__test__/notificationsMiddleware.test.js +1 -3
  491. package/lib/middleware/__test__/requestMiddleware.test.js +8 -13
  492. package/lib/middleware/__test__/utils.test.js +9 -11
  493. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +16 -51
  494. package/lib/middleware/autoUpdateMiddleware.js +33 -40
  495. package/lib/middleware/configMiddleware.js +36 -42
  496. package/lib/middleware/fireAlarmMiddleware.js +12 -18
  497. package/lib/middleware/gitMiddleware.js +5 -8
  498. package/lib/middleware/notificationsMiddleware.js +7 -11
  499. package/lib/middleware/requestMiddleware.js +4 -10
  500. package/lib/middleware/utils.js +1 -4
  501. package/lib/middleware/yargsChecksMiddleware.js +10 -13
  502. package/lib/npm.js +14 -23
  503. package/lib/oauth.js +29 -35
  504. package/lib/parsing.js +3 -6
  505. package/lib/polling.js +11 -15
  506. package/lib/process.js +11 -19
  507. package/lib/projectProfiles.d.ts +2 -2
  508. package/lib/projectProfiles.js +32 -42
  509. package/lib/projects/ProjectLogsManager.js +18 -21
  510. package/lib/projects/__tests__/AppDevModeInterface.test.d.ts +1 -0
  511. package/lib/projects/__tests__/AppDevModeInterface.test.js +512 -0
  512. package/lib/projects/__tests__/LocalDevProcess.test.d.ts +1 -0
  513. package/lib/projects/__tests__/LocalDevProcess.test.js +309 -0
  514. package/lib/projects/__tests__/LocalDevWebsocketServer.test.d.ts +1 -0
  515. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +170 -0
  516. package/lib/projects/__tests__/ProjectLogsManager.test.d.ts +1 -0
  517. package/lib/projects/__tests__/ProjectLogsManager.test.js +189 -0
  518. package/lib/projects/__tests__/buildAndDeploy.test.d.ts +1 -0
  519. package/lib/projects/__tests__/buildAndDeploy.test.js +23 -0
  520. package/lib/projects/__tests__/components.test.d.ts +1 -0
  521. package/lib/projects/__tests__/components.test.js +181 -0
  522. package/lib/projects/__tests__/projects.test.d.ts +1 -0
  523. package/lib/projects/__tests__/projects.test.js +84 -0
  524. package/lib/projects/__tests__/structure.test.d.ts +1 -0
  525. package/lib/projects/__tests__/structure.test.js +211 -0
  526. package/lib/projects/add/__tests__/legacyAddComponent.test.d.ts +1 -0
  527. package/lib/projects/add/__tests__/legacyAddComponent.test.js +204 -0
  528. package/lib/projects/add/__tests__/v3AddComponent.test.d.ts +1 -0
  529. package/lib/projects/add/__tests__/v3AddComponent.test.js +185 -0
  530. package/lib/projects/add/legacyAddComponent.d.ts +1 -1
  531. package/lib/projects/add/legacyAddComponent.js +23 -29
  532. package/lib/projects/add/v3AddComponent.d.ts +1 -1
  533. package/lib/projects/add/v3AddComponent.js +35 -41
  534. package/lib/projects/buildAndDeploy.d.ts +1 -1
  535. package/lib/projects/buildAndDeploy.js +88 -97
  536. package/lib/projects/components.js +19 -25
  537. package/lib/projects/config.d.ts +1 -1
  538. package/lib/projects/config.js +32 -41
  539. package/lib/projects/create/__tests__/legacy.test.d.ts +1 -0
  540. package/lib/projects/create/__tests__/legacy.test.js +91 -0
  541. package/lib/projects/create/__tests__/v3.test.d.ts +1 -0
  542. package/lib/projects/create/__tests__/v3.test.js +78 -0
  543. package/lib/projects/create/index.d.ts +3 -3
  544. package/lib/projects/create/index.js +19 -22
  545. package/lib/projects/create/legacy.d.ts +1 -1
  546. package/lib/projects/create/legacy.js +25 -31
  547. package/lib/projects/create/v3.d.ts +3 -3
  548. package/lib/projects/create/v3.js +49 -59
  549. package/lib/projects/ensureProjectExists.js +31 -37
  550. package/lib/projects/localDev/AppDevModeInterface.d.ts +3 -3
  551. package/lib/projects/localDev/AppDevModeInterface.js +58 -60
  552. package/lib/projects/localDev/DevServerManager.d.ts +1 -1
  553. package/lib/projects/localDev/DevServerManager.js +24 -27
  554. package/lib/projects/localDev/DevServerManagerV2.d.ts +2 -2
  555. package/lib/projects/localDev/DevServerManagerV2.js +17 -22
  556. package/lib/projects/localDev/LocalDevLogger.d.ts +1 -1
  557. package/lib/projects/localDev/LocalDevLogger.js +59 -64
  558. package/lib/projects/localDev/LocalDevManager.d.ts +1 -1
  559. package/lib/projects/localDev/LocalDevManager.js +106 -111
  560. package/lib/projects/localDev/LocalDevProcess.d.ts +4 -4
  561. package/lib/projects/localDev/LocalDevProcess.js +25 -30
  562. package/lib/projects/localDev/LocalDevState.d.ts +3 -3
  563. package/lib/projects/localDev/LocalDevState.js +3 -5
  564. package/lib/projects/localDev/LocalDevWatcher.d.ts +1 -1
  565. package/lib/projects/localDev/LocalDevWatcher.js +6 -11
  566. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +1 -1
  567. package/lib/projects/localDev/LocalDevWebsocketServer.js +25 -27
  568. package/lib/projects/localDev/helpers.d.ts +4 -4
  569. package/lib/projects/localDev/helpers.js +156 -174
  570. package/lib/projects/structure.d.ts +4 -4
  571. package/lib/projects/structure.js +32 -78
  572. package/lib/projects/ui.js +10 -13
  573. package/lib/projects/upload.d.ts +2 -3
  574. package/lib/projects/upload.js +55 -65
  575. package/lib/projects/urls.js +14 -24
  576. package/lib/projects/watch.d.ts +1 -1
  577. package/lib/projects/watch.js +48 -54
  578. package/lib/prompts/__tests__/downloadProjectPrompt.test.d.ts +1 -0
  579. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +28 -0
  580. package/lib/prompts/__tests__/projectsLogsPrompt.test.d.ts +1 -0
  581. package/lib/prompts/__tests__/projectsLogsPrompt.test.js +37 -0
  582. package/lib/prompts/accountNamePrompt.d.ts +1 -1
  583. package/lib/prompts/accountNamePrompt.js +26 -31
  584. package/lib/prompts/accountsPrompt.js +12 -15
  585. package/lib/prompts/cmsFieldPrompt.js +13 -19
  586. package/lib/prompts/createApiSamplePrompt.d.ts +1 -1
  587. package/lib/prompts/createApiSamplePrompt.js +9 -12
  588. package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +10 -9
  589. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +52 -93
  590. package/lib/prompts/createFunctionPrompt.js +17 -20
  591. package/lib/prompts/createModulePrompt.js +12 -15
  592. package/lib/prompts/createTemplatePrompt.js +5 -8
  593. package/lib/prompts/downloadProjectPrompt.js +17 -20
  594. package/lib/prompts/installAppPrompt.js +19 -26
  595. package/lib/prompts/personalAccessKeyPrompt.d.ts +2 -2
  596. package/lib/prompts/personalAccessKeyPrompt.js +40 -47
  597. package/lib/prompts/previewPrompt.js +15 -22
  598. package/lib/prompts/projectAddPrompt.d.ts +1 -1
  599. package/lib/prompts/projectAddPrompt.js +14 -18
  600. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +1 -1
  601. package/lib/prompts/projectDevTargetAccountPrompt.js +48 -54
  602. package/lib/prompts/projectNameAndDestPrompt.d.ts +1 -1
  603. package/lib/prompts/projectNameAndDestPrompt.js +22 -29
  604. package/lib/prompts/projectNamePrompt.js +11 -14
  605. package/lib/prompts/projectsLogsPrompt.js +5 -8
  606. package/lib/prompts/promptUtils.d.ts +1 -1
  607. package/lib/prompts/promptUtils.js +15 -22
  608. package/lib/prompts/sandboxesPrompt.d.ts +1 -1
  609. package/lib/prompts/sandboxesPrompt.js +26 -30
  610. package/lib/prompts/secretPrompt.js +10 -15
  611. package/lib/prompts/selectAppPrompt.js +11 -14
  612. package/lib/prompts/selectHubDBTablePrompt.js +24 -30
  613. package/lib/prompts/selectProjectTemplatePrompt.d.ts +1 -1
  614. package/lib/prompts/selectProjectTemplatePrompt.js +10 -13
  615. package/lib/prompts/selectPublicAppForMigrationPrompt.js +22 -25
  616. package/lib/prompts/setAsDefaultAccountPrompt.js +13 -16
  617. package/lib/prompts/uploadPrompt.js +11 -17
  618. package/lib/sandboxSync.d.ts +1 -1
  619. package/lib/sandboxSync.js +58 -65
  620. package/lib/sandboxes.d.ts +1 -1
  621. package/lib/sandboxes.js +68 -76
  622. package/lib/schema.js +12 -19
  623. package/lib/serverlessLogs.js +45 -52
  624. package/lib/testUtils.js +4 -8
  625. package/lib/ui/SpinniesManager.d.ts +1 -1
  626. package/lib/ui/SpinniesManager.js +29 -35
  627. package/lib/ui/boxen.js +11 -14
  628. package/lib/ui/git.js +14 -20
  629. package/lib/ui/index.js +55 -73
  630. package/lib/ui/logger.js +10 -13
  631. package/lib/ui/serverlessFunctionLogs.js +14 -20
  632. package/lib/ui/spinniesUtils.js +24 -39
  633. package/lib/ui/supportHyperlinks.js +3 -6
  634. package/lib/ui/supportsColor.js +11 -17
  635. package/lib/ui/table.js +6 -13
  636. package/lib/upload.js +15 -21
  637. package/lib/usageTracking.js +44 -50
  638. package/lib/utils/hasFlag.d.ts +1 -0
  639. package/lib/utils/hasFlag.js +9 -0
  640. package/lib/validation.js +48 -87
  641. package/lib/yargsUtils.d.ts +2 -1
  642. package/lib/yargsUtils.js +13 -26
  643. package/mcp-server/server.js +6 -8
  644. package/mcp-server/tools/index.js +13 -16
  645. package/mcp-server/tools/project/AddFeatureToProject.d.ts +1 -1
  646. package/mcp-server/tools/project/AddFeatureToProject.js +33 -37
  647. package/mcp-server/tools/project/CreateProjectTool.d.ts +1 -1
  648. package/mcp-server/tools/project/CreateProjectTool.js +44 -48
  649. package/mcp-server/tools/project/DeployProject.d.ts +1 -1
  650. package/mcp-server/tools/project/DeployProject.js +16 -20
  651. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
  652. package/mcp-server/tools/project/GuidedWalkthroughTool.js +19 -23
  653. package/mcp-server/tools/project/UploadProjectTools.d.ts +1 -1
  654. package/mcp-server/tools/project/UploadProjectTools.js +10 -17
  655. package/mcp-server/tools/project/ValidateProjectTool.d.ts +1 -1
  656. package/mcp-server/tools/project/ValidateProjectTool.js +11 -15
  657. package/mcp-server/tools/project/__tests__/AddFeatureToProject.test.d.ts +1 -0
  658. package/mcp-server/tools/project/__tests__/AddFeatureToProject.test.js +150 -0
  659. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.d.ts +1 -0
  660. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +127 -0
  661. package/mcp-server/tools/project/__tests__/DeployProject.test.d.ts +1 -0
  662. package/mcp-server/tools/project/__tests__/DeployProject.test.js +118 -0
  663. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.d.ts +1 -0
  664. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +125 -0
  665. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.d.ts +1 -0
  666. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +106 -0
  667. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.d.ts +1 -0
  668. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +109 -0
  669. package/mcp-server/tools/project/constants.js +3 -9
  670. package/mcp-server/types.js +1 -5
  671. package/mcp-server/utils/__tests__/command.test.d.ts +1 -0
  672. package/mcp-server/utils/__tests__/command.test.js +45 -0
  673. package/mcp-server/utils/__tests__/project.test.d.ts +1 -0
  674. package/mcp-server/utils/__tests__/project.test.js +76 -0
  675. package/mcp-server/utils/command.d.ts +1 -1
  676. package/mcp-server/utils/command.js +4 -11
  677. package/mcp-server/utils/content.d.ts +1 -1
  678. package/mcp-server/utils/content.js +2 -6
  679. package/mcp-server/utils/project.js +8 -14
  680. package/package.json +20 -16
  681. package/types/LocalDev.d.ts +4 -4
  682. package/types/LocalDev.js +1 -2
  683. package/types/ProjectComponents.d.ts +2 -2
  684. package/types/ProjectComponents.js +1 -2
  685. package/types/Projects.d.ts +1 -1
  686. package/types/Projects.js +2 -5
  687. package/types/Prompts.js +1 -2
  688. package/types/Yargs.js +1 -2
  689. package/types/{Cms.d.ts → cms.d.ts} +1 -1
  690. package/types/cms.js +1 -0
  691. package/types/sandboxes.js +1 -0
  692. package/commands/app/install.d.ts +0 -8
  693. package/commands/app/install.js +0 -127
  694. package/types/Cms.js +0 -2
  695. package/types/Sandboxes.js +0 -2
  696. /package/types/{Sandboxes.d.ts → sandboxes.d.ts} +0 -0
@@ -0,0 +1,150 @@
1
+ import { AddFeatureToProject, } from '../AddFeatureToProject.js';
2
+ import { runCommandInDir } from '../../../utils/project.js';
3
+ import { addFlag } from '../../../utils/command.js';
4
+ import { APP_AUTH_TYPES, APP_DISTRIBUTION_TYPES, } from '../../../../lib/constants.js';
5
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
6
+ vi.mock('../../../utils/project');
7
+ vi.mock('../../../utils/command');
8
+ vi.mock('../../../../lib/constants');
9
+ const mockRunCommandInDir = runCommandInDir;
10
+ const mockAddFlag = addFlag;
11
+ describe('mcp-server/tools/project/AddFeatureToProject', () => {
12
+ let mockMcpServer;
13
+ let tool;
14
+ let mockRegisteredTool;
15
+ beforeEach(() => {
16
+ vi.clearAllMocks();
17
+ // @ts-expect-error Not mocking the whole server
18
+ mockMcpServer = {
19
+ registerTool: vi.fn(),
20
+ };
21
+ mockRegisteredTool = {};
22
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
23
+ tool = new AddFeatureToProject(mockMcpServer);
24
+ // Mock addFlag to simulate command building
25
+ mockAddFlag.mockImplementation((command, flag, value) => `${command} --${flag} "${value}"`);
26
+ });
27
+ describe('register', () => {
28
+ it('should register tool with correct parameters', () => {
29
+ const result = tool.register();
30
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('add-feature-to-hubspot-project', {
31
+ title: 'Add feature to HubSpot Project',
32
+ description: 'Adds a feature to an existing HubSpot project',
33
+ inputSchema: expect.any(Object),
34
+ }, tool.handler);
35
+ expect(result).toBe(mockRegisteredTool);
36
+ });
37
+ });
38
+ describe('handler', () => {
39
+ const baseInput = {
40
+ absoluteProjectPath: '/test/project',
41
+ addApp: false,
42
+ };
43
+ it('should handle successful command execution without app', async () => {
44
+ mockRunCommandInDir.mockResolvedValue({
45
+ stdout: 'Feature added successfully',
46
+ stderr: '',
47
+ });
48
+ const result = await tool.handler(baseInput);
49
+ expect(mockAddFlag).toHaveBeenCalledWith('hs project add', 'features', []);
50
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.any(String));
51
+ expect(result).toEqual({
52
+ content: [
53
+ { type: 'text', text: 'Feature added successfully' },
54
+ { type: 'text', text: '' },
55
+ ],
56
+ });
57
+ });
58
+ it('should handle successful command execution with features', async () => {
59
+ mockRunCommandInDir.mockResolvedValue({
60
+ stdout: 'Features added successfully',
61
+ stderr: '',
62
+ });
63
+ const input = {
64
+ ...baseInput,
65
+ features: ['card', 'settings'],
66
+ };
67
+ await tool.handler(input);
68
+ expect(mockAddFlag).toHaveBeenCalledWith('hs project add', 'features', [
69
+ 'card',
70
+ 'settings',
71
+ ]);
72
+ });
73
+ it('should prompt for distribution and auth when adding app without both', async () => {
74
+ const input = {
75
+ ...baseInput,
76
+ addApp: true,
77
+ };
78
+ const result = await tool.handler(input);
79
+ expect(result.content).toEqual([
80
+ {
81
+ type: 'text',
82
+ text: expect.stringContaining('Ask the user how they would you like to distribute the application'),
83
+ },
84
+ {
85
+ type: 'text',
86
+ text: expect.stringContaining('Ask the user which auth type they would like to use'),
87
+ },
88
+ ]);
89
+ });
90
+ it('should prompt for auth when adding app without auth', async () => {
91
+ const input = {
92
+ ...baseInput,
93
+ addApp: true,
94
+ distribution: APP_DISTRIBUTION_TYPES.PRIVATE,
95
+ };
96
+ const result = await tool.handler(input);
97
+ expect(result.content).toEqual([
98
+ {
99
+ type: 'text',
100
+ text: expect.stringContaining('Ask the user which auth type they would like to use'),
101
+ },
102
+ ]);
103
+ });
104
+ it('should add distribution and auth flags when provided', async () => {
105
+ mockRunCommandInDir.mockResolvedValue({
106
+ stdout: 'App feature added',
107
+ stderr: '',
108
+ });
109
+ const input = {
110
+ ...baseInput,
111
+ addApp: true,
112
+ distribution: APP_DISTRIBUTION_TYPES.MARKETPLACE,
113
+ auth: APP_AUTH_TYPES.OAUTH,
114
+ features: ['webhooks'],
115
+ };
116
+ await tool.handler(input);
117
+ expect(mockAddFlag).toHaveBeenCalledWith('hs project add', 'distribution', APP_DISTRIBUTION_TYPES.MARKETPLACE);
118
+ expect(mockAddFlag).toHaveBeenCalledWith(expect.any(String), 'auth', APP_AUTH_TYPES.OAUTH);
119
+ expect(mockAddFlag).toHaveBeenCalledWith(expect.any(String), 'features', [
120
+ 'webhooks',
121
+ ]);
122
+ });
123
+ it('should handle command execution error', async () => {
124
+ const error = new Error('Command failed');
125
+ mockRunCommandInDir.mockRejectedValue(error);
126
+ const result = await tool.handler(baseInput);
127
+ expect(result).toEqual({
128
+ content: [{ type: 'text', text: 'Command failed' }],
129
+ });
130
+ });
131
+ it('should handle non-Error rejection', async () => {
132
+ mockRunCommandInDir.mockRejectedValue('String error');
133
+ const result = await tool.handler(baseInput);
134
+ expect(result).toEqual({
135
+ content: [{ type: 'text', text: 'String error' }],
136
+ });
137
+ });
138
+ it('should handle stderr in results', async () => {
139
+ mockRunCommandInDir.mockResolvedValue({
140
+ stdout: 'Success with warnings',
141
+ stderr: 'Warning: something happened',
142
+ });
143
+ const result = await tool.handler(baseInput);
144
+ expect(result.content).toEqual([
145
+ { type: 'text', text: 'Success with warnings' },
146
+ { type: 'text', text: 'Warning: something happened' },
147
+ ]);
148
+ });
149
+ });
150
+ });
@@ -0,0 +1,127 @@
1
+ import { CreateProjectTool, } from '../CreateProjectTool.js';
2
+ import { runCommandInDir } from '../../../utils/project.js';
3
+ import { addFlag } from '../../../utils/command.js';
4
+ import { APP_DISTRIBUTION_TYPES } from '../../../../lib/constants.js';
5
+ import { EMPTY_PROJECT, PROJECT_WITH_APP, } from '../../../../lib/projects/create/v3.js';
6
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
7
+ vi.mock('../../../utils/project');
8
+ vi.mock('../../../utils/command');
9
+ vi.mock('../../../../lib/constants');
10
+ vi.mock('../../../../lib/projects/create/v3');
11
+ const mockRunCommandInDir = runCommandInDir;
12
+ const mockAddFlag = addFlag;
13
+ describe('mcp-server/tools/project/CreateProjectTool', () => {
14
+ let mockMcpServer;
15
+ let tool;
16
+ let mockRegisteredTool;
17
+ beforeEach(() => {
18
+ vi.clearAllMocks();
19
+ // @ts-expect-error Not mocking the whole thing
20
+ mockMcpServer = {
21
+ registerTool: vi.fn(),
22
+ };
23
+ mockRegisteredTool = {};
24
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
25
+ tool = new CreateProjectTool(mockMcpServer);
26
+ // Mock addFlag to simulate command building
27
+ mockAddFlag.mockImplementation((command, flag, value) => `${command} --${flag} "${value}"`);
28
+ });
29
+ describe('register', () => {
30
+ it('should register tool with correct parameters', () => {
31
+ const result = tool.register();
32
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('create-hubspot-project', {
33
+ title: 'Create HubSpot Project',
34
+ description: 'Creates a HubSpot project with the provided name and outputs it in the provided destination',
35
+ inputSchema: expect.any(Object),
36
+ }, tool.handler);
37
+ expect(result).toBe(mockRegisteredTool);
38
+ });
39
+ });
40
+ describe('handler', () => {
41
+ const baseInput = {
42
+ absoluteCurrentWorkingDirectory: '/test/workspace',
43
+ name: 'test-project',
44
+ destination: './test-dest',
45
+ projectBase: EMPTY_PROJECT,
46
+ };
47
+ it('should handle successful command execution', async () => {
48
+ mockRunCommandInDir.mockResolvedValue({
49
+ stdout: 'Project created successfully',
50
+ stderr: '',
51
+ });
52
+ const result = await tool.handler(baseInput);
53
+ expect(mockAddFlag).toHaveBeenCalledWith('hs project create', 'platform-version', '2025.2');
54
+ expect(mockAddFlag).toHaveBeenCalledWith(expect.any(String), 'name', 'test-project');
55
+ expect(mockAddFlag).toHaveBeenCalledWith(expect.any(String), 'dest', './test-dest');
56
+ expect(mockAddFlag).toHaveBeenCalledWith(expect.any(String), 'project-base', EMPTY_PROJECT);
57
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/workspace', expect.any(String));
58
+ expect(result).toEqual({
59
+ content: [
60
+ { type: 'text', text: 'Project created successfully' },
61
+ { type: 'text', text: '' },
62
+ ],
63
+ });
64
+ });
65
+ it('should handle command execution error', async () => {
66
+ const error = new Error('Command failed');
67
+ mockRunCommandInDir.mockRejectedValue(error);
68
+ const result = await tool.handler(baseInput);
69
+ expect(result).toEqual({
70
+ content: [{ type: 'text', text: 'Command failed' }],
71
+ });
72
+ });
73
+ it('should prompt for distribution and auth when creating app project without both', async () => {
74
+ const input = {
75
+ ...baseInput,
76
+ projectBase: PROJECT_WITH_APP,
77
+ };
78
+ const result = await tool.handler(input);
79
+ expect(result.content).toEqual([
80
+ {
81
+ type: 'text',
82
+ text: expect.stringContaining('Ask the user how they would you like to distribute the application?'),
83
+ },
84
+ {
85
+ type: 'text',
86
+ text: expect.stringContaining('Ask the user which auth type they would like to use?'),
87
+ },
88
+ ]);
89
+ });
90
+ it('should prompt for auth when creating app project without auth', async () => {
91
+ const input = {
92
+ ...baseInput,
93
+ projectBase: PROJECT_WITH_APP,
94
+ distribution: APP_DISTRIBUTION_TYPES.PRIVATE,
95
+ };
96
+ const result = await tool.handler(input);
97
+ expect(result.content).toEqual([
98
+ {
99
+ type: 'text',
100
+ text: expect.stringContaining('Ask the user which auth type they would like to use?'),
101
+ },
102
+ ]);
103
+ });
104
+ it('should add features flag when features are provided', async () => {
105
+ mockRunCommandInDir.mockResolvedValue({
106
+ stdout: 'Project created',
107
+ stderr: '',
108
+ });
109
+ const input = {
110
+ ...baseInput,
111
+ features: ['card', 'settings'],
112
+ };
113
+ await tool.handler(input);
114
+ expect(mockAddFlag).toHaveBeenCalledWith(expect.any(String), 'features', [
115
+ 'card',
116
+ 'settings',
117
+ ]);
118
+ });
119
+ it('should handle non-Error rejection', async () => {
120
+ mockRunCommandInDir.mockRejectedValue('String error');
121
+ const result = await tool.handler(baseInput);
122
+ expect(result).toEqual({
123
+ content: [{ type: 'text', text: 'String error' }],
124
+ });
125
+ });
126
+ });
127
+ });
@@ -0,0 +1,118 @@
1
+ import { DeployProject } from '../DeployProject.js';
2
+ import { runCommandInDir } from '../../../utils/project.js';
3
+ import { addFlag } from '../../../utils/command.js';
4
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
5
+ vi.mock('../../../utils/project');
6
+ vi.mock('../../../utils/command');
7
+ const mockRunCommandInDir = runCommandInDir;
8
+ const mockAddFlag = addFlag;
9
+ describe('mcp-server/tools/project/DeployProject', () => {
10
+ let mockMcpServer;
11
+ let tool;
12
+ let mockRegisteredTool;
13
+ beforeEach(() => {
14
+ vi.clearAllMocks();
15
+ // @ts-expect-error Not mocking the whole server
16
+ mockMcpServer = {
17
+ registerTool: vi.fn(),
18
+ };
19
+ mockRegisteredTool = {};
20
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
21
+ tool = new DeployProject(mockMcpServer);
22
+ // Mock addFlag to simulate command building
23
+ mockAddFlag.mockImplementation((command, flag, value) => `${command} --${flag} "${value}"`);
24
+ });
25
+ describe('register', () => {
26
+ it('should register tool with correct parameters', () => {
27
+ const result = tool.register();
28
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('deploy-hubspot-project', {
29
+ title: 'Deploy a build of HubSpot Project',
30
+ description: expect.stringContaining('Takes a build number and a project name and deploys that build of the project'),
31
+ inputSchema: expect.any(Object),
32
+ }, tool.handler);
33
+ expect(result).toBe(mockRegisteredTool);
34
+ });
35
+ });
36
+ describe('handler', () => {
37
+ const baseInput = {
38
+ absoluteProjectPath: '/test/project',
39
+ };
40
+ it('should deploy project with specified build number', async () => {
41
+ mockRunCommandInDir.mockResolvedValue({
42
+ stdout: 'Project deployed successfully',
43
+ stderr: '',
44
+ });
45
+ const input = {
46
+ ...baseInput,
47
+ buildNumber: 123,
48
+ };
49
+ const result = await tool.handler(input);
50
+ expect(mockAddFlag).toHaveBeenCalledWith('hs project deploy', 'build', 123);
51
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', expect.stringContaining('--build "123"'));
52
+ expect(result).toEqual({
53
+ content: [
54
+ { type: 'text', text: 'Project deployed successfully' },
55
+ { type: 'text', text: '' },
56
+ ],
57
+ });
58
+ });
59
+ it('should prompt for build number when not provided', async () => {
60
+ mockRunCommandInDir.mockResolvedValue({
61
+ stdout: 'Build 1: Created 2023-01-01\nBuild 2: Created 2023-01-02',
62
+ stderr: '',
63
+ });
64
+ const result = await tool.handler(baseInput);
65
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', 'hs project list-builds --limit 100');
66
+ expect(result.content).toEqual([
67
+ {
68
+ type: 'text',
69
+ text: expect.stringContaining('Ask the user which build number they would like to deploy?'),
70
+ },
71
+ ]);
72
+ expect(result.content[0].text).toContain('Build 1: Created 2023-01-01');
73
+ });
74
+ it('should handle deployment with stderr', async () => {
75
+ mockRunCommandInDir.mockResolvedValue({
76
+ stdout: 'Deployed successfully',
77
+ stderr: 'Warning: deprecated feature used',
78
+ });
79
+ const input = {
80
+ ...baseInput,
81
+ buildNumber: 456,
82
+ };
83
+ const result = await tool.handler(input);
84
+ expect(result.content).toEqual([
85
+ { type: 'text', text: 'Deployed successfully' },
86
+ { type: 'text', text: 'Warning: deprecated feature used' },
87
+ ]);
88
+ });
89
+ it('should handle errors during list-builds command', async () => {
90
+ const error = new Error('Failed to list builds');
91
+ mockRunCommandInDir.mockRejectedValue(error);
92
+ // The error would be thrown and caught by the calling code
93
+ await expect(tool.handler(baseInput)).rejects.toThrow('Failed to list builds');
94
+ });
95
+ it('should handle errors during deploy command', async () => {
96
+ const error = new Error('Deployment failed');
97
+ mockRunCommandInDir.mockRejectedValue(error);
98
+ const input = {
99
+ ...baseInput,
100
+ buildNumber: 789,
101
+ };
102
+ await expect(tool.handler(input)).rejects.toThrow('Deployment failed');
103
+ });
104
+ it('should prompt for build when buildNumber is 0 (falsy)', async () => {
105
+ mockRunCommandInDir.mockResolvedValue({
106
+ stdout: 'Build 0: Initial build\nBuild 1: Latest build',
107
+ stderr: '',
108
+ });
109
+ const input = {
110
+ ...baseInput,
111
+ buildNumber: 0, // This is falsy, so it will prompt
112
+ };
113
+ const result = await tool.handler(input);
114
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', 'hs project list-builds --limit 100');
115
+ expect(result.content[0].text).toContain('Ask the user which build number they would like to deploy?');
116
+ });
117
+ });
118
+ });
@@ -0,0 +1,125 @@
1
+ import { GuidedWalkthroughTool } from '../GuidedWalkthroughTool.js';
2
+ import { execAsync } from '../../../utils/command.js';
3
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
4
+ vi.mock('../../../utils/command');
5
+ const mockExecAsync = execAsync;
6
+ describe('mcp-server/tools/project/GuidedWalkthroughTool', () => {
7
+ let mockMcpServer;
8
+ let tool;
9
+ let mockRegisteredTool;
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ // @ts-expect-error Not mocking whole server
13
+ mockMcpServer = {
14
+ registerTool: vi.fn(),
15
+ };
16
+ mockRegisteredTool = {};
17
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
18
+ tool = new GuidedWalkthroughTool(mockMcpServer);
19
+ });
20
+ describe('register', () => {
21
+ it('should register tool with correct parameters', () => {
22
+ const result = tool.register();
23
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('guided-walkthrough-hubspot-cli', {
24
+ title: 'Guided walkthrough of the CLI',
25
+ description: 'Give the user a guided walkthrough of the HubSpot CLI.',
26
+ inputSchema: expect.any(Object),
27
+ }, tool.handler);
28
+ expect(result).toBe(mockRegisteredTool);
29
+ });
30
+ });
31
+ describe('handler', () => {
32
+ it('should show help for hs init command', async () => {
33
+ const helpOutput = 'Usage: hs init [options]\nInitialize HubSpot CLI';
34
+ mockExecAsync.mockResolvedValue({
35
+ stdout: helpOutput,
36
+ stderr: '',
37
+ });
38
+ const result = await tool.handler({ command: 'hs init' });
39
+ expect(mockExecAsync).toHaveBeenCalledWith('hs init --help');
40
+ expect(result.content).toHaveLength(1);
41
+ expect(result.content[0].text).toContain(helpOutput);
42
+ expect(result.content[0].text).toContain('hs auth');
43
+ });
44
+ it('should show help for hs auth command', async () => {
45
+ const helpOutput = 'Usage: hs auth [options]\nAuthenticate with HubSpot';
46
+ mockExecAsync.mockResolvedValue({
47
+ stdout: helpOutput,
48
+ stderr: '',
49
+ });
50
+ const result = await tool.handler({ command: 'hs auth' });
51
+ expect(mockExecAsync).toHaveBeenCalledWith('hs auth --help');
52
+ expect(result.content[0].text).toContain(helpOutput);
53
+ expect(result.content[0].text).toContain('hs project create');
54
+ });
55
+ it('should show help for hs project create command', async () => {
56
+ const helpOutput = 'Usage: hs project create [options]\nCreate a new project';
57
+ mockExecAsync.mockResolvedValue({
58
+ stdout: helpOutput,
59
+ stderr: '',
60
+ });
61
+ const result = await tool.handler({ command: 'hs project create' });
62
+ expect(mockExecAsync).toHaveBeenCalledWith('hs project create --help');
63
+ expect(result.content[0].text).toContain(helpOutput);
64
+ expect(result.content[0].text).toContain('hs project upload');
65
+ });
66
+ it('should show help for hs project upload command', async () => {
67
+ const helpOutput = 'Usage: hs project upload [options]\nUpload project to HubSpot';
68
+ mockExecAsync.mockResolvedValue({
69
+ stdout: helpOutput,
70
+ stderr: '',
71
+ });
72
+ const result = await tool.handler({ command: 'hs project upload' });
73
+ expect(mockExecAsync).toHaveBeenCalledWith('hs project upload --help');
74
+ expect(result.content[0].text).toContain(helpOutput);
75
+ expect(result.content[0].text).toContain('hs project dev');
76
+ });
77
+ it('should handle command without next step', async () => {
78
+ const helpOutput = 'Usage: hs project dev [options]\nStart development server';
79
+ mockExecAsync.mockResolvedValue({
80
+ stdout: helpOutput,
81
+ stderr: '',
82
+ });
83
+ // Test with a command that doesn't have a next command
84
+ const result = await tool.handler({ command: 'hs project upload' });
85
+ expect(result.content[0].text).toContain(helpOutput);
86
+ expect(result.content[0].text).toContain('hs project dev');
87
+ });
88
+ it('should handle no command provided', async () => {
89
+ const result = await tool.handler({});
90
+ expect(mockExecAsync).not.toHaveBeenCalled();
91
+ expect(result.content).toEqual([
92
+ {
93
+ type: 'text',
94
+ text: 'Is there another command you would like to learn more about?',
95
+ },
96
+ ]);
97
+ });
98
+ it('should handle undefined command', async () => {
99
+ const result = await tool.handler({ command: undefined });
100
+ expect(mockExecAsync).not.toHaveBeenCalled();
101
+ expect(result.content).toEqual([
102
+ {
103
+ type: 'text',
104
+ text: 'Is there another command you would like to learn more about?',
105
+ },
106
+ ]);
107
+ });
108
+ it('should handle execAsync errors', async () => {
109
+ const error = new Error('Command not found');
110
+ mockExecAsync.mockRejectedValue(error);
111
+ await expect(tool.handler({ command: 'hs init' })).rejects.toThrow('Command not found');
112
+ });
113
+ it('should format help text with proper instructions', async () => {
114
+ const helpOutput = 'Usage: hs init\nOptions:\n --help Show help';
115
+ mockExecAsync.mockResolvedValue({
116
+ stdout: helpOutput,
117
+ stderr: '',
118
+ });
119
+ const result = await tool.handler({ command: 'hs init' });
120
+ expect(result.content[0].text).toContain('Display this help output for the user amd wait for them to acknowledge:');
121
+ expect(result.content[0].text).toContain(helpOutput);
122
+ expect(result.content[0].text).toContain('Once they are ready, A good command to look at next is hs auth');
123
+ });
124
+ });
125
+ });
@@ -0,0 +1,106 @@
1
+ import { UploadProjectTools } from '../UploadProjectTools.js';
2
+ import { runCommandInDir } from '../../../utils/project.js';
3
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
4
+ vi.mock('../../../utils/project');
5
+ const mockRunCommandInDir = runCommandInDir;
6
+ describe('mcp-server/tools/project/UploadProjectTools', () => {
7
+ let mockMcpServer;
8
+ let tool;
9
+ let mockRegisteredTool;
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ // @ts-expect-error noy mocking whole server
13
+ mockMcpServer = {
14
+ registerTool: vi.fn(),
15
+ };
16
+ mockRegisteredTool = {};
17
+ mockMcpServer.registerTool.mockReturnValue(mockRegisteredTool);
18
+ tool = new UploadProjectTools(mockMcpServer);
19
+ });
20
+ describe('register', () => {
21
+ it('should register tool with correct parameters', () => {
22
+ const result = tool.register();
23
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('upload-hubspot-project', {
24
+ title: 'Upload HubSpot Project',
25
+ description: expect.stringContaining('Uploads the HubSpot project in current working directory.'),
26
+ inputSchema: expect.any(Object),
27
+ }, tool.handler);
28
+ expect(result).toBe(mockRegisteredTool);
29
+ });
30
+ });
31
+ describe('handler', () => {
32
+ const input = {
33
+ absoluteProjectPath: '/test/project',
34
+ };
35
+ it('should upload project successfully', async () => {
36
+ mockRunCommandInDir.mockResolvedValue({
37
+ stdout: 'Project uploaded successfully',
38
+ stderr: '',
39
+ });
40
+ const result = await tool.handler(input);
41
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', 'hs project upload --force-create');
42
+ expect(result).toEqual({
43
+ content: [
44
+ { type: 'text', text: 'Project uploaded successfully' },
45
+ { type: 'text', text: '' },
46
+ ],
47
+ });
48
+ });
49
+ it('should handle upload with warnings', async () => {
50
+ mockRunCommandInDir.mockResolvedValue({
51
+ stdout: 'Project uploaded with warnings',
52
+ stderr: 'Warning: some files were ignored',
53
+ });
54
+ const result = await tool.handler(input);
55
+ expect(result.content).toEqual([
56
+ { type: 'text', text: 'Project uploaded with warnings' },
57
+ { type: 'text', text: 'Warning: some files were ignored' },
58
+ ]);
59
+ });
60
+ it('should handle upload errors', async () => {
61
+ const error = new Error('Upload failed');
62
+ mockRunCommandInDir.mockRejectedValue(error);
63
+ await expect(tool.handler(input)).rejects.toThrow('Upload failed');
64
+ });
65
+ it('should use force-create flag', async () => {
66
+ mockRunCommandInDir.mockResolvedValue({
67
+ stdout: 'Project created and uploaded',
68
+ stderr: '',
69
+ });
70
+ await tool.handler(input);
71
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/test/project', 'hs project upload --force-create');
72
+ });
73
+ it('should handle empty stdout and stderr', async () => {
74
+ mockRunCommandInDir.mockResolvedValue({
75
+ stdout: '',
76
+ stderr: '',
77
+ });
78
+ const result = await tool.handler(input);
79
+ expect(result.content).toEqual([
80
+ { type: 'text', text: '' },
81
+ { type: 'text', text: '' },
82
+ ]);
83
+ });
84
+ it('should work with different project paths', async () => {
85
+ mockRunCommandInDir.mockResolvedValue({
86
+ stdout: 'Upload complete',
87
+ stderr: '',
88
+ });
89
+ const differentInput = {
90
+ absoluteProjectPath: '/different/path/to/project',
91
+ };
92
+ await tool.handler(differentInput);
93
+ expect(mockRunCommandInDir).toHaveBeenCalledWith('/different/path/to/project', 'hs project upload --force-create');
94
+ });
95
+ it('should handle very long output', async () => {
96
+ const longOutput = 'A'.repeat(10000);
97
+ mockRunCommandInDir.mockResolvedValue({
98
+ stdout: longOutput,
99
+ stderr: 'Long stderr output',
100
+ });
101
+ const result = await tool.handler(input);
102
+ expect(result.content[0].text).toBe(longOutput);
103
+ expect(result.content[1].text).toBe('Long stderr output');
104
+ });
105
+ });
106
+ });