@hubspot/cli 7.11.8-experimental.0 → 8.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/api/__tests__/migrate.test.js +19 -1
  2. package/api/migrate.d.ts +1 -1
  3. package/api/migrate.js +2 -1
  4. package/bin/cli.js +12 -27
  5. package/commands/__tests__/customObject.test.js +0 -2
  6. package/commands/__tests__/doctor.test.js +0 -2
  7. package/commands/__tests__/getStarted.test.js +0 -4
  8. package/commands/__tests__/project.test.js +0 -4
  9. package/commands/__tests__/upgrade.test.js +309 -0
  10. package/commands/account/__tests__/auth.test.js +180 -0
  11. package/commands/account/__tests__/list.test.js +128 -3
  12. package/commands/account/__tests__/rename.test.js +0 -2
  13. package/commands/account/__tests__/use.test.js +138 -0
  14. package/commands/account/auth.js +1 -1
  15. package/commands/account/clean.js +4 -3
  16. package/commands/account/createOverride.js +3 -2
  17. package/commands/account/info.js +2 -2
  18. package/commands/account/list.js +4 -4
  19. package/commands/account/remove.js +3 -2
  20. package/commands/account/removeOverride.js +3 -2
  21. package/commands/account/use.js +4 -3
  22. package/commands/app/__tests__/migrate.test.js +8 -25
  23. package/commands/app/migrate.js +10 -16
  24. package/commands/app/secret/__tests__/add.test.js +112 -0
  25. package/commands/app/secret/add.js +13 -13
  26. package/commands/auth.js +8 -2
  27. package/commands/cms/__tests__/fetch.test.js +114 -15
  28. package/commands/cms/__tests__/upload.test.js +308 -0
  29. package/commands/cms/__tests__/watch.test.js +212 -0
  30. package/commands/cms/app/create.js +2 -3
  31. package/commands/cms/convertFields.js +1 -1
  32. package/commands/cms/fetch.js +3 -2
  33. package/commands/cms/function/deploy.js +2 -2
  34. package/commands/cms/function/list.js +2 -3
  35. package/commands/cms/lighthouseScore.js +19 -27
  36. package/commands/cms/module/marketplace-validate.js +0 -1
  37. package/commands/cms/theme/__tests__/preview.test.js +2 -8
  38. package/commands/cms/theme/create.js +1 -1
  39. package/commands/cms/theme/marketplace-validate.js +0 -1
  40. package/commands/cms/theme/preview.d.ts +0 -1
  41. package/commands/cms/theme/preview.js +12 -52
  42. package/commands/cms/upload.js +3 -3
  43. package/commands/cms/watch.js +3 -3
  44. package/commands/customObject.js +0 -2
  45. package/commands/doctor.js +10 -2
  46. package/commands/filemanager/__tests__/upload.test.js +161 -0
  47. package/commands/getStarted.js +13 -3
  48. package/commands/hubdb/__tests__/list.test.js +0 -9
  49. package/commands/hubdb/list.js +6 -8
  50. package/commands/init.js +8 -2
  51. package/commands/mcp/__tests__/start.test.js +113 -3
  52. package/commands/mcp/setup.js +0 -7
  53. package/commands/mcp/start.d.ts +1 -1
  54. package/commands/mcp/start.js +0 -7
  55. package/commands/project/__tests__/add.test.js +0 -2
  56. package/commands/project/__tests__/create.test.js +2 -2
  57. package/commands/project/__tests__/deploy.test.js +0 -4
  58. package/commands/project/__tests__/dev.test.js +273 -0
  59. package/commands/project/__tests__/devUnifiedFlow.test.js +2 -5
  60. package/commands/project/__tests__/installDeps.test.js +0 -2
  61. package/commands/project/__tests__/lint.test.js +0 -5
  62. package/commands/project/__tests__/logs.test.js +24 -31
  63. package/commands/project/__tests__/migrate.test.js +7 -12
  64. package/commands/project/__tests__/updateDeps.test.js +0 -2
  65. package/commands/project/__tests__/upload.test.js +191 -0
  66. package/commands/project/__tests__/validate.test.js +314 -31
  67. package/commands/project/cloneApp.d.ts +1 -7
  68. package/commands/project/cloneApp.js +1 -149
  69. package/commands/project/create.js +3 -4
  70. package/commands/project/deploy.js +18 -7
  71. package/commands/project/dev/deprecatedFlow.js +0 -2
  72. package/commands/project/dev/index.js +23 -11
  73. package/commands/project/dev/unifiedFlow.d.ts +1 -1
  74. package/commands/project/dev/unifiedFlow.js +1 -4
  75. package/commands/project/list.js +4 -4
  76. package/commands/project/listBuilds.js +2 -7
  77. package/commands/project/logs.js +19 -12
  78. package/commands/project/migrate.js +3 -3
  79. package/commands/project/profile/add.js +1 -1
  80. package/commands/project/profile/delete.js +1 -1
  81. package/commands/project/upload.d.ts +1 -1
  82. package/commands/project/upload.js +13 -4
  83. package/commands/project/validate.js +85 -13
  84. package/commands/project/watch.js +7 -7
  85. package/commands/project.js +0 -4
  86. package/commands/sandbox/__tests__/create.test.js +0 -2
  87. package/commands/secret/__tests__/addSecret.test.js +140 -7
  88. package/commands/secret/addSecret.js +3 -1
  89. package/commands/testAccount/__tests__/create.test.js +6 -1
  90. package/commands/testAccount/__tests__/importData.test.js +0 -1
  91. package/commands/testAccount/create.d.ts +1 -0
  92. package/commands/testAccount/create.js +13 -5
  93. package/commands/upgrade.d.ts +8 -0
  94. package/commands/upgrade.js +119 -0
  95. package/lang/en.d.ts +88 -10
  96. package/lang/en.js +105 -26
  97. package/lib/__tests__/buildAccount.test.js +0 -13
  98. package/lib/__tests__/cliUpgradeUtils.test.js +131 -0
  99. package/lib/__tests__/commonOpts.test.js +0 -1
  100. package/lib/__tests__/dependencyManagement.test.js +633 -13
  101. package/lib/__tests__/developerTestAccounts.test.js +0 -1
  102. package/lib/__tests__/hasFeature.test.js +0 -6
  103. package/lib/__tests__/importData.test.js +0 -1
  104. package/lib/__tests__/npmCli.test.js +84 -0
  105. package/lib/__tests__/oauth.test.js +1 -11
  106. package/lib/__tests__/process.test.js +0 -1
  107. package/lib/__tests__/sandboxSync.test.js +0 -1
  108. package/lib/__tests__/sandboxes.test.js +0 -1
  109. package/lib/__tests__/serverlessLogs.test.js +0 -1
  110. package/lib/__tests__/usageTracking.test.js +39 -6
  111. package/lib/__tests__/validation.test.js +0 -1
  112. package/lib/app/__tests__/migrate.test.js +137 -12
  113. package/lib/app/migrate.d.ts +5 -2
  114. package/lib/app/migrate.js +30 -11
  115. package/lib/app/urls.d.ts +1 -1
  116. package/lib/buildAccount.d.ts +1 -1
  117. package/lib/cliUpgradeUtils.d.ts +22 -0
  118. package/lib/cliUpgradeUtils.js +62 -0
  119. package/lib/cmsAssets/api-sample.js +2 -5
  120. package/lib/cmsAssets/function.js +1 -9
  121. package/lib/cmsAssets/module.js +1 -9
  122. package/lib/cmsAssets/template.js +1 -9
  123. package/lib/configOptions.d.ts +0 -1
  124. package/lib/configOptions.js +1 -5
  125. package/lib/constants.d.ts +6 -0
  126. package/lib/constants.js +10 -4
  127. package/lib/dependencyManagement.d.ts +9 -0
  128. package/lib/dependencyManagement.js +127 -26
  129. package/lib/developerTestAccounts.d.ts +1 -1
  130. package/lib/doctor/Diagnosis.d.ts +1 -0
  131. package/lib/doctor/Diagnosis.js +7 -0
  132. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
  133. package/lib/doctor/DiagnosticInfoBuilder.js +8 -4
  134. package/lib/doctor/Doctor.d.ts +12 -0
  135. package/lib/doctor/Doctor.js +283 -33
  136. package/lib/doctor/__tests__/Diagnosis.test.js +1 -0
  137. package/lib/doctor/__tests__/Doctor.test.js +201 -51
  138. package/lib/errorHandlers/__tests__/index.test.d.ts +1 -0
  139. package/lib/errorHandlers/__tests__/index.test.js +278 -0
  140. package/lib/errorHandlers/index.d.ts +1 -0
  141. package/lib/errorHandlers/index.js +14 -2
  142. package/lib/http.js +3 -1
  143. package/lib/links.js +2 -3
  144. package/lib/mcp/__tests__/setup.test.js +69 -2
  145. package/lib/mcp/setup.d.ts +1 -0
  146. package/lib/mcp/setup.js +37 -4
  147. package/lib/middleware/__tests__/configMiddleware.test.js +1 -43
  148. package/lib/middleware/__tests__/usageTrackingMiddleware.test.d.ts +1 -0
  149. package/lib/middleware/__tests__/usageTrackingMiddleware.test.js +44 -0
  150. package/lib/middleware/__tests__/yargsChecksMiddleware.test.js +0 -5
  151. package/lib/middleware/autoUpdateMiddleware.js +58 -57
  152. package/lib/middleware/configMiddleware.d.ts +0 -3
  153. package/lib/middleware/configMiddleware.js +0 -11
  154. package/lib/middleware/fireAlarmMiddleware.js +1 -1
  155. package/lib/middleware/spinniesMiddleware.d.ts +1 -0
  156. package/lib/middleware/spinniesMiddleware.js +4 -0
  157. package/lib/middleware/usageTrackingMiddleware.d.ts +13 -0
  158. package/lib/middleware/usageTrackingMiddleware.js +16 -0
  159. package/lib/{npm.d.ts → npm/npmCli.d.ts} +8 -3
  160. package/lib/npm/npmCli.js +59 -0
  161. package/lib/npm/packageJson.d.ts +24 -0
  162. package/lib/npm/packageJson.js +102 -0
  163. package/lib/npm/workspaces.d.ts +12 -0
  164. package/lib/npm/workspaces.js +48 -0
  165. package/lib/oauth.js +1 -3
  166. package/lib/projects/__tests__/AppDevModeInterface.test.js +40 -18
  167. package/lib/projects/__tests__/DevServerManager.test.js +1 -0
  168. package/lib/projects/__tests__/DevSessionManager.test.d.ts +1 -0
  169. package/lib/projects/__tests__/DevSessionManager.test.js +250 -0
  170. package/lib/projects/__tests__/LocalDevProcess.test.js +19 -6
  171. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +0 -2
  172. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +0 -1
  173. package/lib/projects/__tests__/components.test.js +6 -22
  174. package/lib/projects/__tests__/deploy.test.js +0 -1
  175. package/lib/projects/__tests__/localDevProjectHelpers.test.js +3 -5
  176. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.d.ts +1 -0
  177. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.js +328 -0
  178. package/lib/projects/__tests__/projectProfiles.test.d.ts +1 -0
  179. package/lib/projects/__tests__/projectProfiles.test.js +441 -0
  180. package/lib/projects/__tests__/projects.test.js +0 -1
  181. package/lib/projects/__tests__/structure.test.js +0 -1
  182. package/lib/projects/__tests__/uieLinting.test.js +2 -11
  183. package/lib/projects/__tests__/upload.test.js +104 -3
  184. package/lib/projects/add/__tests__/legacyAddComponent.test.js +0 -2
  185. package/lib/projects/add/__tests__/v2AddComponent.test.js +2 -4
  186. package/lib/projects/add/v2AddComponent.js +2 -3
  187. package/lib/projects/components.d.ts +1 -1
  188. package/lib/projects/components.js +4 -4
  189. package/lib/projects/create/__tests__/legacy.test.js +0 -1
  190. package/lib/projects/create/__tests__/v2.test.js +0 -1
  191. package/lib/projects/create/v2.d.ts +1 -1
  192. package/lib/projects/create/v2.js +1 -1
  193. package/lib/projects/ensureProjectExists.js +0 -1
  194. package/lib/projects/localDev/AppDevModeInterface.js +9 -2
  195. package/lib/projects/localDev/DevSessionManager.d.ts +18 -0
  196. package/lib/projects/localDev/DevSessionManager.js +95 -0
  197. package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
  198. package/lib/projects/localDev/LocalDevLogger.js +18 -7
  199. package/lib/projects/localDev/LocalDevManager_DEPRECATED.d.ts +4 -3
  200. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +23 -12
  201. package/lib/projects/localDev/LocalDevProcess.d.ts +2 -1
  202. package/lib/projects/localDev/LocalDevProcess.js +18 -7
  203. package/lib/projects/localDev/LocalDevState.d.ts +3 -2
  204. package/lib/projects/localDev/helpers/account.d.ts +1 -1
  205. package/lib/projects/localDev/helpers/devSessionsApi.d.ts +9 -0
  206. package/lib/projects/localDev/helpers/devSessionsApi.js +19 -0
  207. package/lib/projects/localDev/helpers/project.d.ts +1 -1
  208. package/lib/projects/localDev/helpers/project.js +1 -2
  209. package/lib/projects/pollProjectBuildAndDeploy.js +4 -5
  210. package/lib/projects/projectProfiles.d.ts +17 -0
  211. package/lib/projects/projectProfiles.js +140 -0
  212. package/lib/projects/structure.d.ts +1 -1
  213. package/lib/projects/uieLinting.js +6 -8
  214. package/lib/projects/upload.d.ts +9 -1
  215. package/lib/projects/upload.js +11 -5
  216. package/lib/projects/urls.d.ts +1 -0
  217. package/lib/projects/urls.js +3 -3
  218. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +8 -4
  219. package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +2 -0
  220. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +19 -13
  221. package/lib/sandboxSync.d.ts +1 -1
  222. package/lib/sandboxes.d.ts +1 -1
  223. package/lib/serverlessLogs.js +0 -1
  224. package/lib/theme/__tests__/migrate.test.js +12 -4
  225. package/lib/theme/migrate.js +2 -3
  226. package/lib/ui/__tests__/SpinniesManager.test.js +0 -1
  227. package/lib/usageTracking.js +18 -0
  228. package/mcp-server/tools/cms/HsCreateFunctionTool.d.ts +2 -2
  229. package/mcp-server/tools/cms/HsCreateFunctionTool.js +2 -1
  230. package/mcp-server/tools/cms/HsCreateModuleTool.js +2 -1
  231. package/mcp-server/tools/cms/HsCreateTemplateTool.js +2 -1
  232. package/mcp-server/tools/cms/HsFunctionLogsTool.js +2 -2
  233. package/mcp-server/tools/cms/HsListFunctionsTool.js +2 -2
  234. package/mcp-server/tools/cms/HsListTool.js +2 -2
  235. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +4 -4
  236. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.js +4 -4
  237. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.js +4 -4
  238. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.js +4 -4
  239. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.js +4 -4
  240. package/mcp-server/tools/cms/__tests__/HsListTool.test.js +4 -4
  241. package/mcp-server/tools/project/AddFeatureToProjectTool.js +4 -3
  242. package/mcp-server/tools/project/CreateProjectTool.js +4 -3
  243. package/mcp-server/tools/project/CreateTestAccountTool.d.ts +7 -2
  244. package/mcp-server/tools/project/CreateTestAccountTool.js +19 -9
  245. package/mcp-server/tools/project/DocFetchTool.js +2 -1
  246. package/mcp-server/tools/project/DocsSearchTool.js +2 -1
  247. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +4 -4
  248. package/mcp-server/tools/project/GetApplicationInfoTool.js +5 -5
  249. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -1
  250. package/mcp-server/tools/project/UploadProjectTools.js +6 -3
  251. package/mcp-server/tools/project/ValidateProjectTool.js +2 -1
  252. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.js +4 -2
  253. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +4 -2
  254. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +23 -4
  255. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.js +3 -1
  256. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +0 -1
  257. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +3 -1
  258. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +4 -2
  259. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +8 -5
  260. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +3 -1
  261. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +3 -1
  262. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +7 -3
  263. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +3 -1
  264. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +17 -3
  265. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +3 -1
  266. package/mcp-server/utils/__tests__/content.test.js +0 -3
  267. package/mcp-server/utils/__tests__/feedbackTracking.test.js +0 -3
  268. package/mcp-server/utils/__tests__/project.test.js +65 -4
  269. package/mcp-server/utils/project.js +6 -2
  270. package/package.json +15 -17
  271. package/types/Cms.d.ts +1 -1
  272. package/types/Cms.js +2 -0
  273. package/types/LocalDev.d.ts +3 -2
  274. package/types/PackageJson.d.ts +10 -0
  275. package/types/PackageJson.js +1 -0
  276. package/types/ProjectComponents.d.ts +1 -1
  277. package/ui/components/BoxWithTitle.js +1 -1
  278. package/ui/components/Table.d.ts +89 -0
  279. package/ui/components/Table.js +246 -0
  280. package/ui/lib/table.d.ts +2 -0
  281. package/ui/lib/table.js +11 -0
  282. package/ui/playground/Playground.d.ts +5 -0
  283. package/ui/{views/UiSandbox.js → playground/Playground.js} +4 -4
  284. package/ui/{lib/ui-testing-utils.d.ts → playground/fixtures.d.ts} +1 -1
  285. package/ui/{lib/ui-testing-utils.js → playground/fixtures.js} +33 -1
  286. package/ui/render.d.ts +19 -0
  287. package/ui/render.js +44 -0
  288. package/commands/__tests__/create.test.js +0 -53
  289. package/commands/create.d.ts +0 -4
  290. package/commands/create.js +0 -137
  291. package/commands/customObject/__tests__/schema.test.js +0 -53
  292. package/commands/customObject/schema/create.d.ts +0 -4
  293. package/commands/customObject/schema/create.js +0 -34
  294. package/commands/customObject/schema/delete.d.ts +0 -4
  295. package/commands/customObject/schema/delete.js +0 -37
  296. package/commands/customObject/schema/fetch-all.d.ts +0 -4
  297. package/commands/customObject/schema/fetch-all.js +0 -32
  298. package/commands/customObject/schema/fetch.d.ts +0 -4
  299. package/commands/customObject/schema/fetch.js +0 -36
  300. package/commands/customObject/schema/list.d.ts +0 -4
  301. package/commands/customObject/schema/list.js +0 -26
  302. package/commands/customObject/schema/update.d.ts +0 -4
  303. package/commands/customObject/schema/update.js +0 -39
  304. package/commands/customObject/schema.d.ts +0 -3
  305. package/commands/customObject/schema.js +0 -31
  306. package/commands/fetch.d.ts +0 -4
  307. package/commands/fetch.js +0 -52
  308. package/commands/function/deploy.d.ts +0 -4
  309. package/commands/function/deploy.js +0 -31
  310. package/commands/function/list.d.ts +0 -4
  311. package/commands/function/list.js +0 -33
  312. package/commands/function/server.d.ts +0 -4
  313. package/commands/function/server.js +0 -57
  314. package/commands/function.d.ts +0 -3
  315. package/commands/function.js +0 -32
  316. package/commands/lint.d.ts +0 -4
  317. package/commands/lint.js +0 -31
  318. package/commands/list.d.ts +0 -4
  319. package/commands/list.js +0 -31
  320. package/commands/logs.d.ts +0 -4
  321. package/commands/logs.js +0 -58
  322. package/commands/module/marketplace-validate.d.ts +0 -4
  323. package/commands/module/marketplace-validate.js +0 -31
  324. package/commands/module.d.ts +0 -3
  325. package/commands/module.js +0 -23
  326. package/commands/mv.d.ts +0 -4
  327. package/commands/mv.js +0 -35
  328. package/commands/project/__tests__/migrateApp.test.js +0 -78
  329. package/commands/project/migrateApp.d.ts +0 -4
  330. package/commands/project/migrateApp.js +0 -55
  331. package/commands/remove.d.ts +0 -4
  332. package/commands/remove.js +0 -31
  333. package/commands/theme/generate-selectors.d.ts +0 -4
  334. package/commands/theme/generate-selectors.js +0 -30
  335. package/commands/theme/marketplace-validate.d.ts +0 -4
  336. package/commands/theme/marketplace-validate.js +0 -33
  337. package/commands/theme/preview.d.ts +0 -4
  338. package/commands/theme/preview.js +0 -59
  339. package/commands/theme.d.ts +0 -3
  340. package/commands/theme.js +0 -29
  341. package/commands/upload.d.ts +0 -4
  342. package/commands/upload.js +0 -62
  343. package/commands/watch.d.ts +0 -4
  344. package/commands/watch.js +0 -73
  345. package/lib/__tests__/npm.test.js +0 -57
  346. package/lib/__tests__/projectProfiles.test.js +0 -129
  347. package/lib/app/__tests__/migrate_legacy.test.js +0 -143
  348. package/lib/app/migrate_legacy.d.ts +0 -4
  349. package/lib/app/migrate_legacy.js +0 -121
  350. package/lib/npm.js +0 -33
  351. package/lib/projectProfiles.d.ts +0 -7
  352. package/lib/projectProfiles.js +0 -73
  353. package/lib/ui/table.d.ts +0 -3
  354. package/lib/ui/table.js +0 -63
  355. package/ui/index.d.ts +0 -1
  356. package/ui/index.js +0 -6
  357. package/ui/views/UiSandbox.d.ts +0 -5
  358. /package/commands/__tests__/{create.test.d.ts → upgrade.test.d.ts} +0 -0
  359. /package/commands/{customObject/__tests__/schema.test.d.ts → cms/__tests__/upload.test.d.ts} +0 -0
  360. /package/commands/{project/__tests__/migrateApp.test.d.ts → cms/__tests__/watch.test.d.ts} +0 -0
  361. /package/{lib/__tests__/npm.test.d.ts → commands/project/__tests__/dev.test.d.ts} +0 -0
  362. /package/lib/__tests__/{projectProfiles.test.d.ts → cliUpgradeUtils.test.d.ts} +0 -0
  363. /package/lib/{app/__tests__/migrate_legacy.test.d.ts → __tests__/npmCli.test.d.ts} +0 -0
package/commands/init.js CHANGED
@@ -55,8 +55,14 @@ async function oauthConfigCreationFlow(env) {
55
55
  tokenInfo: {},
56
56
  },
57
57
  };
58
- await authenticateWithOauth(oauthAccount);
59
- setConfigAccountAsDefault(configData.accountId);
58
+ try {
59
+ await authenticateWithOauth(oauthAccount);
60
+ setConfigAccountAsDefault(configData.accountId);
61
+ }
62
+ catch (e) {
63
+ logError(e);
64
+ process.exit(EXIT_CODES.ERROR);
65
+ }
60
66
  return oauthAccount;
61
67
  }
62
68
  const AUTH_TYPE_NAMES = {
@@ -1,7 +1,42 @@
1
+ import { spawn } from 'node:child_process';
2
+ import fs from 'fs';
3
+ import { EventEmitter } from 'events';
4
+ import * as configLib from '@hubspot/local-dev-lib/config';
5
+ import { uiLogger } from '../../../lib/ui/logger.js';
6
+ import * as errorHandlers from '../../../lib/errorHandlers/index.js';
7
+ import * as usageTrackingLib from '../../../lib/usageTracking.js';
8
+ import * as processLib from '../../../lib/process.js';
9
+ import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
1
10
  import startCommand from '../start.js';
2
11
  vi.mock('yargs');
3
12
  vi.mock('../../../lib/commonOpts');
13
+ vi.mock('node:child_process');
14
+ vi.mock('fs');
15
+ vi.mock('@hubspot/local-dev-lib/config');
16
+ vi.mock('../../../lib/errorHandlers/index.js');
17
+ vi.mock('../../../lib/process.js');
18
+ const spawnSpy = vi.mocked(spawn);
19
+ const existsSyncSpy = vi.spyOn(fs, 'existsSync');
20
+ const trackCommandUsageSpy = vi.spyOn(usageTrackingLib, 'trackCommandUsage');
21
+ const handleExitSpy = vi.spyOn(processLib, 'handleExit');
22
+ const logErrorSpy = vi.spyOn(errorHandlers, 'logError');
23
+ const processExitSpy = vi.spyOn(process, 'exit');
24
+ const getConfigAccountIfExistsSpy = vi.spyOn(configLib, 'getConfigAccountIfExists');
25
+ class MockChildProcess extends EventEmitter {
26
+ kill = vi.fn();
27
+ }
4
28
  describe('commands/mcp/start', () => {
29
+ let mockChildProcess;
30
+ beforeEach(() => {
31
+ mockChildProcess = new MockChildProcess();
32
+ // @ts-expect-error Mock implementation
33
+ spawnSpy.mockReturnValue(mockChildProcess);
34
+ existsSyncSpy.mockReturnValue(true);
35
+ // @ts-expect-error Mock implementation
36
+ processExitSpy.mockImplementation(() => { });
37
+ // Mock config to prevent reading actual config file in CI
38
+ getConfigAccountIfExistsSpy.mockReturnValue(undefined);
39
+ });
5
40
  describe('command', () => {
6
41
  it('should have the correct command structure', () => {
7
42
  expect(startCommand.command).toEqual('start');
@@ -19,9 +54,84 @@ describe('commands/mcp/start', () => {
19
54
  });
20
55
  });
21
56
  describe('handler', () => {
22
- it('should be defined', () => {
23
- expect(startCommand.handler).toBeDefined();
24
- expect(typeof startCommand.handler).toBe('function');
57
+ let args;
58
+ beforeEach(() => {
59
+ args = {
60
+ aiAgent: 'test-agent',
61
+ derivedAccountId: 123456,
62
+ d: false,
63
+ debug: false,
64
+ };
65
+ });
66
+ it('should track command usage', async () => {
67
+ await startCommand.handler(args);
68
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('mcp-start', {}, 123456);
69
+ });
70
+ it('should check if server file exists', async () => {
71
+ await startCommand.handler(args);
72
+ expect(existsSyncSpy).toHaveBeenCalledWith(expect.stringContaining('server.js'));
73
+ });
74
+ it('should error if server file does not exist', async () => {
75
+ existsSyncSpy.mockReturnValue(false);
76
+ await startCommand.handler(args);
77
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('not found'));
78
+ expect(spawnSpy).not.toHaveBeenCalled();
79
+ });
80
+ it('should spawn server process with correct arguments', async () => {
81
+ await startCommand.handler(args);
82
+ expect(spawnSpy).toHaveBeenCalledWith('node', [expect.stringContaining('server.js')], expect.objectContaining({
83
+ stdio: 'inherit',
84
+ env: expect.objectContaining({
85
+ HUBSPOT_MCP_AI_AGENT: 'test-agent',
86
+ }),
87
+ }));
88
+ });
89
+ it('should use "unknown" as default AI agent', async () => {
90
+ delete args.aiAgent;
91
+ await startCommand.handler(args);
92
+ expect(spawnSpy).toHaveBeenCalledWith('node', expect.any(Array), expect.objectContaining({
93
+ env: expect.objectContaining({
94
+ HUBSPOT_MCP_AI_AGENT: 'unknown',
95
+ }),
96
+ }));
97
+ });
98
+ it('should log debug messages when starting', async () => {
99
+ await startCommand.handler(args);
100
+ expect(uiLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Starting'));
101
+ expect(uiLogger.debug).toHaveBeenCalledWith(expect.stringContaining('stop'));
102
+ });
103
+ it('should handle child process errors', async () => {
104
+ await startCommand.handler(args);
105
+ const error = new Error('Process error');
106
+ mockChildProcess.emit('error', error);
107
+ expect(logErrorSpy).toHaveBeenCalledWith(error);
108
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('Failed to start'));
109
+ });
110
+ it('should handle child process close', async () => {
111
+ await startCommand.handler(args);
112
+ mockChildProcess.emit('close');
113
+ expect(uiLogger.info).toHaveBeenCalledWith(expect.stringMatching(/stopped/i));
114
+ });
115
+ it('should register exit handler', async () => {
116
+ await startCommand.handler(args);
117
+ expect(handleExitSpy).toHaveBeenCalledWith(expect.any(Function));
118
+ });
119
+ it('should kill child process on exit', async () => {
120
+ await startCommand.handler(args);
121
+ const exitHandler = handleExitSpy.mock.calls[0][0];
122
+ exitHandler({ isSIGHUP: false });
123
+ expect(uiLogger.info).toHaveBeenCalledWith(expect.stringContaining('Shutting'));
124
+ expect(mockChildProcess.kill).toHaveBeenCalledWith('SIGTERM');
125
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.SUCCESS);
126
+ });
127
+ it('should handle exceptions during server start', async () => {
128
+ const error = new Error('Spawn failed');
129
+ spawnSpy.mockImplementation(() => {
130
+ throw error;
131
+ });
132
+ await startCommand.handler(args);
133
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('Failed to start'));
134
+ expect(logErrorSpy).toHaveBeenCalledWith(error);
25
135
  });
26
136
  });
27
137
  });
@@ -16,13 +16,6 @@ async function handler(args) {
16
16
  uiLogger.error(commands.mcp.setup.errors.needsMcpAccess(derivedAccountId));
17
17
  process.exit(EXIT_CODES.ERROR);
18
18
  }
19
- try {
20
- await import('@modelcontextprotocol/sdk/server/mcp.js');
21
- }
22
- catch (e) {
23
- uiLogger.error(commands.mcp.setup.errors.needsNode20);
24
- process.exit(EXIT_CODES.ERROR);
25
- }
26
19
  trackCommandUsage('mcp-setup', {}, args.derivedAccountId);
27
20
  try {
28
21
  await addMcpServerToConfig(args.client);
@@ -1,6 +1,6 @@
1
1
  import { CommonArgs, YargsCommandModule } from '../../types/Yargs.js';
2
2
  interface McpStartArgs extends CommonArgs {
3
- aiAgent: string;
3
+ aiAgent?: string;
4
4
  }
5
5
  declare const mcpStartCommand: YargsCommandModule<unknown, McpStartArgs>;
6
6
  export default mcpStartCommand;
@@ -14,13 +14,6 @@ const describe = undefined; // Leave hidden for now
14
14
  const __filename = fileURLToPath(import.meta.url);
15
15
  const __dirname = path.dirname(__filename);
16
16
  async function handler(args) {
17
- try {
18
- await import('@modelcontextprotocol/sdk/server/mcp.js');
19
- }
20
- catch (e) {
21
- uiLogger.error(commands.mcp.start.errors.needsNode20);
22
- process.exit(EXIT_CODES.ERROR);
23
- }
24
17
  trackCommandUsage('mcp-start', {}, args.derivedAccountId);
25
18
  await startMcpServer(args.aiAgent);
26
19
  }
@@ -7,13 +7,11 @@ import { getProjectConfig } from '../../../lib/projects/config.js';
7
7
  import { isV2Project } from '../../../lib/projects/platformVersion.js';
8
8
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
9
9
  vi.mock('../../../lib/commonOpts');
10
- vi.mock('../../../lib/ui/logger.js');
11
10
  vi.mock('../../../lib/errorHandlers/index.js');
12
11
  vi.mock('../../../lib/projects/add/v2AddComponent');
13
12
  vi.mock('../../../lib/projects/add/legacyAddComponent');
14
13
  vi.mock('../../../lib/projects/config');
15
14
  vi.mock('../../../lib/projects/platformVersion');
16
- vi.mock('../../../lib/usageTracking');
17
15
  const mockedV2AddComponent = vi.mocked(v2AddComponent);
18
16
  const mockedLegacyAddComponent = vi.mocked(legacyAddComponent);
19
17
  const mockedGetProjectConfig = vi.mocked(getProjectConfig);
@@ -50,7 +50,7 @@ describe('commands/project/create', () => {
50
50
  expect(optionsCall['platform-version']).toEqual(expect.objectContaining({
51
51
  describe: 'The target platform version for the new project.',
52
52
  type: 'string',
53
- choices: ['2023.2', '2025.1', '2025.2'],
53
+ choices: ['2025.1', '2025.2'],
54
54
  default: '2025.2',
55
55
  }));
56
56
  });
@@ -79,7 +79,7 @@ describe('commands/project/create', () => {
79
79
  projectCreateCommand.builder(yargsMock);
80
80
  const optionsCall = optionsSpy.mock.calls[0][0];
81
81
  expect(optionsCall.auth).toEqual(expect.objectContaining({
82
- describe: 'Authentication model for the application.',
82
+ describe: 'Authentication model for the app.',
83
83
  type: 'string',
84
84
  choices: ['oauth', 'static'],
85
85
  }));
@@ -27,9 +27,6 @@ vi.mock('../../../lib/projects/pollProjectBuildAndDeploy');
27
27
  vi.mock('../../../lib/projects/platformVersion');
28
28
  vi.mock('../../../lib/prompts/projectNamePrompt');
29
29
  vi.mock('../../../lib/prompts/promptUtils');
30
- vi.mock('../../../lib/usageTracking');
31
- vi.mock('../../../lib/ui/logger');
32
- vi.mock('../../ui/logger.js');
33
30
  vi.spyOn(ui, 'uiLine');
34
31
  const uiCommandReferenceSpy = vi.spyOn(ui, 'uiCommandReference');
35
32
  const uiAccountDescriptionSpy = vi.spyOn(ui, 'uiAccountDescription');
@@ -87,7 +84,6 @@ describe('commands/project/deploy', () => {
87
84
  [profileFlag]: expect.objectContaining({
88
85
  type: 'string',
89
86
  alias: ['p'],
90
- hidden: true,
91
87
  }),
92
88
  [forceFlag]: expect.objectContaining({
93
89
  type: 'boolean',
@@ -0,0 +1,273 @@
1
+ import * as configLib from '@hubspot/local-dev-lib/config';
2
+ import * as projectConfigLib from '../../../lib/projects/config.js';
3
+ import * as platformVersionLib from '../../../lib/projects/platformVersion.js';
4
+ import * as projectProfilesLib from '../../../lib/projects/projectProfiles.js';
5
+ import * as projectParsingProfiles from '@hubspot/project-parsing-lib/profiles';
6
+ import * as promptUtilsLib from '../../../lib/prompts/promptUtils.js';
7
+ import * as usageTrackingLib from '../../../lib/usageTracking.js';
8
+ import * as errorHandlers from '../../../lib/errorHandlers/index.js';
9
+ import { uiLogger } from '../../../lib/ui/logger.js';
10
+ import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
11
+ import * as deprecatedFlowLib from '../dev/deprecatedFlow.js';
12
+ import * as unifiedFlowLib from '../dev/unifiedFlow.js';
13
+ import projectDevCommand from '../dev/index.js';
14
+ vi.mock('@hubspot/local-dev-lib/config');
15
+ vi.mock('@hubspot/project-parsing-lib/profiles');
16
+ vi.mock('../../../lib/projects/config.js');
17
+ vi.mock('../../../lib/projects/platformVersion.js');
18
+ vi.mock('../../../lib/projects/projectProfiles.js');
19
+ vi.mock('../../../lib/prompts/promptUtils.js');
20
+ vi.mock('../../../lib/errorHandlers/index.js');
21
+ vi.mock('../../../lib/ui/index.js');
22
+ vi.mock('../dev/deprecatedFlow.js');
23
+ vi.mock('../dev/unifiedFlow.js');
24
+ const getConfigAccountIfExistsSpy = vi.spyOn(configLib, 'getConfigAccountIfExists');
25
+ const getProjectConfigSpy = vi.spyOn(projectConfigLib, 'getProjectConfig');
26
+ const validateProjectConfigSpy = vi.spyOn(projectConfigLib, 'validateProjectConfig');
27
+ const isV2ProjectSpy = vi.spyOn(platformVersionLib, 'isV2Project');
28
+ const loadProfileSpy = vi.spyOn(projectProfilesLib, 'loadProfile');
29
+ const enforceProfileUsageSpy = vi.spyOn(projectProfilesLib, 'enforceProfileUsage');
30
+ const getAllHsProfilesSpy = vi.spyOn(projectParsingProfiles, 'getAllHsProfiles');
31
+ const listPromptSpy = vi.spyOn(promptUtilsLib, 'listPrompt');
32
+ const trackCommandUsageSpy = vi.spyOn(usageTrackingLib, 'trackCommandUsage');
33
+ const logErrorSpy = vi.spyOn(errorHandlers, 'logError');
34
+ const deprecatedProjectDevFlowSpy = vi.spyOn(deprecatedFlowLib, 'deprecatedProjectDevFlow');
35
+ const unifiedProjectDevFlowSpy = vi.spyOn(unifiedFlowLib, 'unifiedProjectDevFlow');
36
+ const processExitSpy = vi.spyOn(process, 'exit');
37
+ describe('commands/project/dev', () => {
38
+ beforeEach(() => {
39
+ // @ts-expect-error Mock implementation
40
+ processExitSpy.mockImplementation(() => { });
41
+ getProjectConfigSpy.mockResolvedValue({
42
+ projectConfig: {
43
+ name: 'test-project',
44
+ srcDir: 'src',
45
+ platformVersion: 'v2',
46
+ },
47
+ projectDir: '/test/project',
48
+ });
49
+ validateProjectConfigSpy.mockImplementation(() => { });
50
+ isV2ProjectSpy.mockReturnValue(true);
51
+ trackCommandUsageSpy.mockImplementation(async () => { });
52
+ deprecatedProjectDevFlowSpy.mockResolvedValue(undefined);
53
+ unifiedProjectDevFlowSpy.mockResolvedValue(undefined);
54
+ enforceProfileUsageSpy.mockResolvedValue(undefined);
55
+ getAllHsProfilesSpy.mockResolvedValue([]);
56
+ listPromptSpy.mockResolvedValue('dev');
57
+ });
58
+ describe('command', () => {
59
+ it('should have the correct command structure', () => {
60
+ expect(projectDevCommand.command).toEqual('dev');
61
+ });
62
+ });
63
+ describe('describe', () => {
64
+ it('should provide a description', () => {
65
+ expect(projectDevCommand.describe).toBeDefined();
66
+ });
67
+ });
68
+ describe('builder', () => {
69
+ it('should be a function', () => {
70
+ expect(typeof projectDevCommand.builder).toBe('function');
71
+ });
72
+ });
73
+ describe('handler', () => {
74
+ let args;
75
+ beforeEach(() => {
76
+ args = {
77
+ derivedAccountId: 123456,
78
+ };
79
+ });
80
+ describe('validation', () => {
81
+ it('should validate project config', async () => {
82
+ await projectDevCommand.handler(args);
83
+ expect(validateProjectConfigSpy).toHaveBeenCalledWith({
84
+ name: 'test-project',
85
+ srcDir: 'src',
86
+ platformVersion: 'v2',
87
+ }, '/test/project');
88
+ });
89
+ it('should exit if project config validation fails', async () => {
90
+ const error = new Error('Invalid config');
91
+ validateProjectConfigSpy.mockImplementation(() => {
92
+ throw error;
93
+ });
94
+ await projectDevCommand.handler(args);
95
+ expect(logErrorSpy).toHaveBeenCalledWith(error);
96
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
97
+ });
98
+ it('should exit if no project directory', async () => {
99
+ getProjectConfigSpy.mockResolvedValue({
100
+ projectConfig: {
101
+ name: 'test-project',
102
+ srcDir: 'src',
103
+ platformVersion: 'v2',
104
+ },
105
+ projectDir: null,
106
+ });
107
+ // Make process.exit actually throw to stop execution
108
+ processExitSpy.mockImplementation((code) => {
109
+ throw new Error(`process.exit called with ${code}`);
110
+ });
111
+ await expect(projectDevCommand.handler(args)).rejects.toThrow('process.exit called');
112
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('project'));
113
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
114
+ });
115
+ it('should error if using testingAccount and projectAccount with legacy project', async () => {
116
+ isV2ProjectSpy.mockReturnValue(false);
117
+ args.testingAccount = '111111';
118
+ args.projectAccount = '222222';
119
+ await projectDevCommand.handler(args);
120
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('--project-account and --testing-account'));
121
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
122
+ });
123
+ it('should error if using account flag with V2 project', async () => {
124
+ isV2ProjectSpy.mockReturnValue(true);
125
+ args.userProvidedAccount = '123456';
126
+ await projectDevCommand.handler(args);
127
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('--account flag'));
128
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
129
+ });
130
+ });
131
+ describe('account resolution', () => {
132
+ it('should use projectAccount flag', async () => {
133
+ args.projectAccount = '999999';
134
+ getConfigAccountIfExistsSpy.mockReturnValue({
135
+ accountId: 999999,
136
+ });
137
+ await projectDevCommand.handler(args);
138
+ expect(getConfigAccountIfExistsSpy).toHaveBeenCalledWith('999999');
139
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('project-dev', {}, 999999);
140
+ });
141
+ it('should use userProvidedAccount for legacy projects', async () => {
142
+ isV2ProjectSpy.mockReturnValue(false);
143
+ args.userProvidedAccount = '888888';
144
+ args.derivedAccountId = 888888;
145
+ await projectDevCommand.handler(args);
146
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('project-dev', {}, 888888);
147
+ });
148
+ it('should use profile accountId when profile specified', async () => {
149
+ args.profile = 'test-profile';
150
+ loadProfileSpy.mockReturnValue({
151
+ accountId: 777777,
152
+ });
153
+ await projectDevCommand.handler(args);
154
+ expect(loadProfileSpy).toHaveBeenCalledWith({
155
+ name: 'test-project',
156
+ srcDir: 'src',
157
+ platformVersion: 'v2',
158
+ }, '/test/project', 'test-profile');
159
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('project-dev', {}, 777777);
160
+ });
161
+ it('should exit if profile loading fails', async () => {
162
+ args.profile = 'invalid-profile';
163
+ const error = new Error('Profile not found');
164
+ loadProfileSpy.mockImplementation(() => {
165
+ throw error;
166
+ });
167
+ // Make process.exit actually throw to stop execution
168
+ processExitSpy.mockImplementation((code) => {
169
+ throw new Error(`process.exit called with ${code}`);
170
+ });
171
+ await expect(projectDevCommand.handler(args)).rejects.toThrow('process.exit called');
172
+ expect(logErrorSpy).toHaveBeenCalledWith(error);
173
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
174
+ });
175
+ it('should prompt for profile selection when profiles exist and no profile is specified', async () => {
176
+ getAllHsProfilesSpy.mockResolvedValue(['dev', 'prod']);
177
+ listPromptSpy.mockResolvedValue('dev');
178
+ loadProfileSpy.mockReturnValue({
179
+ accountId: 789012,
180
+ variables: {},
181
+ });
182
+ await projectDevCommand.handler(args);
183
+ expect(getAllHsProfilesSpy).toHaveBeenCalledWith('/test/project/src');
184
+ expect(listPromptSpy).toHaveBeenCalledWith(expect.any(String), {
185
+ choices: ['dev', 'prod'],
186
+ });
187
+ expect(loadProfileSpy).toHaveBeenCalledWith({
188
+ name: 'test-project',
189
+ srcDir: 'src',
190
+ platformVersion: 'v2',
191
+ }, '/test/project', 'dev');
192
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('project-dev', {}, 789012);
193
+ });
194
+ it('should exit if profile loading fails after selection', async () => {
195
+ getAllHsProfilesSpy.mockResolvedValue(['dev', 'prod']);
196
+ listPromptSpy.mockResolvedValue('dev');
197
+ const error = new Error('Failed to load profile');
198
+ loadProfileSpy.mockImplementation(() => {
199
+ throw error;
200
+ });
201
+ // Make process.exit actually throw to stop execution
202
+ processExitSpy.mockImplementation((code) => {
203
+ throw new Error(`process.exit called with ${code}`);
204
+ });
205
+ await expect(projectDevCommand.handler(args)).rejects.toThrow('process.exit called');
206
+ expect(logErrorSpy).toHaveBeenCalledWith(error);
207
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
208
+ });
209
+ it('should use derivedAccountId as fallback', async () => {
210
+ await projectDevCommand.handler(args);
211
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('project-dev', {}, 123456);
212
+ });
213
+ });
214
+ describe('dev flow execution', () => {
215
+ it('should track command usage', async () => {
216
+ await projectDevCommand.handler(args);
217
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('project-dev', {}, 123456);
218
+ });
219
+ it('should run unified flow for V2 projects', async () => {
220
+ isV2ProjectSpy.mockReturnValue(true);
221
+ await projectDevCommand.handler(args);
222
+ expect(unifiedProjectDevFlowSpy).toHaveBeenCalledWith({
223
+ args,
224
+ targetProjectAccountId: 123456,
225
+ providedTargetTestingAccountId: undefined,
226
+ projectConfig: {
227
+ name: 'test-project',
228
+ srcDir: 'src',
229
+ platformVersion: 'v2',
230
+ },
231
+ projectDir: '/test/project',
232
+ profileConfig: undefined,
233
+ });
234
+ expect(deprecatedProjectDevFlowSpy).not.toHaveBeenCalled();
235
+ });
236
+ it('should run deprecated flow for legacy projects', async () => {
237
+ isV2ProjectSpy.mockReturnValue(false);
238
+ await projectDevCommand.handler(args);
239
+ expect(deprecatedProjectDevFlowSpy).toHaveBeenCalledWith({
240
+ args,
241
+ accountId: 123456,
242
+ projectConfig: {
243
+ name: 'test-project',
244
+ srcDir: 'src',
245
+ platformVersion: 'v2',
246
+ },
247
+ projectDir: '/test/project',
248
+ });
249
+ expect(unifiedProjectDevFlowSpy).not.toHaveBeenCalled();
250
+ });
251
+ it('should pass testingAccount to unified flow', async () => {
252
+ isV2ProjectSpy.mockReturnValue(true);
253
+ args.testingAccount = '555555';
254
+ getConfigAccountIfExistsSpy.mockReturnValue({
255
+ accountId: 555555,
256
+ });
257
+ await projectDevCommand.handler(args);
258
+ expect(unifiedProjectDevFlowSpy).toHaveBeenCalledWith(expect.objectContaining({
259
+ providedTargetTestingAccountId: 555555,
260
+ }));
261
+ });
262
+ it('should pass profile config to unified flow', async () => {
263
+ args.profile = 'dev-profile';
264
+ const profileConfig = { accountId: 666666 };
265
+ loadProfileSpy.mockReturnValue(profileConfig);
266
+ await projectDevCommand.handler(args);
267
+ expect(unifiedProjectDevFlowSpy).toHaveBeenCalledWith(expect.objectContaining({
268
+ profileConfig,
269
+ }));
270
+ });
271
+ });
272
+ });
273
+ });
@@ -1,6 +1,6 @@
1
1
  import path from 'path';
2
2
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
3
- import { translateForLocalDev } from '@hubspot/project-parsing-lib';
3
+ import { translateForLocalDev } from '@hubspot/project-parsing-lib/translate';
4
4
  import { getAllConfigAccounts, getConfigAccountById, getConfigAccountEnvironment, } from '@hubspot/local-dev-lib/config';
5
5
  import { getValidEnv } from '@hubspot/local-dev-lib/environment';
6
6
  import { getServerPortByInstanceId } from '@hubspot/local-dev-lib/portManager';
@@ -31,7 +31,7 @@ vi.mock('@hubspot/ui-extensions-dev-server', () => ({
31
31
  },
32
32
  }));
33
33
  // Mock all dependencies
34
- vi.mock('@hubspot/project-parsing-lib');
34
+ vi.mock('@hubspot/project-parsing-lib/translate');
35
35
  vi.mock('@hubspot/local-dev-lib/config');
36
36
  vi.mock('@hubspot/local-dev-lib/environment');
37
37
  vi.mock('@hubspot/local-dev-lib/portManager');
@@ -47,7 +47,6 @@ vi.mock('../../../lib/projects/localDev/LocalDevWebsocketServer');
47
47
  vi.mock('../../../lib/process');
48
48
  vi.mock('../../../lib/accountTypes');
49
49
  vi.mock('../../../lib/ui');
50
- vi.mock('../../../lib/ui/logger');
51
50
  describe('unifiedProjectDevFlow', () => {
52
51
  const mockArgs = {
53
52
  profile: 'test-profile',
@@ -110,7 +109,6 @@ describe('unifiedProjectDevFlow', () => {
110
109
  shutdown: vi.fn().mockResolvedValue(undefined),
111
110
  };
112
111
  beforeEach(() => {
113
- vi.clearAllMocks();
114
112
  // Mock process.exit
115
113
  vi.spyOn(global.process, 'exit').mockImplementation((code) => {
116
114
  throw new Error(`Process.exit called with code ${code}`);
@@ -376,7 +374,6 @@ describe('unifiedProjectDevFlow', () => {
376
374
  expect(mockLocalDevProcess.start).toHaveBeenCalled();
377
375
  expect(mockLocalDevWatcher.start).toHaveBeenCalled();
378
376
  expect(mockWebsocketServer.start).toHaveBeenCalled();
379
- expect(SpinniesManager.init).toHaveBeenCalled();
380
377
  });
381
378
  });
382
379
  describe('UI messaging', () => {
@@ -7,11 +7,9 @@ import { trackCommandUsage } from '../../../lib/usageTracking.js';
7
7
  import * as dependencyManagement from '../../../lib/dependencyManagement.js';
8
8
  import * as promptUtils from '../../../lib/prompts/promptUtils.js';
9
9
  import projectInstallDepsCommand from '../installDeps.js';
10
- vi.mock('../../../lib/ui/logger.js');
11
10
  vi.mock('../../../lib/projects/config');
12
11
  vi.mock('../../../lib/dependencyManagement');
13
12
  vi.mock('../../../lib/prompts/promptUtils');
14
- vi.mock('../../../lib/usageTracking');
15
13
  vi.mock('../../../lib/commonOpts');
16
14
  const exampleSpy = vi.spyOn(yargs, 'example');
17
15
  const processExitSpy = vi.spyOn(process, 'exit');
@@ -9,13 +9,11 @@ import * as promptUtils from '../../../lib/prompts/promptUtils.js';
9
9
  import * as linting from '../../../lib/projects/uieLinting.js';
10
10
  import { REQUIRED_PACKAGES_AND_MIN_VERSIONS } from '../../../lib/projects/uieLinting.js';
11
11
  import projectLintCommand from '../lint.js';
12
- vi.mock('../../../lib/ui/logger.js');
13
12
  vi.mock('../../../lib/ui/SpinniesManager.js');
14
13
  vi.mock('../../../lib/projects/config');
15
14
  vi.mock('../../../lib/dependencyManagement');
16
15
  vi.mock('../../../lib/prompts/promptUtils');
17
16
  vi.mock('../../../lib/projects/uieLinting');
18
- vi.mock('../../../lib/usageTracking');
19
17
  vi.mock('../../../lib/commonOpts');
20
18
  const exampleSpy = vi.spyOn(yargs, 'example');
21
19
  const processExitSpy = vi.spyOn(process, 'exit');
@@ -63,9 +61,6 @@ describe('commands/project/lint', () => {
63
61
  lintPackagesSpy.mockResolvedValue({ success: true, results: [] });
64
62
  displayLintResultsSpy.mockImplementation(() => { });
65
63
  });
66
- afterEach(() => {
67
- vi.clearAllMocks();
68
- });
69
64
  it('should track the command usage', async () => {
70
65
  getProjectConfigSpy.mockResolvedValue({
71
66
  projectDir: '/test/project',