@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
@@ -1,13 +1,12 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
2
1
  import { getAccountConfig, getConfigAccounts, getEnv, } from '@hubspot/local-dev-lib/config';
3
2
  import { getValidEnv } from '@hubspot/local-dev-lib/environment';
4
3
  import { findProjectComponents, getProjectComponentTypes, } from '../../../lib/projects/structure.js';
5
4
  import { ComponentTypes } from '../../../types/Projects.js';
6
- import { i18n } from '../../../lib/lang.js';
5
+ import { commands } from '../../../lang/en.js';
6
+ import { uiLogger } from '../../../lib/ui/logger.js';
7
7
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
8
- import { uiCommandReference } from '../../../lib/ui/index.js';
9
8
  import SpinniesManager from '../../../lib/ui/SpinniesManager.js';
10
- import LocalDevManager from '../../../lib/projects/localDev/LocalDevManager.js';
9
+ import LocalDevManager_DEPRECATED from '../../../lib/projects/localDev/LocalDevManager_DEPRECATED.js';
11
10
  import { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfAccountFlagIsSupported, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, useExistingDevTestAccount, checkIfParentAccountIsAuthed, hasSandboxes, } from '../../../lib/projects/localDev/helpers/account.js';
12
11
  import { createInitialBuildForNewProject, createNewProjectForLocalDev, } from '../../../lib/projects/localDev/helpers/project.js';
13
12
  import { handleExit } from '../../../lib/process.js';
@@ -23,28 +22,20 @@ export async function deprecatedProjectDevFlow({ args, accountId, projectConfig,
23
22
  const hasPublicApps = !!componentTypes[ComponentTypes.PublicApp];
24
23
  const accountConfig = getAccountConfig(accountId);
25
24
  if (!accountConfig) {
26
- logger.error(i18n('commands.project.subcommands.dev.errors.noAccount', {
27
- accountId: accountId,
28
- authCommand: uiCommandReference('hs auth'),
29
- }));
25
+ uiLogger.error(commands.project.dev.errors.noAccount(accountId));
30
26
  process.exit(EXIT_CODES.ERROR);
31
27
  }
32
28
  if (runnableComponents.length === 0) {
33
- logger.error(i18n(`commands.project.subcommands.dev.errors.noRunnableComponents`, {
34
- projectDir,
35
- command: uiCommandReference('hs project add'),
36
- }));
29
+ uiLogger.error(commands.project.dev.errors.noRunnableComponents);
37
30
  process.exit(EXIT_CODES.SUCCESS);
38
31
  }
39
32
  else if (hasPrivateApps && hasPublicApps) {
40
- logger.error(i18n(`commands.project.subcommands.dev.errors.invalidProjectComponents`));
33
+ uiLogger.error(commands.project.dev.errors.invalidProjectComponents);
41
34
  process.exit(EXIT_CODES.SUCCESS);
42
35
  }
43
36
  const accounts = getConfigAccounts();
44
37
  if (!accounts) {
45
- logger.error(i18n(`commands.project.subcommands.dev.errors.noAccountsInConfig`, {
46
- authCommand: uiCommandReference('hs auth'),
47
- }));
38
+ uiLogger.error(commands.project.dev.errors.noAccountsInConfig);
48
39
  process.exit(EXIT_CODES.ERROR);
49
40
  }
50
41
  let bypassRecommendedAccountPrompt = false;
@@ -110,7 +101,7 @@ export async function deprecatedProjectDevFlow({ args, accountId, projectConfig,
110
101
  targetProjectAccountId = derivedAccountId;
111
102
  }
112
103
  if (!targetProjectAccountId || !targetTestingAccountId) {
113
- logger.error(i18n(`commands.project.subcommands.dev.errors.noAccount`));
104
+ uiLogger.error(commands.project.dev.errors.noAccount(accountId));
114
105
  process.exit(EXIT_CODES.ERROR);
115
106
  }
116
107
  // eslint-disable-next-line prefer-const
@@ -130,7 +121,7 @@ export async function deprecatedProjectDevFlow({ args, accountId, projectConfig,
130
121
  project = await createNewProjectForLocalDev(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
131
122
  deployedBuild = await createInitialBuildForNewProject(projectConfig, projectDir, targetProjectAccountId);
132
123
  }
133
- const LocalDev = new LocalDevManager({
124
+ const LocalDev = new LocalDevManager_DEPRECATED({
134
125
  runnableComponents,
135
126
  debug: args.debug,
136
127
  deployedBuild,
@@ -2,24 +2,24 @@ import { trackCommandUsage } from '../../../lib/usageTracking.js';
2
2
  import { getAccountId } from '@hubspot/local-dev-lib/config';
3
3
  import { getProjectConfig, validateProjectConfig, } from '../../../lib/projects/config.js';
4
4
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
5
- import { uiBetaTag, uiLine } from '../../../lib/ui/index.js';
5
+ import { uiLine } from '../../../lib/ui/index.js';
6
6
  import { deprecatedProjectDevFlow } from './deprecatedFlow.js';
7
7
  import { unifiedProjectDevFlow } from './unifiedFlow.js';
8
- import { useV3Api } from '../../../lib/projects/platformVersion.js';
8
+ import { isV2Project } from '../../../lib/projects/platformVersion.js';
9
9
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
10
10
  import { loadProfile, exitIfUsingProfiles, } from '../../../lib/projectProfiles.js';
11
11
  import { commands } from '../../../lang/en.js';
12
12
  import { uiLogger } from '../../../lib/ui/logger.js';
13
13
  const command = 'dev';
14
- const describe = uiBetaTag(commands.project.dev.describe, false);
15
- function validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV3) {
14
+ const describe = commands.project.dev.describe;
15
+ function validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV2) {
16
16
  // Legacy projects do not support targetTestingAccount and targetProjectAccount
17
- if (testingAccount && projectAccount && !useV3) {
17
+ if (testingAccount && projectAccount && !useV2) {
18
18
  uiLogger.error(commands.project.dev.errors.unsupportedAccountFlagLegacy);
19
19
  process.exit(EXIT_CODES.ERROR);
20
20
  }
21
- if (userProvidedAccount && useV3) {
22
- uiLogger.error(commands.project.dev.errors.unsupportedAccountFlagV3);
21
+ if (userProvidedAccount && useV2) {
22
+ uiLogger.error(commands.project.dev.errors.unsupportedAccountFlagV2);
23
23
  process.exit(EXIT_CODES.ERROR);
24
24
  }
25
25
  }
@@ -27,15 +27,15 @@ async function handler(args) {
27
27
  const { derivedAccountId, userProvidedAccount, testingAccount, projectAccount, } = args;
28
28
  const { projectConfig, projectDir } = await getProjectConfig();
29
29
  validateProjectConfig(projectConfig, projectDir);
30
- const useV3 = useV3Api(projectConfig.platformVersion);
30
+ const useV2Projects = isV2Project(projectConfig.platformVersion);
31
31
  if (!projectDir) {
32
32
  uiLogger.error(commands.project.dev.errors.noProjectConfig);
33
33
  process.exit(EXIT_CODES.ERROR);
34
34
  }
35
- validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV3);
36
- uiBetaTag(commands.project.dev.logs.betaMessage);
37
- if (useV3) {
38
- uiLogger.log(commands.project.dev.logs.learnMoreMessageV3);
35
+ validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV2Projects);
36
+ uiLogger.log(commands.project.dev.logs.header);
37
+ if (useV2Projects) {
38
+ uiLogger.log(commands.project.dev.logs.learnMoreMessageV2);
39
39
  }
40
40
  else {
41
41
  uiLogger.log(commands.project.dev.logs.learnMoreMessageLegacy);
@@ -54,7 +54,7 @@ async function handler(args) {
54
54
  else if (userProvidedAccount && derivedAccountId) {
55
55
  targetProjectAccountId = derivedAccountId;
56
56
  }
57
- if (!targetProjectAccountId && useV3Api(projectConfig.platformVersion)) {
57
+ if (!targetProjectAccountId && isV2Project(projectConfig.platformVersion)) {
58
58
  if (args.profile) {
59
59
  profile = loadProfile(projectConfig, projectDir, args.profile);
60
60
  if (!profile) {
@@ -73,13 +73,13 @@ async function handler(args) {
73
73
  if (!targetProjectAccountId) {
74
74
  // The user is not using profile or account flags, so we can use the derived accountId
75
75
  targetProjectAccountId = derivedAccountId;
76
- if (useV3) {
76
+ if (useV2Projects) {
77
77
  uiLogger.log('');
78
78
  uiLogger.log(commands.project.dev.logs.defaultProjectAccountExplanation(targetProjectAccountId));
79
79
  }
80
80
  }
81
81
  trackCommandUsage('project-dev', {}, targetProjectAccountId);
82
- if (useV3Api(projectConfig.platformVersion)) {
82
+ if (isV2Project(projectConfig.platformVersion)) {
83
83
  const targetTestingAccountId = (testingAccount && getAccountId(testingAccount)) || undefined;
84
84
  await unifiedProjectDevFlow({
85
85
  args,
@@ -109,15 +109,19 @@ function projectDevBuilder(yargs) {
109
109
  yargs.options('testing-account', {
110
110
  type: 'string',
111
111
  description: commands.project.dev.options.testingAccount,
112
- hidden: true,
113
112
  implies: ['project-account'],
114
113
  });
115
114
  yargs.options('project-account', {
116
115
  type: 'string',
117
116
  description: commands.project.dev.options.projectAccount,
118
- hidden: true,
119
117
  implies: ['testingAccount'],
120
118
  });
119
+ yargs.option('account', {
120
+ alias: 'a',
121
+ describe: '',
122
+ type: 'string',
123
+ description: commands.project.dev.options.account,
124
+ });
121
125
  yargs.example([['$0 project dev', commands.project.dev.examples.default]]);
122
126
  yargs.conflicts('profile', 'account');
123
127
  yargs.conflicts('profile', 'testing-account');
@@ -126,7 +130,6 @@ function projectDevBuilder(yargs) {
126
130
  }
127
131
  export const builder = makeYargsBuilder(projectDevBuilder, command, describe, {
128
132
  useGlobalOptions: true,
129
- useAccountOptions: true,
130
133
  useConfigOptions: true,
131
134
  useEnvironmentOptions: true,
132
135
  });
@@ -1,6 +1,7 @@
1
1
  import path from 'path';
2
2
  import util from 'util';
3
3
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
4
+ import { startPortManagerServer, stopPortManagerServer, } from '@hubspot/local-dev-lib/portManager';
4
5
  import { isTranslationError } from '@hubspot/project-parsing-lib/src/lib/errors.js';
5
6
  import { translateForLocalDev } from '@hubspot/project-parsing-lib';
6
7
  import { getEnv, getConfigAccounts, getAccountConfig, } from '@hubspot/local-dev-lib/config';
@@ -8,8 +9,8 @@ import { getValidEnv } from '@hubspot/local-dev-lib/environment';
8
9
  import { logError } from '../../../lib/errorHandlers/index.js';
9
10
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
10
11
  import { ensureProjectExists } from '../../../lib/projects/ensureProjectExists.js';
11
- import { createInitialBuildForNewProject, createNewProjectForLocalDev, compareLocalProjectToDeployed, } from '../../../lib/projects/localDev/helpers/project.js';
12
- import { useExistingDevTestAccount, createDeveloperTestAccountForLocalDev, selectAccountTypePrompt, } from '../../../lib/projects/localDev/helpers/account.js';
12
+ import { createInitialBuildForNewProject, createNewProjectForLocalDev, compareLocalProjectToDeployed, checkAndInstallDependencies, } from '../../../lib/projects/localDev/helpers/project.js';
13
+ import { useExistingDevTestAccount, createDeveloperTestAccountForLocalDev, selectAccountTypePrompt, createSandboxForLocalDev, } from '../../../lib/projects/localDev/helpers/account.js';
13
14
  import { selectDeveloperTestTargetAccountPrompt, selectSandboxTargetAccountPrompt, } from '../../../lib/prompts/projectDevTargetAccountPrompt.js';
14
15
  import SpinniesManager from '../../../lib/ui/SpinniesManager.js';
15
16
  import LocalDevProcess from '../../../lib/projects/localDev/LocalDevProcess.js';
@@ -93,6 +94,9 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
93
94
  const sandboxAccountPromptResponse = await selectSandboxTargetAccountPrompt(accounts, targetProjectAccountConfig);
94
95
  targetTestingAccountId =
95
96
  sandboxAccountPromptResponse.targetAccountId || undefined;
97
+ if (sandboxAccountPromptResponse.createNestedAccount) {
98
+ targetTestingAccountId = await createSandboxForLocalDev(targetProjectAccountId, targetProjectAccountConfig, env);
99
+ }
96
100
  }
97
101
  else {
98
102
  targetTestingAccountId = targetProjectAccountId;
@@ -109,13 +113,16 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
109
113
  let project = uploadedProject;
110
114
  SpinniesManager.init();
111
115
  if (projectExists && project) {
112
- await compareLocalProjectToDeployed(projectConfig, targetProjectAccountId, project.deployedBuild?.buildId, projectNodes);
116
+ await compareLocalProjectToDeployed(projectConfig, targetProjectAccountId, project.deployedBuild?.buildId, projectNodes, args.profile);
113
117
  }
114
118
  else {
115
119
  project = await createNewProjectForLocalDev(projectConfig, targetProjectAccountId, false, false);
116
120
  await createInitialBuildForNewProject(projectConfig, projectDir, targetProjectAccountId, true, args.profile);
117
121
  }
122
+ // Check for missing/outdated dependencies
123
+ await checkAndInstallDependencies();
118
124
  // End setup, start local dev process
125
+ await startPortManagerServer();
119
126
  const localDevProcess = new LocalDevProcess({
120
127
  initialProjectNodes: projectNodes,
121
128
  initialProjectProfileData: projectProfileData,
@@ -125,15 +132,14 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
125
132
  targetTestingAccountId: targetTestingAccountId,
126
133
  projectConfig,
127
134
  projectDir,
128
- projectName: project.name,
129
- projectId: project.id,
135
+ projectData: project,
130
136
  env,
131
137
  });
132
- await localDevProcess.start();
133
- const watcher = new LocalDevWatcher(localDevProcess);
134
- watcher.start();
135
138
  const websocketServer = new LocalDevWebsocketServer(localDevProcess, args.debug);
139
+ const watcher = new LocalDevWatcher(localDevProcess);
136
140
  await websocketServer.start();
141
+ await localDevProcess.start();
142
+ watcher.start();
137
143
  handleKeypress(async (key) => {
138
144
  if ((key.ctrl && key.name === 'c') || key.name === 'q') {
139
145
  await Promise.all([
@@ -147,5 +153,6 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
147
153
  localDevProcess.stop(!isSIGHUP);
148
154
  watcher.stop();
149
155
  websocketServer.shutdown();
156
+ stopPortManagerServer();
150
157
  });
151
158
  }
@@ -1,22 +1,21 @@
1
1
  import path from 'path';
2
2
  import { getCwd, sanitizeFileName } from '@hubspot/local-dev-lib/path';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
4
3
  import { extractZipArchive } from '@hubspot/local-dev-lib/archive';
5
4
  import { downloadProject, fetchProjectBuilds, } from '@hubspot/local-dev-lib/api/projects';
6
5
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
7
6
  import { getProjectConfig } from '../../lib/projects/config.js';
8
7
  import { downloadProjectPrompt } from '../../lib/prompts/downloadProjectPrompt.js';
9
- import { i18n } from '../../lib/lang.js';
10
- import { uiBetaTag } from '../../lib/ui/index.js';
8
+ import { commands } from '../../lang/en.js';
9
+ import { uiLogger } from '../../lib/ui/logger.js';
11
10
  import { trackCommandUsage } from '../../lib/usageTracking.js';
12
11
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
13
12
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
14
13
  const command = 'download';
15
- const describe = uiBetaTag(i18n(`commands.project.subcommands.download.describe`), false);
14
+ const describe = commands.project.download.describe;
16
15
  async function handler(args) {
17
16
  const { projectConfig } = await getProjectConfig();
18
17
  if (projectConfig) {
19
- logger.error(i18n(`commands.project.subcommands.download.warnings.cannotDownloadWithinProject`));
18
+ uiLogger.error(commands.project.download.warnings.cannotDownloadWithinProject);
20
19
  process.exit(EXIT_CODES.ERROR);
21
20
  }
22
21
  const { dest, build, derivedAccountId } = args;
@@ -33,16 +32,16 @@ async function handler(args) {
33
32
  }
34
33
  }
35
34
  if (!buildNumberToDownload) {
36
- logger.error(i18n(`commands.project.subcommands.download.errors.noBuildIdToDownload`));
35
+ uiLogger.error(commands.project.download.errors.noBuildIdToDownload);
37
36
  process.exit(EXIT_CODES.ERROR);
38
37
  }
39
- const absoluteDestPath = dest ? path.resolve(getCwd(), dest) : getCwd();
38
+ const sanitizedProjectName = sanitizeFileName(projectName);
39
+ const absoluteDestPath = dest
40
+ ? path.resolve(getCwd(), dest, sanitizedProjectName)
41
+ : path.resolve(getCwd(), sanitizedProjectName);
40
42
  const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, buildNumberToDownload);
41
- await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: false });
42
- logger.log(i18n(`commands.project.subcommands.download.logs.downloadSucceeded`, {
43
- buildId: buildNumberToDownload,
44
- projectName,
45
- }));
43
+ await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath));
44
+ uiLogger.log(commands.project.download.logs.downloadSucceeded(buildNumberToDownload, projectName));
46
45
  process.exit(EXIT_CODES.SUCCESS);
47
46
  }
48
47
  catch (e) {
@@ -56,15 +55,15 @@ async function handler(args) {
56
55
  function projectDownloadBuilder(yargs) {
57
56
  yargs.options({
58
57
  project: {
59
- describe: i18n(`commands.project.subcommands.download.options.project.describe`),
58
+ describe: commands.project.download.options.project.describe,
60
59
  type: 'string',
61
60
  },
62
61
  dest: {
63
- describe: i18n(`commands.project.subcommands.download.options.dest.describe`),
62
+ describe: commands.project.download.options.dest.describe,
64
63
  type: 'string',
65
64
  },
66
65
  build: {
67
- describe: i18n(`commands.project.subcommands.download.options.build.describe`),
66
+ describe: commands.project.download.options.build.describe,
68
67
  alias: ['build-id'],
69
68
  type: 'number',
70
69
  },
@@ -72,7 +71,7 @@ function projectDownloadBuilder(yargs) {
72
71
  yargs.example([
73
72
  [
74
73
  '$0 project download --project=myProject --dest=myProjectFolder',
75
- i18n(`commands.project.subcommands.download.examples.default`),
74
+ commands.project.download.examples.default,
76
75
  ],
77
76
  ]);
78
77
  return yargs;
@@ -1,5 +1,5 @@
1
- import { CommonArgs, YargsCommandModule } from '../../types/Yargs.js';
2
- export type ProjectInstallDepsArgs = CommonArgs & {
1
+ import { CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
2
+ export type ProjectInstallDepsArgs = CommonArgs & ConfigArgs & {
3
3
  packages?: string[];
4
4
  };
5
5
  declare const projectInstallDepsCommand: YargsCommandModule<unknown, ProjectInstallDepsArgs>;
@@ -1,23 +1,22 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
2
1
  import { installPackages, getProjectPackageJsonLocations, } from '../../lib/dependencyManagement.js';
3
2
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
4
3
  import { getProjectConfig } from '../../lib/projects/config.js';
5
4
  import { promptUser } from '../../lib/prompts/promptUtils.js';
6
5
  import path from 'path';
7
- import { i18n } from '../../lib/lang.js';
6
+ import { commands } from '../../lang/en.js';
7
+ import { uiLogger } from '../../lib/ui/logger.js';
8
8
  import { trackCommandUsage } from '../../lib/usageTracking.js';
9
- import { uiBetaTag } from '../../lib/ui/index.js';
10
9
  import { logError } from '../../lib/errorHandlers/index.js';
11
10
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
12
11
  const command = 'install-deps [packages..]';
13
- const describe = uiBetaTag(i18n(`commands.project.subcommands.installDeps.help.describe`), false);
12
+ const describe = commands.project.installDeps.help.describe;
14
13
  async function handler(args) {
15
14
  const { derivedAccountId, packages } = args;
16
15
  try {
17
16
  trackCommandUsage('project-install-deps', undefined, derivedAccountId);
18
17
  const projectConfig = await getProjectConfig();
19
18
  if (!projectConfig || !projectConfig.projectDir) {
20
- logger.error(i18n(`commands.project.subcommands.installDeps.noProjectConfig`));
19
+ uiLogger.error(commands.project.installDeps.noProjectConfig);
21
20
  return process.exit(EXIT_CODES.ERROR);
22
21
  }
23
22
  const { projectDir } = projectConfig;
@@ -28,14 +27,14 @@ async function handler(args) {
28
27
  name: 'selectedInstallLocations',
29
28
  type: 'checkbox',
30
29
  when: () => packages && packages.length > 0,
31
- message: i18n(`commands.project.subcommands.installDeps.installLocationPrompt`),
30
+ message: commands.project.installDeps.installLocationPrompt,
32
31
  choices: installLocations.map(dir => ({
33
32
  name: path.relative(projectDir, dir),
34
33
  value: dir,
35
34
  })),
36
35
  validate: (choices) => {
37
36
  if (choices === undefined || choices.length === 0) {
38
- return i18n(`commands.project.subcommands.installDeps.installLocationPromptRequired`);
37
+ return commands.project.installDeps.installLocationPromptRequired;
39
38
  }
40
39
  return true;
41
40
  },
@@ -59,17 +58,18 @@ function projectInstallDepsBuilder(yargs) {
59
58
  yargs.example([
60
59
  [
61
60
  '$0 project install-deps',
62
- i18n(`commands.project.subcommands.installDeps.help.installAppDepsExample`),
61
+ commands.project.installDeps.help.installAppDepsExample,
63
62
  ],
64
63
  [
65
64
  '$0 project install-deps dependency1 dependency2',
66
- i18n(`commands.project.subcommands.installDeps.help.addDepToSubComponentExample`),
65
+ commands.project.installDeps.help.addDepToSubComponentExample,
67
66
  ],
68
67
  ]);
69
68
  return yargs;
70
69
  }
71
70
  const builder = makeYargsBuilder(projectInstallDepsBuilder, command, describe, {
72
71
  useGlobalOptions: true,
72
+ useConfigOptions: true,
73
73
  });
74
74
  const projectInstallDepsCommand = {
75
75
  command,
@@ -0,0 +1,4 @@
1
+ import { AccountArgs, CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
2
+ type ProjectListArgs = CommonArgs & ConfigArgs & AccountArgs;
3
+ declare const projectListCommand: YargsCommandModule<unknown, ProjectListArgs>;
4
+ export default projectListCommand;
@@ -0,0 +1,62 @@
1
+ import { trackCommandUsage } from '../../lib/usageTracking.js';
2
+ import { makeYargsBuilder } from '../../lib/yargsUtils.js';
3
+ import { fetchProjects } from '@hubspot/local-dev-lib/api/projects';
4
+ import { logError } from '../../lib/errorHandlers/index.js';
5
+ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
6
+ import { getTableContents, getTableHeader } from '../../lib/ui/table.js';
7
+ import { uiLogger } from '../../lib/ui/logger.js';
8
+ import { commands } from '../../lang/en.js';
9
+ const command = ['list', 'ls'];
10
+ const describe = commands.project.list.describe;
11
+ async function getProjectData(accountId) {
12
+ try {
13
+ const { data: projects } = await fetchProjects(accountId);
14
+ return projects.results;
15
+ }
16
+ catch (e) {
17
+ logError(e);
18
+ process.exit(EXIT_CODES.ERROR);
19
+ }
20
+ }
21
+ function formatProjectsAsTableRows(projects) {
22
+ const projectListData = [];
23
+ projects.forEach(project => {
24
+ projectListData.push([
25
+ project.name,
26
+ project.latestBuild ? project.latestBuild.platformVersion : '',
27
+ ]);
28
+ });
29
+ return projectListData;
30
+ }
31
+ async function handler(args) {
32
+ const { derivedAccountId } = args;
33
+ trackCommandUsage('projects-list', undefined, derivedAccountId);
34
+ const projectData = await getProjectData(derivedAccountId);
35
+ if (projectData.length === 0) {
36
+ uiLogger.error(commands.project.list.errors.noProjectsFound(derivedAccountId));
37
+ process.exit(EXIT_CODES.ERROR);
38
+ }
39
+ const projectListData = formatProjectsAsTableRows(projectData);
40
+ projectListData.unshift(getTableHeader([
41
+ commands.project.list.labels.name,
42
+ commands.project.list.labels.platformVersion,
43
+ ]));
44
+ uiLogger.log(commands.project.list.projects);
45
+ uiLogger.log(getTableContents(projectListData, { border: { bodyLeft: ' ' } }));
46
+ }
47
+ function projectListBuilder(yargs) {
48
+ yargs.example([['$0 project list']]);
49
+ return yargs;
50
+ }
51
+ const builder = makeYargsBuilder(projectListBuilder, command, describe, {
52
+ useGlobalOptions: true,
53
+ useConfigOptions: true,
54
+ useAccountOptions: true,
55
+ });
56
+ const projectListCommand = {
57
+ command,
58
+ describe,
59
+ handler,
60
+ builder,
61
+ };
62
+ export default projectListCommand;
@@ -1,34 +1,30 @@
1
1
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
3
2
  import { fetchProject, fetchProjectBuilds, } from '@hubspot/local-dev-lib/api/projects';
4
3
  import { getTableContents, getTableHeader } from '../../lib/ui/table.js';
5
- import { uiBetaTag, uiLink } from '../../lib/ui/index.js';
4
+ import { uiLink } from '../../lib/ui/index.js';
6
5
  import { getProjectConfig, validateProjectConfig, } from '../../lib/projects/config.js';
7
6
  import { getProjectDetailUrl } from '../../lib/projects/urls.js';
8
7
  import moment from 'moment';
9
8
  import { promptUser } from '../../lib/prompts/promptUtils.js';
10
9
  import { trackCommandUsage } from '../../lib/usageTracking.js';
11
- import { i18n } from '../../lib/lang.js';
10
+ import { uiLogger } from '../../lib/ui/logger.js';
12
11
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
13
12
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
14
13
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
15
14
  import { commands } from '../../lang/en.js';
16
15
  const command = 'list-builds';
17
- const describe = uiBetaTag(i18n(`commands.project.subcommands.listBuilds.describe`), false);
16
+ const describe = commands.project.listBuilds.describe;
18
17
  async function fetchAndDisplayBuilds(accountId, project, options) {
19
18
  const { data: { results, paging }, } = await fetchProjectBuilds(accountId, project.name, options);
20
19
  const currentDeploy = project.deployedBuildId;
21
20
  if (options && options.after) {
22
- logger.log(i18n(`commands.project.subcommands.listBuilds.logs.showingNextBuilds`, {
23
- count: results.length,
24
- projectName: project.name,
25
- }));
21
+ uiLogger.log(commands.project.listBuilds.showingNextBuilds(results.length, project.name));
26
22
  }
27
23
  else {
28
- logger.log(commands.project.listBuilds.showingRecentBuilds(results.length, project.name, uiLink(commands.project.listBuilds.viewAllBuildsLink, getProjectDetailUrl(project.name, accountId))));
24
+ uiLogger.log(commands.project.listBuilds.showingRecentBuilds(results.length, project.name, uiLink(commands.project.listBuilds.viewAllBuildsLink, getProjectDetailUrl(project.name, accountId))));
29
25
  }
30
26
  if (results.length === 0) {
31
- logger.log(i18n(`commands.project.subcommands.listBuilds.errors.noBuilds`));
27
+ uiLogger.log(commands.project.listBuilds.errors.noBuilds);
32
28
  }
33
29
  else {
34
30
  const builds = results.map(build => {
@@ -49,7 +45,7 @@ async function fetchAndDisplayBuilds(accountId, project, options) {
49
45
  ];
50
46
  });
51
47
  builds.unshift(getTableHeader(['Build ID', 'Status', 'Completed', 'Duration', 'Details']));
52
- logger.log(getTableContents(builds, {
48
+ uiLogger.log(getTableContents(builds, {
53
49
  columnDefault: {
54
50
  paddingLeft: 3,
55
51
  },
@@ -58,7 +54,7 @@ async function fetchAndDisplayBuilds(accountId, project, options) {
58
54
  if (paging && paging.next) {
59
55
  await promptUser({
60
56
  name: 'more',
61
- message: i18n(`commands.project.subcommands.listBuilds.continueOrExitPrompt`),
57
+ message: commands.project.listBuilds.continueOrExitPrompt,
62
58
  });
63
59
  await fetchAndDisplayBuilds(accountId, project, {
64
60
  limit: options.limit,
@@ -81,9 +77,7 @@ async function handler(args) {
81
77
  }
82
78
  catch (e) {
83
79
  if (isHubSpotHttpError(e) && e.status === 404) {
84
- logger.error(i18n(`commands.project.subcommands.listBuilds.errors.projectNotFound`, {
85
- projectName,
86
- }));
80
+ uiLogger.error(commands.project.listBuilds.errors.projectNotFound(projectName));
87
81
  }
88
82
  else {
89
83
  logError(e, new ApiErrorContext({
@@ -97,19 +91,16 @@ async function handler(args) {
97
91
  function projectListBuildsBuilder(yargs) {
98
92
  yargs.options({
99
93
  project: {
100
- describe: i18n(`commands.project.subcommands.listBuilds.options.project.describe`),
94
+ describe: commands.project.listBuilds.options.project.describe,
101
95
  type: 'string',
102
96
  },
103
97
  limit: {
104
- describe: i18n(`commands.project.subcommands.listBuilds.options.limit.describe`),
98
+ describe: commands.project.listBuilds.options.limit.describe,
105
99
  type: 'string',
106
100
  },
107
101
  });
108
102
  yargs.example([
109
- [
110
- '$0 project list-builds',
111
- i18n(`commands.project.subcommands.listBuilds.examples.default`),
112
- ],
103
+ ['$0 project list-builds', commands.project.listBuilds.examples.default],
113
104
  ]);
114
105
  return yargs;
115
106
  }