@hubspot/cli 8.1.0 → 8.1.1-experimental.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (676) hide show
  1. package/api/migrate.js +8 -4
  2. package/bin/cli.js +12 -6
  3. package/commands/account/auth.js +7 -7
  4. package/commands/account/clean.js +7 -6
  5. package/commands/account/createOverride.js +10 -7
  6. package/commands/account/info.js +36 -17
  7. package/commands/account/link.d.ts +4 -0
  8. package/commands/account/link.js +89 -0
  9. package/commands/account/list.js +32 -76
  10. package/commands/account/remove.js +4 -3
  11. package/commands/account/removeOverride.js +11 -10
  12. package/commands/account/rename.js +5 -6
  13. package/commands/account/unlink.d.ts +4 -0
  14. package/commands/account/unlink.js +70 -0
  15. package/commands/account/use.js +75 -6
  16. package/commands/account.js +4 -0
  17. package/commands/api.d.ts +10 -0
  18. package/commands/api.js +164 -0
  19. package/commands/app/migrate.js +13 -13
  20. package/commands/app/secret/add.js +6 -7
  21. package/commands/app/secret/delete.js +9 -10
  22. package/commands/app/secret/list.js +6 -7
  23. package/commands/app/secret/update.js +8 -9
  24. package/commands/auth.js +19 -15
  25. package/commands/cms/app/create.js +9 -5
  26. package/commands/cms/convertFields.js +8 -8
  27. package/commands/cms/delete.js +2 -3
  28. package/commands/cms/fetch.js +7 -7
  29. package/commands/cms/function/create.js +9 -5
  30. package/commands/cms/function/deploy.js +2 -3
  31. package/commands/cms/function/list.js +11 -7
  32. package/commands/cms/function/logs.js +17 -22
  33. package/commands/cms/function/server.js +2 -3
  34. package/commands/cms/getReactModule.js +7 -8
  35. package/commands/cms/lighthouseScore.js +25 -24
  36. package/commands/cms/lint.js +4 -5
  37. package/commands/cms/list.js +5 -6
  38. package/commands/cms/module/create.js +9 -5
  39. package/commands/cms/module/marketplace-validate.js +7 -8
  40. package/commands/cms/mv.js +2 -3
  41. package/commands/cms/template/create.js +10 -6
  42. package/commands/cms/theme/create.js +5 -5
  43. package/commands/cms/theme/generate-selectors.js +5 -4
  44. package/commands/cms/theme/marketplace-validate.js +8 -9
  45. package/commands/cms/theme/preview.js +23 -70
  46. package/commands/cms/upload.js +15 -12
  47. package/commands/cms/watch.d.ts +0 -1
  48. package/commands/cms/watch.js +6 -12
  49. package/commands/cms/webpack/create.js +5 -5
  50. package/commands/completion.js +3 -5
  51. package/commands/config/migrate.js +6 -7
  52. package/commands/config/set.js +5 -6
  53. package/commands/customObject/create.js +4 -5
  54. package/commands/customObject/createSchema.js +4 -5
  55. package/commands/customObject/deleteSchema.js +4 -5
  56. package/commands/customObject/fetchAllSchemas.js +2 -3
  57. package/commands/customObject/fetchSchema.js +2 -3
  58. package/commands/customObject/listSchemas.js +2 -3
  59. package/commands/customObject/updateSchema.js +4 -5
  60. package/commands/doctor.js +8 -8
  61. package/commands/feedback.js +7 -5
  62. package/commands/filemanager/fetch.js +5 -6
  63. package/commands/filemanager/upload.js +5 -5
  64. package/commands/getStarted.js +17 -19
  65. package/commands/hubdb/clear.js +6 -3
  66. package/commands/hubdb/create.js +4 -5
  67. package/commands/hubdb/delete.js +9 -6
  68. package/commands/hubdb/fetch.js +6 -3
  69. package/commands/hubdb/list.js +16 -14
  70. package/commands/init.js +15 -14
  71. package/commands/mcp/setup.js +5 -14
  72. package/commands/mcp/start.js +2 -4
  73. package/commands/open.js +4 -5
  74. package/commands/project/add.js +13 -8
  75. package/commands/project/appInstallStatus.d.ts +4 -0
  76. package/commands/project/appInstallStatus.js +132 -0
  77. package/commands/project/create.js +28 -17
  78. package/commands/project/delete.d.ts +7 -0
  79. package/commands/project/delete.js +74 -0
  80. package/commands/project/deploy.js +39 -36
  81. package/commands/project/dev/deprecatedFlow.js +62 -17
  82. package/commands/project/dev/index.d.ts +3 -3
  83. package/commands/project/dev/index.js +59 -48
  84. package/commands/project/dev/unifiedFlow.js +70 -21
  85. package/commands/project/download.js +12 -9
  86. package/commands/project/info.d.ts +4 -0
  87. package/commands/project/info.js +67 -0
  88. package/commands/project/installDeps.js +9 -6
  89. package/commands/project/lint.js +31 -10
  90. package/commands/project/list.d.ts +2 -2
  91. package/commands/project/list.js +15 -14
  92. package/commands/project/listBuilds.js +8 -6
  93. package/commands/project/logs.js +5 -6
  94. package/commands/project/migrate.js +18 -18
  95. package/commands/project/open.js +5 -6
  96. package/commands/project/profile/add.js +12 -8
  97. package/commands/project/profile/delete.js +15 -11
  98. package/commands/project/updateDeps.js +9 -6
  99. package/commands/project/upload.d.ts +1 -0
  100. package/commands/project/upload.js +39 -19
  101. package/commands/project/validate.js +12 -12
  102. package/commands/project/watch.js +32 -19
  103. package/commands/project.js +12 -3
  104. package/commands/sandbox/create.js +18 -45
  105. package/commands/sandbox/delete.js +13 -14
  106. package/commands/secret/addSecret.js +6 -7
  107. package/commands/secret/deleteSecret.js +5 -6
  108. package/commands/secret/listSecret.js +2 -3
  109. package/commands/secret/updateSecret.js +4 -5
  110. package/commands/testAccount/create.d.ts +1 -1
  111. package/commands/testAccount/create.js +25 -17
  112. package/commands/testAccount/createConfig.js +7 -8
  113. package/commands/testAccount/delete.js +27 -18
  114. package/commands/testAccount/importData.js +6 -7
  115. package/commands/upgrade.js +9 -10
  116. package/lang/en.d.ts +258 -14
  117. package/lang/en.js +275 -28
  118. package/lib/accountAuth.js +4 -0
  119. package/lib/api/usageTracking.d.ts +29 -0
  120. package/lib/api/usageTracking.js +28 -0
  121. package/lib/app/migrate.js +18 -5
  122. package/lib/buildAccount.d.ts +1 -6
  123. package/lib/buildAccount.js +9 -42
  124. package/lib/commandSuggestion.js +1 -7
  125. package/lib/constants.d.ts +2 -4
  126. package/lib/constants.js +4 -4
  127. package/lib/doctor/Diagnosis.js +5 -5
  128. package/lib/doctor/Doctor.js +7 -7
  129. package/lib/errorHandlers/index.js +4 -3
  130. package/lib/errorHandlers/suppressError.js +4 -0
  131. package/lib/errors/PromptExitError.d.ts +6 -0
  132. package/lib/errors/PromptExitError.js +11 -0
  133. package/lib/generateSelectors.js +1 -2
  134. package/lib/getStartedV2Actions.d.ts +13 -0
  135. package/lib/getStartedV2Actions.js +56 -3
  136. package/lib/hasFeature.js +1 -2
  137. package/lib/link/accountTableUtils.d.ts +10 -0
  138. package/lib/link/accountTableUtils.js +39 -0
  139. package/lib/link/index.d.ts +18 -0
  140. package/lib/link/index.js +185 -0
  141. package/lib/link/linkUtils.d.ts +5 -0
  142. package/lib/link/linkUtils.js +49 -0
  143. package/lib/link/prompts.d.ts +7 -0
  144. package/lib/link/prompts.js +126 -0
  145. package/lib/link/renderLinkedAccountsTable.d.ts +2 -0
  146. package/lib/link/renderLinkedAccountsTable.js +14 -0
  147. package/lib/link/warnIfLinkedDirectory.d.ts +1 -0
  148. package/lib/link/warnIfLinkedDirectory.js +9 -0
  149. package/lib/mcp/setup.d.ts +1 -0
  150. package/lib/mcp/setup.js +77 -30
  151. package/lib/middleware/autoUpdateMiddleware.js +6 -3
  152. package/lib/process.d.ts +1 -1
  153. package/lib/process.js +10 -3
  154. package/lib/projects/ProjectLogsManager.js +6 -3
  155. package/lib/projects/components.js +15 -4
  156. package/lib/projects/create/index.js +3 -6
  157. package/lib/projects/create/legacy.js +5 -10
  158. package/lib/projects/create/v2.js +5 -14
  159. package/lib/projects/delete.d.ts +13 -0
  160. package/lib/projects/delete.js +193 -0
  161. package/lib/projects/deploy.d.ts +1 -1
  162. package/lib/projects/deploy.js +2 -2
  163. package/lib/projects/ensureProjectExists.js +1 -2
  164. package/lib/projects/localDev/AppDevModeInterface.js +13 -9
  165. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +4 -1
  166. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +3 -3
  167. package/lib/projects/localDev/DevSessionManager.d.ts +6 -3
  168. package/lib/projects/localDev/DevSessionManager.js +31 -19
  169. package/lib/projects/localDev/LocalDevManager_DEPRECATED.d.ts +5 -0
  170. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +21 -10
  171. package/lib/projects/localDev/LocalDevProcess.js +6 -5
  172. package/lib/projects/localDev/LocalDevState.d.ts +3 -2
  173. package/lib/projects/localDev/LocalDevState.js +3 -1
  174. package/lib/projects/localDev/helpers/account.d.ts +4 -3
  175. package/lib/projects/localDev/helpers/account.js +21 -30
  176. package/lib/projects/localDev/helpers/process.d.ts +1 -1
  177. package/lib/projects/localDev/helpers/process.js +4 -10
  178. package/lib/projects/localDev/helpers/project.d.ts +4 -3
  179. package/lib/projects/localDev/helpers/project.js +31 -15
  180. package/lib/projects/npmAuditOnUpload.d.ts +10 -0
  181. package/lib/projects/npmAuditOnUpload.js +73 -0
  182. package/lib/projects/pollProjectBuildAndDeploy.js +90 -85
  183. package/lib/projects/projectInfo.d.ts +5 -0
  184. package/lib/projects/projectInfo.js +82 -0
  185. package/lib/projects/projectProfiles.d.ts +1 -2
  186. package/lib/projects/projectProfiles.js +5 -17
  187. package/lib/projects/uieLinting.d.ts +17 -3
  188. package/lib/projects/uieLinting.js +93 -28
  189. package/lib/projects/upload.d.ts +3 -1
  190. package/lib/projects/upload.js +70 -50
  191. package/lib/projects/watch.d.ts +2 -1
  192. package/lib/projects/watch.js +32 -24
  193. package/lib/projects/workspaces.d.ts +42 -0
  194. package/lib/projects/workspaces.js +350 -0
  195. package/lib/prompts/createApiSamplePrompt.js +4 -0
  196. package/lib/prompts/downloadProjectPrompt.js +11 -10
  197. package/lib/prompts/installAppPrompt.js +3 -2
  198. package/lib/prompts/personalAccessKeyPrompt.js +3 -2
  199. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +1 -0
  200. package/lib/prompts/projectDevTargetAccountPrompt.js +23 -16
  201. package/lib/prompts/projectProfilePrompt.d.ts +2 -0
  202. package/lib/prompts/projectProfilePrompt.js +46 -0
  203. package/lib/prompts/projectsLogsPrompt.js +3 -0
  204. package/lib/prompts/promptUtils.js +4 -2
  205. package/lib/prompts/selectHubDBTablePrompt.js +8 -4
  206. package/lib/prompts/selectPublicAppForMigrationPrompt.js +12 -6
  207. package/lib/sandboxes.d.ts +1 -9
  208. package/lib/sandboxes.js +0 -21
  209. package/lib/serverlessLogs.js +50 -44
  210. package/lib/theme/cmsDevServerProcess.d.ts +14 -0
  211. package/lib/theme/cmsDevServerProcess.js +149 -0
  212. package/lib/theme/cmsDevServerRunner.d.ts +14 -0
  213. package/lib/theme/cmsDevServerRunner.js +90 -0
  214. package/lib/theme/migrate.d.ts +1 -1
  215. package/lib/theme/migrate.js +1 -5
  216. package/lib/ui/SpinniesManager.d.ts +1 -0
  217. package/lib/ui/SpinniesManager.js +22 -6
  218. package/lib/ui/accountTable.d.ts +8 -0
  219. package/lib/ui/accountTable.js +67 -0
  220. package/lib/ui/spinniesUtils.d.ts +0 -1
  221. package/lib/ui/spinniesUtils.js +6 -16
  222. package/lib/usageTracking.d.ts +9 -20
  223. package/lib/usageTracking.js +51 -34
  224. package/lib/yargs/makeYargsBuilder.d.ts +13 -0
  225. package/lib/yargs/makeYargsBuilder.js +33 -0
  226. package/lib/yargs/makeYargsHandlerWithUsageTracking.d.ts +3 -0
  227. package/lib/yargs/makeYargsHandlerWithUsageTracking.js +121 -0
  228. package/lib/yargs/parseYargsOrExit.d.ts +4 -0
  229. package/lib/yargs/parseYargsOrExit.js +25 -0
  230. package/lib/yargs/strictEnforceBoolean.d.ts +1 -0
  231. package/lib/yargs/strictEnforceBoolean.js +13 -0
  232. package/lib/yargsUtils.d.ts +3 -16
  233. package/lib/yargsUtils.js +3 -48
  234. package/mcp-server/Tool.d.ts +15 -0
  235. package/mcp-server/Tool.js +53 -0
  236. package/mcp-server/server.js +43 -3
  237. package/mcp-server/tools/cms/HsCreateFunctionTool.d.ts +4 -2
  238. package/mcp-server/tools/cms/HsCreateFunctionTool.js +9 -7
  239. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -2
  240. package/mcp-server/tools/cms/HsCreateModuleTool.js +9 -7
  241. package/mcp-server/tools/cms/HsCreateTemplateTool.d.ts +4 -2
  242. package/mcp-server/tools/cms/HsCreateTemplateTool.js +9 -7
  243. package/mcp-server/tools/cms/HsFunctionLogsTool.d.ts +4 -2
  244. package/mcp-server/tools/cms/HsFunctionLogsTool.js +9 -7
  245. package/mcp-server/tools/cms/HsListFunctionsTool.d.ts +4 -2
  246. package/mcp-server/tools/cms/HsListFunctionsTool.js +9 -7
  247. package/mcp-server/tools/cms/HsListTool.d.ts +4 -2
  248. package/mcp-server/tools/cms/HsListTool.js +9 -7
  249. package/mcp-server/tools/index.d.ts +3 -2
  250. package/mcp-server/tools/index.js +24 -22
  251. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +25 -5
  252. package/mcp-server/tools/project/AddFeatureToProjectTool.js +16 -18
  253. package/mcp-server/tools/project/CreateProjectTool.d.ts +29 -6
  254. package/mcp-server/tools/project/CreateProjectTool.js +16 -18
  255. package/mcp-server/tools/project/CreateTestAccountTool.d.ts +4 -2
  256. package/mcp-server/tools/project/CreateTestAccountTool.js +22 -10
  257. package/mcp-server/tools/project/DeployProjectTool.d.ts +4 -2
  258. package/mcp-server/tools/project/DeployProjectTool.js +6 -8
  259. package/mcp-server/tools/project/DocFetchTool.d.ts +4 -2
  260. package/mcp-server/tools/project/DocFetchTool.js +8 -6
  261. package/mcp-server/tools/project/DocsSearchTool.d.ts +9 -3
  262. package/mcp-server/tools/project/DocsSearchTool.js +32 -9
  263. package/mcp-server/tools/project/FindProjectsTool.d.ts +15 -0
  264. package/mcp-server/tools/project/FindProjectsTool.js +60 -0
  265. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +4 -2
  266. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +13 -14
  267. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +4 -2
  268. package/mcp-server/tools/project/GetApplicationInfoTool.js +8 -6
  269. package/mcp-server/tools/project/GetBuildLogsTool.d.ts +6 -4
  270. package/mcp-server/tools/project/GetBuildLogsTool.js +15 -14
  271. package/mcp-server/tools/project/GetBuildStatusTool.d.ts +5 -3
  272. package/mcp-server/tools/project/GetBuildStatusTool.js +12 -11
  273. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -2
  274. package/mcp-server/tools/project/GetConfigValuesTool.js +12 -7
  275. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +10 -3
  276. package/mcp-server/tools/project/GuidedWalkthroughTool.js +5 -12
  277. package/mcp-server/tools/project/UploadProjectTools.d.ts +4 -2
  278. package/mcp-server/tools/project/UploadProjectTools.js +11 -9
  279. package/mcp-server/tools/project/ValidateProjectTool.d.ts +4 -2
  280. package/mcp-server/tools/project/ValidateProjectTool.js +10 -8
  281. package/mcp-server/tools/project/constants.d.ts +13 -1
  282. package/mcp-server/tools/project/constants.js +13 -16
  283. package/mcp-server/types.d.ts +0 -7
  284. package/mcp-server/types.js +1 -13
  285. package/mcp-server/utils/command.d.ts +5 -0
  286. package/mcp-server/utils/command.js +24 -0
  287. package/mcp-server/utils/feedbackTracking.js +2 -17
  288. package/mcp-server/utils/logger.d.ts +10 -0
  289. package/mcp-server/utils/logger.js +29 -0
  290. package/mcp-server/utils/toolUsageTracking.js +10 -8
  291. package/package.json +15 -11
  292. package/types/Link.d.ts +32 -0
  293. package/types/Link.js +5 -0
  294. package/types/LocalDev.d.ts +5 -0
  295. package/types/PackageJson.d.ts +1 -0
  296. package/types/Projects.d.ts +19 -0
  297. package/types/Prompts.d.ts +1 -0
  298. package/types/Yargs.d.ts +19 -1
  299. package/ui/components/getStarted/GetStartedFlow.js +79 -2
  300. package/ui/components/getStarted/reducer.d.ts +20 -0
  301. package/ui/components/getStarted/reducer.js +36 -0
  302. package/ui/components/getStarted/screens/InstallationScreen.d.ts +7 -0
  303. package/ui/components/getStarted/screens/InstallationScreen.js +16 -0
  304. package/ui/components/getStarted/screens/ProjectSetupScreen.js +2 -1
  305. package/ui/lib/constants.d.ts +1 -0
  306. package/ui/lib/constants.js +1 -0
  307. package/api/__tests__/migrate.test.d.ts +0 -1
  308. package/api/__tests__/migrate.test.js +0 -199
  309. package/commands/__tests__/account.test.d.ts +0 -1
  310. package/commands/__tests__/account.test.js +0 -69
  311. package/commands/__tests__/auth.test.d.ts +0 -1
  312. package/commands/__tests__/auth.test.js +0 -43
  313. package/commands/__tests__/cms.test.d.ts +0 -1
  314. package/commands/__tests__/cms.test.js +0 -87
  315. package/commands/__tests__/config.test.d.ts +0 -1
  316. package/commands/__tests__/config.test.js +0 -44
  317. package/commands/__tests__/customObject.test.d.ts +0 -1
  318. package/commands/__tests__/customObject.test.js +0 -68
  319. package/commands/__tests__/doctor.test.d.ts +0 -1
  320. package/commands/__tests__/doctor.test.js +0 -132
  321. package/commands/__tests__/feedback.test.d.ts +0 -1
  322. package/commands/__tests__/feedback.test.js +0 -24
  323. package/commands/__tests__/filemanager.test.d.ts +0 -1
  324. package/commands/__tests__/filemanager.test.js +0 -45
  325. package/commands/__tests__/getStarted.test.d.ts +0 -1
  326. package/commands/__tests__/getStarted.test.js +0 -173
  327. package/commands/__tests__/hubdb.test.d.ts +0 -1
  328. package/commands/__tests__/hubdb.test.js +0 -50
  329. package/commands/__tests__/init.test.d.ts +0 -1
  330. package/commands/__tests__/init.test.js +0 -42
  331. package/commands/__tests__/mcp.test.d.ts +0 -1
  332. package/commands/__tests__/mcp.test.js +0 -46
  333. package/commands/__tests__/open.test.d.ts +0 -1
  334. package/commands/__tests__/open.test.js +0 -58
  335. package/commands/__tests__/project.test.d.ts +0 -1
  336. package/commands/__tests__/project.test.js +0 -125
  337. package/commands/__tests__/sandbox.test.d.ts +0 -1
  338. package/commands/__tests__/sandbox.test.js +0 -44
  339. package/commands/__tests__/secret.test.d.ts +0 -1
  340. package/commands/__tests__/secret.test.js +0 -49
  341. package/commands/__tests__/testAccount.test.d.ts +0 -1
  342. package/commands/__tests__/testAccount.test.js +0 -57
  343. package/commands/__tests__/upgrade.test.d.ts +0 -1
  344. package/commands/__tests__/upgrade.test.js +0 -309
  345. package/commands/account/__tests__/auth.test.d.ts +0 -1
  346. package/commands/account/__tests__/auth.test.js +0 -206
  347. package/commands/account/__tests__/clean.test.d.ts +0 -1
  348. package/commands/account/__tests__/clean.test.js +0 -28
  349. package/commands/account/__tests__/createOverride.test.d.ts +0 -1
  350. package/commands/account/__tests__/createOverride.test.js +0 -32
  351. package/commands/account/__tests__/info.test.d.ts +0 -1
  352. package/commands/account/__tests__/info.test.js +0 -28
  353. package/commands/account/__tests__/list.test.d.ts +0 -1
  354. package/commands/account/__tests__/list.test.js +0 -153
  355. package/commands/account/__tests__/remove.test.d.ts +0 -1
  356. package/commands/account/__tests__/remove.test.js +0 -36
  357. package/commands/account/__tests__/removeOverride.d.ts +0 -1
  358. package/commands/account/__tests__/removeOverride.js +0 -25
  359. package/commands/account/__tests__/rename.test.d.ts +0 -1
  360. package/commands/account/__tests__/rename.test.js +0 -82
  361. package/commands/account/__tests__/use.test.d.ts +0 -1
  362. package/commands/account/__tests__/use.test.js +0 -170
  363. package/commands/app/__tests__/migrate.test.d.ts +0 -1
  364. package/commands/app/__tests__/migrate.test.js +0 -111
  365. package/commands/app/secret/__tests__/add.test.d.ts +0 -1
  366. package/commands/app/secret/__tests__/add.test.js +0 -140
  367. package/commands/app/secret/__tests__/delete.test.d.ts +0 -1
  368. package/commands/app/secret/__tests__/delete.test.js +0 -28
  369. package/commands/app/secret/__tests__/list.test.d.ts +0 -1
  370. package/commands/app/secret/__tests__/list.test.js +0 -25
  371. package/commands/app/secret/__tests__/update.test.d.ts +0 -1
  372. package/commands/app/secret/__tests__/update.test.js +0 -28
  373. package/commands/cms/__tests__/delete.test.d.ts +0 -1
  374. package/commands/cms/__tests__/delete.test.js +0 -39
  375. package/commands/cms/__tests__/fetch.test.d.ts +0 -1
  376. package/commands/cms/__tests__/fetch.test.js +0 -156
  377. package/commands/cms/__tests__/function.test.d.ts +0 -1
  378. package/commands/cms/__tests__/function.test.js +0 -50
  379. package/commands/cms/__tests__/lint.test.d.ts +0 -1
  380. package/commands/cms/__tests__/lint.test.js +0 -33
  381. package/commands/cms/__tests__/list.test.d.ts +0 -1
  382. package/commands/cms/__tests__/list.test.js +0 -42
  383. package/commands/cms/__tests__/module.test.d.ts +0 -1
  384. package/commands/cms/__tests__/module.test.js +0 -45
  385. package/commands/cms/__tests__/mv.test.d.ts +0 -1
  386. package/commands/cms/__tests__/mv.test.js +0 -46
  387. package/commands/cms/__tests__/theme.test.d.ts +0 -1
  388. package/commands/cms/__tests__/theme.test.js +0 -54
  389. package/commands/cms/__tests__/upload.test.d.ts +0 -1
  390. package/commands/cms/__tests__/upload.test.js +0 -308
  391. package/commands/cms/__tests__/watch.test.d.ts +0 -1
  392. package/commands/cms/__tests__/watch.test.js +0 -212
  393. package/commands/cms/function/__tests__/logs.test.d.ts +0 -1
  394. package/commands/cms/function/__tests__/logs.test.js +0 -70
  395. package/commands/cms/theme/__tests__/generate-selectors.test.d.ts +0 -1
  396. package/commands/cms/theme/__tests__/generate-selectors.test.js +0 -28
  397. package/commands/cms/theme/__tests__/marketplace-validate.test.d.ts +0 -1
  398. package/commands/cms/theme/__tests__/marketplace-validate.test.js +0 -36
  399. package/commands/cms/theme/__tests__/preview.test.d.ts +0 -1
  400. package/commands/cms/theme/__tests__/preview.test.js +0 -54
  401. package/commands/customObject/__tests__/create.test.d.ts +0 -1
  402. package/commands/customObject/__tests__/create.test.js +0 -40
  403. package/commands/customObject/__tests__/createSchema.test.d.ts +0 -1
  404. package/commands/customObject/__tests__/createSchema.test.js +0 -28
  405. package/commands/customObject/__tests__/deleteSchema.test.d.ts +0 -1
  406. package/commands/customObject/__tests__/deleteSchema.test.js +0 -42
  407. package/commands/customObject/__tests__/fetch-all-schemas.test.d.ts +0 -1
  408. package/commands/customObject/__tests__/fetch-all-schemas.test.js +0 -41
  409. package/commands/customObject/__tests__/fetchSchema.test.d.ts +0 -1
  410. package/commands/customObject/__tests__/fetchSchema.test.js +0 -45
  411. package/commands/customObject/__tests__/listSchemas.test.d.ts +0 -1
  412. package/commands/customObject/__tests__/listSchemas.test.js +0 -29
  413. package/commands/customObject/__tests__/updateSchema.test.d.ts +0 -1
  414. package/commands/customObject/__tests__/updateSchema.test.js +0 -40
  415. package/commands/filemanager/__tests__/fetch.test.d.ts +0 -1
  416. package/commands/filemanager/__tests__/fetch.test.js +0 -32
  417. package/commands/filemanager/__tests__/upload.test.d.ts +0 -1
  418. package/commands/filemanager/__tests__/upload.test.js +0 -191
  419. package/commands/hubdb/__tests__/clear.test.d.ts +0 -1
  420. package/commands/hubdb/__tests__/clear.test.js +0 -28
  421. package/commands/hubdb/__tests__/create.test.d.ts +0 -1
  422. package/commands/hubdb/__tests__/create.test.js +0 -28
  423. package/commands/hubdb/__tests__/delete.test.d.ts +0 -1
  424. package/commands/hubdb/__tests__/delete.test.js +0 -28
  425. package/commands/hubdb/__tests__/fetch.test.d.ts +0 -1
  426. package/commands/hubdb/__tests__/fetch.test.js +0 -28
  427. package/commands/hubdb/__tests__/list.test.d.ts +0 -1
  428. package/commands/hubdb/__tests__/list.test.js +0 -88
  429. package/commands/mcp/__tests__/setup.test.d.ts +0 -1
  430. package/commands/mcp/__tests__/setup.test.js +0 -26
  431. package/commands/mcp/__tests__/start.test.d.ts +0 -1
  432. package/commands/mcp/__tests__/start.test.js +0 -137
  433. package/commands/project/__tests__/add.test.d.ts +0 -1
  434. package/commands/project/__tests__/add.test.js +0 -107
  435. package/commands/project/__tests__/create.test.d.ts +0 -1
  436. package/commands/project/__tests__/create.test.js +0 -97
  437. package/commands/project/__tests__/deploy.test.d.ts +0 -1
  438. package/commands/project/__tests__/deploy.test.js +0 -307
  439. package/commands/project/__tests__/dev.test.d.ts +0 -1
  440. package/commands/project/__tests__/dev.test.js +0 -273
  441. package/commands/project/__tests__/devUnifiedFlow.test.d.ts +0 -1
  442. package/commands/project/__tests__/devUnifiedFlow.test.js +0 -434
  443. package/commands/project/__tests__/download.test.d.ts +0 -1
  444. package/commands/project/__tests__/download.test.js +0 -39
  445. package/commands/project/__tests__/installDeps.test.d.ts +0 -1
  446. package/commands/project/__tests__/installDeps.test.js +0 -140
  447. package/commands/project/__tests__/lint.test.d.ts +0 -1
  448. package/commands/project/__tests__/lint.test.js +0 -704
  449. package/commands/project/__tests__/list.test.d.ts +0 -1
  450. package/commands/project/__tests__/list.test.js +0 -31
  451. package/commands/project/__tests__/listBuilds.test.d.ts +0 -1
  452. package/commands/project/__tests__/listBuilds.test.js +0 -38
  453. package/commands/project/__tests__/logs.test.d.ts +0 -1
  454. package/commands/project/__tests__/logs.test.js +0 -202
  455. package/commands/project/__tests__/migrate.test.d.ts +0 -1
  456. package/commands/project/__tests__/migrate.test.js +0 -106
  457. package/commands/project/__tests__/open.test.d.ts +0 -1
  458. package/commands/project/__tests__/open.test.js +0 -39
  459. package/commands/project/__tests__/profile.test.d.ts +0 -1
  460. package/commands/project/__tests__/profile.test.js +0 -42
  461. package/commands/project/__tests__/updateDeps.test.d.ts +0 -1
  462. package/commands/project/__tests__/updateDeps.test.js +0 -140
  463. package/commands/project/__tests__/upload.test.d.ts +0 -1
  464. package/commands/project/__tests__/upload.test.js +0 -234
  465. package/commands/project/__tests__/validate.test.d.ts +0 -1
  466. package/commands/project/__tests__/validate.test.js +0 -381
  467. package/commands/project/__tests__/watch.test.d.ts +0 -1
  468. package/commands/project/__tests__/watch.test.js +0 -35
  469. package/commands/sandbox/__tests__/create.test.d.ts +0 -1
  470. package/commands/sandbox/__tests__/create.test.js +0 -245
  471. package/commands/sandbox/__tests__/delete.test.d.ts +0 -1
  472. package/commands/sandbox/__tests__/delete.test.js +0 -31
  473. package/commands/secret/__tests__/addSecret.test.d.ts +0 -1
  474. package/commands/secret/__tests__/addSecret.test.js +0 -162
  475. package/commands/secret/__tests__/deleteSecret.test.d.ts +0 -1
  476. package/commands/secret/__tests__/deleteSecret.test.js +0 -41
  477. package/commands/secret/__tests__/listSecret.test.d.ts +0 -1
  478. package/commands/secret/__tests__/listSecret.test.js +0 -29
  479. package/commands/secret/__tests__/updateSecret.test.d.ts +0 -1
  480. package/commands/secret/__tests__/updateSecret.test.js +0 -29
  481. package/commands/testAccount/__tests__/create.test.d.ts +0 -1
  482. package/commands/testAccount/__tests__/create.test.js +0 -106
  483. package/commands/testAccount/__tests__/createConfig.test.d.ts +0 -1
  484. package/commands/testAccount/__tests__/createConfig.test.js +0 -32
  485. package/commands/testAccount/__tests__/delete.test.d.ts +0 -1
  486. package/commands/testAccount/__tests__/delete.test.js +0 -29
  487. package/commands/testAccount/__tests__/importData.test.d.ts +0 -1
  488. package/commands/testAccount/__tests__/importData.test.js +0 -92
  489. package/lib/__tests__/CLIWebSocketServer.test.d.ts +0 -1
  490. package/lib/__tests__/CLIWebSocketServer.test.js +0 -252
  491. package/lib/__tests__/accountAuth.test.d.ts +0 -1
  492. package/lib/__tests__/accountAuth.test.js +0 -258
  493. package/lib/__tests__/accountTypes.test.d.ts +0 -1
  494. package/lib/__tests__/accountTypes.test.js +0 -98
  495. package/lib/__tests__/buildAccount.test.d.ts +0 -1
  496. package/lib/__tests__/buildAccount.test.js +0 -262
  497. package/lib/__tests__/cliUpgradeUtils.test.d.ts +0 -1
  498. package/lib/__tests__/cliUpgradeUtils.test.js +0 -131
  499. package/lib/__tests__/commandSuggestion.test.d.ts +0 -1
  500. package/lib/__tests__/commandSuggestion.test.js +0 -119
  501. package/lib/__tests__/commonOpts.test.d.ts +0 -1
  502. package/lib/__tests__/commonOpts.test.js +0 -80
  503. package/lib/__tests__/dependencyManagement.test.d.ts +0 -1
  504. package/lib/__tests__/dependencyManagement.test.js +0 -1067
  505. package/lib/__tests__/developerTestAccounts.test.d.ts +0 -1
  506. package/lib/__tests__/developerTestAccounts.test.js +0 -156
  507. package/lib/__tests__/hasFeature.test.d.ts +0 -1
  508. package/lib/__tests__/hasFeature.test.js +0 -167
  509. package/lib/__tests__/http.test.d.ts +0 -1
  510. package/lib/__tests__/http.test.js +0 -40
  511. package/lib/__tests__/importData.test.d.ts +0 -1
  512. package/lib/__tests__/importData.test.js +0 -98
  513. package/lib/__tests__/npmCli.test.d.ts +0 -1
  514. package/lib/__tests__/npmCli.test.js +0 -84
  515. package/lib/__tests__/oauth.test.d.ts +0 -1
  516. package/lib/__tests__/oauth.test.js +0 -109
  517. package/lib/__tests__/parsing.test.d.ts +0 -1
  518. package/lib/__tests__/parsing.test.js +0 -34
  519. package/lib/__tests__/polling.test.d.ts +0 -1
  520. package/lib/__tests__/polling.test.js +0 -76
  521. package/lib/__tests__/process.test.d.ts +0 -1
  522. package/lib/__tests__/process.test.js +0 -89
  523. package/lib/__tests__/sandboxSync.test.d.ts +0 -1
  524. package/lib/__tests__/sandboxSync.test.js +0 -147
  525. package/lib/__tests__/sandboxes.test.d.ts +0 -1
  526. package/lib/__tests__/sandboxes.test.js +0 -156
  527. package/lib/__tests__/serverlessLogs.test.d.ts +0 -1
  528. package/lib/__tests__/serverlessLogs.test.js +0 -148
  529. package/lib/__tests__/usageTracking.test.d.ts +0 -1
  530. package/lib/__tests__/usageTracking.test.js +0 -197
  531. package/lib/__tests__/validation.test.d.ts +0 -1
  532. package/lib/__tests__/validation.test.js +0 -143
  533. package/lib/__tests__/yargsUtils.test.d.ts +0 -1
  534. package/lib/__tests__/yargsUtils.test.js +0 -124
  535. package/lib/app/__tests__/migrate.test.d.ts +0 -1
  536. package/lib/app/__tests__/migrate.test.js +0 -638
  537. package/lib/doctor/__tests__/Diagnosis.test.d.ts +0 -1
  538. package/lib/doctor/__tests__/Diagnosis.test.js +0 -84
  539. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.d.ts +0 -1
  540. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +0 -177
  541. package/lib/doctor/__tests__/Doctor.test.d.ts +0 -1
  542. package/lib/doctor/__tests__/Doctor.test.js +0 -560
  543. package/lib/errorHandlers/__tests__/index.test.d.ts +0 -1
  544. package/lib/errorHandlers/__tests__/index.test.js +0 -278
  545. package/lib/mcp/__tests__/setup.test.d.ts +0 -1
  546. package/lib/mcp/__tests__/setup.test.js +0 -194
  547. package/lib/middleware/__tests__/commandTargetingUtils.test.d.ts +0 -1
  548. package/lib/middleware/__tests__/commandTargetingUtils.test.js +0 -99
  549. package/lib/middleware/__tests__/configMiddleware.test.d.ts +0 -1
  550. package/lib/middleware/__tests__/configMiddleware.test.js +0 -118
  551. package/lib/middleware/__tests__/gitMiddleware.test.d.ts +0 -1
  552. package/lib/middleware/__tests__/gitMiddleware.test.js +0 -43
  553. package/lib/middleware/__tests__/requestMiddleware.test.d.ts +0 -1
  554. package/lib/middleware/__tests__/requestMiddleware.test.js +0 -15
  555. package/lib/middleware/__tests__/usageTrackingMiddleware.test.d.ts +0 -1
  556. package/lib/middleware/__tests__/usageTrackingMiddleware.test.js +0 -44
  557. package/lib/middleware/__tests__/yargsChecksMiddleware.test.d.ts +0 -1
  558. package/lib/middleware/__tests__/yargsChecksMiddleware.test.js +0 -39
  559. package/lib/projects/__tests__/AppDevModeInterface.test.d.ts +0 -1
  560. package/lib/projects/__tests__/AppDevModeInterface.test.js +0 -541
  561. package/lib/projects/__tests__/DevServerManager.test.d.ts +0 -1
  562. package/lib/projects/__tests__/DevServerManager.test.js +0 -185
  563. package/lib/projects/__tests__/DevSessionManager.test.d.ts +0 -1
  564. package/lib/projects/__tests__/DevSessionManager.test.js +0 -250
  565. package/lib/projects/__tests__/LocalDevProcess.test.d.ts +0 -1
  566. package/lib/projects/__tests__/LocalDevProcess.test.js +0 -481
  567. package/lib/projects/__tests__/LocalDevWebsocketServer.test.d.ts +0 -1
  568. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +0 -231
  569. package/lib/projects/__tests__/ProjectLogsManager.test.d.ts +0 -1
  570. package/lib/projects/__tests__/ProjectLogsManager.test.js +0 -302
  571. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +0 -1
  572. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +0 -160
  573. package/lib/projects/__tests__/components.test.d.ts +0 -1
  574. package/lib/projects/__tests__/components.test.js +0 -426
  575. package/lib/projects/__tests__/deploy.test.d.ts +0 -1
  576. package/lib/projects/__tests__/deploy.test.js +0 -231
  577. package/lib/projects/__tests__/localDevProjectHelpers.test.d.ts +0 -1
  578. package/lib/projects/__tests__/localDevProjectHelpers.test.js +0 -120
  579. package/lib/projects/__tests__/platformVersion.test.d.ts +0 -1
  580. package/lib/projects/__tests__/platformVersion.test.js +0 -63
  581. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.d.ts +0 -1
  582. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.js +0 -328
  583. package/lib/projects/__tests__/projectProfiles.test.d.ts +0 -1
  584. package/lib/projects/__tests__/projectProfiles.test.js +0 -441
  585. package/lib/projects/__tests__/projects.test.d.ts +0 -1
  586. package/lib/projects/__tests__/projects.test.js +0 -58
  587. package/lib/projects/__tests__/structure.test.d.ts +0 -1
  588. package/lib/projects/__tests__/structure.test.js +0 -210
  589. package/lib/projects/__tests__/uieLinting.test.d.ts +0 -1
  590. package/lib/projects/__tests__/uieLinting.test.js +0 -631
  591. package/lib/projects/__tests__/upload.test.d.ts +0 -1
  592. package/lib/projects/__tests__/upload.test.js +0 -183
  593. package/lib/projects/add/__tests__/legacyAddComponent.test.d.ts +0 -1
  594. package/lib/projects/add/__tests__/legacyAddComponent.test.js +0 -245
  595. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +0 -1
  596. package/lib/projects/add/__tests__/v2AddComponent.test.js +0 -343
  597. package/lib/projects/create/__tests__/legacy.test.d.ts +0 -1
  598. package/lib/projects/create/__tests__/legacy.test.js +0 -90
  599. package/lib/projects/create/__tests__/v2.test.d.ts +0 -1
  600. package/lib/projects/create/__tests__/v2.test.js +0 -257
  601. package/lib/projects/platformVersion.d.ts +0 -9
  602. package/lib/projects/platformVersion.js +0 -39
  603. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.d.ts +0 -1
  604. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +0 -157
  605. package/lib/prompts/__tests__/createFunctionPrompt.test.d.ts +0 -1
  606. package/lib/prompts/__tests__/createFunctionPrompt.test.js +0 -129
  607. package/lib/prompts/__tests__/createModulePrompt.test.d.ts +0 -1
  608. package/lib/prompts/__tests__/createModulePrompt.test.js +0 -187
  609. package/lib/prompts/__tests__/createTemplatePrompt.test.d.ts +0 -1
  610. package/lib/prompts/__tests__/createTemplatePrompt.test.js +0 -102
  611. package/lib/prompts/__tests__/downloadProjectPrompt.test.d.ts +0 -1
  612. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +0 -31
  613. package/lib/prompts/__tests__/projectAddPrompt.test.d.ts +0 -1
  614. package/lib/prompts/__tests__/projectAddPrompt.test.js +0 -143
  615. package/lib/prompts/__tests__/projectsLogsPrompt.test.d.ts +0 -1
  616. package/lib/prompts/__tests__/projectsLogsPrompt.test.js +0 -37
  617. package/lib/prompts/__tests__/selectProjectTemplatePrompt.test.d.ts +0 -1
  618. package/lib/prompts/__tests__/selectProjectTemplatePrompt.test.js +0 -160
  619. package/lib/sandboxSync.d.ts +0 -4
  620. package/lib/sandboxSync.js +0 -102
  621. package/lib/theme/__tests__/migrate.test.d.ts +0 -1
  622. package/lib/theme/__tests__/migrate.test.js +0 -256
  623. package/lib/ui/__tests__/SpinniesManager.test.d.ts +0 -1
  624. package/lib/ui/__tests__/SpinniesManager.test.js +0 -488
  625. package/lib/ui/__tests__/removeAnsiCodes.test.d.ts +0 -1
  626. package/lib/ui/__tests__/removeAnsiCodes.test.js +0 -84
  627. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.d.ts +0 -1
  628. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +0 -255
  629. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.d.ts +0 -1
  630. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.js +0 -228
  631. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.d.ts +0 -1
  632. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.js +0 -209
  633. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.d.ts +0 -1
  634. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.js +0 -187
  635. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.d.ts +0 -1
  636. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.js +0 -125
  637. package/mcp-server/tools/cms/__tests__/HsListTool.test.d.ts +0 -1
  638. package/mcp-server/tools/cms/__tests__/HsListTool.test.js +0 -125
  639. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.d.ts +0 -1
  640. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.js +0 -158
  641. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.d.ts +0 -1
  642. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +0 -133
  643. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.d.ts +0 -1
  644. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +0 -462
  645. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.d.ts +0 -1
  646. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.js +0 -126
  647. package/mcp-server/tools/project/__tests__/DocFetchTool.test.d.ts +0 -1
  648. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +0 -125
  649. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.d.ts +0 -1
  650. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +0 -210
  651. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +0 -1
  652. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +0 -178
  653. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +0 -1
  654. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +0 -124
  655. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.d.ts +0 -1
  656. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +0 -307
  657. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +0 -1
  658. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +0 -242
  659. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.d.ts +0 -1
  660. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +0 -209
  661. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.d.ts +0 -1
  662. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +0 -158
  663. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.d.ts +0 -1
  664. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +0 -179
  665. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.d.ts +0 -1
  666. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +0 -118
  667. package/mcp-server/utils/__tests__/command.test.d.ts +0 -1
  668. package/mcp-server/utils/__tests__/command.test.js +0 -45
  669. package/mcp-server/utils/__tests__/content.test.d.ts +0 -1
  670. package/mcp-server/utils/__tests__/content.test.js +0 -164
  671. package/mcp-server/utils/__tests__/feedbackTracking.test.d.ts +0 -1
  672. package/mcp-server/utils/__tests__/feedbackTracking.test.js +0 -124
  673. package/mcp-server/utils/__tests__/project.test.d.ts +0 -1
  674. package/mcp-server/utils/__tests__/project.test.js +0 -140
  675. package/mcp-server/utils/project.d.ts +0 -5
  676. package/mcp-server/utils/project.js +0 -18
@@ -0,0 +1,350 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import crypto from 'crypto';
4
+ import { shouldIgnoreFile } from '@hubspot/local-dev-lib/ignoreRules';
5
+ import { getPackableFiles, } from '@hubspot/project-parsing-lib/workspaces';
6
+ import { uiLogger } from '../ui/logger.js';
7
+ import { lib } from '../../lang/en.js';
8
+ /**
9
+ * Generates a short hash of the input string for use in workspace paths.
10
+ * Uses SHA256 truncated to 8 hex characters (4 billion possibilities).
11
+ */
12
+ export function shortHash(input) {
13
+ return crypto.createHash('sha256').update(input).digest('hex').slice(0, 8);
14
+ }
15
+ /**
16
+ * Determines the archive path for an external workspace or file: dependency.
17
+ * Produces `_workspaces/<basename>-<hash>` with no subdirectory.
18
+ * The hash prevents collisions between different directories with the same basename.
19
+ */
20
+ export function computeExternalArchivePath(absolutePath) {
21
+ const resolved = path.resolve(absolutePath);
22
+ const name = path.basename(resolved);
23
+ return path.join('_workspaces', `${name}-${shortHash(resolved)}`);
24
+ }
25
+ /**
26
+ * Returns true if dir is inside srcDir (i.e. it will already be included
27
+ * in the archive from the srcDir walk and must not be copied again).
28
+ */
29
+ function isInsideSrcDir(dir, srcDir) {
30
+ const rel = path.relative(path.resolve(srcDir), path.resolve(dir));
31
+ return !rel.startsWith('..') && !path.isAbsolute(rel);
32
+ }
33
+ /**
34
+ * Creates a file filter function for workspace archiving.
35
+ * Filters files based on packable files list and ignore rules.
36
+ */
37
+ function createWorkspaceFileFilter(packableFiles) {
38
+ return (file) => {
39
+ if (packableFiles.size > 0 && !packableFiles.has(file.name)) {
40
+ uiLogger.debug(lib.projectUpload.handleProjectUpload.fileFiltered(file.name));
41
+ return false;
42
+ }
43
+ const ignored = shouldIgnoreFile(file.name, true);
44
+ if (ignored) {
45
+ uiLogger.debug(lib.projectUpload.handleProjectUpload.fileFiltered(file.name));
46
+ return false;
47
+ }
48
+ return file;
49
+ };
50
+ }
51
+ /**
52
+ * Archives workspace directories and returns mapping information.
53
+ *
54
+ * Internal workspaces (inside srcDir) are not archived — they are already
55
+ * included via the srcDir walk. Their relative paths (from the package.json
56
+ * directory to the workspace directory) are stored directly in the entries.
57
+ *
58
+ * External workspaces (outside srcDir) are copied to `_workspaces/<name>-<hash>`
59
+ * and their relative archive paths (e.g. `../_workspaces/<name>-<hash>`) are stored.
60
+ */
61
+ async function archiveWorkspaceDirectories(archive, srcDir, workspaceMappings) {
62
+ const externalArchivePaths = new Map(); // resolvedDir -> archivePath
63
+ const archivePathToDir = new Map(); // archivePath -> resolvedDir (collision detection)
64
+ const packageWorkspaceEntries = new Map();
65
+ const externalsToArchive = [];
66
+ for (const mapping of workspaceMappings) {
67
+ const { workspaceDir, sourcePackageJsonPath } = mapping;
68
+ if (!packageWorkspaceEntries.has(sourcePackageJsonPath)) {
69
+ packageWorkspaceEntries.set(sourcePackageJsonPath, []);
70
+ }
71
+ if (isInsideSrcDir(workspaceDir, srcDir)) {
72
+ // Internal: already in archive from srcDir walk.
73
+ // Store the relative path from the package.json directory so npm can resolve it.
74
+ const relPath = path.relative(path.dirname(sourcePackageJsonPath), path.resolve(workspaceDir));
75
+ packageWorkspaceEntries.get(sourcePackageJsonPath).push(relPath);
76
+ }
77
+ else {
78
+ // External: archive to _workspaces/<name>-<hash>.
79
+ const archivePath = computeExternalArchivePath(workspaceDir);
80
+ const resolvedDir = path.resolve(workspaceDir);
81
+ // Detect hash collisions (different dirs mapping to the same archive path)
82
+ const existing = archivePathToDir.get(archivePath);
83
+ if (existing && existing !== resolvedDir) {
84
+ throw new Error(lib.projectUpload.handleProjectUpload.workspaceCollision(archivePath, workspaceDir, existing));
85
+ }
86
+ if (!externalArchivePaths.has(resolvedDir)) {
87
+ externalArchivePaths.set(resolvedDir, archivePath);
88
+ archivePathToDir.set(archivePath, resolvedDir);
89
+ externalsToArchive.push({ dir: workspaceDir, archivePath });
90
+ }
91
+ const relPkgJsonDir = path.relative(srcDir, path.dirname(sourcePackageJsonPath));
92
+ const relativeEntry = path.relative(relPkgJsonDir, archivePath);
93
+ packageWorkspaceEntries.get(sourcePackageJsonPath).push(relativeEntry);
94
+ }
95
+ }
96
+ // Fetch packable files in parallel (I/O optimization)
97
+ const withPackableFiles = await Promise.all(externalsToArchive.map(async (item) => ({
98
+ ...item,
99
+ packableFiles: await getPackableFiles(item.dir),
100
+ })));
101
+ // Archive directories sequentially (archiver requires sequential operations)
102
+ for (const { dir, archivePath, packableFiles } of withPackableFiles) {
103
+ uiLogger.log(lib.projectUpload.handleProjectUpload.workspaceIncluded(dir, archivePath));
104
+ archive.directory(dir, archivePath, createWorkspaceFileFilter(packableFiles));
105
+ }
106
+ return { externalArchivePaths, packageWorkspaceEntries };
107
+ }
108
+ /**
109
+ * Archives file: dependencies and returns mapping information.
110
+ *
111
+ * Internal file: dependencies (inside srcDir) are skipped — their original
112
+ * `file:` references in package.json remain valid after upload.
113
+ *
114
+ * External file: dependencies are archived to `_workspaces/<name>-<hash>`
115
+ * and tracked in the returned map so package.json can be rewritten.
116
+ */
117
+ async function archiveFileDependencies(archive, srcDir, fileDependencyMappings, externalArchivePaths) {
118
+ const packageFileDeps = new Map();
119
+ const toArchive = [];
120
+ for (const mapping of fileDependencyMappings) {
121
+ const { packageName, localPath, sourcePackageJsonPath } = mapping;
122
+ if (isInsideSrcDir(localPath, srcDir)) {
123
+ // Internal: original file: reference stays unchanged, nothing to do
124
+ continue;
125
+ }
126
+ // External: archive to _workspaces/<name>-<hash>
127
+ const archivePath = computeExternalArchivePath(localPath);
128
+ const resolvedPath = path.resolve(localPath);
129
+ if (!packageFileDeps.has(sourcePackageJsonPath)) {
130
+ packageFileDeps.set(sourcePackageJsonPath, new Map());
131
+ }
132
+ const relPkgJsonDir = path.relative(srcDir, path.dirname(sourcePackageJsonPath));
133
+ const relativeArchivePath = path.relative(relPkgJsonDir, archivePath);
134
+ packageFileDeps
135
+ .get(sourcePackageJsonPath)
136
+ .set(packageName, relativeArchivePath);
137
+ // Only archive each unique path once
138
+ if (!externalArchivePaths.has(resolvedPath)) {
139
+ externalArchivePaths.set(resolvedPath, archivePath);
140
+ toArchive.push({ localPath, archivePath, packageName });
141
+ }
142
+ }
143
+ // Fetch packable files in parallel (I/O optimization)
144
+ const withPackableFiles = await Promise.all(toArchive.map(async (item) => ({
145
+ ...item,
146
+ packableFiles: await getPackableFiles(item.localPath),
147
+ })));
148
+ // Archive directories sequentially (archiver requires sequential operations)
149
+ for (const { localPath, archivePath, packageName, packableFiles, } of withPackableFiles) {
150
+ uiLogger.log(lib.projectUpload.handleProjectUpload.fileDependencyIncluded(packageName, localPath, archivePath));
151
+ archive.directory(localPath, archivePath, createWorkspaceFileFilter(packableFiles));
152
+ }
153
+ return packageFileDeps;
154
+ }
155
+ /**
156
+ * Updates package.json files in the archive to reflect new workspace and file: dependency paths.
157
+ *
158
+ * Workspace entries in packageWorkspaces are already in final form:
159
+ * - Internal workspaces: relative paths (e.g. "../packages/utils")
160
+ * - External workspaces: relative paths (e.g. "../_workspaces/logger-abc")
161
+ *
162
+ * Only external file: dependencies appear in packageFileDeps; internal ones
163
+ * keep their original file: references and are left untouched.
164
+ */
165
+ export async function updatePackageJsonInArchive(archive, srcDir, packageWorkspaces, packageFileDeps) {
166
+ // Collect all package.json paths that need updating
167
+ const allPackageJsonPaths = new Set([
168
+ ...packageWorkspaces.keys(),
169
+ ...packageFileDeps.keys(),
170
+ ]);
171
+ for (const packageJsonPath of allPackageJsonPaths) {
172
+ if (!fs.existsSync(packageJsonPath)) {
173
+ continue;
174
+ }
175
+ const relativePackageJsonPath = path.relative(srcDir, packageJsonPath);
176
+ let rawContent;
177
+ try {
178
+ rawContent = fs.readFileSync(packageJsonPath, 'utf8');
179
+ }
180
+ catch {
181
+ continue;
182
+ }
183
+ let packageJson;
184
+ try {
185
+ packageJson = JSON.parse(rawContent);
186
+ }
187
+ catch (e) {
188
+ uiLogger.warn(lib.projectUpload.handleProjectUpload.malformedPackageJson(packageJsonPath, e instanceof Error ? e.message : String(e)));
189
+ archive.append(rawContent, { name: relativePackageJsonPath });
190
+ continue;
191
+ }
192
+ let modified = false;
193
+ // Update workspaces field — entries are already in their final form
194
+ const workspaceEntries = packageWorkspaces.get(packageJsonPath);
195
+ if (workspaceEntries && packageJson.workspaces) {
196
+ packageJson.workspaces = workspaceEntries;
197
+ modified = true;
198
+ uiLogger.debug(lib.projectUpload.handleProjectUpload.updatingPackageJsonWorkspaces(relativePackageJsonPath));
199
+ uiLogger.debug(lib.projectUpload.handleProjectUpload.updatedWorkspaces(workspaceEntries.join(', ')));
200
+ }
201
+ // Update external file: dependencies; internal ones are left untouched
202
+ const fileDeps = packageFileDeps.get(packageJsonPath);
203
+ if (fileDeps && fileDeps.size > 0 && packageJson.dependencies) {
204
+ for (const [packageName, archivePath] of fileDeps.entries()) {
205
+ if (packageJson.dependencies[packageName]?.startsWith('file:')) {
206
+ packageJson.dependencies[packageName] = `file:${archivePath}`;
207
+ modified = true;
208
+ uiLogger.debug(lib.projectUpload.handleProjectUpload.updatedFileDependency(packageName, archivePath));
209
+ }
210
+ }
211
+ }
212
+ archive.append(modified ? JSON.stringify(packageJson, null, 2) : rawContent, { name: relativePackageJsonPath });
213
+ }
214
+ // Ensure all append operations are queued before finalize is called
215
+ // Use setImmediate to yield control and let archiver process the queue
216
+ await new Promise(resolve => setImmediate(resolve));
217
+ }
218
+ export function rewriteLockfileForExternalDeps(lockfileContent, pathMappings) {
219
+ if (pathMappings.length === 0) {
220
+ return lockfileContent;
221
+ }
222
+ const packages = lockfileContent.packages;
223
+ if (!packages) {
224
+ return lockfileContent;
225
+ }
226
+ const newPackages = {};
227
+ for (const [key, value] of Object.entries(packages)) {
228
+ const mapping = pathMappings.find(m => m.oldPath === key);
229
+ newPackages[mapping ? mapping.newPath : key] = value;
230
+ }
231
+ for (const [key, value] of Object.entries(newPackages)) {
232
+ if (key.startsWith('node_modules/') &&
233
+ typeof value === 'object' &&
234
+ value !== null) {
235
+ const entry = value;
236
+ if (entry.link === true && typeof entry.resolved === 'string') {
237
+ const mapping = pathMappings.find(m => m.oldPath === entry.resolved);
238
+ if (mapping) {
239
+ newPackages[key] = { ...entry, resolved: mapping.newPath };
240
+ }
241
+ }
242
+ }
243
+ }
244
+ const rootEntry = newPackages[''];
245
+ if (rootEntry && typeof rootEntry === 'object' && rootEntry !== null) {
246
+ const root = rootEntry;
247
+ if (Array.isArray(root.workspaces)) {
248
+ newPackages[''] = {
249
+ ...root,
250
+ workspaces: root.workspaces.map((ws) => {
251
+ if (typeof ws !== 'string')
252
+ return ws;
253
+ const mapping = pathMappings.find(m => m.oldPath === ws);
254
+ return mapping ? mapping.newPath : ws;
255
+ }),
256
+ };
257
+ }
258
+ }
259
+ return { ...lockfileContent, packages: newPackages };
260
+ }
261
+ export function getPackageJsonPathsToUpdate(srcDir, workspaceMappings, fileDependencyMappings) {
262
+ const paths = new Set();
263
+ for (const { sourcePackageJsonPath } of workspaceMappings) {
264
+ paths.add(path.relative(srcDir, sourcePackageJsonPath));
265
+ }
266
+ for (const { localPath, sourcePackageJsonPath } of fileDependencyMappings) {
267
+ if (!isInsideSrcDir(localPath, srcDir)) {
268
+ paths.add(path.relative(srcDir, sourcePackageJsonPath));
269
+ }
270
+ }
271
+ return paths;
272
+ }
273
+ function getDirsWithExternalDeps(srcDir, workspaceMappings, fileDependencyMappings) {
274
+ const dirs = new Set();
275
+ for (const { workspaceDir, sourcePackageJsonPath } of workspaceMappings) {
276
+ if (!isInsideSrcDir(workspaceDir, srcDir)) {
277
+ dirs.add(path.dirname(sourcePackageJsonPath));
278
+ }
279
+ }
280
+ for (const { localPath, sourcePackageJsonPath } of fileDependencyMappings) {
281
+ if (!isInsideSrcDir(localPath, srcDir)) {
282
+ dirs.add(path.dirname(sourcePackageJsonPath));
283
+ }
284
+ }
285
+ return dirs;
286
+ }
287
+ export function getLockfilePathsToUpdate(srcDir, workspaceMappings, fileDependencyMappings) {
288
+ const dirsWithExternalDeps = getDirsWithExternalDeps(srcDir, workspaceMappings, fileDependencyMappings);
289
+ const paths = new Set();
290
+ for (const dir of dirsWithExternalDeps) {
291
+ const lockfilePath = path.join(dir, 'package-lock.json');
292
+ if (fs.existsSync(lockfilePath)) {
293
+ paths.add(path.relative(srcDir, lockfilePath));
294
+ }
295
+ }
296
+ return paths;
297
+ }
298
+ async function rewriteLockfilesInArchive(archive, srcDir, externalArchivePaths, dirsWithExternalDeps) {
299
+ if (externalArchivePaths.size === 0)
300
+ return;
301
+ for (const dir of dirsWithExternalDeps) {
302
+ const lockfilePath = path.join(dir, 'package-lock.json');
303
+ if (!fs.existsSync(lockfilePath))
304
+ continue;
305
+ let rawContent;
306
+ try {
307
+ rawContent = fs.readFileSync(lockfilePath, 'utf8');
308
+ }
309
+ catch {
310
+ continue;
311
+ }
312
+ let lockfileContent;
313
+ try {
314
+ lockfileContent = JSON.parse(rawContent);
315
+ }
316
+ catch {
317
+ continue;
318
+ }
319
+ const pathMappings = [];
320
+ for (const [absoluteExternalPath, archivePath] of externalArchivePaths) {
321
+ pathMappings.push({
322
+ oldPath: path.relative(dir, absoluteExternalPath),
323
+ newPath: path.relative(dir, path.join(srcDir, archivePath)),
324
+ });
325
+ }
326
+ const rewritten = rewriteLockfileForExternalDeps(lockfileContent, pathMappings);
327
+ const relativeLockfilePath = path.relative(srcDir, lockfilePath);
328
+ uiLogger.debug(lib.projectUpload.handleProjectUpload.updatingLockfile(relativeLockfilePath));
329
+ archive.append(JSON.stringify(rewritten, null, 2), {
330
+ name: relativeLockfilePath,
331
+ });
332
+ }
333
+ await new Promise(resolve => setImmediate(resolve));
334
+ }
335
+ /**
336
+ * Main orchestration function that handles archiving of workspaces and file dependencies.
337
+ * This is the clean integration point for upload.ts.
338
+ */
339
+ export async function archiveWorkspacesAndDependencies(archive, srcDir, projectDir, workspaceMappings, fileDependencyMappings) {
340
+ // Archive workspace directories (internal ones are skipped, externals are copied)
341
+ const { externalArchivePaths, packageWorkspaceEntries } = await archiveWorkspaceDirectories(archive, srcDir, workspaceMappings);
342
+ // Archive external file: dependencies (internals are skipped)
343
+ const packageFileDeps = await archiveFileDependencies(archive, srcDir, fileDependencyMappings, externalArchivePaths);
344
+ // Update package.json files with new paths
345
+ await updatePackageJsonInArchive(archive, srcDir, packageWorkspaceEntries, packageFileDeps);
346
+ // Rewrite lock files to point to archive paths for external deps
347
+ const dirsWithExternalDeps = getDirsWithExternalDeps(srcDir, workspaceMappings, fileDependencyMappings);
348
+ await rewriteLockfilesInArchive(archive, srcDir, externalArchivePaths, dirsWithExternalDeps);
349
+ return { packageWorkspaces: packageWorkspaceEntries, packageFileDeps };
350
+ }
@@ -1,5 +1,6 @@
1
1
  import { promptUser } from './promptUtils.js';
2
2
  import { lib } from '../../lang/en.js';
3
+ import { isPromptExitError } from '../errors/PromptExitError.js';
3
4
  function getSampleTypesPrompt(choices) {
4
5
  return {
5
6
  type: 'rawlist',
@@ -53,6 +54,9 @@ export async function createApiSamplePrompt(samplesConfig) {
53
54
  };
54
55
  }
55
56
  catch (e) {
57
+ if (isPromptExitError(e)) {
58
+ throw e;
59
+ }
56
60
  return {};
57
61
  }
58
62
  }
@@ -2,21 +2,22 @@ import { promptUser } from './promptUtils.js';
2
2
  import { getConfigAccountIfExists } from '@hubspot/local-dev-lib/config';
3
3
  import { fetchProjects } from '@hubspot/local-dev-lib/api/projects';
4
4
  import { logError, ApiErrorContext } from '../errorHandlers/index.js';
5
- import { uiLogger } from '../ui/logger.js';
6
- import { EXIT_CODES } from '../enums/exitCodes.js';
7
5
  import { lib } from '../../lang/en.js';
6
+ import { PromptExitError } from '../errors/PromptExitError.js';
7
+ import { EXIT_CODES } from '../enums/exitCodes.js';
8
+ import { uiLogger } from '../ui/logger.js';
8
9
  async function createProjectsList(accountId) {
9
- try {
10
- if (accountId) {
11
- const { data: projects } = await fetchProjects(accountId);
12
- return projects.results;
13
- }
10
+ if (!accountId) {
14
11
  uiLogger.error(lib.prompts.downloadProjectPrompt.errors.accountIdRequired);
15
- process.exit(EXIT_CODES.ERROR);
12
+ throw new PromptExitError(lib.prompts.downloadProjectPrompt.errors.accountIdRequired, EXIT_CODES.ERROR);
13
+ }
14
+ try {
15
+ const { data: projects } = await fetchProjects(accountId);
16
+ return projects.results;
16
17
  }
17
18
  catch (e) {
18
- logError(e, accountId ? new ApiErrorContext({ accountId }) : undefined);
19
- process.exit(EXIT_CODES.ERROR);
19
+ logError(e, new ApiErrorContext({ accountId }));
20
+ throw new PromptExitError('Failed to fetch projects', EXIT_CODES.ERROR);
20
21
  }
21
22
  }
22
23
  export async function downloadProjectPrompt(promptOptions) {
@@ -1,8 +1,9 @@
1
1
  import open from 'open';
2
2
  import { promptUser } from './promptUtils.js';
3
- import { EXIT_CODES } from '../enums/exitCodes.js';
4
3
  import { lib } from '../../lang/en.js';
5
4
  import { uiLogger } from '../ui/logger.js';
5
+ import { PromptExitError } from '../errors/PromptExitError.js';
6
+ import { EXIT_CODES } from '../enums/exitCodes.js';
6
7
  export async function installAppBrowserPrompt(installUrl, isReinstall = false) {
7
8
  uiLogger.log('');
8
9
  if (isReinstall) {
@@ -20,7 +21,7 @@ export async function installAppBrowserPrompt(installUrl, isReinstall = false) {
20
21
  });
21
22
  if (!isReinstall && !shouldOpenBrowser) {
22
23
  uiLogger.log(lib.prompts.installAppPrompt.decline);
23
- process.exit(EXIT_CODES.SUCCESS);
24
+ throw new PromptExitError(lib.prompts.installAppPrompt.decline, EXIT_CODES.SUCCESS);
24
25
  }
25
26
  else if (!shouldOpenBrowser) {
26
27
  return;
@@ -6,8 +6,9 @@ import { uiLogger } from '../ui/logger.js';
6
6
  import { promptUser } from './promptUtils.js';
7
7
  import { getCliAccountNamePromptConfig, } from './accountNamePrompt.js';
8
8
  import { uiInfoSection } from '../ui/index.js';
9
- import { EXIT_CODES } from '../enums/exitCodes.js';
10
9
  import { lib } from '../../lang/en.js';
10
+ import { PromptExitError } from '../errors/PromptExitError.js';
11
+ import { EXIT_CODES } from '../enums/exitCodes.js';
11
12
  /**
12
13
  * Displays notification to user that we are about to open the browser,
13
14
  * then opens their browser to the personal-access-key shortlink
@@ -27,7 +28,7 @@ export async function personalAccessKeyPrompt({ env, account, }) {
27
28
  ]);
28
29
  if (!choice) {
29
30
  deleteConfigFileIfEmpty();
30
- process.exit(EXIT_CODES.SUCCESS);
31
+ throw new PromptExitError(lib.prompts.personalAccessKeyPrompt.errors.authCancelled, EXIT_CODES.SUCCESS);
31
32
  }
32
33
  if (choice ===
33
34
  lib.prompts.personalAccessKeyPrompt.personalAccessKeyPromptChoices
@@ -10,3 +10,4 @@ export declare function selectSandboxTargetAccountPrompt(accounts: HubSpotConfig
10
10
  export declare function selectDeveloperTestTargetAccountPrompt(accounts: HubSpotConfigAccount[], defaultAccountConfig: HubSpotConfigAccount): Promise<ProjectDevTargetAccountPromptResponse>;
11
11
  export declare function confirmDefaultAccountPrompt(accountName: string, accountType: string): Promise<boolean>;
12
12
  export declare function confirmUseExistingDeveloperTestAccountPrompt(account: DeveloperTestAccount): Promise<boolean>;
13
+ export declare function confirmLinkExistingDeveloperTestAccountPrompt(accountName: string): Promise<boolean>;
@@ -6,6 +6,7 @@ import { lib } from '../../lang/en.js';
6
6
  import { uiLogger } from '../ui/logger.js';
7
7
  import { uiAccountDescription } from '../ui/index.js';
8
8
  import { isSandbox } from '../accountTypes.js';
9
+ import { PromptExitError } from '../errors/PromptExitError.js';
9
10
  import { EXIT_CODES } from '../enums/exitCodes.js';
10
11
  function mapNestedAccount(accountConfig) {
11
12
  const parentAccountId = accountConfig.parentAccountId ?? null;
@@ -23,20 +24,18 @@ function getNonConfigDeveloperTestAccountName(account) {
23
24
  }
24
25
  export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountConfig) {
25
26
  const defaultAccountId = defaultAccountConfig.accountId;
27
+ if (!defaultAccountId) {
28
+ uiLogger.error(lib.prompts.projectDevTargetAccountPrompt.noAccountId);
29
+ throw new PromptExitError(lib.prompts.projectDevTargetAccountPrompt.noAccountId, EXIT_CODES.ERROR);
30
+ }
26
31
  let choices = [];
27
32
  let sandboxUsage = {
28
33
  STANDARD: { used: 0, available: 0, limit: 0 },
29
34
  DEVELOPER: { used: 0, available: 0, limit: 0 },
30
35
  };
31
36
  try {
32
- if (defaultAccountId) {
33
- const { data } = await getSandboxUsageLimits(defaultAccountId);
34
- sandboxUsage = data.usage;
35
- }
36
- else {
37
- uiLogger.error(lib.prompts.projectDevTargetAccountPrompt.noAccountId);
38
- process.exit(EXIT_CODES.ERROR);
39
- }
37
+ const { data } = await getSandboxUsageLimits(defaultAccountId);
38
+ sandboxUsage = data.usage;
40
39
  }
41
40
  catch (err) {
42
41
  uiLogger.debug('Unable to fetch sandbox usage limits: ', err);
@@ -83,16 +82,14 @@ export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountC
83
82
  }
84
83
  export async function selectDeveloperTestTargetAccountPrompt(accounts, defaultAccountConfig) {
85
84
  const defaultAccountId = defaultAccountConfig.accountId;
85
+ if (!defaultAccountId) {
86
+ uiLogger.error(lib.prompts.projectDevTargetAccountPrompt.noAccountId);
87
+ throw new PromptExitError(lib.prompts.projectDevTargetAccountPrompt.noAccountId, EXIT_CODES.ERROR);
88
+ }
86
89
  let devTestAccountsResponse;
87
90
  try {
88
- if (defaultAccountId) {
89
- const { data } = await fetchDeveloperTestAccounts(defaultAccountId);
90
- devTestAccountsResponse = data;
91
- }
92
- else {
93
- uiLogger.error(lib.prompts.projectDevTargetAccountPrompt.noAccountId);
94
- process.exit(EXIT_CODES.ERROR);
95
- }
91
+ const { data } = await fetchDeveloperTestAccounts(defaultAccountId);
92
+ devTestAccountsResponse = data;
96
93
  }
97
94
  catch (err) {
98
95
  uiLogger.debug('Unable to fetch developer test account usage limits: ', err);
@@ -167,3 +164,13 @@ export async function confirmUseExistingDeveloperTestAccountPrompt(account) {
167
164
  ]);
168
165
  return confirmUseExistingDeveloperTestAccount;
169
166
  }
167
+ export async function confirmLinkExistingDeveloperTestAccountPrompt(accountName) {
168
+ const { confirmLinkExistingDeveloperTestAccount } = await promptUser([
169
+ {
170
+ name: 'confirmLinkExistingDeveloperTestAccount',
171
+ type: 'confirm',
172
+ message: lib.prompts.projectDevTargetAccountPrompt.confirmLinkExistingDeveloperTestAccount(accountName),
173
+ },
174
+ ]);
175
+ return confirmLinkExistingDeveloperTestAccount;
176
+ }
@@ -0,0 +1,2 @@
1
+ import { ProjectConfig } from '../../types/Projects.js';
2
+ export declare function projectProfilePrompt(projectDir: string, projectConfig: ProjectConfig, profileName?: string, exitIfMissing?: boolean): Promise<string | null>;
@@ -0,0 +1,46 @@
1
+ import path from 'path';
2
+ import { getAllHsProfiles } from '@hubspot/project-parsing-lib/profiles';
3
+ import { listPrompt } from './promptUtils.js';
4
+ import { loadProfile } from '../projects/projectProfiles.js';
5
+ import { lib } from '../../lang/en.js';
6
+ function generateProfilePromptOption(projectDir, projectConfig, profileName) {
7
+ const choice = {
8
+ name: profileName,
9
+ value: profileName,
10
+ };
11
+ try {
12
+ const profile = loadProfile(projectConfig, projectDir, profileName);
13
+ choice.name = `${profileName} [${profile.accountId}]`;
14
+ }
15
+ catch (e) {
16
+ choice.name = `${profileName} [Invalid profile]`;
17
+ choice.disabled = true;
18
+ }
19
+ return choice;
20
+ }
21
+ export async function projectProfilePrompt(projectDir, projectConfig, profileName, exitIfMissing) {
22
+ if (profileName) {
23
+ return profileName;
24
+ }
25
+ const existingProfiles = await getAllHsProfiles(path.join(projectDir, projectConfig.srcDir));
26
+ if (existingProfiles.length !== 0) {
27
+ if (existingProfiles.length === 1) {
28
+ return existingProfiles[0];
29
+ }
30
+ // In automated workflows exit instead of prompting
31
+ if (exitIfMissing) {
32
+ throw new Error(lib.prompts.projectProfilePrompt.exitMessage);
33
+ }
34
+ const listOptions = existingProfiles.map(p => generateProfilePromptOption(projectDir, projectConfig, p));
35
+ const hasAnyValidProfiles = listOptions.some(option => typeof option === 'object' && 'name' in option && !option.disabled);
36
+ // Exit early if the user has no valid profiles for us to show in the prompt
37
+ if (!hasAnyValidProfiles) {
38
+ throw new Error(lib.prompts.projectProfilePrompt.noValidProfilesMessage);
39
+ }
40
+ const profileNameFromPrompt = await listPrompt(lib.prompts.projectProfilePrompt.message, {
41
+ choices: listOptions,
42
+ });
43
+ return profileNameFromPrompt;
44
+ }
45
+ return null;
46
+ }
@@ -4,6 +4,9 @@ export async function projectLogsPrompt({ functionChoices, promptOptions, projec
4
4
  if (!functionChoices) {
5
5
  return {};
6
6
  }
7
+ if (promptOptions?.function) {
8
+ return { functionName: promptOptions.function };
9
+ }
7
10
  if (functionChoices.length === 1) {
8
11
  return { functionName: functionChoices[0] };
9
12
  }
@@ -3,6 +3,7 @@ import { EXIT_CODES } from '../enums/exitCodes.js';
3
3
  import chalk from 'chalk';
4
4
  import { lib } from '../../lang/en.js';
5
5
  import { uiLogger } from '../ui/logger.js';
6
+ import { PromptExitError } from '../errors/PromptExitError.js';
6
7
  export const Separator = new _Separator();
7
8
  export const PROMPT_THEME = { prefix: { idle: chalk.green('?') } };
8
9
  export const CHECKBOX_PROMPT_THEME = {
@@ -19,14 +20,14 @@ function isNoSelectableChoicesError(error) {
19
20
  }
20
21
  function handlePromptError(config, error) {
21
22
  if (isUserCancellationError(error)) {
22
- process.exit(EXIT_CODES.SUCCESS);
23
+ throw new PromptExitError(lib.prompts.promptUtils.errors.userCancelled, EXIT_CODES.SUCCESS);
23
24
  }
24
25
  if (isNoSelectableChoicesError(error)) {
25
26
  if (!Array.isArray(config)) {
26
27
  uiLogger.log(config.message);
27
28
  }
28
29
  uiLogger.error(lib.prompts.promptUtils.errors.noSelectableChoices);
29
- process.exit(EXIT_CODES.ERROR);
30
+ throw new PromptExitError(lib.prompts.promptUtils.errors.noSelectableChoices, EXIT_CODES.ERROR);
30
31
  }
31
32
  throw error;
32
33
  }
@@ -41,6 +42,7 @@ function mapPromptChoicesToChoices(choices) {
41
42
  return {
42
43
  value: choice.value,
43
44
  name: choice.name,
45
+ short: choice.short,
44
46
  disabled: choice.disabled,
45
47
  checked: choice.checked,
46
48
  };
@@ -4,25 +4,29 @@ import { lib } from '../../lang/en.js';
4
4
  import { debugError } from '../errorHandlers/index.js';
5
5
  import { uiLogger } from '../ui/logger.js';
6
6
  import { fetchTables } from '@hubspot/local-dev-lib/api/hubdb';
7
- import { EXIT_CODES } from '../enums/exitCodes.js';
8
7
  import { isValidPath, untildify } from '@hubspot/local-dev-lib/path';
8
+ import { isPromptExitError, PromptExitError, } from '../errors/PromptExitError.js';
9
+ import { EXIT_CODES } from '../enums/exitCodes.js';
9
10
  async function fetchHubDBOptions(accountId) {
10
11
  try {
11
12
  const { data: { results: tables }, } = await fetchTables(accountId);
12
13
  if (tables.length === 0) {
13
14
  uiLogger.log(lib.prompts.selectHubDBTablePrompt.errors.noTables(accountId.toString()));
14
- process.exit(EXIT_CODES.SUCCESS);
15
+ throw new PromptExitError(lib.prompts.selectHubDBTablePrompt.errors.noTables(accountId.toString()), EXIT_CODES.SUCCESS);
15
16
  }
16
17
  return tables;
17
18
  }
18
19
  catch (error) {
20
+ if (isPromptExitError(error)) {
21
+ throw error;
22
+ }
19
23
  debugError(error, { accountId });
20
24
  uiLogger.error(lib.prompts.selectHubDBTablePrompt.errors.errorFetchingTables(accountId.toString()));
21
- process.exit(EXIT_CODES.ERROR);
25
+ throw new PromptExitError(lib.prompts.selectHubDBTablePrompt.errors.errorFetchingTables(accountId.toString()), EXIT_CODES.ERROR);
22
26
  }
23
27
  }
24
28
  export async function selectHubDBTablePrompt({ accountId, options, skipDestPrompt = true, }) {
25
- const hubdbTables = (await fetchHubDBOptions(accountId)) || [];
29
+ const hubdbTables = await fetchHubDBOptions(accountId);
26
30
  const id = options.tableId?.toString();
27
31
  const isValidTable = options.tableId && hubdbTables.find(table => table.id === id);
28
32
  return promptUser([