@hubspot/cli 7.8.0-experimental.0 → 7.8.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 (357) hide show
  1. package/bin/cli.js +31 -27
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/doctor.test.js +16 -16
  4. package/commands/__tests__/getStarted.test.js +2 -2
  5. package/commands/__tests__/mcp.test.js +1 -1
  6. package/commands/__tests__/project.test.js +2 -3
  7. package/commands/account/auth.js +1 -0
  8. package/commands/account/clean.js +18 -27
  9. package/commands/account/createOverride.js +13 -31
  10. package/commands/account/info.js +20 -31
  11. package/commands/account/list.js +16 -22
  12. package/commands/account/remove.js +12 -20
  13. package/commands/account/removeOverride.js +11 -21
  14. package/commands/account/rename.js +6 -9
  15. package/commands/account/use.js +12 -26
  16. package/commands/account.js +2 -2
  17. package/commands/app/__tests__/migrate.test.js +5 -6
  18. package/commands/app/migrate.js +13 -19
  19. package/commands/app/secret/add.js +2 -1
  20. package/commands/app/secret/delete.js +2 -1
  21. package/commands/app/secret/list.js +2 -1
  22. package/commands/app/secret/update.js +2 -1
  23. package/commands/app/secret.js +2 -1
  24. package/commands/app.js +2 -2
  25. package/commands/auth.d.ts +1 -0
  26. package/commands/auth.js +17 -7
  27. package/commands/cms/convertFields.js +7 -9
  28. package/commands/cms/getReactModule.js +9 -14
  29. package/commands/cms/lighthouseScore.js +33 -36
  30. package/commands/cms.js +2 -2
  31. package/commands/completion.js +3 -3
  32. package/commands/config/set.d.ts +1 -1
  33. package/commands/config/set.js +64 -37
  34. package/commands/config.js +2 -2
  35. package/commands/create.js +2 -2
  36. package/commands/customObject/create.js +10 -12
  37. package/commands/customObject/schema/create.js +9 -11
  38. package/commands/customObject/schema/delete.js +16 -16
  39. package/commands/customObject/schema/fetch-all.js +12 -11
  40. package/commands/customObject/schema/fetch.js +15 -15
  41. package/commands/customObject/schema/list.js +4 -4
  42. package/commands/customObject/schema/update.js +13 -13
  43. package/commands/customObject/schema.js +2 -2
  44. package/commands/customObject.js +6 -7
  45. package/commands/doctor.js +8 -11
  46. package/commands/feedback.js +8 -13
  47. package/commands/fetch.js +8 -8
  48. package/commands/filemanager/fetch.js +7 -7
  49. package/commands/filemanager/upload.js +15 -34
  50. package/commands/filemanager.js +2 -2
  51. package/commands/function/deploy.js +11 -29
  52. package/commands/function/list.js +8 -8
  53. package/commands/function/server.js +9 -11
  54. package/commands/function.d.ts +1 -1
  55. package/commands/function.js +2 -2
  56. package/commands/getStarted.d.ts +1 -3
  57. package/commands/getStarted.js +68 -20
  58. package/commands/hubdb/clear.js +7 -15
  59. package/commands/hubdb/create.js +9 -15
  60. package/commands/hubdb/delete.js +8 -15
  61. package/commands/hubdb/fetch.js +6 -9
  62. package/commands/hubdb.d.ts +1 -1
  63. package/commands/hubdb.js +2 -2
  64. package/commands/init.js +2 -3
  65. package/commands/lint.js +16 -16
  66. package/commands/list.js +8 -14
  67. package/commands/logs.js +14 -20
  68. package/commands/mcp/__tests__/setup.test.js +2 -2
  69. package/commands/mcp/setup.js +11 -2
  70. package/commands/mcp.js +3 -3
  71. package/commands/mv.js +6 -17
  72. package/commands/open.js +5 -5
  73. package/commands/project/__tests__/add.test.js +15 -13
  74. package/commands/project/__tests__/create.test.js +6 -6
  75. package/commands/project/__tests__/deploy.test.js +3 -7
  76. package/commands/project/__tests__/devUnifiedFlow.test.js +2 -4
  77. package/commands/project/__tests__/installDeps.test.js +8 -8
  78. package/commands/project/__tests__/list.test.js +31 -0
  79. package/commands/project/__tests__/logs.test.js +1 -4
  80. package/commands/project/__tests__/migrate.test.js +7 -7
  81. package/commands/project/__tests__/migrateApp.test.js +3 -7
  82. package/commands/project/__tests__/profile.test.js +1 -1
  83. package/commands/project/__tests__/validate.test.js +98 -0
  84. package/commands/project/add.d.ts +2 -2
  85. package/commands/project/add.js +7 -10
  86. package/commands/project/cloneApp.js +14 -19
  87. package/commands/project/create.js +4 -11
  88. package/commands/project/deploy.js +5 -5
  89. package/commands/project/dev/deprecatedFlow.js +9 -18
  90. package/commands/project/dev/index.js +21 -18
  91. package/commands/project/dev/unifiedFlow.js +15 -8
  92. package/commands/project/download.js +15 -16
  93. package/commands/project/installDeps.d.ts +2 -2
  94. package/commands/project/installDeps.js +9 -9
  95. package/commands/project/list.d.ts +4 -0
  96. package/commands/project/list.js +62 -0
  97. package/commands/project/listBuilds.js +12 -21
  98. package/commands/project/logs.js +21 -24
  99. package/commands/project/migrate.js +33 -12
  100. package/commands/project/migrateApp.js +10 -17
  101. package/commands/project/open.js +6 -14
  102. package/commands/project/profile/add.js +3 -3
  103. package/commands/project/profile/delete.js +1 -2
  104. package/commands/project/profile.js +2 -3
  105. package/commands/project/upload.js +16 -25
  106. package/commands/project/validate.js +7 -7
  107. package/commands/project/watch.js +13 -22
  108. package/commands/project.js +4 -3
  109. package/commands/sandbox/__tests__/create.test.js +5 -5
  110. package/commands/sandbox/create.js +22 -32
  111. package/commands/sandbox/delete.js +39 -64
  112. package/commands/sandbox.js +2 -2
  113. package/commands/secret/addSecret.js +7 -17
  114. package/commands/secret/deleteSecret.js +10 -20
  115. package/commands/secret/listSecret.js +8 -10
  116. package/commands/secret/updateSecret.js +9 -17
  117. package/commands/secret.js +2 -2
  118. package/commands/testAccount/__tests__/delete.test.js +2 -4
  119. package/commands/testAccount/create.js +2 -2
  120. package/commands/testAccount/delete.d.ts +4 -3
  121. package/commands/testAccount/delete.js +155 -14
  122. package/commands/testAccount/importData.d.ts +1 -1
  123. package/commands/testAccount/importData.js +1 -1
  124. package/commands/testAccount.js +1 -1
  125. package/commands/theme/preview.js +1 -4
  126. package/lang/en.d.ts +365 -111
  127. package/lang/en.js +409 -158
  128. package/lang/en.lyaml +4 -4
  129. package/lib/__tests__/buildAccount.test.js +4 -3
  130. package/lib/__tests__/commonOpts.test.js +1 -1
  131. package/lib/__tests__/dependencyManagement.test.js +1 -1
  132. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  133. package/lib/__tests__/hasFeature.test.js +145 -7
  134. package/lib/__tests__/npm.test.js +1 -1
  135. package/lib/__tests__/oauth.test.js +4 -4
  136. package/lib/__tests__/process.test.js +10 -5
  137. package/lib/__tests__/sandboxSync.test.js +8 -8
  138. package/lib/__tests__/sandboxes.test.js +8 -8
  139. package/lib/__tests__/serverlessLogs.test.js +1 -1
  140. package/lib/__tests__/usageTracking.test.js +5 -5
  141. package/lib/__tests__/validation.test.js +2 -1
  142. package/lib/__tests__/yargsUtils.test.js +83 -9
  143. package/lib/app/__tests__/migrate.test.js +19 -56
  144. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  145. package/lib/app/migrate.d.ts +2 -8
  146. package/lib/app/migrate.js +6 -81
  147. package/lib/app/migrate_legacy.js +20 -24
  148. package/lib/buildAccount.d.ts +2 -2
  149. package/lib/buildAccount.js +32 -64
  150. package/lib/commonOpts.d.ts +1 -1
  151. package/lib/commonOpts.js +25 -22
  152. package/lib/configMigrate.js +88 -9
  153. package/lib/configOptions.js +7 -0
  154. package/lib/constants.d.ts +22 -1
  155. package/lib/constants.js +26 -1
  156. package/lib/dependencyManagement.d.ts +0 -5
  157. package/lib/dependencyManagement.js +9 -36
  158. package/lib/developerTestAccounts.js +9 -23
  159. package/lib/doctor/Diagnosis.js +11 -23
  160. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  161. package/lib/doctor/Doctor.js +42 -90
  162. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  163. package/lib/errorHandlers/index.js +12 -20
  164. package/lib/errorHandlers/suppressError.js +11 -18
  165. package/lib/hasFeature.js +6 -0
  166. package/lib/lang.js +6 -5
  167. package/lib/links.d.ts +1 -0
  168. package/lib/links.js +14 -7
  169. package/lib/mcp/setup.js +1 -1
  170. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  171. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  172. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  173. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  174. package/lib/middleware/commandTargetingUtils.js +74 -0
  175. package/lib/middleware/configMiddleware.d.ts +1 -1
  176. package/lib/middleware/configMiddleware.js +21 -81
  177. package/lib/middleware/fireAlarmMiddleware.js +15 -5
  178. package/lib/middleware/gitMiddleware.js +5 -1
  179. package/lib/middleware/notificationsMiddleware.js +5 -11
  180. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  181. package/lib/npm.js +2 -2
  182. package/lib/oauth.js +5 -5
  183. package/lib/process.js +5 -4
  184. package/lib/projects/__tests__/AppDevModeInterface.test.js +87 -90
  185. package/lib/projects/__tests__/LocalDevProcess.test.js +231 -19
  186. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +89 -63
  187. package/lib/projects/__tests__/deploy.test.js +73 -8
  188. package/lib/projects/__tests__/localDevProjectHelpers.test.js +6 -2
  189. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  190. package/lib/projects/__tests__/projects.test.js +12 -12
  191. package/lib/projects/__tests__/structure.test.js +3 -3
  192. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  193. package/lib/projects/__tests__/upload.test.js +82 -0
  194. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  195. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
  196. package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +39 -39
  197. package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
  198. package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
  199. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  200. package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
  201. package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +82 -7
  202. package/lib/projects/create/index.js +4 -4
  203. package/lib/projects/create/legacy.js +2 -2
  204. package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
  205. package/lib/projects/create/{v3.js → v2.js} +16 -13
  206. package/lib/projects/deploy.d.ts +1 -1
  207. package/lib/projects/deploy.js +2 -2
  208. package/lib/projects/localDev/AppDevModeInterface.d.ts +10 -1
  209. package/lib/projects/localDev/AppDevModeInterface.js +118 -89
  210. package/lib/projects/localDev/DevServerManager.d.ts +11 -29
  211. package/lib/projects/localDev/DevServerManager.js +19 -61
  212. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
  213. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
  214. package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
  215. package/lib/projects/localDev/LocalDevLogger.js +27 -6
  216. package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +10 -11
  217. package/lib/projects/localDev/LocalDevProcess.d.ts +7 -5
  218. package/lib/projects/localDev/LocalDevProcess.js +93 -21
  219. package/lib/projects/localDev/LocalDevState.d.ts +12 -8
  220. package/lib/projects/localDev/LocalDevState.js +27 -17
  221. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +6 -1
  222. package/lib/projects/localDev/LocalDevWebsocketServer.js +94 -33
  223. package/lib/projects/localDev/helpers/account.d.ts +1 -1
  224. package/lib/projects/localDev/helpers/account.js +2 -2
  225. package/lib/projects/localDev/helpers/project.d.ts +3 -2
  226. package/lib/projects/localDev/helpers/project.js +49 -10
  227. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +7 -0
  228. package/lib/projects/localDev/localDevWebsocketServerUtils.js +19 -0
  229. package/lib/projects/platformVersion.d.ts +1 -1
  230. package/lib/projects/platformVersion.js +1 -1
  231. package/lib/projects/pollProjectBuildAndDeploy.js +4 -4
  232. package/lib/projects/structure.js +6 -6
  233. package/lib/projects/upload.d.ts +1 -1
  234. package/lib/projects/upload.js +17 -8
  235. package/lib/projects/urls.d.ts +0 -1
  236. package/lib/projects/urls.js +0 -3
  237. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  238. package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
  239. package/lib/prompts/accountNamePrompt.js +14 -19
  240. package/lib/prompts/accountsPrompt.js +2 -2
  241. package/lib/prompts/cmsFieldPrompt.js +2 -2
  242. package/lib/prompts/createApiSamplePrompt.js +5 -5
  243. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  244. package/lib/prompts/createFunctionPrompt.js +14 -14
  245. package/lib/prompts/createModulePrompt.js +9 -9
  246. package/lib/prompts/createTemplatePrompt.js +2 -2
  247. package/lib/prompts/downloadProjectPrompt.js +5 -8
  248. package/lib/prompts/installAppPrompt.d.ts +1 -6
  249. package/lib/prompts/installAppPrompt.js +1 -6
  250. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  251. package/lib/prompts/previewPrompt.js +6 -6
  252. package/lib/prompts/projectAddPrompt.d.ts +2 -2
  253. package/lib/prompts/projectAddPrompt.js +9 -2
  254. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  255. package/lib/prompts/projectNamePrompt.js +4 -8
  256. package/lib/prompts/projectsLogsPrompt.js +2 -4
  257. package/lib/prompts/promptUtils.js +30 -9
  258. package/lib/prompts/sandboxesPrompt.js +7 -7
  259. package/lib/prompts/secretPrompt.js +3 -3
  260. package/lib/prompts/selectAppPrompt.js +3 -3
  261. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  262. package/lib/prompts/selectProjectTemplatePrompt.js +2 -0
  263. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  264. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  265. package/lib/prompts/uploadPrompt.js +5 -5
  266. package/lib/sandboxSync.js +24 -41
  267. package/lib/sandboxes.js +19 -47
  268. package/lib/schema.js +3 -3
  269. package/lib/serverlessLogs.js +11 -13
  270. package/lib/theme/__tests__/migrate.test.d.ts +1 -0
  271. package/lib/theme/__tests__/migrate.test.js +233 -0
  272. package/lib/theme/migrate.d.ts +13 -0
  273. package/lib/theme/migrate.js +90 -0
  274. package/lib/ui/SpinniesManager.d.ts +2 -0
  275. package/lib/ui/SpinniesManager.js +112 -8
  276. package/lib/ui/boxen.js +1 -2
  277. package/lib/ui/git.js +13 -10
  278. package/lib/ui/index.d.ts +4 -0
  279. package/lib/ui/index.js +47 -38
  280. package/lib/ui/serverlessFunctionLogs.js +9 -7
  281. package/lib/ui/uiMessages.d.ts +72 -0
  282. package/lib/ui/uiMessages.js +75 -0
  283. package/lib/usageTracking.js +8 -8
  284. package/lib/validation.js +20 -23
  285. package/lib/yargsUtils.d.ts +1 -1
  286. package/lib/yargsUtils.js +12 -5
  287. package/mcp-server/tools/cms/HsCreateFunctionTool.js +1 -1
  288. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  289. package/mcp-server/tools/cms/HsCreateModuleTool.js +1 -1
  290. package/mcp-server/tools/cms/HsCreateTemplateTool.js +1 -1
  291. package/mcp-server/tools/cms/HsFunctionLogsTool.js +2 -2
  292. package/mcp-server/tools/cms/HsListFunctionsTool.js +1 -1
  293. package/mcp-server/tools/cms/HsListTool.js +1 -1
  294. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +1 -1
  295. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.js +1 -1
  296. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.js +1 -1
  297. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.js +2 -2
  298. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.js +1 -1
  299. package/mcp-server/tools/cms/__tests__/HsListTool.test.js +1 -1
  300. package/mcp-server/tools/index.js +4 -0
  301. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +3 -3
  302. package/mcp-server/tools/project/AddFeatureToProjectTool.js +3 -3
  303. package/mcp-server/tools/project/CreateProjectTool.d.ts +3 -3
  304. package/mcp-server/tools/project/CreateProjectTool.js +5 -5
  305. package/mcp-server/tools/project/DeployProjectTool.js +1 -1
  306. package/mcp-server/tools/project/DocFetchTool.js +2 -2
  307. package/mcp-server/tools/project/DocsSearchTool.d.ts +4 -1
  308. package/mcp-server/tools/project/DocsSearchTool.js +7 -7
  309. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  310. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  311. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  312. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  313. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -1
  314. package/mcp-server/tools/project/GetConfigValuesTool.js +13 -7
  315. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  316. package/mcp-server/tools/project/GuidedWalkthroughTool.js +1 -1
  317. package/mcp-server/tools/project/UploadProjectTools.js +2 -2
  318. package/mcp-server/tools/project/ValidateProjectTool.js +1 -1
  319. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.js +1 -1
  320. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +2 -2
  321. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.js +1 -1
  322. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +2 -2
  323. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +14 -12
  324. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  325. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  326. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  327. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  328. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +9 -8
  329. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +1 -1
  330. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +1 -1
  331. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +1 -1
  332. package/mcp-server/tools/project/constants.d.ts +1 -1
  333. package/mcp-server/tools/project/constants.js +9 -3
  334. package/mcp-server/utils/__tests__/cliConfig.test.d.ts +1 -0
  335. package/mcp-server/utils/__tests__/cliConfig.test.js +110 -0
  336. package/mcp-server/utils/cliConfig.d.ts +1 -0
  337. package/mcp-server/utils/cliConfig.js +12 -0
  338. package/mcp-server/utils/toolUsageTracking.js +2 -2
  339. package/package.json +8 -12
  340. package/types/LocalDev.d.ts +19 -3
  341. package/ui/components/HorizontalSelectPrompt.js +1 -1
  342. package/ui/index.js +1 -1
  343. package/commands/getStartedV2.d.ts +0 -9
  344. package/commands/getStartedV2.js +0 -39
  345. package/lib/middleware/__test__/utils.test.js +0 -51
  346. package/lib/middleware/utils.d.ts +0 -8
  347. package/lib/middleware/utils.js +0 -14
  348. package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
  349. package/lib/projects/localDev/DevServerManagerV2.js +0 -81
  350. package/ui/components/Ascii.d.ts +0 -10
  351. package/ui/components/Ascii.js +0 -11
  352. package/ui/views/GetStarted.d.ts +0 -7
  353. package/ui/views/GetStarted.js +0 -157
  354. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/list.test.d.ts} +0 -0
  355. /package/{lib/projects/add/__tests__/v3AddComponent.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
  356. /package/lib/{projects/create/__tests__/v3.test.d.ts → middleware/__test__/commandTargetingUtils.test.d.ts} +0 -0
  357. /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
@@ -0,0 +1,115 @@
1
+ import { GetApplicationInfoTool } from '../GetApplicationInfoTool.js';
2
+ import { getAccountId } from '@hubspot/local-dev-lib/config';
3
+ import { http } from '@hubspot/local-dev-lib/http';
4
+ import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
5
+ vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
6
+ vi.mock('../../utils/toolUsageTracking');
7
+ vi.mock('@hubspot/local-dev-lib/http');
8
+ vi.mock('@hubspot/local-dev-lib/errors/index');
9
+ vi.mock('@hubspot/local-dev-lib/config');
10
+ const mockGetAccountId = getAccountId;
11
+ const mockHttp = http;
12
+ const mockIsHubSpotHttpError = isHubSpotHttpError;
13
+ describe('mcp-server/tools/project/GetApplicationInfoTool', () => {
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 GetApplicationInfoTool(mockMcpServer);
26
+ });
27
+ describe('register', () => {
28
+ it('should register tool with correct parameters', () => {
29
+ const result = tool.register();
30
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('get-applications-info', {
31
+ title: 'Get Applications Information',
32
+ description: 'Retrieves a list of all HubSpot applications available in the current account. Returns an array of applications, where each application contains an appId (numeric identifier) and appName (string). This information is useful for identifying available applications before using other tools that require specific application IDs, such as getting API usage patterns. No input parameters are required - this tool fetches all applications from the HubSpot Insights API.',
33
+ inputSchema: {},
34
+ }, tool.handler);
35
+ expect(result).toBe(mockRegisteredTool);
36
+ });
37
+ });
38
+ describe('handler', () => {
39
+ const input = {};
40
+ beforeEach(() => {
41
+ mockGetAccountId.mockReturnValue(123456789);
42
+ mockIsHubSpotHttpError.mockReturnValue(false);
43
+ });
44
+ it('should return application information successfully', async () => {
45
+ const mockResponse = {
46
+ data: {
47
+ applications: [
48
+ {
49
+ appId: 12345,
50
+ appName: 'Test App 1',
51
+ },
52
+ {
53
+ appId: 67890,
54
+ appName: 'Test App 2',
55
+ },
56
+ ],
57
+ },
58
+ status: 200,
59
+ statusText: 'OK',
60
+ headers: {},
61
+ config: { headers: {} },
62
+ };
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ mockHttp.get.mockResolvedValue(mockResponse);
65
+ const result = await tool.handler(input);
66
+ expect(mockGetAccountId).toHaveBeenCalledWith();
67
+ expect(mockHttp.get).toHaveBeenCalledWith(123456789, {
68
+ url: 'app/feature/utilization/public/v3/insights/apps',
69
+ });
70
+ expect(result).toEqual({
71
+ content: [
72
+ {
73
+ type: 'text',
74
+ text: JSON.stringify(mockResponse.data, null, 2),
75
+ },
76
+ ],
77
+ });
78
+ });
79
+ it('should return error when account ID cannot be determined', async () => {
80
+ mockGetAccountId.mockReturnValue(null);
81
+ const result = await tool.handler(input);
82
+ expect(result).toEqual({
83
+ content: [
84
+ {
85
+ type: 'text',
86
+ text: 'No account ID found. Please run `hs account auth` to configure an account, or set a default account with `hs account use <account>`',
87
+ },
88
+ ],
89
+ });
90
+ expect(mockHttp.get).not.toHaveBeenCalled();
91
+ });
92
+ it('should handle empty applications response', async () => {
93
+ const mockResponse = {
94
+ data: {
95
+ applications: [],
96
+ },
97
+ status: 200,
98
+ statusText: 'OK',
99
+ headers: {},
100
+ config: { headers: {} },
101
+ };
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ mockHttp.get.mockResolvedValue(mockResponse);
104
+ const result = await tool.handler(input);
105
+ expect(result).toEqual({
106
+ content: [
107
+ {
108
+ type: 'text',
109
+ text: JSON.stringify(mockResponse.data, null, 2),
110
+ },
111
+ ],
112
+ });
113
+ });
114
+ });
115
+ });
@@ -1,13 +1,13 @@
1
1
  import { GetConfigValuesTool } from '../GetConfigValuesTool.js';
2
2
  import { getIntermediateRepresentationSchema, mapToInternalType, } from '@hubspot/project-parsing-lib';
3
- import { getAccountId } from '@hubspot/local-dev-lib/config';
3
+ import { getAccountIdFromCliConfig } from '../../../utils/cliConfig.js';
4
4
  vi.mock('@modelcontextprotocol/sdk/server/mcp.js');
5
5
  vi.mock('@hubspot/project-parsing-lib');
6
- vi.mock('@hubspot/local-dev-lib/config');
6
+ vi.mock('../../../utils/cliConfig.js');
7
7
  vi.mock('../../../utils/toolUsageTracking');
8
8
  const mockGetIntermediateRepresentationSchema = getIntermediateRepresentationSchema;
9
9
  const mockMapToInternalType = mapToInternalType;
10
- const mockGetAccountId = getAccountId;
10
+ const mockGetAccountIdFromCliConfig = getAccountIdFromCliConfig;
11
11
  describe('mcp-server/tools/project/GetConfigValuesTool', () => {
12
12
  let mockMcpServer;
13
13
  let tool;
@@ -25,7 +25,7 @@ describe('mcp-server/tools/project/GetConfigValuesTool', () => {
25
25
  describe('register', () => {
26
26
  it('should register tool with correct parameters', () => {
27
27
  const result = tool.register();
28
- expect(mockMcpServer.registerTool).toHaveBeenCalledWith('get-hubspot-feature-config-schema', {
28
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('get-feature-config-schema', {
29
29
  title: 'Fetch the JSON Schema for component',
30
30
  description: expect.stringContaining('Fetches and returns the JSON schema for the provided feature'),
31
31
  inputSchema: expect.objectContaining({
@@ -44,9 +44,10 @@ describe('mcp-server/tools/project/GetConfigValuesTool', () => {
44
44
  const input = {
45
45
  platformVersion: '2025.2',
46
46
  featureType: 'card',
47
+ absoluteCurrentWorkingDirectory: '/foo',
47
48
  };
48
49
  beforeEach(() => {
49
- mockGetAccountId.mockReturnValue(123456789);
50
+ mockGetAccountIdFromCliConfig.mockReturnValue(123456789);
50
51
  });
51
52
  it('should return config schema when component type exists', async () => {
52
53
  const mockSchema = {
@@ -61,6 +62,7 @@ describe('mcp-server/tools/project/GetConfigValuesTool', () => {
61
62
  mockGetIntermediateRepresentationSchema.mockResolvedValue(mockSchema);
62
63
  mockMapToInternalType.mockReturnValue('internal-card-type');
63
64
  const result = await tool.handler(input);
65
+ expect(mockGetAccountIdFromCliConfig).toHaveBeenCalledWith('/foo');
64
66
  expect(mockGetIntermediateRepresentationSchema).toHaveBeenCalledWith({
65
67
  platformVersion: '2025.2',
66
68
  projectSourceDir: '',
@@ -133,14 +135,13 @@ describe('mcp-server/tools/project/GetConfigValuesTool', () => {
133
135
  });
134
136
  });
135
137
  it('should handle null account id', async () => {
136
- mockGetAccountId.mockReturnValue(null);
137
- mockGetIntermediateRepresentationSchema.mockRejectedValue(new Error('No account ID'));
138
+ mockGetAccountIdFromCliConfig.mockReturnValue(null);
138
139
  const result = await tool.handler(input);
139
140
  expect(result).toEqual({
140
141
  content: [
141
142
  {
142
143
  type: 'text',
143
- text: 'Unable to locate JSON schema for type card',
144
+ text: 'No account ID found. Please run `hs account auth` to configure an account, or set a default account with `hs account use <account>`',
144
145
  },
145
146
  ],
146
147
  });
@@ -21,7 +21,7 @@ describe('mcp-server/tools/project/GuidedWalkthroughTool', () => {
21
21
  describe('register', () => {
22
22
  it('should register tool with correct parameters', () => {
23
23
  const result = tool.register();
24
- expect(mockMcpServer.registerTool).toHaveBeenCalledWith('guided-walkthrough-hubspot-cli', {
24
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('guided-walkthrough-cli', {
25
25
  title: 'Guided walkthrough of the CLI',
26
26
  description: 'Give the user a guided walkthrough of the HubSpot CLI.',
27
27
  inputSchema: expect.any(Object),
@@ -21,7 +21,7 @@ describe('mcp-server/tools/project/UploadProjectTools', () => {
21
21
  describe('register', () => {
22
22
  it('should register tool with correct parameters', () => {
23
23
  const result = tool.register();
24
- expect(mockMcpServer.registerTool).toHaveBeenCalledWith('upload-hubspot-project', {
24
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('upload-project', {
25
25
  title: 'Upload HubSpot Project',
26
26
  description: expect.stringContaining('Uploads the HubSpot project in current working directory.'),
27
27
  inputSchema: expect.any(Object),
@@ -21,7 +21,7 @@ describe('mcp-server/tools/project/ValidateProjectTool', () => {
21
21
  describe('register', () => {
22
22
  it('should register tool with correct parameters', () => {
23
23
  const result = tool.register();
24
- expect(mockMcpServer.registerTool).toHaveBeenCalledWith('validate-hubspot-project', {
24
+ expect(mockMcpServer.registerTool).toHaveBeenCalledWith('validate-project', {
25
25
  title: expect.stringContaining('Validate HubSpot Project'),
26
26
  description: expect.stringContaining('Validates the HubSpot project and its configuration files.'),
27
27
  inputSchema: expect.any(Object),
@@ -1,6 +1,6 @@
1
1
  import z from 'zod';
2
2
  export declare const absoluteProjectPath: z.ZodString;
3
3
  export declare const absoluteCurrentWorkingDirectory: z.ZodString;
4
- export declare const features: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodLiteral<"card">, z.ZodLiteral<"settings">, z.ZodLiteral<"app-function">, z.ZodLiteral<"webhooks">, z.ZodLiteral<"workflow-action">, z.ZodLiteral<"workflow-action-tool">, z.ZodLiteral<"app-object">, z.ZodLiteral<"scim">]>, "many">>;
4
+ export declare const features: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodLiteral<"card">, z.ZodLiteral<"settings">, z.ZodLiteral<"app-function">, z.ZodLiteral<"webhooks">, z.ZodLiteral<"workflow-action">, z.ZodLiteral<"workflow-action-tool">, z.ZodLiteral<"app-object">, z.ZodLiteral<"app-event">, z.ZodLiteral<"scim">, z.ZodLiteral<"page">]>, "many">>;
5
5
  export declare const docsSearchQuery: z.ZodString;
6
6
  export declare const docUrl: z.ZodString;
@@ -9,12 +9,18 @@ export const features = z
9
9
  .array(z.union([
10
10
  z.literal('card'),
11
11
  z.literal('settings'),
12
- z.literal('app-function'),
12
+ z
13
+ .literal('app-function')
14
+ .describe('Also known as a public serverless function'),
13
15
  z.literal('webhooks'),
14
- z.literal('workflow-action'),
15
- z.literal('workflow-action-tool'),
16
+ z
17
+ .literal('workflow-action')
18
+ .describe('Also known as a custom workflow action.'),
19
+ z.literal('workflow-action-tool').describe('Also known as agent tools.'),
16
20
  z.literal('app-object'),
21
+ z.literal('app-event'),
17
22
  z.literal('scim'),
23
+ z.literal('page'),
18
24
  ]))
19
25
  .describe('The features to include in the project, multiple options can be selected')
20
26
  .optional();
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,110 @@
1
+ import { getAccountIdFromCliConfig } from '../cliConfig.js';
2
+ import { configFileExists, findConfig, getAccountId, loadConfig, } from '@hubspot/local-dev-lib/config';
3
+ vi.mock('@hubspot/local-dev-lib/config');
4
+ const mockConfigFileExists = configFileExists;
5
+ const mockFindConfig = findConfig;
6
+ const mockGetAccountId = getAccountId;
7
+ const mockLoadConfig = loadConfig;
8
+ describe('mcp-server/utils/cliConfig', () => {
9
+ const mockWorkingDirectory = '/test/working/directory';
10
+ beforeEach(() => {
11
+ vi.clearAllMocks();
12
+ });
13
+ describe('getAccountIdFromCliConfig', () => {
14
+ it('should load global config when it exists and return account ID', () => {
15
+ const expectedAccountId = 12345;
16
+ mockConfigFileExists.mockReturnValue(true);
17
+ mockGetAccountId.mockReturnValue(expectedAccountId);
18
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory);
19
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
20
+ expect(mockLoadConfig).toHaveBeenCalledWith('');
21
+ expect(mockFindConfig).not.toHaveBeenCalled();
22
+ expect(mockGetAccountId).toHaveBeenCalledWith(undefined);
23
+ expect(result).toBe(expectedAccountId);
24
+ });
25
+ it('should load local config when global config does not exist and return account ID', () => {
26
+ const expectedAccountId = 67890;
27
+ const localConfigPath = '/path/to/local/config';
28
+ mockConfigFileExists.mockReturnValue(false);
29
+ mockFindConfig.mockReturnValue(localConfigPath);
30
+ mockGetAccountId.mockReturnValue(expectedAccountId);
31
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory);
32
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
33
+ expect(mockFindConfig).toHaveBeenCalledWith(mockWorkingDirectory);
34
+ expect(mockLoadConfig).toHaveBeenCalledWith(localConfigPath);
35
+ expect(mockGetAccountId).toHaveBeenCalledWith(undefined);
36
+ expect(result).toBe(expectedAccountId);
37
+ });
38
+ it('should pass accountNameOrId parameter to getAccountId when provided as string', () => {
39
+ const expectedAccountId = 11111;
40
+ const accountName = 'test-account';
41
+ mockConfigFileExists.mockReturnValue(true);
42
+ mockGetAccountId.mockReturnValue(expectedAccountId);
43
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory, accountName);
44
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
45
+ expect(mockLoadConfig).toHaveBeenCalledWith('');
46
+ expect(mockGetAccountId).toHaveBeenCalledWith(accountName);
47
+ expect(result).toBe(expectedAccountId);
48
+ });
49
+ it('should pass accountNameOrId parameter to getAccountId when provided as number', () => {
50
+ const expectedAccountId = 22222;
51
+ const accountId = 22222;
52
+ mockConfigFileExists.mockReturnValue(true);
53
+ mockGetAccountId.mockReturnValue(expectedAccountId);
54
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory, accountId);
55
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
56
+ expect(mockLoadConfig).toHaveBeenCalledWith('');
57
+ expect(mockGetAccountId).toHaveBeenCalledWith(accountId);
58
+ expect(result).toBe(expectedAccountId);
59
+ });
60
+ it('should return null when getAccountId returns null', () => {
61
+ mockConfigFileExists.mockReturnValue(true);
62
+ mockGetAccountId.mockReturnValue(null);
63
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory);
64
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
65
+ expect(mockLoadConfig).toHaveBeenCalledWith('');
66
+ expect(mockGetAccountId).toHaveBeenCalledWith(undefined);
67
+ expect(result).toBeNull();
68
+ });
69
+ it('should handle findConfig returning null by passing null to loadConfig', () => {
70
+ const expectedAccountId = 33333;
71
+ mockConfigFileExists.mockReturnValue(false);
72
+ mockFindConfig.mockReturnValue(null);
73
+ mockGetAccountId.mockReturnValue(expectedAccountId);
74
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory);
75
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
76
+ expect(mockFindConfig).toHaveBeenCalledWith(mockWorkingDirectory);
77
+ expect(mockLoadConfig).toHaveBeenCalledWith(null);
78
+ expect(mockGetAccountId).toHaveBeenCalledWith(undefined);
79
+ expect(result).toBe(expectedAccountId);
80
+ });
81
+ it('should work with local config when provided with account name parameter', () => {
82
+ const expectedAccountId = 44444;
83
+ const accountName = 'local-test-account';
84
+ const localConfigPath = '/path/to/local/config';
85
+ mockConfigFileExists.mockReturnValue(false);
86
+ mockFindConfig.mockReturnValue(localConfigPath);
87
+ mockGetAccountId.mockReturnValue(expectedAccountId);
88
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory, accountName);
89
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
90
+ expect(mockFindConfig).toHaveBeenCalledWith(mockWorkingDirectory);
91
+ expect(mockLoadConfig).toHaveBeenCalledWith(localConfigPath);
92
+ expect(mockGetAccountId).toHaveBeenCalledWith(accountName);
93
+ expect(result).toBe(expectedAccountId);
94
+ });
95
+ it('should work with local config when provided with account ID parameter', () => {
96
+ const expectedAccountId = 55555;
97
+ const accountId = 55555;
98
+ const localConfigPath = '/path/to/local/config';
99
+ mockConfigFileExists.mockReturnValue(false);
100
+ mockFindConfig.mockReturnValue(localConfigPath);
101
+ mockGetAccountId.mockReturnValue(expectedAccountId);
102
+ const result = getAccountIdFromCliConfig(mockWorkingDirectory, accountId);
103
+ expect(mockConfigFileExists).toHaveBeenCalledWith(true);
104
+ expect(mockFindConfig).toHaveBeenCalledWith(mockWorkingDirectory);
105
+ expect(mockLoadConfig).toHaveBeenCalledWith(localConfigPath);
106
+ expect(mockGetAccountId).toHaveBeenCalledWith(accountId);
107
+ expect(result).toBe(expectedAccountId);
108
+ });
109
+ });
110
+ });
@@ -0,0 +1 @@
1
+ export declare function getAccountIdFromCliConfig(absolutePathToWorkingDirectory: string, accountNameOrId?: string | number): number | null;
@@ -0,0 +1,12 @@
1
+ import { configFileExists, findConfig, getAccountId, loadConfig, } from '@hubspot/local-dev-lib/config';
2
+ export function getAccountIdFromCliConfig(absolutePathToWorkingDirectory, accountNameOrId) {
3
+ const globalConfigExists = configFileExists(true);
4
+ if (globalConfigExists) {
5
+ loadConfig('');
6
+ }
7
+ else {
8
+ const configPath = findConfig(absolutePathToWorkingDirectory);
9
+ loadConfig(configPath);
10
+ }
11
+ return getAccountId(accountNameOrId);
12
+ }
@@ -1,7 +1,7 @@
1
1
  import { trackUsage } from '@hubspot/local-dev-lib/trackUsage';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
3
2
  import { EventClass, getNodeVersionData, getPlatform, } from '../../lib/usageTracking.js';
4
3
  import { getAccountId, isTrackingAllowed } from '@hubspot/local-dev-lib/config';
4
+ import { uiLogger } from '../../lib/ui/logger.js';
5
5
  export async function trackToolUsage(toolName, meta) {
6
6
  if (!isTrackingAllowed()) {
7
7
  return;
@@ -16,7 +16,7 @@ export async function trackToolUsage(toolName, meta) {
16
16
  };
17
17
  const accountId = getAccountId() || undefined;
18
18
  try {
19
- logger.info('Tracking tool usage');
19
+ uiLogger.info('Tracking tool usage');
20
20
  await trackUsage('cli-interaction', EventClass.INTERACTION, usageTrackingEvent, accountId);
21
21
  }
22
22
  catch (error) { }
package/package.json CHANGED
@@ -1,17 +1,16 @@
1
1
  {
2
2
  "name": "@hubspot/cli",
3
- "version": "7.8.0-experimental.0",
3
+ "version": "7.8.0",
4
4
  "description": "The official CLI for developing on HubSpot",
5
5
  "license": "Apache-2.0",
6
6
  "repository": "https://github.com/HubSpot/hubspot-cli",
7
7
  "type": "module",
8
8
  "dependencies": {
9
- "@hubspot/local-dev-lib": "3.18.0",
10
- "@hubspot/project-parsing-lib": "0.8.2",
9
+ "@hubspot/local-dev-lib": "3.20.2",
10
+ "@hubspot/project-parsing-lib": "0.10.1",
11
11
  "@hubspot/serverless-dev-runtime": "7.0.6",
12
12
  "@hubspot/theme-preview-dev-server": "0.0.10",
13
- "@hubspot/ui-extensions-dev-server": "0.9.8",
14
- "@inkjs/ui": "^2.0.0",
13
+ "@hubspot/ui-extensions-dev-server": "0.10.1",
15
14
  "archiver": "7.0.1",
16
15
  "boxen": "8.0.1",
17
16
  "chalk": "5.4.1",
@@ -19,12 +18,9 @@
19
18
  "cli-cursor": "3.1.0",
20
19
  "cli-progress": "3.12.0",
21
20
  "express": "4.21.2",
22
- "figlet": "^1.8.2",
23
- "figures": "^6.1.0",
24
21
  "findup-sync": "4.0.0",
25
22
  "fs-extra": "8.1.0",
26
23
  "ink": "5.2.1",
27
- "ink-link": "^4.1.0",
28
24
  "inquirer": "12.7.0",
29
25
  "js-yaml": "4.1.0",
30
26
  "moment": "2.30.1",
@@ -33,17 +29,17 @@
33
29
  "react": "^18.0.0",
34
30
  "strip-ansi": "7.1.0",
35
31
  "table": "6.9.0",
36
- "tmp": "0.2.3",
32
+ "tmp": "0.2.4",
37
33
  "update-notifier": "7.3.1",
38
34
  "ws": "^8.18.2",
39
35
  "yargs": "17.7.2",
40
36
  "yargs-parser": "21.1.1"
41
37
  },
42
38
  "devDependencies": {
39
+ "@hubspot/npm-scripts": "0.0.4",
43
40
  "@types/archiver": "^6.0.3",
44
41
  "@types/cli-progress": "^3.11.6",
45
42
  "@types/express": "^5.0.0",
46
- "@types/figlet": "^1.7.0",
47
43
  "@types/findup-sync": "^4.0.5",
48
44
  "@types/fs-extra": "^11.0.4",
49
45
  "@types/inquirer": "^9.0.8",
@@ -57,7 +53,7 @@
57
53
  "@types/yargs": "^17.0.33",
58
54
  "@typescript-eslint/eslint-plugin": "^8.30.1",
59
55
  "@typescript-eslint/parser": "^8.11.0",
60
- "axios": "^1.7.4",
56
+ "axios": "^1.12.2",
61
57
  "eslint": "^8.56.0",
62
58
  "eslint-plugin-import": "^2.31.0",
63
59
  "husky": "^4.3.8",
@@ -85,7 +81,7 @@
85
81
  "lint": "echo 'Linting is disabled for Blazar'",
86
82
  "lint:local": "eslint . && prettier --list-different './**/*.{ts,tsx,js,json}'",
87
83
  "list-all-commands": "yarn tsx ./scripts/get-all-commands.ts",
88
- "local-link": "yarn tsx ./scripts/linking.ts",
84
+ "local-link": "hubspot-linking",
89
85
  "mcp-local": "yarn tsx ./scripts/mcp-local.ts",
90
86
  "prettier:write": "prettier --write './**/*.{ts,js,json}'",
91
87
  "release": "yarn tsx ./scripts/release.ts release",
@@ -1,17 +1,17 @@
1
1
  import { HSProfileVariables, IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types.js';
2
2
  import { Environment } from '@hubspot/local-dev-lib/types/Config';
3
3
  import { ValueOf } from '@hubspot/local-dev-lib/types/Utils';
4
+ import { Project } from '@hubspot/local-dev-lib/types/Project';
4
5
  import { ProjectConfig } from './Projects.js';
5
6
  import LocalDevState from '../lib/projects/localDev/LocalDevState.js';
6
- import { APP_INSTALLATION_STATES, LOCAL_DEV_SERVER_MESSAGE_TYPES } from '../lib/constants.js';
7
+ import { APP_INSTALLATION_STATES, LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES, LOCAL_DEV_SERVER_MESSAGE_TYPES } from '../lib/constants.js';
7
8
  export type LocalDevStateConstructorOptions = {
8
9
  targetProjectAccountId: number;
9
10
  targetTestingAccountId: number;
10
11
  profile?: string;
11
12
  projectConfig: ProjectConfig;
12
13
  projectDir: string;
13
- projectId: number;
14
- projectName: string;
14
+ projectData: Project;
15
15
  debug?: boolean;
16
16
  initialProjectNodes: {
17
17
  [key: string]: IntermediateRepresentationNodeLocalDev;
@@ -23,6 +23,12 @@ export type LocalDevWebsocketMessage = {
23
23
  type: string;
24
24
  data?: unknown;
25
25
  };
26
+ export type LocalDevDeployWebsocketMessage = {
27
+ type: typeof LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.DEPLOY;
28
+ data: {
29
+ force: boolean;
30
+ };
31
+ };
26
32
  export type LocalDevStateListener<K extends keyof LocalDevState> = (value: LocalDevState[K]) => void;
27
33
  export type AppLocalDevData = {
28
34
  id: number;
@@ -32,3 +38,13 @@ export type AppLocalDevData = {
32
38
  scopeGroupIds: number[];
33
39
  };
34
40
  export type LocalDevServerMessage = ValueOf<typeof LOCAL_DEV_SERVER_MESSAGE_TYPES>;
41
+ export type LocalDevProjectUploadResult = {
42
+ uploadSuccess: boolean;
43
+ buildSuccess: boolean;
44
+ deploySuccess?: boolean;
45
+ deployId?: number;
46
+ };
47
+ export type LocalDevProjectDeployResult = {
48
+ success: boolean;
49
+ deployId?: number;
50
+ };
@@ -26,5 +26,5 @@ export function HorizontalSelectPrompt({ defaultOption, options, onSelect, promp
26
26
  onSelect(options[selectedIndex]);
27
27
  }
28
28
  });
29
- return (_jsxs(Box, { ...CONTAINER_STYLES, flexDirection: "column", marginTop: 1, width: "100%", justifyContent: "flex-start", children: [prompt && (_jsx(Box, { marginBottom: 1, alignSelf: "flex-start", children: _jsx(Text, { children: prompt }) })), _jsx(Box, { flexDirection: "row", justifyContent: "flex-start", flexWrap: "wrap", width: "100%", gap: 1, children: options.map((option, index) => (_jsx(Box, { children: _jsx(Text, { backgroundColor: index === selectedIndex ? INK_COLORS.INFO_BLUE : undefined, bold: index === selectedIndex, children: ` ${option} ` }) }, index))) }), _jsx(Box, { marginTop: 1, alignSelf: "flex-start", justifyContent: "flex-start", children: _jsx(Text, { dimColor: true, children: "Use arrow keys to navigate, Enter to select" }) })] }));
29
+ return (_jsxs(Box, { ...CONTAINER_STYLES, flexDirection: "column", marginTop: 1, width: "100%", alignSelf: "center", justifyContent: "center", children: [prompt && (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: prompt }) })), _jsx(Box, { flexDirection: "row", justifyContent: "center", flexWrap: "wrap", width: "100%", gap: 1, children: options.map((option, index) => (_jsx(Box, { children: _jsx(Text, { backgroundColor: index === selectedIndex ? INK_COLORS.INFO_BLUE : undefined, bold: index === selectedIndex, children: ` ${option} ` }) }, index))) }), _jsx(Box, { marginTop: 1, alignSelf: "center", justifyContent: "center", children: _jsx(Text, { dimColor: true, children: "Use arrow keys to navigate, Enter to select" }) })] }));
30
30
  }
package/ui/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { render } from 'ink';
2
- // Ink components will be enabled by setting the ENABLE_INK environment variable
2
+ // Ink components will be enabled by setting the HUBSPOT_ENABLE_INK environment variable
3
3
  export async function renderInline(component) {
4
4
  const { unmount } = render(component, { patchConsole: false });
5
5
  unmount();
@@ -1,9 +0,0 @@
1
- import { AccountArgs, YargsCommandModule, CommonArgs, ConfigArgs, EnvironmentArgs } from '../types/Yargs.js';
2
- export declare const command = "get-started-v2";
3
- export declare const describe: undefined;
4
- export type GetStartedArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
5
- name?: string;
6
- dest?: string;
7
- };
8
- declare const getStartedV2Command: YargsCommandModule<unknown, GetStartedArgs>;
9
- export default getStartedV2Command;
@@ -1,39 +0,0 @@
1
- import { commands } from '../lang/en.js';
2
- import { makeYargsBuilder } from '../lib/yargsUtils.js';
3
- import { getGetStarted } from '../ui/views/GetStarted.js';
4
- import { render } from 'ink';
5
- export const command = 'get-started-v2';
6
- export const describe = undefined;
7
- async function handler(args) {
8
- render(getGetStarted({ args }));
9
- }
10
- function getStartedBuilder(yargs) {
11
- yargs.options({
12
- name: {
13
- describe: commands.getStarted.options.name.describe,
14
- type: 'string',
15
- },
16
- dest: {
17
- describe: commands.getStarted.options.dest.describe,
18
- type: 'string',
19
- },
20
- 'template-source': {
21
- describe: commands.getStarted.options.templateSource.describe,
22
- type: 'string',
23
- },
24
- });
25
- return yargs;
26
- }
27
- const builder = makeYargsBuilder(getStartedBuilder, command, commands.getStarted.verboseDescribe, {
28
- useGlobalOptions: true,
29
- useAccountOptions: true,
30
- useConfigOptions: true,
31
- useEnvironmentOptions: true,
32
- });
33
- const getStartedV2Command = {
34
- command,
35
- describe,
36
- handler,
37
- builder,
38
- };
39
- export default getStartedV2Command;
@@ -1,51 +0,0 @@
1
- import { isTargetedCommand } from '../utils.js';
2
- const targetCommandMap = {
3
- init: { target: true },
4
- account: {
5
- target: true,
6
- subCommands: {
7
- use: { target: true },
8
- },
9
- },
10
- project: {
11
- subCommands: {
12
- deploy: { target: true },
13
- },
14
- },
15
- };
16
- describe('lib/middleware/utils', () => {
17
- describe('isTargetedCommand()', () => {
18
- it('should return true for a direct target command', () => {
19
- const result = isTargetedCommand(['init'], targetCommandMap);
20
- expect(result).toBe(true);
21
- });
22
- it('should return true for a command with a subcommand', () => {
23
- const result = isTargetedCommand(['account'], targetCommandMap);
24
- expect(result).toBe(true);
25
- });
26
- it('should return true for a nested target command', () => {
27
- const result = isTargetedCommand(['project', 'deploy'], targetCommandMap);
28
- expect(result).toBe(true);
29
- });
30
- it('should return false for a non-existent command', () => {
31
- const result = isTargetedCommand(['nonexistent'], targetCommandMap);
32
- expect(result).toBe(false);
33
- });
34
- it('should return false for a non-targeted command', () => {
35
- const result = isTargetedCommand(['auth'], targetCommandMap);
36
- expect(result).toBe(false);
37
- });
38
- it('should return false for a command with a targeted subcommand', () => {
39
- const result = isTargetedCommand(['project'], targetCommandMap);
40
- expect(result).toBe(false);
41
- });
42
- it('should return false for a non-existent subcommand', () => {
43
- const result = isTargetedCommand(['auth', 'nonexistent'], targetCommandMap);
44
- expect(result).toBe(false);
45
- });
46
- it('should return false for an empty command array', () => {
47
- const result = isTargetedCommand([], targetCommandMap);
48
- expect(result).toBe(false);
49
- });
50
- });
51
- });
@@ -1,8 +0,0 @@
1
- type TargetCommandMap = {
2
- [key: string]: {
3
- target?: boolean;
4
- subCommands?: TargetCommandMap;
5
- };
6
- };
7
- export declare function isTargetedCommand(commandParts: (string | number)[], targetCommandMap: TargetCommandMap): boolean;
8
- export {};