@hubspot/cli 8.0.11-experimental.0 → 8.0.11-experimental.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 (534) hide show
  1. package/bin/cli.js +2 -0
  2. package/commands/account/auth.js +12 -22
  3. package/commands/account/clean.js +5 -6
  4. package/commands/account/createOverride.js +7 -7
  5. package/commands/account/info.js +2 -1
  6. package/commands/account/list.js +3 -5
  7. package/commands/account/remove.js +2 -3
  8. package/commands/account/removeOverride.js +8 -10
  9. package/commands/account/rename.js +5 -6
  10. package/commands/account/use.js +8 -19
  11. package/commands/api.d.ts +10 -0
  12. package/commands/api.js +164 -0
  13. package/commands/app/migrate.js +8 -8
  14. package/commands/app/secret/add.js +6 -7
  15. package/commands/app/secret/delete.js +9 -10
  16. package/commands/app/secret/list.js +6 -7
  17. package/commands/app/secret/update.js +8 -9
  18. package/commands/auth.js +12 -12
  19. package/commands/cms/app/create.js +9 -5
  20. package/commands/cms/convertFields.js +8 -8
  21. package/commands/cms/delete.js +2 -3
  22. package/commands/cms/fetch.js +7 -7
  23. package/commands/cms/function/create.js +9 -5
  24. package/commands/cms/function/deploy.js +2 -3
  25. package/commands/cms/function/list.js +11 -7
  26. package/commands/cms/function/logs.js +17 -23
  27. package/commands/cms/function/server.js +2 -3
  28. package/commands/cms/getReactModule.js +7 -8
  29. package/commands/cms/lighthouseScore.js +25 -24
  30. package/commands/cms/lint.js +4 -5
  31. package/commands/cms/list.js +5 -6
  32. package/commands/cms/module/create.js +9 -5
  33. package/commands/cms/module/marketplace-validate.js +7 -8
  34. package/commands/cms/mv.js +2 -3
  35. package/commands/cms/template/create.js +10 -6
  36. package/commands/cms/theme/create.js +5 -5
  37. package/commands/cms/theme/generate-selectors.js +5 -4
  38. package/commands/cms/theme/marketplace-validate.js +8 -9
  39. package/commands/cms/theme/preview.js +16 -8
  40. package/commands/cms/upload.js +15 -12
  41. package/commands/cms/watch.js +5 -5
  42. package/commands/cms/webpack/create.js +5 -5
  43. package/commands/completion.js +3 -5
  44. package/commands/config/migrate.js +6 -7
  45. package/commands/config/set.js +5 -6
  46. package/commands/customObject/create.js +4 -5
  47. package/commands/customObject/createSchema.js +4 -5
  48. package/commands/customObject/deleteSchema.js +4 -5
  49. package/commands/customObject/fetchAllSchemas.js +2 -3
  50. package/commands/customObject/fetchSchema.js +2 -3
  51. package/commands/customObject/listSchemas.js +2 -3
  52. package/commands/customObject/updateSchema.js +4 -5
  53. package/commands/doctor.js +8 -8
  54. package/commands/feedback.js +6 -4
  55. package/commands/filemanager/fetch.js +5 -6
  56. package/commands/filemanager/upload.js +5 -5
  57. package/commands/getStarted.js +14 -16
  58. package/commands/hubdb/clear.js +5 -6
  59. package/commands/hubdb/create.js +4 -5
  60. package/commands/hubdb/delete.js +8 -9
  61. package/commands/hubdb/fetch.js +5 -6
  62. package/commands/hubdb/list.js +16 -14
  63. package/commands/init.js +14 -17
  64. package/commands/mcp/setup.js +5 -6
  65. package/commands/mcp/start.js +2 -3
  66. package/commands/open.js +4 -5
  67. package/commands/project/add.js +10 -5
  68. package/commands/project/create.js +10 -10
  69. package/commands/project/delete.d.ts +7 -0
  70. package/commands/project/delete.js +74 -0
  71. package/commands/project/deploy.js +36 -34
  72. package/commands/project/dev/deprecatedFlow.js +42 -15
  73. package/commands/project/dev/index.d.ts +3 -3
  74. package/commands/project/dev/index.js +24 -30
  75. package/commands/project/dev/unifiedFlow.js +37 -14
  76. package/commands/project/download.js +10 -11
  77. package/commands/project/info.js +17 -17
  78. package/commands/project/installDeps.js +9 -6
  79. package/commands/project/lint.js +11 -8
  80. package/commands/project/list.js +14 -14
  81. package/commands/project/listBuilds.js +8 -6
  82. package/commands/project/logs.js +5 -6
  83. package/commands/project/migrate.js +8 -8
  84. package/commands/project/open.js +5 -6
  85. package/commands/project/profile/add.js +12 -8
  86. package/commands/project/profile/delete.js +15 -11
  87. package/commands/project/updateDeps.js +9 -6
  88. package/commands/project/upload.js +31 -17
  89. package/commands/project/validate.js +11 -11
  90. package/commands/project/watch.js +20 -20
  91. package/commands/project.js +2 -0
  92. package/commands/sandbox/create.js +15 -15
  93. package/commands/sandbox/delete.js +13 -14
  94. package/commands/secret/addSecret.js +6 -7
  95. package/commands/secret/deleteSecret.js +5 -6
  96. package/commands/secret/listSecret.js +2 -3
  97. package/commands/secret/updateSecret.js +4 -5
  98. package/commands/testAccount/create.d.ts +1 -1
  99. package/commands/testAccount/create.js +20 -16
  100. package/commands/testAccount/createConfig.js +7 -8
  101. package/commands/testAccount/delete.js +27 -18
  102. package/commands/testAccount/importData.js +6 -7
  103. package/commands/upgrade.js +9 -10
  104. package/lang/en.d.ts +94 -7
  105. package/lang/en.js +94 -10
  106. package/lib/accountAuth.js +2 -2
  107. package/lib/buildAccount.js +3 -3
  108. package/lib/constants.d.ts +0 -1
  109. package/lib/constants.js +0 -1
  110. package/lib/doctor/Diagnosis.js +5 -5
  111. package/lib/errorHandlers/index.js +4 -3
  112. package/lib/errorHandlers/suppressError.js +4 -0
  113. package/lib/errors/PromptExitError.d.ts +4 -2
  114. package/lib/errors/PromptExitError.js +3 -0
  115. package/lib/hasFeature.js +1 -2
  116. package/lib/middleware/autoUpdateMiddleware.js +6 -3
  117. package/lib/process.d.ts +1 -1
  118. package/lib/process.js +10 -3
  119. package/lib/projects/create/v2.js +1 -2
  120. package/lib/projects/delete.d.ts +13 -0
  121. package/lib/projects/delete.js +193 -0
  122. package/lib/projects/localDev/AppDevModeInterface.js +11 -11
  123. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +3 -1
  124. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
  125. package/lib/projects/localDev/DevSessionManager.d.ts +6 -3
  126. package/lib/projects/localDev/DevSessionManager.js +31 -19
  127. package/lib/projects/localDev/LocalDevManager_DEPRECATED.d.ts +3 -0
  128. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +16 -12
  129. package/lib/projects/localDev/LocalDevProcess.js +6 -5
  130. package/lib/projects/localDev/LocalDevState.d.ts +3 -2
  131. package/lib/projects/localDev/LocalDevState.js +3 -1
  132. package/lib/projects/localDev/helpers/account.d.ts +4 -3
  133. package/lib/projects/localDev/helpers/account.js +16 -19
  134. package/lib/projects/localDev/helpers/process.d.ts +1 -1
  135. package/lib/projects/localDev/helpers/process.js +4 -10
  136. package/lib/projects/localDev/helpers/project.d.ts +4 -3
  137. package/lib/projects/localDev/helpers/project.js +31 -15
  138. package/lib/projects/projectInfo.d.ts +3 -20
  139. package/lib/projects/projectInfo.js +32 -54
  140. package/lib/projects/projectProfiles.d.ts +1 -2
  141. package/lib/projects/projectProfiles.js +5 -17
  142. package/lib/projects/upload.js +19 -0
  143. package/lib/projects/workspaces.d.ts +42 -0
  144. package/lib/projects/workspaces.js +350 -0
  145. package/lib/prompts/createApiSamplePrompt.js +4 -0
  146. package/lib/prompts/projectProfilePrompt.d.ts +2 -0
  147. package/lib/prompts/projectProfilePrompt.js +46 -0
  148. package/lib/prompts/promptUtils.js +3 -2
  149. package/lib/prompts/selectHubDBTablePrompt.js +2 -2
  150. package/lib/prompts/selectPublicAppForMigrationPrompt.js +2 -2
  151. package/lib/theme/cmsDevServerProcess.d.ts +2 -0
  152. package/lib/theme/cmsDevServerProcess.js +7 -6
  153. package/lib/ui/SpinniesManager.d.ts +1 -0
  154. package/lib/ui/SpinniesManager.js +20 -6
  155. package/lib/ui/spinniesUtils.d.ts +0 -1
  156. package/lib/ui/spinniesUtils.js +6 -16
  157. package/lib/usageTracking.d.ts +3 -4
  158. package/lib/yargs/makeYargsBuilder.d.ts +13 -0
  159. package/lib/yargs/makeYargsBuilder.js +33 -0
  160. package/lib/yargs/makeYargsHandlerWithUsageTracking.d.ts +3 -0
  161. package/lib/yargs/makeYargsHandlerWithUsageTracking.js +95 -0
  162. package/lib/yargs/strictEnforceBoolean.d.ts +1 -0
  163. package/lib/yargs/strictEnforceBoolean.js +13 -0
  164. package/lib/yargsUtils.d.ts +3 -16
  165. package/lib/yargsUtils.js +3 -48
  166. package/mcp-server/tools/cms/HsCreateTemplateTool.d.ts +1 -1
  167. package/package.json +10 -5
  168. package/types/LocalDev.d.ts +5 -0
  169. package/types/Projects.d.ts +19 -0
  170. package/types/Yargs.d.ts +18 -1
  171. package/api/__tests__/migrate.test.d.ts +0 -1
  172. package/api/__tests__/migrate.test.js +0 -199
  173. package/commands/__tests__/account.test.d.ts +0 -1
  174. package/commands/__tests__/account.test.js +0 -69
  175. package/commands/__tests__/auth.test.d.ts +0 -1
  176. package/commands/__tests__/auth.test.js +0 -43
  177. package/commands/__tests__/cms.test.d.ts +0 -1
  178. package/commands/__tests__/cms.test.js +0 -87
  179. package/commands/__tests__/config.test.d.ts +0 -1
  180. package/commands/__tests__/config.test.js +0 -44
  181. package/commands/__tests__/customObject.test.d.ts +0 -1
  182. package/commands/__tests__/customObject.test.js +0 -68
  183. package/commands/__tests__/doctor.test.d.ts +0 -1
  184. package/commands/__tests__/doctor.test.js +0 -132
  185. package/commands/__tests__/feedback.test.d.ts +0 -1
  186. package/commands/__tests__/feedback.test.js +0 -24
  187. package/commands/__tests__/filemanager.test.d.ts +0 -1
  188. package/commands/__tests__/filemanager.test.js +0 -45
  189. package/commands/__tests__/getStarted.test.d.ts +0 -1
  190. package/commands/__tests__/getStarted.test.js +0 -173
  191. package/commands/__tests__/hubdb.test.d.ts +0 -1
  192. package/commands/__tests__/hubdb.test.js +0 -50
  193. package/commands/__tests__/init.test.d.ts +0 -1
  194. package/commands/__tests__/init.test.js +0 -42
  195. package/commands/__tests__/mcp.test.d.ts +0 -1
  196. package/commands/__tests__/mcp.test.js +0 -46
  197. package/commands/__tests__/open.test.d.ts +0 -1
  198. package/commands/__tests__/open.test.js +0 -58
  199. package/commands/__tests__/project.test.d.ts +0 -1
  200. package/commands/__tests__/project.test.js +0 -125
  201. package/commands/__tests__/sandbox.test.d.ts +0 -1
  202. package/commands/__tests__/sandbox.test.js +0 -44
  203. package/commands/__tests__/secret.test.d.ts +0 -1
  204. package/commands/__tests__/secret.test.js +0 -49
  205. package/commands/__tests__/testAccount.test.d.ts +0 -1
  206. package/commands/__tests__/testAccount.test.js +0 -57
  207. package/commands/__tests__/upgrade.test.d.ts +0 -1
  208. package/commands/__tests__/upgrade.test.js +0 -309
  209. package/commands/account/__tests__/auth.test.d.ts +0 -1
  210. package/commands/account/__tests__/auth.test.js +0 -206
  211. package/commands/account/__tests__/clean.test.d.ts +0 -1
  212. package/commands/account/__tests__/clean.test.js +0 -28
  213. package/commands/account/__tests__/createOverride.test.d.ts +0 -1
  214. package/commands/account/__tests__/createOverride.test.js +0 -32
  215. package/commands/account/__tests__/info.test.d.ts +0 -1
  216. package/commands/account/__tests__/info.test.js +0 -28
  217. package/commands/account/__tests__/list.test.d.ts +0 -1
  218. package/commands/account/__tests__/list.test.js +0 -153
  219. package/commands/account/__tests__/remove.test.d.ts +0 -1
  220. package/commands/account/__tests__/remove.test.js +0 -36
  221. package/commands/account/__tests__/removeOverride.d.ts +0 -1
  222. package/commands/account/__tests__/removeOverride.js +0 -25
  223. package/commands/account/__tests__/rename.test.d.ts +0 -1
  224. package/commands/account/__tests__/rename.test.js +0 -82
  225. package/commands/account/__tests__/use.test.d.ts +0 -1
  226. package/commands/account/__tests__/use.test.js +0 -170
  227. package/commands/app/__tests__/migrate.test.d.ts +0 -1
  228. package/commands/app/__tests__/migrate.test.js +0 -111
  229. package/commands/app/secret/__tests__/add.test.d.ts +0 -1
  230. package/commands/app/secret/__tests__/add.test.js +0 -140
  231. package/commands/app/secret/__tests__/delete.test.d.ts +0 -1
  232. package/commands/app/secret/__tests__/delete.test.js +0 -28
  233. package/commands/app/secret/__tests__/list.test.d.ts +0 -1
  234. package/commands/app/secret/__tests__/list.test.js +0 -25
  235. package/commands/app/secret/__tests__/update.test.d.ts +0 -1
  236. package/commands/app/secret/__tests__/update.test.js +0 -28
  237. package/commands/cms/__tests__/delete.test.d.ts +0 -1
  238. package/commands/cms/__tests__/delete.test.js +0 -39
  239. package/commands/cms/__tests__/fetch.test.d.ts +0 -1
  240. package/commands/cms/__tests__/fetch.test.js +0 -156
  241. package/commands/cms/__tests__/function.test.d.ts +0 -1
  242. package/commands/cms/__tests__/function.test.js +0 -50
  243. package/commands/cms/__tests__/lint.test.d.ts +0 -1
  244. package/commands/cms/__tests__/lint.test.js +0 -33
  245. package/commands/cms/__tests__/list.test.d.ts +0 -1
  246. package/commands/cms/__tests__/list.test.js +0 -42
  247. package/commands/cms/__tests__/module.test.d.ts +0 -1
  248. package/commands/cms/__tests__/module.test.js +0 -45
  249. package/commands/cms/__tests__/mv.test.d.ts +0 -1
  250. package/commands/cms/__tests__/mv.test.js +0 -46
  251. package/commands/cms/__tests__/theme.test.d.ts +0 -1
  252. package/commands/cms/__tests__/theme.test.js +0 -54
  253. package/commands/cms/__tests__/upload.test.d.ts +0 -1
  254. package/commands/cms/__tests__/upload.test.js +0 -312
  255. package/commands/cms/__tests__/watch.test.d.ts +0 -1
  256. package/commands/cms/__tests__/watch.test.js +0 -204
  257. package/commands/cms/function/__tests__/logs.test.d.ts +0 -1
  258. package/commands/cms/function/__tests__/logs.test.js +0 -70
  259. package/commands/cms/theme/__tests__/generate-selectors.test.d.ts +0 -1
  260. package/commands/cms/theme/__tests__/generate-selectors.test.js +0 -28
  261. package/commands/cms/theme/__tests__/marketplace-validate.test.d.ts +0 -1
  262. package/commands/cms/theme/__tests__/marketplace-validate.test.js +0 -36
  263. package/commands/cms/theme/__tests__/preview.test.d.ts +0 -1
  264. package/commands/cms/theme/__tests__/preview.test.js +0 -54
  265. package/commands/customObject/__tests__/create.test.d.ts +0 -1
  266. package/commands/customObject/__tests__/create.test.js +0 -40
  267. package/commands/customObject/__tests__/createSchema.test.d.ts +0 -1
  268. package/commands/customObject/__tests__/createSchema.test.js +0 -28
  269. package/commands/customObject/__tests__/deleteSchema.test.d.ts +0 -1
  270. package/commands/customObject/__tests__/deleteSchema.test.js +0 -42
  271. package/commands/customObject/__tests__/fetch-all-schemas.test.d.ts +0 -1
  272. package/commands/customObject/__tests__/fetch-all-schemas.test.js +0 -41
  273. package/commands/customObject/__tests__/fetchSchema.test.d.ts +0 -1
  274. package/commands/customObject/__tests__/fetchSchema.test.js +0 -45
  275. package/commands/customObject/__tests__/listSchemas.test.d.ts +0 -1
  276. package/commands/customObject/__tests__/listSchemas.test.js +0 -29
  277. package/commands/customObject/__tests__/updateSchema.test.d.ts +0 -1
  278. package/commands/customObject/__tests__/updateSchema.test.js +0 -40
  279. package/commands/filemanager/__tests__/fetch.test.d.ts +0 -1
  280. package/commands/filemanager/__tests__/fetch.test.js +0 -32
  281. package/commands/filemanager/__tests__/upload.test.d.ts +0 -1
  282. package/commands/filemanager/__tests__/upload.test.js +0 -191
  283. package/commands/hubdb/__tests__/clear.test.d.ts +0 -1
  284. package/commands/hubdb/__tests__/clear.test.js +0 -28
  285. package/commands/hubdb/__tests__/create.test.d.ts +0 -1
  286. package/commands/hubdb/__tests__/create.test.js +0 -28
  287. package/commands/hubdb/__tests__/delete.test.d.ts +0 -1
  288. package/commands/hubdb/__tests__/delete.test.js +0 -28
  289. package/commands/hubdb/__tests__/fetch.test.d.ts +0 -1
  290. package/commands/hubdb/__tests__/fetch.test.js +0 -28
  291. package/commands/hubdb/__tests__/list.test.d.ts +0 -1
  292. package/commands/hubdb/__tests__/list.test.js +0 -88
  293. package/commands/mcp/__tests__/setup.test.d.ts +0 -1
  294. package/commands/mcp/__tests__/setup.test.js +0 -26
  295. package/commands/mcp/__tests__/start.test.d.ts +0 -1
  296. package/commands/mcp/__tests__/start.test.js +0 -144
  297. package/commands/project/__tests__/add.test.d.ts +0 -1
  298. package/commands/project/__tests__/add.test.js +0 -107
  299. package/commands/project/__tests__/create.test.d.ts +0 -1
  300. package/commands/project/__tests__/create.test.js +0 -97
  301. package/commands/project/__tests__/deploy.test.d.ts +0 -1
  302. package/commands/project/__tests__/deploy.test.js +0 -307
  303. package/commands/project/__tests__/dev.test.d.ts +0 -1
  304. package/commands/project/__tests__/dev.test.js +0 -273
  305. package/commands/project/__tests__/devUnifiedFlow.test.d.ts +0 -1
  306. package/commands/project/__tests__/devUnifiedFlow.test.js +0 -434
  307. package/commands/project/__tests__/download.test.d.ts +0 -1
  308. package/commands/project/__tests__/download.test.js +0 -39
  309. package/commands/project/__tests__/info.test.d.ts +0 -1
  310. package/commands/project/__tests__/info.test.js +0 -145
  311. package/commands/project/__tests__/installDeps.test.d.ts +0 -1
  312. package/commands/project/__tests__/installDeps.test.js +0 -140
  313. package/commands/project/__tests__/lint.test.d.ts +0 -1
  314. package/commands/project/__tests__/lint.test.js +0 -704
  315. package/commands/project/__tests__/list.test.d.ts +0 -1
  316. package/commands/project/__tests__/list.test.js +0 -31
  317. package/commands/project/__tests__/listBuilds.test.d.ts +0 -1
  318. package/commands/project/__tests__/listBuilds.test.js +0 -38
  319. package/commands/project/__tests__/logs.test.d.ts +0 -1
  320. package/commands/project/__tests__/logs.test.js +0 -202
  321. package/commands/project/__tests__/migrate.test.d.ts +0 -1
  322. package/commands/project/__tests__/migrate.test.js +0 -106
  323. package/commands/project/__tests__/open.test.d.ts +0 -1
  324. package/commands/project/__tests__/open.test.js +0 -39
  325. package/commands/project/__tests__/profile.test.d.ts +0 -1
  326. package/commands/project/__tests__/profile.test.js +0 -42
  327. package/commands/project/__tests__/updateDeps.test.d.ts +0 -1
  328. package/commands/project/__tests__/updateDeps.test.js +0 -140
  329. package/commands/project/__tests__/upload.test.d.ts +0 -1
  330. package/commands/project/__tests__/upload.test.js +0 -234
  331. package/commands/project/__tests__/validate.test.d.ts +0 -1
  332. package/commands/project/__tests__/validate.test.js +0 -381
  333. package/commands/project/__tests__/watch.test.d.ts +0 -1
  334. package/commands/project/__tests__/watch.test.js +0 -35
  335. package/commands/sandbox/__tests__/create.test.d.ts +0 -1
  336. package/commands/sandbox/__tests__/create.test.js +0 -198
  337. package/commands/sandbox/__tests__/delete.test.d.ts +0 -1
  338. package/commands/sandbox/__tests__/delete.test.js +0 -31
  339. package/commands/secret/__tests__/addSecret.test.d.ts +0 -1
  340. package/commands/secret/__tests__/addSecret.test.js +0 -162
  341. package/commands/secret/__tests__/deleteSecret.test.d.ts +0 -1
  342. package/commands/secret/__tests__/deleteSecret.test.js +0 -41
  343. package/commands/secret/__tests__/listSecret.test.d.ts +0 -1
  344. package/commands/secret/__tests__/listSecret.test.js +0 -29
  345. package/commands/secret/__tests__/updateSecret.test.d.ts +0 -1
  346. package/commands/secret/__tests__/updateSecret.test.js +0 -29
  347. package/commands/testAccount/__tests__/create.test.d.ts +0 -1
  348. package/commands/testAccount/__tests__/create.test.js +0 -106
  349. package/commands/testAccount/__tests__/createConfig.test.d.ts +0 -1
  350. package/commands/testAccount/__tests__/createConfig.test.js +0 -32
  351. package/commands/testAccount/__tests__/delete.test.d.ts +0 -1
  352. package/commands/testAccount/__tests__/delete.test.js +0 -29
  353. package/commands/testAccount/__tests__/importData.test.d.ts +0 -1
  354. package/commands/testAccount/__tests__/importData.test.js +0 -92
  355. package/lib/__tests__/CLIWebSocketServer.test.d.ts +0 -1
  356. package/lib/__tests__/CLIWebSocketServer.test.js +0 -252
  357. package/lib/__tests__/accountAuth.test.d.ts +0 -1
  358. package/lib/__tests__/accountAuth.test.js +0 -258
  359. package/lib/__tests__/accountTypes.test.d.ts +0 -1
  360. package/lib/__tests__/accountTypes.test.js +0 -98
  361. package/lib/__tests__/buildAccount.test.d.ts +0 -1
  362. package/lib/__tests__/buildAccount.test.js +0 -211
  363. package/lib/__tests__/cliUpgradeUtils.test.d.ts +0 -1
  364. package/lib/__tests__/cliUpgradeUtils.test.js +0 -131
  365. package/lib/__tests__/commandSuggestion.test.d.ts +0 -1
  366. package/lib/__tests__/commandSuggestion.test.js +0 -121
  367. package/lib/__tests__/commonOpts.test.d.ts +0 -1
  368. package/lib/__tests__/commonOpts.test.js +0 -80
  369. package/lib/__tests__/dependencyManagement.test.d.ts +0 -1
  370. package/lib/__tests__/dependencyManagement.test.js +0 -1067
  371. package/lib/__tests__/developerTestAccounts.test.d.ts +0 -1
  372. package/lib/__tests__/developerTestAccounts.test.js +0 -156
  373. package/lib/__tests__/hasFeature.test.d.ts +0 -1
  374. package/lib/__tests__/hasFeature.test.js +0 -167
  375. package/lib/__tests__/http.test.d.ts +0 -1
  376. package/lib/__tests__/http.test.js +0 -40
  377. package/lib/__tests__/importData.test.d.ts +0 -1
  378. package/lib/__tests__/importData.test.js +0 -98
  379. package/lib/__tests__/npmCli.test.d.ts +0 -1
  380. package/lib/__tests__/npmCli.test.js +0 -84
  381. package/lib/__tests__/oauth.test.d.ts +0 -1
  382. package/lib/__tests__/oauth.test.js +0 -109
  383. package/lib/__tests__/parsing.test.d.ts +0 -1
  384. package/lib/__tests__/parsing.test.js +0 -34
  385. package/lib/__tests__/polling.test.d.ts +0 -1
  386. package/lib/__tests__/polling.test.js +0 -76
  387. package/lib/__tests__/process.test.d.ts +0 -1
  388. package/lib/__tests__/process.test.js +0 -89
  389. package/lib/__tests__/sandboxes.test.d.ts +0 -1
  390. package/lib/__tests__/sandboxes.test.js +0 -128
  391. package/lib/__tests__/serverlessLogs.test.d.ts +0 -1
  392. package/lib/__tests__/serverlessLogs.test.js +0 -163
  393. package/lib/__tests__/usageTracking.test.d.ts +0 -1
  394. package/lib/__tests__/usageTracking.test.js +0 -197
  395. package/lib/__tests__/validation.test.d.ts +0 -1
  396. package/lib/__tests__/validation.test.js +0 -143
  397. package/lib/__tests__/yargsUtils.test.d.ts +0 -1
  398. package/lib/__tests__/yargsUtils.test.js +0 -124
  399. package/lib/app/__tests__/migrate.test.d.ts +0 -1
  400. package/lib/app/__tests__/migrate.test.js +0 -638
  401. package/lib/doctor/__tests__/Diagnosis.test.d.ts +0 -1
  402. package/lib/doctor/__tests__/Diagnosis.test.js +0 -84
  403. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.d.ts +0 -1
  404. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +0 -177
  405. package/lib/doctor/__tests__/Doctor.test.d.ts +0 -1
  406. package/lib/doctor/__tests__/Doctor.test.js +0 -560
  407. package/lib/errorHandlers/__tests__/index.test.d.ts +0 -1
  408. package/lib/errorHandlers/__tests__/index.test.js +0 -278
  409. package/lib/mcp/__tests__/setup.test.d.ts +0 -1
  410. package/lib/mcp/__tests__/setup.test.js +0 -523
  411. package/lib/middleware/__tests__/commandTargetingUtils.test.d.ts +0 -1
  412. package/lib/middleware/__tests__/commandTargetingUtils.test.js +0 -99
  413. package/lib/middleware/__tests__/configMiddleware.test.d.ts +0 -1
  414. package/lib/middleware/__tests__/configMiddleware.test.js +0 -118
  415. package/lib/middleware/__tests__/gitMiddleware.test.d.ts +0 -1
  416. package/lib/middleware/__tests__/gitMiddleware.test.js +0 -43
  417. package/lib/middleware/__tests__/requestMiddleware.test.d.ts +0 -1
  418. package/lib/middleware/__tests__/requestMiddleware.test.js +0 -15
  419. package/lib/middleware/__tests__/usageTrackingMiddleware.test.d.ts +0 -1
  420. package/lib/middleware/__tests__/usageTrackingMiddleware.test.js +0 -44
  421. package/lib/middleware/__tests__/yargsChecksMiddleware.test.d.ts +0 -1
  422. package/lib/middleware/__tests__/yargsChecksMiddleware.test.js +0 -39
  423. package/lib/projects/__tests__/AppDevModeInterface.test.d.ts +0 -1
  424. package/lib/projects/__tests__/AppDevModeInterface.test.js +0 -541
  425. package/lib/projects/__tests__/DevServerManager.test.d.ts +0 -1
  426. package/lib/projects/__tests__/DevServerManager.test.js +0 -185
  427. package/lib/projects/__tests__/DevSessionManager.test.d.ts +0 -1
  428. package/lib/projects/__tests__/DevSessionManager.test.js +0 -250
  429. package/lib/projects/__tests__/LocalDevProcess.test.d.ts +0 -1
  430. package/lib/projects/__tests__/LocalDevProcess.test.js +0 -481
  431. package/lib/projects/__tests__/LocalDevWebsocketServer.test.d.ts +0 -1
  432. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +0 -231
  433. package/lib/projects/__tests__/ProjectLogsManager.test.d.ts +0 -1
  434. package/lib/projects/__tests__/ProjectLogsManager.test.js +0 -302
  435. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +0 -1
  436. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +0 -160
  437. package/lib/projects/__tests__/components.test.d.ts +0 -1
  438. package/lib/projects/__tests__/components.test.js +0 -440
  439. package/lib/projects/__tests__/deploy.test.d.ts +0 -1
  440. package/lib/projects/__tests__/deploy.test.js +0 -231
  441. package/lib/projects/__tests__/localDevProjectHelpers.test.d.ts +0 -1
  442. package/lib/projects/__tests__/localDevProjectHelpers.test.js +0 -120
  443. package/lib/projects/__tests__/platformVersion.test.d.ts +0 -1
  444. package/lib/projects/__tests__/platformVersion.test.js +0 -63
  445. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.d.ts +0 -1
  446. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.js +0 -328
  447. package/lib/projects/__tests__/projectInfo.test.d.ts +0 -1
  448. package/lib/projects/__tests__/projectInfo.test.js +0 -114
  449. package/lib/projects/__tests__/projectProfiles.test.d.ts +0 -1
  450. package/lib/projects/__tests__/projectProfiles.test.js +0 -441
  451. package/lib/projects/__tests__/projects.test.d.ts +0 -1
  452. package/lib/projects/__tests__/projects.test.js +0 -58
  453. package/lib/projects/__tests__/structure.test.d.ts +0 -1
  454. package/lib/projects/__tests__/structure.test.js +0 -210
  455. package/lib/projects/__tests__/uieLinting.test.d.ts +0 -1
  456. package/lib/projects/__tests__/uieLinting.test.js +0 -631
  457. package/lib/projects/__tests__/upload.test.d.ts +0 -1
  458. package/lib/projects/__tests__/upload.test.js +0 -183
  459. package/lib/projects/add/__tests__/legacyAddComponent.test.d.ts +0 -1
  460. package/lib/projects/add/__tests__/legacyAddComponent.test.js +0 -245
  461. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +0 -1
  462. package/lib/projects/add/__tests__/v2AddComponent.test.js +0 -343
  463. package/lib/projects/create/__tests__/legacy.test.d.ts +0 -1
  464. package/lib/projects/create/__tests__/legacy.test.js +0 -72
  465. package/lib/projects/create/__tests__/v2.test.d.ts +0 -1
  466. package/lib/projects/create/__tests__/v2.test.js +0 -257
  467. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.d.ts +0 -1
  468. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +0 -157
  469. package/lib/prompts/__tests__/createFunctionPrompt.test.d.ts +0 -1
  470. package/lib/prompts/__tests__/createFunctionPrompt.test.js +0 -129
  471. package/lib/prompts/__tests__/createModulePrompt.test.d.ts +0 -1
  472. package/lib/prompts/__tests__/createModulePrompt.test.js +0 -187
  473. package/lib/prompts/__tests__/createTemplatePrompt.test.d.ts +0 -1
  474. package/lib/prompts/__tests__/createTemplatePrompt.test.js +0 -102
  475. package/lib/prompts/__tests__/downloadProjectPrompt.test.d.ts +0 -1
  476. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +0 -31
  477. package/lib/prompts/__tests__/projectAddPrompt.test.d.ts +0 -1
  478. package/lib/prompts/__tests__/projectAddPrompt.test.js +0 -143
  479. package/lib/prompts/__tests__/projectsLogsPrompt.test.d.ts +0 -1
  480. package/lib/prompts/__tests__/projectsLogsPrompt.test.js +0 -37
  481. package/lib/prompts/__tests__/selectProjectTemplatePrompt.test.d.ts +0 -1
  482. package/lib/prompts/__tests__/selectProjectTemplatePrompt.test.js +0 -160
  483. package/lib/theme/__tests__/migrate.test.d.ts +0 -1
  484. package/lib/theme/__tests__/migrate.test.js +0 -247
  485. package/lib/ui/__tests__/SpinniesManager.test.d.ts +0 -1
  486. package/lib/ui/__tests__/SpinniesManager.test.js +0 -488
  487. package/lib/ui/__tests__/removeAnsiCodes.test.d.ts +0 -1
  488. package/lib/ui/__tests__/removeAnsiCodes.test.js +0 -84
  489. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.d.ts +0 -1
  490. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +0 -254
  491. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.d.ts +0 -1
  492. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.js +0 -227
  493. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.d.ts +0 -1
  494. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.js +0 -208
  495. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.d.ts +0 -1
  496. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.js +0 -186
  497. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.d.ts +0 -1
  498. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.js +0 -124
  499. package/mcp-server/tools/cms/__tests__/HsListTool.test.d.ts +0 -1
  500. package/mcp-server/tools/cms/__tests__/HsListTool.test.js +0 -124
  501. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.d.ts +0 -1
  502. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.js +0 -157
  503. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.d.ts +0 -1
  504. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +0 -131
  505. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.d.ts +0 -1
  506. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +0 -461
  507. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.d.ts +0 -1
  508. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.js +0 -125
  509. package/mcp-server/tools/project/__tests__/DocFetchTool.test.d.ts +0 -1
  510. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +0 -125
  511. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.d.ts +0 -1
  512. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +0 -210
  513. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +0 -1
  514. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +0 -146
  515. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +0 -1
  516. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +0 -124
  517. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.d.ts +0 -1
  518. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +0 -307
  519. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +0 -1
  520. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +0 -242
  521. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.d.ts +0 -1
  522. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +0 -209
  523. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.d.ts +0 -1
  524. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +0 -158
  525. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.d.ts +0 -1
  526. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +0 -187
  527. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.d.ts +0 -1
  528. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +0 -118
  529. package/mcp-server/utils/__tests__/command.test.d.ts +0 -1
  530. package/mcp-server/utils/__tests__/command.test.js +0 -275
  531. package/mcp-server/utils/__tests__/content.test.d.ts +0 -1
  532. package/mcp-server/utils/__tests__/content.test.js +0 -164
  533. package/mcp-server/utils/__tests__/feedbackTracking.test.d.ts +0 -1
  534. package/mcp-server/utils/__tests__/feedbackTracking.test.js +0 -69
@@ -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
  }
@@ -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
+ }
@@ -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
  }
@@ -5,7 +5,7 @@ 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
7
  import { isValidPath, untildify } from '@hubspot/local-dev-lib/path';
8
- import { PromptExitError } from '../errors/PromptExitError.js';
8
+ import { isPromptExitError, PromptExitError, } from '../errors/PromptExitError.js';
9
9
  import { EXIT_CODES } from '../enums/exitCodes.js';
10
10
  async function fetchHubDBOptions(accountId) {
11
11
  try {
@@ -17,7 +17,7 @@ async function fetchHubDBOptions(accountId) {
17
17
  return tables;
18
18
  }
19
19
  catch (error) {
20
- if (error instanceof PromptExitError) {
20
+ if (isPromptExitError(error)) {
21
21
  throw error;
22
22
  }
23
23
  debugError(error, { accountId });
@@ -4,7 +4,7 @@ import { uiLine } from '../ui/index.js';
4
4
  import { logError } from '../errorHandlers/index.js';
5
5
  import { uiLogger } from '../ui/logger.js';
6
6
  import { fetchPublicAppsForPortal } from '@hubspot/local-dev-lib/api/appsDev';
7
- import { PromptExitError } from '../errors/PromptExitError.js';
7
+ import { isPromptExitError, PromptExitError, } from '../errors/PromptExitError.js';
8
8
  import { EXIT_CODES } from '../enums/exitCodes.js';
9
9
  async function fetchPublicAppOptions(accountId, accountName, isMigratingApp = false) {
10
10
  if (!accountId) {
@@ -32,7 +32,7 @@ async function fetchPublicAppOptions(accountId, accountName, isMigratingApp = fa
32
32
  return filteredPublicApps;
33
33
  }
34
34
  catch (error) {
35
- if (error instanceof PromptExitError) {
35
+ if (isPromptExitError(error)) {
36
36
  throw error;
37
37
  }
38
38
  logError(error, accountId ? { accountId } : undefined);
@@ -1,4 +1,5 @@
1
1
  import { ChildProcess } from 'child_process';
2
+ import { ExitFunction } from '../../types/Yargs.js';
2
3
  interface DevServerOptions {
3
4
  absoluteSrc: string;
4
5
  accountName?: string;
@@ -7,6 +8,7 @@ interface DevServerOptions {
7
8
  generateFieldsTypes?: boolean;
8
9
  resetSession?: boolean;
9
10
  dest: string;
11
+ exit: ExitFunction;
10
12
  }
11
13
  export declare function spawnDevServer(options: DevServerOptions): Promise<ChildProcess>;
12
14
  export {};
@@ -6,6 +6,7 @@ import { fileURLToPath } from 'url';
6
6
  import { getConfigFilePath } from '@hubspot/local-dev-lib/config';
7
7
  import SpinniesManager from '../ui/SpinniesManager.js';
8
8
  import { lib } from '../../lang/en.js';
9
+ import { EXIT_CODES } from '../enums/exitCodes.js';
9
10
  const __filename = fileURLToPath(import.meta.url);
10
11
  const __dirname = path.dirname(__filename);
11
12
  // cms-dev-server version to install to isolated cache
@@ -83,7 +84,7 @@ async function ensureCmsDevServerCache(targetVersion) {
83
84
  return cacheDir;
84
85
  }
85
86
  export async function spawnDevServer(options) {
86
- const { absoluteSrc, accountName, noSsl, port, generateFieldsTypes, resetSession, dest, } = options;
87
+ const { absoluteSrc, accountName, noSsl, port, generateFieldsTypes, resetSession, dest, exit, } = options;
87
88
  // Ensure cms-dev-server is installed in isolated cache
88
89
  const cacheDir = await ensureCmsDevServerCache(TARGET_CMS_DEV_SERVER_VERSION);
89
90
  // Get config path to pass to createDevServer
@@ -123,18 +124,18 @@ export async function spawnDevServer(options) {
123
124
  cwd: cacheDir,
124
125
  });
125
126
  // Handle process events
126
- devServer.on('error', error => {
127
+ devServer.on('error', async (error) => {
127
128
  console.error(lib.theme.cmsDevServerProcess.serverStartError(error));
128
- process.exit(1);
129
+ await exit(EXIT_CODES.ERROR);
129
130
  });
130
- devServer.on('exit', (code, signal) => {
131
+ devServer.on('exit', async (code, signal) => {
131
132
  if (code !== 0 && code !== null) {
132
133
  console.error(lib.theme.cmsDevServerProcess.serverExit(code));
133
- process.exit(code);
134
+ await exit(code);
134
135
  }
135
136
  if (signal) {
136
137
  console.error(lib.theme.cmsDevServerProcess.serverKill(signal));
137
- process.exit(1);
138
+ await exit(EXIT_CODES.ERROR);
138
139
  }
139
140
  });
140
141
  // Handle CLI termination
@@ -12,6 +12,7 @@ declare class SpinniesManager {
12
12
  private lineCount;
13
13
  private currentFrameIndex;
14
14
  private spin;
15
+ private sigintHandler;
15
16
  constructor();
16
17
  init(options?: Partial<SpinnerState>): void;
17
18
  private resetState;
@@ -10,7 +10,8 @@ The above copyright notice and this permission notice shall be included in all c
10
10
  import readline from 'readline';
11
11
  import chalk from 'chalk';
12
12
  import cliCursor from 'cli-cursor';
13
- import { breakText, cleanStream, colorOptions, getLinesLength, prefixOptions, purgeSpinnerOptions, purgeSpinnersOptions, SPINNERS, terminalSupportsUnicode, writeStream, } from './spinniesUtils.js';
13
+ import { breakText, cleanStream, colorOptions, getLinesLength, prefixOptions, purgeSpinnerOptions, purgeSpinnersOptions, SPINNERS, writeStream, } from './spinniesUtils.js';
14
+ import { isUnicodeSupported } from '@hubspot/local-dev-lib/isUnicodeSupported';
14
15
  import { uiLogger } from './logger.js';
15
16
  function safeColor(text, color) {
16
17
  const chalkFn = chalk[color];
@@ -29,6 +30,7 @@ class SpinniesManager {
29
30
  lineCount = 0;
30
31
  currentFrameIndex = 0;
31
32
  spin;
33
+ sigintHandler = null;
32
34
  constructor() {
33
35
  this.resetState();
34
36
  }
@@ -37,7 +39,7 @@ class SpinniesManager {
37
39
  spinnerColor: 'greenBright',
38
40
  succeedColor: 'green',
39
41
  failColor: 'red',
40
- spinner: terminalSupportsUnicode() ? SPINNERS.dots : SPINNERS.dashes,
42
+ spinner: isUnicodeSupported() ? SPINNERS.dots : SPINNERS.dashes,
41
43
  disableSpins: false,
42
44
  ...purgeSpinnersOptions(options),
43
45
  };
@@ -247,12 +249,24 @@ class SpinniesManager {
247
249
  }
248
250
  }
249
251
  bindSigint() {
250
- process.removeAllListeners('SIGINT');
251
- process.on('SIGINT', () => {
252
+ if (this.sigintHandler) {
253
+ process.removeListener('SIGINT', this.sigintHandler);
254
+ }
255
+ this.sigintHandler = () => {
252
256
  cliCursor.show();
253
257
  readline.moveCursor(process.stderr, 0, this.lineCount);
254
- process.exit(0);
255
- });
258
+ const remainingListeners = process
259
+ .listeners('SIGINT')
260
+ .filter(l => l !== this.sigintHandler);
261
+ if (remainingListeners.length === 0) {
262
+ // process.exit is intentionally used here rather than the command-level
263
+ // exit() function because this SIGINT handler runs outside of a command
264
+ // context and needs to force-terminate the process when no other SIGINT
265
+ // listeners remain to handle it.
266
+ process.exit(0);
267
+ }
268
+ };
269
+ process.on('SIGINT', this.sigintHandler);
256
270
  }
257
271
  }
258
272
  const toExport = new SpinniesManager();
@@ -28,5 +28,4 @@ export declare function breakText(text: string, prefixLength: number): string;
28
28
  export declare function getLinesLength(text: string, prefixLength: number): number[];
29
29
  export declare function writeStream(stream: NodeJS.WriteStream, output: string, rawLines: number[]): void;
30
30
  export declare function cleanStream(stream: NodeJS.WriteStream, rawLines: number[]): void;
31
- export declare function terminalSupportsUnicode(): boolean;
32
31
  export {};
@@ -9,6 +9,8 @@ The above copyright notice and this permission notice shall be included in all c
9
9
  **/
10
10
  import readline from 'readline';
11
11
  import stripAnsi from 'strip-ansi';
12
+ import { isUnicodeSupported } from '@hubspot/local-dev-lib/isUnicodeSupported';
13
+ import { getSymbols } from '@hubspot/local-dev-lib/logger';
12
14
  export const VALID_STATUSES = [
13
15
  'succeed',
14
16
  'fail',
@@ -64,7 +66,7 @@ export function purgeSpinnersOptions({ spinner, disableSpins, ...others }) {
64
66
  return { ...colors, ...prefixes, ...disableSpinsOption, spinner };
65
67
  }
66
68
  function turnToValidSpinner(spinner = {}) {
67
- const platformSpinner = terminalSupportsUnicode()
69
+ const platformSpinner = isUnicodeSupported()
68
70
  ? SPINNERS.dots
69
71
  : SPINNERS.dashes;
70
72
  if (typeof spinner !== 'object') {
@@ -101,14 +103,9 @@ export function colorOptions({ color, succeedColor, failColor, spinnerColor, })
101
103
  return colors;
102
104
  }
103
105
  export function prefixOptions({ succeedPrefix, failPrefix, }) {
104
- if (terminalSupportsUnicode()) {
105
- succeedPrefix = succeedPrefix || '✓';
106
- failPrefix = failPrefix || '✖';
107
- }
108
- else {
109
- succeedPrefix = succeedPrefix || '√';
110
- failPrefix = failPrefix || '×';
111
- }
106
+ const symbols = getSymbols();
107
+ succeedPrefix = succeedPrefix || symbols.success;
108
+ failPrefix = failPrefix || symbols.error;
112
109
  return { succeedPrefix, failPrefix };
113
110
  }
114
111
  export function breakText(text, prefixLength) {
@@ -142,10 +139,3 @@ export function cleanStream(stream, rawLines) {
142
139
  readline.clearScreenDown(stream);
143
140
  readline.moveCursor(stream, 0, -rawLines.length);
144
141
  }
145
- export function terminalSupportsUnicode() {
146
- // The default command prompt and powershell in Windows do not support Unicode characters.
147
- // However, the VSCode integrated terminal and the Windows Terminal both do.
148
- return (process.platform !== 'win32' ||
149
- process.env.TERM_PROGRAM === 'vscode' ||
150
- !!process.env.WT_SESSION);
151
- }