@hubspot/cli 7.8.12-experimental.0 → 7.9.0-beta.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 (451) hide show
  1. package/bin/cli.js +31 -25
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/cms.test.js +44 -1
  4. package/commands/__tests__/customObject.test.js +22 -1
  5. package/commands/__tests__/doctor.test.js +16 -16
  6. package/commands/__tests__/project.test.js +2 -0
  7. package/commands/account/auth.js +1 -0
  8. package/commands/account/clean.js +18 -27
  9. package/commands/account/createOverride.js +13 -31
  10. package/commands/account/info.js +20 -31
  11. package/commands/account/list.js +16 -22
  12. package/commands/account/remove.js +12 -20
  13. package/commands/account/removeOverride.js +11 -21
  14. package/commands/account/rename.js +6 -9
  15. package/commands/account/use.js +12 -26
  16. package/commands/account.js +2 -2
  17. package/commands/app/__tests__/migrate.test.js +5 -5
  18. package/commands/app/migrate.js +13 -18
  19. package/commands/app.js +1 -6
  20. package/commands/auth.d.ts +1 -0
  21. package/commands/auth.js +17 -7
  22. package/commands/{__tests__/remove.test.js → cms/__tests__/delete.test.js} +8 -8
  23. package/commands/{__tests__ → cms/__tests__}/fetch.test.js +3 -3
  24. package/commands/{__tests__ → cms/__tests__}/function.test.js +7 -3
  25. package/commands/{__tests__ → cms/__tests__}/lint.test.js +3 -3
  26. package/commands/{__tests__ → cms/__tests__}/list.test.js +3 -3
  27. package/commands/{__tests__ → cms/__tests__}/mv.test.js +3 -3
  28. package/commands/{__tests__ → cms/__tests__}/theme.test.js +9 -2
  29. package/commands/cms/app/create.d.ts +9 -0
  30. package/commands/cms/app/create.js +82 -0
  31. package/commands/cms/app.d.ts +3 -0
  32. package/commands/cms/app.js +17 -0
  33. package/commands/cms/convertFields.js +7 -9
  34. package/commands/cms/delete.d.ts +6 -0
  35. package/commands/cms/delete.js +43 -0
  36. package/commands/cms/fetch.d.ts +12 -0
  37. package/commands/cms/fetch.js +79 -0
  38. package/commands/{__tests__ → cms/function/__tests__}/logs.test.js +4 -5
  39. package/commands/cms/function/create.d.ts +12 -0
  40. package/commands/cms/function/create.js +84 -0
  41. package/commands/cms/function/deploy.d.ts +6 -0
  42. package/commands/cms/function/deploy.js +89 -0
  43. package/commands/cms/function/list.d.ts +6 -0
  44. package/commands/cms/function/list.js +60 -0
  45. package/commands/cms/function/logs.d.ts +10 -0
  46. package/commands/cms/function/logs.js +135 -0
  47. package/commands/cms/function/server.d.ts +10 -0
  48. package/commands/cms/function/server.js +69 -0
  49. package/commands/cms/function.d.ts +3 -0
  50. package/commands/cms/function.js +27 -0
  51. package/commands/cms/getReactModule.js +9 -14
  52. package/commands/cms/lighthouseScore.js +33 -36
  53. package/commands/cms/lint.d.ts +6 -0
  54. package/commands/cms/lint.js +83 -0
  55. package/commands/cms/list.d.ts +6 -0
  56. package/commands/cms/list.js +96 -0
  57. package/commands/cms/module/create.d.ts +11 -0
  58. package/commands/cms/module/create.js +84 -0
  59. package/commands/cms/module/marketplace-validate.d.ts +6 -0
  60. package/commands/cms/module/marketplace-validate.js +45 -0
  61. package/commands/cms/module.d.ts +3 -0
  62. package/commands/cms/module.js +17 -0
  63. package/commands/cms/mv.d.ts +7 -0
  64. package/commands/cms/mv.js +60 -0
  65. package/commands/cms/template/create.d.ts +9 -0
  66. package/commands/cms/template/create.js +72 -0
  67. package/commands/cms/template.d.ts +3 -0
  68. package/commands/cms/template.js +17 -0
  69. package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.js +2 -2
  70. package/commands/{theme → cms/theme}/__tests__/preview.test.js +2 -2
  71. package/commands/cms/theme/create.d.ts +6 -0
  72. package/commands/cms/theme/create.js +58 -0
  73. package/commands/cms/theme/generate-selectors.d.ts +6 -0
  74. package/commands/cms/theme/generate-selectors.js +171 -0
  75. package/commands/cms/theme/marketplace-validate.d.ts +6 -0
  76. package/commands/cms/theme/marketplace-validate.js +46 -0
  77. package/commands/cms/theme/preview.d.ts +12 -0
  78. package/commands/cms/theme/preview.js +224 -0
  79. package/commands/cms/theme.d.ts +3 -0
  80. package/commands/cms/theme.js +25 -0
  81. package/commands/cms/upload.d.ts +12 -0
  82. package/commands/cms/upload.js +212 -0
  83. package/commands/cms/watch.d.ts +14 -0
  84. package/commands/cms/watch.js +138 -0
  85. package/commands/cms/webpack/create.d.ts +6 -0
  86. package/commands/cms/webpack/create.js +58 -0
  87. package/commands/cms/webpack.d.ts +3 -0
  88. package/commands/cms/webpack.js +17 -0
  89. package/commands/cms.js +28 -2
  90. package/commands/completion.js +3 -3
  91. package/commands/config/set.d.ts +1 -1
  92. package/commands/config/set.js +64 -36
  93. package/commands/config.js +2 -2
  94. package/commands/create.js +6 -4
  95. package/commands/customObject/{schema/__tests__/create.test.js → __tests__/createSchema.test.js} +5 -5
  96. package/commands/customObject/{schema/__tests__/delete.test.js → __tests__/deleteSchema.test.js} +5 -5
  97. package/commands/customObject/{schema/__tests__/fetch-all.test.js → __tests__/fetch-all-schemas.test.js} +5 -5
  98. package/commands/customObject/{schema/__tests__/fetch.test.js → __tests__/fetchSchema.test.js} +5 -5
  99. package/commands/customObject/{schema/__tests__/list.test.js → __tests__/listSchemas.test.js} +5 -5
  100. package/commands/customObject/{schema/__tests__/update.test.js → __tests__/updateSchema.test.js} +5 -5
  101. package/commands/customObject/create.js +10 -12
  102. package/commands/customObject/createSchema.d.ts +6 -0
  103. package/commands/customObject/createSchema.js +56 -0
  104. package/commands/customObject/deleteSchema.d.ts +7 -0
  105. package/commands/customObject/deleteSchema.js +69 -0
  106. package/commands/customObject/fetchAllSchemas.d.ts +6 -0
  107. package/commands/customObject/fetchAllSchemas.js +57 -0
  108. package/commands/customObject/fetchSchema.d.ts +7 -0
  109. package/commands/customObject/fetchSchema.js +67 -0
  110. package/commands/customObject/listSchemas.d.ts +4 -0
  111. package/commands/customObject/listSchemas.js +35 -0
  112. package/commands/customObject/schema/create.d.ts +4 -6
  113. package/commands/customObject/schema/create.js +13 -38
  114. package/commands/customObject/schema/delete.d.ts +4 -7
  115. package/commands/customObject/schema/delete.js +15 -50
  116. package/commands/customObject/schema/fetch-all.d.ts +4 -6
  117. package/commands/customObject/schema/fetch-all.js +14 -40
  118. package/commands/customObject/schema/fetch.d.ts +4 -7
  119. package/commands/customObject/schema/fetch.js +14 -49
  120. package/commands/customObject/schema/list.d.ts +4 -4
  121. package/commands/customObject/schema/list.js +10 -19
  122. package/commands/customObject/schema/update.d.ts +4 -7
  123. package/commands/customObject/schema/update.js +15 -50
  124. package/commands/customObject/schema.js +5 -3
  125. package/commands/customObject/updateSchema.d.ts +7 -0
  126. package/commands/customObject/updateSchema.js +71 -0
  127. package/commands/customObject.js +22 -8
  128. package/commands/doctor.js +8 -11
  129. package/commands/feedback.js +7 -12
  130. package/commands/fetch.d.ts +4 -12
  131. package/commands/fetch.js +20 -47
  132. package/commands/filemanager/fetch.js +7 -7
  133. package/commands/filemanager/upload.js +15 -34
  134. package/commands/filemanager.js +2 -2
  135. package/commands/function/deploy.d.ts +4 -6
  136. package/commands/function/deploy.js +14 -89
  137. package/commands/function/list.d.ts +4 -6
  138. package/commands/function/list.js +14 -40
  139. package/commands/function/server.d.ts +4 -10
  140. package/commands/function/server.js +22 -31
  141. package/commands/function.d.ts +2 -4
  142. package/commands/function.js +25 -14
  143. package/commands/getStarted.js +2 -2
  144. package/commands/hubdb/clear.js +7 -15
  145. package/commands/hubdb/create.js +9 -15
  146. package/commands/hubdb/delete.js +8 -15
  147. package/commands/hubdb/fetch.js +6 -9
  148. package/commands/hubdb.d.ts +1 -1
  149. package/commands/hubdb.js +2 -2
  150. package/commands/init.js +2 -3
  151. package/commands/lint.d.ts +4 -6
  152. package/commands/lint.js +13 -65
  153. package/commands/list.d.ts +4 -6
  154. package/commands/list.js +14 -81
  155. package/commands/logs.d.ts +4 -10
  156. package/commands/logs.js +25 -94
  157. package/commands/module/marketplace-validate.d.ts +4 -6
  158. package/commands/module/marketplace-validate.js +15 -27
  159. package/commands/module.d.ts +2 -2
  160. package/commands/module.js +17 -15
  161. package/commands/mv.d.ts +4 -7
  162. package/commands/mv.js +14 -51
  163. package/commands/open.js +5 -5
  164. package/commands/project/__tests__/add.test.js +15 -13
  165. package/commands/project/__tests__/deploy.test.js +3 -4
  166. package/commands/project/__tests__/devUnifiedFlow.test.js +32 -0
  167. package/commands/project/__tests__/installDeps.test.js +8 -8
  168. package/commands/project/__tests__/list.test.js +31 -0
  169. package/commands/project/__tests__/logs.test.js +1 -1
  170. package/commands/project/__tests__/migrate.test.js +6 -5
  171. package/commands/project/__tests__/migrateApp.test.js +2 -5
  172. package/commands/project/__tests__/validate.test.js +98 -0
  173. package/commands/project/add.d.ts +2 -2
  174. package/commands/project/add.js +6 -5
  175. package/commands/project/cloneApp.js +14 -19
  176. package/commands/project/create.js +1 -2
  177. package/commands/project/deploy.js +3 -3
  178. package/commands/project/dev/deprecatedFlow.js +9 -18
  179. package/commands/project/dev/index.js +19 -17
  180. package/commands/project/dev/unifiedFlow.js +11 -4
  181. package/commands/project/download.js +15 -15
  182. package/commands/project/installDeps.d.ts +2 -2
  183. package/commands/project/installDeps.js +9 -8
  184. package/commands/project/list.d.ts +4 -0
  185. package/commands/project/list.js +62 -0
  186. package/commands/project/listBuilds.js +11 -20
  187. package/commands/project/logs.js +21 -24
  188. package/commands/project/migrate.js +5 -2
  189. package/commands/project/migrateApp.js +9 -15
  190. package/commands/project/open.js +6 -13
  191. package/commands/project/upload.d.ts +2 -2
  192. package/commands/project/upload.js +17 -26
  193. package/commands/project/validate.js +6 -6
  194. package/commands/project/watch.js +13 -22
  195. package/commands/project.js +4 -2
  196. package/commands/remove.d.ts +4 -6
  197. package/commands/remove.js +12 -24
  198. package/commands/sandbox/__tests__/create.test.js +5 -5
  199. package/commands/sandbox/create.js +22 -32
  200. package/commands/sandbox/delete.js +38 -63
  201. package/commands/sandbox.js +2 -2
  202. package/commands/secret/addSecret.js +7 -17
  203. package/commands/secret/deleteSecret.js +10 -20
  204. package/commands/secret/listSecret.js +8 -10
  205. package/commands/secret/updateSecret.js +9 -17
  206. package/commands/secret.js +2 -2
  207. package/commands/testAccount/__tests__/delete.test.js +2 -4
  208. package/commands/testAccount/create.js +2 -5
  209. package/commands/testAccount/delete.d.ts +4 -3
  210. package/commands/testAccount/delete.js +155 -14
  211. package/commands/theme/generate-selectors.d.ts +4 -6
  212. package/commands/theme/generate-selectors.js +14 -152
  213. package/commands/theme/marketplace-validate.d.ts +4 -6
  214. package/commands/theme/marketplace-validate.js +14 -25
  215. package/commands/theme/preview.d.ts +4 -12
  216. package/commands/theme/preview.js +18 -183
  217. package/commands/theme.d.ts +2 -2
  218. package/commands/theme.js +19 -13
  219. package/commands/upload.d.ts +4 -12
  220. package/commands/upload.js +19 -169
  221. package/commands/watch.d.ts +4 -14
  222. package/commands/watch.js +23 -88
  223. package/lang/en.d.ts +863 -542
  224. package/lang/en.js +912 -595
  225. package/lang/en.lyaml +4 -4
  226. package/lib/__tests__/buildAccount.test.js +4 -3
  227. package/lib/__tests__/commonOpts.test.js +1 -1
  228. package/lib/__tests__/dependencyManagement.test.js +1 -1
  229. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  230. package/lib/__tests__/npm.test.js +1 -1
  231. package/lib/__tests__/oauth.test.js +4 -4
  232. package/lib/__tests__/process.test.js +10 -5
  233. package/lib/__tests__/sandboxSync.test.js +8 -8
  234. package/lib/__tests__/sandboxes.test.js +8 -8
  235. package/lib/__tests__/serverlessLogs.test.js +1 -1
  236. package/lib/__tests__/usageTracking.test.js +5 -5
  237. package/lib/__tests__/validation.test.js +2 -1
  238. package/lib/__tests__/yargsUtils.test.js +83 -9
  239. package/lib/app/__tests__/migrate.test.js +5 -5
  240. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  241. package/lib/app/migrate.js +1 -1
  242. package/lib/app/migrate_legacy.js +20 -24
  243. package/lib/buildAccount.d.ts +2 -2
  244. package/lib/buildAccount.js +32 -64
  245. package/lib/commonOpts.d.ts +1 -1
  246. package/lib/commonOpts.js +25 -22
  247. package/lib/configMigrate.js +88 -9
  248. package/lib/configOptions.js +7 -0
  249. package/lib/constants.d.ts +15 -1
  250. package/lib/constants.js +19 -1
  251. package/lib/dependencyManagement.js +9 -27
  252. package/lib/developerTestAccounts.js +9 -23
  253. package/lib/doctor/Diagnosis.js +11 -23
  254. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  255. package/lib/doctor/Doctor.js +42 -90
  256. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  257. package/lib/errorHandlers/index.js +12 -20
  258. package/lib/errorHandlers/suppressError.js +11 -18
  259. package/lib/generateSelectors.js +1 -1
  260. package/lib/lang.js +6 -5
  261. package/lib/links.js +4 -4
  262. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  263. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  264. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  265. package/lib/middleware/autoUpdateMiddleware.d.ts +2 -1
  266. package/lib/middleware/autoUpdateMiddleware.js +12 -2
  267. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  268. package/lib/middleware/commandTargetingUtils.js +74 -0
  269. package/lib/middleware/configMiddleware.d.ts +1 -1
  270. package/lib/middleware/configMiddleware.js +21 -81
  271. package/lib/middleware/gitMiddleware.js +5 -1
  272. package/lib/middleware/notificationsMiddleware.js +5 -11
  273. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  274. package/lib/npm.js +2 -2
  275. package/lib/oauth.js +5 -5
  276. package/lib/process.js +5 -4
  277. package/lib/projectProfiles.d.ts +1 -1
  278. package/lib/projectProfiles.js +2 -10
  279. package/lib/projects/__tests__/AppDevModeInterface.test.js +101 -135
  280. package/lib/projects/__tests__/DevServerManager.test.js +183 -0
  281. package/lib/projects/__tests__/LocalDevProcess.test.js +6 -5
  282. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +76 -45
  283. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +1 -0
  284. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +161 -0
  285. package/lib/projects/__tests__/deploy.test.js +9 -9
  286. package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
  287. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  288. package/lib/projects/__tests__/projects.test.js +12 -12
  289. package/lib/projects/__tests__/structure.test.js +3 -3
  290. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  291. package/lib/projects/__tests__/upload.test.js +82 -0
  292. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  293. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
  294. package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +39 -39
  295. package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
  296. package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
  297. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  298. package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
  299. package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +3 -3
  300. package/lib/projects/create/index.js +4 -4
  301. package/lib/projects/create/legacy.js +2 -2
  302. package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
  303. package/lib/projects/create/{v3.js → v2.js} +5 -5
  304. package/lib/projects/deploy.d.ts +1 -1
  305. package/lib/projects/deploy.js +2 -2
  306. package/lib/projects/localDev/AppDevModeInterface.d.ts +11 -3
  307. package/lib/projects/localDev/AppDevModeInterface.js +128 -115
  308. package/lib/projects/localDev/DevServerManager.d.ts +10 -29
  309. package/lib/projects/localDev/DevServerManager.js +20 -76
  310. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
  311. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
  312. package/lib/projects/localDev/LocalDevLogger.js +10 -11
  313. package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +10 -11
  314. package/lib/projects/localDev/LocalDevProcess.js +3 -2
  315. package/lib/projects/localDev/LocalDevState.d.ts +3 -0
  316. package/lib/projects/localDev/LocalDevState.js +9 -0
  317. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +4 -1
  318. package/lib/projects/localDev/LocalDevWebsocketServer.js +46 -16
  319. package/lib/projects/localDev/UIExtensionsDevModeInterface.d.ts +13 -0
  320. package/lib/projects/localDev/UIExtensionsDevModeInterface.js +37 -0
  321. package/lib/projects/localDev/helpers/account.d.ts +1 -1
  322. package/lib/projects/localDev/helpers/account.js +2 -2
  323. package/lib/projects/localDev/helpers/process.d.ts +1 -0
  324. package/lib/projects/localDev/helpers/process.js +15 -0
  325. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  326. package/lib/projects/localDev/helpers/project.js +39 -3
  327. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +3 -0
  328. package/lib/projects/localDev/localDevWebsocketServerUtils.js +9 -0
  329. package/lib/projects/platformVersion.d.ts +1 -1
  330. package/lib/projects/platformVersion.js +1 -1
  331. package/lib/projects/structure.d.ts +2 -2
  332. package/lib/projects/structure.js +6 -6
  333. package/lib/projects/upload.d.ts +2 -3
  334. package/lib/projects/upload.js +17 -9
  335. package/lib/projects/urls.d.ts +0 -1
  336. package/lib/projects/urls.js +0 -3
  337. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  338. package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
  339. package/lib/prompts/accountNamePrompt.js +14 -19
  340. package/lib/prompts/accountsPrompt.js +2 -2
  341. package/lib/prompts/cmsFieldPrompt.js +2 -2
  342. package/lib/prompts/createApiSamplePrompt.js +5 -5
  343. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  344. package/lib/prompts/createFunctionPrompt.js +14 -14
  345. package/lib/prompts/createModulePrompt.js +9 -9
  346. package/lib/prompts/createTemplatePrompt.js +2 -2
  347. package/lib/prompts/downloadProjectPrompt.js +5 -8
  348. package/lib/prompts/installAppPrompt.d.ts +1 -6
  349. package/lib/prompts/installAppPrompt.js +1 -6
  350. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  351. package/lib/prompts/previewPrompt.js +6 -6
  352. package/lib/prompts/projectAddPrompt.d.ts +2 -2
  353. package/lib/prompts/projectAddPrompt.js +7 -1
  354. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  355. package/lib/prompts/projectNamePrompt.js +4 -8
  356. package/lib/prompts/projectsLogsPrompt.js +2 -4
  357. package/lib/prompts/promptUtils.js +27 -9
  358. package/lib/prompts/sandboxesPrompt.js +7 -7
  359. package/lib/prompts/secretPrompt.js +3 -3
  360. package/lib/prompts/selectAppPrompt.js +3 -3
  361. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  362. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  363. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  364. package/lib/prompts/uploadPrompt.js +5 -5
  365. package/lib/sandboxSync.js +24 -41
  366. package/lib/sandboxes.js +19 -47
  367. package/lib/schema.js +3 -3
  368. package/lib/serverlessLogs.js +11 -13
  369. package/lib/theme/__tests__/migrate.test.js +6 -6
  370. package/lib/theme/migrate.js +2 -2
  371. package/lib/ui/SpinniesManager.d.ts +2 -0
  372. package/lib/ui/SpinniesManager.js +7 -0
  373. package/lib/ui/boxen.js +1 -2
  374. package/lib/ui/git.js +13 -10
  375. package/lib/ui/index.d.ts +6 -0
  376. package/lib/ui/index.js +55 -38
  377. package/lib/ui/serverlessFunctionLogs.js +9 -7
  378. package/lib/ui/uiMessages.d.ts +73 -0
  379. package/lib/ui/uiMessages.js +76 -0
  380. package/lib/usageTracking.js +7 -7
  381. package/lib/validation.js +20 -23
  382. package/lib/yargsUtils.d.ts +1 -1
  383. package/lib/yargsUtils.js +12 -5
  384. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -4
  385. package/mcp-server/tools/index.js +4 -0
  386. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  387. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  388. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  389. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  390. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
  391. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  392. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +1 -1
  393. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  394. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  395. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  396. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  397. package/mcp-server/utils/toolUsageTracking.js +2 -2
  398. package/package.json +8 -7
  399. package/types/Cms.d.ts +6 -6
  400. package/types/Yargs.d.ts +1 -1
  401. package/commands/app/__tests__/install.test.js +0 -47
  402. package/commands/app/install.d.ts +0 -8
  403. package/commands/app/install.js +0 -122
  404. package/lib/middleware/__test__/utils.test.js +0 -51
  405. package/lib/middleware/utils.d.ts +0 -8
  406. package/lib/middleware/utils.js +0 -14
  407. package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
  408. package/lib/projects/localDev/DevServerManagerV2.js +0 -81
  409. /package/commands/{customObject/schema → cms}/__tests__/delete.test.d.ts +0 -0
  410. /package/commands/{__tests__ → cms/__tests__}/fetch.test.d.ts +0 -0
  411. /package/commands/{__tests__ → cms/__tests__}/function.test.d.ts +0 -0
  412. /package/commands/{__tests__ → cms/__tests__}/lint.test.d.ts +0 -0
  413. /package/commands/{__tests__ → cms/__tests__}/list.test.d.ts +0 -0
  414. /package/commands/{__tests__ → cms/__tests__}/mv.test.d.ts +0 -0
  415. /package/commands/{__tests__ → cms/__tests__}/theme.test.d.ts +0 -0
  416. /package/commands/{__tests__ → cms/function/__tests__}/logs.test.d.ts +0 -0
  417. /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.d.ts +0 -0
  418. /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.js +0 -0
  419. /package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.d.ts +0 -0
  420. /package/commands/{theme → cms/theme}/__tests__/preview.test.d.ts +0 -0
  421. /package/commands/{__tests__/remove.test.d.ts → customObject/__tests__/createSchema.test.d.ts} +0 -0
  422. /package/commands/{app/__tests__/install.test.d.ts → customObject/__tests__/deleteSchema.test.d.ts} +0 -0
  423. /package/commands/customObject/{schema/__tests__/create.test.d.ts → __tests__/fetch-all-schemas.test.d.ts} +0 -0
  424. /package/commands/customObject/{schema/__tests__/fetch-all.test.d.ts → __tests__/fetchSchema.test.d.ts} +0 -0
  425. /package/commands/customObject/{schema/__tests__/fetch.test.d.ts → __tests__/listSchemas.test.d.ts} +0 -0
  426. /package/commands/customObject/{schema/__tests__/list.test.d.ts → __tests__/updateSchema.test.d.ts} +0 -0
  427. /package/commands/{customObject/schema/__tests__/update.test.d.ts → project/__tests__/list.test.d.ts} +0 -0
  428. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
  429. /package/{commands/create → lib/cmsAssets}/api-sample.d.ts +0 -0
  430. /package/{commands/create → lib/cmsAssets}/api-sample.js +0 -0
  431. /package/{commands/create → lib/cmsAssets}/app.d.ts +0 -0
  432. /package/{commands/create → lib/cmsAssets}/app.js +0 -0
  433. /package/{commands/create → lib/cmsAssets}/function.d.ts +0 -0
  434. /package/{commands/create → lib/cmsAssets}/function.js +0 -0
  435. /package/{commands/create → lib/cmsAssets}/index.d.ts +0 -0
  436. /package/{commands/create → lib/cmsAssets}/index.js +0 -0
  437. /package/{commands/create → lib/cmsAssets}/module.d.ts +0 -0
  438. /package/{commands/create → lib/cmsAssets}/module.js +0 -0
  439. /package/{commands/create → lib/cmsAssets}/react-app.d.ts +0 -0
  440. /package/{commands/create → lib/cmsAssets}/react-app.js +0 -0
  441. /package/{commands/create → lib/cmsAssets}/template.d.ts +0 -0
  442. /package/{commands/create → lib/cmsAssets}/template.js +0 -0
  443. /package/{commands/create → lib/cmsAssets}/vue-app.d.ts +0 -0
  444. /package/{commands/create → lib/cmsAssets}/vue-app.js +0 -0
  445. /package/{commands/create → lib/cmsAssets}/webpack-serverless.d.ts +0 -0
  446. /package/{commands/create → lib/cmsAssets}/webpack-serverless.js +0 -0
  447. /package/{commands/create → lib/cmsAssets}/website-theme.d.ts +0 -0
  448. /package/{commands/create → lib/cmsAssets}/website-theme.js +0 -0
  449. /package/lib/{projects/add/__tests__/v3AddComponent.test.d.ts → middleware/__test__/commandTargetingUtils.test.d.ts} +0 -0
  450. /package/lib/projects/{create/__tests__/v3.test.d.ts → __tests__/DevServerManager.test.d.ts} +0 -0
  451. /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
@@ -1,12 +1,12 @@
1
1
  import { WebSocketServer } from 'ws';
2
2
  import { isPortManagerServerRunning, requestPorts, } from '@hubspot/local-dev-lib/portManager';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
3
+ import { uiLogger } from '../../ui/logger.js';
4
4
  import { LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES, LOCAL_DEV_UI_MESSAGE_SEND_TYPES, LOCAL_DEV_SERVER_MESSAGE_TYPES, } from '../../constants.js';
5
5
  import LocalDevWebsocketServer from '../localDev/LocalDevWebsocketServer.js';
6
6
  import { lib } from '../../../lang/en.js';
7
7
  vi.mock('ws');
8
8
  vi.mock('@hubspot/local-dev-lib/portManager');
9
- vi.mock('@hubspot/local-dev-lib/logger');
9
+ vi.mock('../../ui/logger.js');
10
10
  describe('LocalDevWebsocketServer', () => {
11
11
  let mockLocalDevProcess;
12
12
  let mockWebSocket;
@@ -59,39 +59,68 @@ describe('LocalDevWebsocketServer', () => {
59
59
  await server.start();
60
60
  expect(WebSocketServer).toHaveBeenCalledWith({ port: 1234 });
61
61
  expect(mockWebSocketServer.on).toHaveBeenCalledWith('connection', expect.any(Function));
62
- expect(logger.log).toHaveBeenCalled();
62
+ expect(uiLogger.log).toHaveBeenCalled();
63
63
  });
64
- it('should accept connection from valid origin', async () => {
65
- isPortManagerServerRunning.mockResolvedValue(true);
66
- requestPorts.mockResolvedValue({
67
- 'local-dev-ui-websocket-server': 1234,
64
+ describe('valid origins', () => {
65
+ const validOrigins = [
66
+ 'https://app.hubspot.com',
67
+ 'https://app.hubspotqa.com',
68
+ 'https://local.hubspot.com',
69
+ 'https://local.hubspotqa.com',
70
+ 'https://app-na2.hubspot.com',
71
+ 'https://app-na2.hubspotqa.com',
72
+ 'https://app-na3.hubspot.com',
73
+ 'https://app-na3.hubspotqa.com',
74
+ 'https://app-ap1.hubspot.com',
75
+ 'https://app-ap1.hubspotqa.com',
76
+ 'https://app-eu1.hubspot.com',
77
+ 'https://app-eu1.hubspotqa.com',
78
+ ];
79
+ validOrigins.forEach(origin => {
80
+ it(`should accept connection from ${origin}`, async () => {
81
+ isPortManagerServerRunning.mockResolvedValue(true);
82
+ requestPorts.mockResolvedValue({
83
+ 'local-dev-ui-websocket-server': 1234,
84
+ });
85
+ await server.start();
86
+ // Get the connection callback
87
+ const connectionCallback = mockWebSocketServer.on.mock
88
+ .calls[0][1];
89
+ // Simulate connection from valid origin
90
+ connectionCallback(mockWebSocket, {
91
+ headers: { origin },
92
+ });
93
+ expect(mockWebSocket.on).toHaveBeenCalledWith('message', expect.any(Function));
94
+ expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledWith('projectNodes', expect.any(Function));
95
+ expect(mockWebSocket.close).not.toHaveBeenCalled();
96
+ });
68
97
  });
69
- await server.start();
70
- // Get the connection callback
71
- const connectionCallback = mockWebSocketServer.on.mock.calls[0][1];
72
- // Simulate connection from valid origin
73
- connectionCallback(mockWebSocket, {
74
- headers: { origin: 'https://app.hubspot.com' },
75
- });
76
- expect(mockWebSocket.on).toHaveBeenCalledWith('message', expect.any(Function));
77
- expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledWith('projectNodes', expect.any(Function));
78
- expect(mockWebSocket.close).not.toHaveBeenCalled();
79
98
  });
80
- it('should reject connection from invalid origin', async () => {
81
- isPortManagerServerRunning.mockResolvedValue(true);
82
- requestPorts.mockResolvedValue({
83
- 'local-dev-ui-websocket-server': 1234,
84
- });
85
- await server.start();
86
- // Get the connection callback
87
- const connectionCallback = mockWebSocketServer.on.mock.calls[0][1];
88
- // Simulate connection from invalid origin
89
- connectionCallback(mockWebSocket, {
90
- headers: { origin: 'https://malicious-site.com' },
99
+ describe('invalid origins', () => {
100
+ const invalidOrigins = [
101
+ 'https://malicious-site.com',
102
+ 'https://app.malicious-site.com',
103
+ 'https://app.hubspot.com.evil.com',
104
+ ];
105
+ invalidOrigins.forEach(origin => {
106
+ it(`should reject connection from "${origin}"`, async () => {
107
+ isPortManagerServerRunning.mockResolvedValue(true);
108
+ requestPorts.mockResolvedValue({
109
+ 'local-dev-ui-websocket-server': 1234,
110
+ });
111
+ await server.start();
112
+ // Get the connection callback
113
+ const connectionCallback = mockWebSocketServer.on.mock
114
+ .calls[0][1];
115
+ // Simulate connection from invalid origin
116
+ connectionCallback(mockWebSocket, {
117
+ headers: { origin },
118
+ });
119
+ expect(mockWebSocket.close).toHaveBeenCalledWith(1008, lib.LocalDevWebsocketServer.errors.originNotAllowed(origin));
120
+ expect(mockWebSocket.on).not.toHaveBeenCalled();
121
+ expect(mockLocalDevProcess.addStateListener).not.toHaveBeenCalled();
122
+ });
91
123
  });
92
- expect(mockWebSocket.close).toHaveBeenCalledWith(1008, lib.LocalDevWebsocketServer.errors.originNotAllowed('https://malicious-site.com'));
93
- expect(mockWebSocket.on).not.toHaveBeenCalled();
94
- expect(mockLocalDevProcess.addStateListener).not.toHaveBeenCalled();
95
124
  });
96
125
  it('should reject connection with no origin header', async () => {
97
126
  isPortManagerServerRunning.mockResolvedValue(true);
@@ -119,7 +148,7 @@ describe('LocalDevWebsocketServer', () => {
119
148
  const connectionCallback = mockWebSocketServer.on.mock.calls[0][1];
120
149
  // Simulate connection from valid origin
121
150
  connectionCallback(mockWebSocket, {
122
- headers: { origin: 'https://app.hubspot.com' },
151
+ headers: { origin: 'https://app-na3.hubspot.com' },
123
152
  });
124
153
  expect(mockLocalDevProcess.sendDevServerMessage).toHaveBeenCalledWith(LOCAL_DEV_SERVER_MESSAGE_TYPES.WEBSOCKET_SERVER_CONNECTED);
125
154
  });
@@ -148,7 +177,7 @@ describe('LocalDevWebsocketServer', () => {
148
177
  const messageCallback = mockWebSocket.on.mock.calls[0][1];
149
178
  const message = {};
150
179
  messageCallback(JSON.stringify(message));
151
- expect(logger.error).toHaveBeenCalled();
180
+ expect(uiLogger.error).toHaveBeenCalled();
152
181
  });
153
182
  it('should log error for unknown message type', () => {
154
183
  const messageCallback = mockWebSocket.on.mock.calls[0][1];
@@ -156,13 +185,13 @@ describe('LocalDevWebsocketServer', () => {
156
185
  type: 'UNKNOWN_TYPE',
157
186
  };
158
187
  messageCallback(JSON.stringify(message));
159
- expect(logger.error).toHaveBeenCalled();
188
+ expect(uiLogger.error).toHaveBeenCalled();
160
189
  });
161
190
  it('should log error for invalid JSON', () => {
162
191
  const messageCallback = mockWebSocket.on.mock.calls[0][1];
163
192
  const invalidJson = 'invalid json';
164
193
  messageCallback(invalidJson);
165
- expect(logger.error).toHaveBeenCalled();
194
+ expect(uiLogger.error).toHaveBeenCalled();
166
195
  });
167
196
  });
168
197
  describe('shutdown()', () => {
@@ -213,7 +242,7 @@ describe('LocalDevWebsocketServer', () => {
213
242
  headers: { origin: 'https://app.hubspot.com' },
214
243
  });
215
244
  connectionCallback(mockWebSocket2, {
216
- headers: { origin: 'https://app.hubspotqa.com' },
245
+ headers: { origin: 'https://app-na2.hubspotqa.com' },
217
246
  });
218
247
  connectionCallback(mockWebSocket3, {
219
248
  headers: { origin: 'https://local.hubspot.com' },
@@ -223,7 +252,7 @@ describe('LocalDevWebsocketServer', () => {
223
252
  expect(mockWebSocket2.on).toHaveBeenCalledWith('message', expect.any(Function));
224
253
  expect(mockWebSocket3.on).toHaveBeenCalledWith('message', expect.any(Function));
225
254
  // Each connection should trigger state listener setup
226
- expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledTimes(9); // 3 listeners per connection * 3 connections
255
+ expect(mockLocalDevProcess.addStateListener).toHaveBeenCalledTimes(12); // 4 listeners per connection * 3 connections
227
256
  // Each connection should trigger dev server message
228
257
  expect(mockLocalDevProcess.sendDevServerMessage).toHaveBeenCalledTimes(3);
229
258
  expect(mockLocalDevProcess.sendDevServerMessage).toHaveBeenCalledWith(LOCAL_DEV_SERVER_MESSAGE_TYPES.WEBSOCKET_SERVER_CONNECTED);
@@ -238,7 +267,7 @@ describe('LocalDevWebsocketServer', () => {
238
267
  headers: { origin: 'https://app.hubspot.com' },
239
268
  });
240
269
  connectionCallback(mockWebSocket2, {
241
- headers: { origin: 'https://app.hubspotqa.com' },
270
+ headers: { origin: 'https://app-eu1.hubspotqa.com' },
242
271
  });
243
272
  // Each websocket should receive project data
244
273
  expect(mockWebSocket1.send).toHaveBeenCalledWith(JSON.stringify({
@@ -270,7 +299,7 @@ describe('LocalDevWebsocketServer', () => {
270
299
  headers: { origin: 'https://app.hubspot.com' },
271
300
  });
272
301
  connectionCallback(mockWebSocket2, {
273
- headers: { origin: 'https://app.hubspotqa.com' },
302
+ headers: { origin: 'https://app-ap1.hubspotqa.com' },
274
303
  });
275
304
  // Get all the close callbacks for both connections (there should be 2 per connection)
276
305
  const closeCallbacks1 = mockWebSocket1.on.mock.calls
@@ -279,16 +308,16 @@ describe('LocalDevWebsocketServer', () => {
279
308
  const closeCallbacks2 = mockWebSocket2.on.mock.calls
280
309
  .filter(call => call[0] === 'close')
281
310
  .map(call => call[1]);
282
- expect(closeCallbacks1).toHaveLength(3); // projectNodes, appData, and uploadWarnings listeners
283
- expect(closeCallbacks2).toHaveLength(3); // projectNodes, appData, and uploadWarnings listeners
311
+ expect(closeCallbacks1).toHaveLength(4); // projectNodes, appData, devServersStarted, and uploadWarnings listeners
312
+ expect(closeCallbacks2).toHaveLength(4); // projectNodes, appData, devServersStarted, and uploadWarnings listeners
284
313
  // Simulate first connection closing (call all close callbacks)
285
314
  closeCallbacks1.forEach(callback => callback());
286
- // Should have removed listeners for first connection (3 listeners: projectNodes, appData, and uploadWarnings)
287
- expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(3);
315
+ // Should have removed listeners for first connection (4 listeners: projectNodes, appData, devServersStarted, and uploadWarnings)
316
+ expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(4);
288
317
  // Simulate second connection closing
289
318
  closeCallbacks2.forEach(callback => callback());
290
319
  // Should have removed listeners for second connection as well
291
- expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(6);
320
+ expect(mockLocalDevProcess.removeStateListener).toHaveBeenCalledTimes(8);
292
321
  });
293
322
  it('should broadcast state changes to all connected clients', () => {
294
323
  // Establish connections
@@ -296,7 +325,7 @@ describe('LocalDevWebsocketServer', () => {
296
325
  headers: { origin: 'https://app.hubspot.com' },
297
326
  });
298
327
  connectionCallback(mockWebSocket2, {
299
- headers: { origin: 'https://app.hubspotqa.com' },
328
+ headers: { origin: 'https://local.hubspotqa.com' },
300
329
  });
301
330
  // Get the projectNodes listeners that were registered
302
331
  const projectNodesListeners = mockLocalDevProcess.addStateListener.mock.calls
@@ -312,6 +341,8 @@ describe('LocalDevWebsocketServer', () => {
312
341
  componentRoot: '/test/path',
313
342
  componentConfigPath: '/test/path/config.json',
314
343
  configUpdatedSinceLastUpload: false,
344
+ removed: false,
345
+ parsingErrors: [],
315
346
  },
316
347
  componentDeps: {},
317
348
  metaFilePath: '/test/path',
@@ -0,0 +1,161 @@
1
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
2
+ import UIExtensionsDevModeInterface from '../localDev/UIExtensionsDevModeInterface.js';
3
+ import LocalDevState from '../localDev/LocalDevState.js';
4
+ import { DevModeUnifiedInterface } from '@hubspot/ui-extensions-dev-server';
5
+ import { requestPorts } from '@hubspot/local-dev-lib/portManager';
6
+ import { logger } from '@hubspot/local-dev-lib/logger';
7
+ import { getHubSpotApiOrigin, getHubSpotWebsiteOrigin, } from '@hubspot/local-dev-lib/urls';
8
+ import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
9
+ vi.mock('@hubspot/ui-extensions-dev-server', () => ({
10
+ DevModeUnifiedInterface: {
11
+ setup: vi.fn().mockResolvedValue(undefined),
12
+ start: vi.fn().mockResolvedValue(undefined),
13
+ fileChange: vi.fn().mockResolvedValue(undefined),
14
+ cleanup: vi.fn().mockResolvedValue(undefined),
15
+ },
16
+ }));
17
+ vi.mock('@hubspot/local-dev-lib/portManager', () => ({
18
+ requestPorts: vi.fn().mockResolvedValue({ 'test-port': 8080 }),
19
+ }));
20
+ vi.mock('@hubspot/local-dev-lib/urls', () => ({
21
+ getHubSpotApiOrigin: vi.fn().mockReturnValue('https://api.hubspot.com'),
22
+ getHubSpotWebsiteOrigin: vi.fn().mockReturnValue('https://app.hubspot.com'),
23
+ }));
24
+ describe('UIExtensionsDevModeInterface', () => {
25
+ let uiExtensionsInterface;
26
+ let mockLocalDevState;
27
+ beforeEach(() => {
28
+ vi.clearAllMocks();
29
+ vi.mocked(DevModeUnifiedInterface.setup).mockResolvedValue(undefined);
30
+ vi.mocked(DevModeUnifiedInterface.start).mockResolvedValue(undefined);
31
+ vi.mocked(DevModeUnifiedInterface.fileChange).mockResolvedValue(undefined);
32
+ vi.mocked(DevModeUnifiedInterface.cleanup).mockResolvedValue(undefined);
33
+ mockLocalDevState = new LocalDevState({
34
+ targetProjectAccountId: 123,
35
+ targetTestingAccountId: 456,
36
+ projectConfig: {
37
+ name: 'test-ui-extensions-project',
38
+ srcDir: 'src',
39
+ platformVersion: '1.0.0',
40
+ },
41
+ projectDir: '/test/ui-extensions-project',
42
+ projectData: {
43
+ name: 'test-ui-extensions-project',
44
+ id: 789,
45
+ createdAt: Date.now(),
46
+ deletedAt: 0,
47
+ isLocked: false,
48
+ portalId: 123,
49
+ updatedAt: Date.now(),
50
+ },
51
+ debug: false,
52
+ initialProjectNodes: {
53
+ 'test-component': {
54
+ uid: 'test-component-uid',
55
+ componentType: 'UI_EXTENSION',
56
+ config: {
57
+ name: 'Test UI Extension',
58
+ type: 'card',
59
+ },
60
+ localDev: {
61
+ componentRoot: '/test/path',
62
+ componentConfigPath: '/test/path/config.json',
63
+ configUpdatedSinceLastUpload: false,
64
+ removed: false,
65
+ parsingErrors: [],
66
+ },
67
+ componentDeps: {},
68
+ metaFilePath: '/test/path',
69
+ files: [],
70
+ },
71
+ },
72
+ initialProjectProfileData: {
73
+ testVariable: 'testValue',
74
+ },
75
+ profile: 'test',
76
+ env: ENVIRONMENTS.QA,
77
+ });
78
+ uiExtensionsInterface = new UIExtensionsDevModeInterface({
79
+ localDevState: mockLocalDevState,
80
+ });
81
+ });
82
+ describe('constructor', () => {
83
+ it('should store the localDevState reference', () => {
84
+ expect(uiExtensionsInterface.localDevState).toBe(mockLocalDevState);
85
+ });
86
+ });
87
+ describe('setup', () => {
88
+ it('should call DevModeUnifiedInterface.setup with correct parameters', async () => {
89
+ await uiExtensionsInterface.setup();
90
+ expect(DevModeUnifiedInterface.setup).toHaveBeenCalledWith({
91
+ components: mockLocalDevState.projectNodes,
92
+ profileData: mockLocalDevState.projectProfileData,
93
+ logger,
94
+ urls: {
95
+ api: 'https://api.hubspot.com',
96
+ web: 'https://app.hubspot.com',
97
+ },
98
+ });
99
+ });
100
+ it('should use correct URLs based on environment', async () => {
101
+ await uiExtensionsInterface.setup();
102
+ expect(getHubSpotApiOrigin).toHaveBeenCalledWith(mockLocalDevState.env);
103
+ expect(getHubSpotWebsiteOrigin).toHaveBeenCalledWith(mockLocalDevState.env);
104
+ });
105
+ it('should pass project nodes and profile data from state', async () => {
106
+ await uiExtensionsInterface.setup();
107
+ const setupCall = vi.mocked(DevModeUnifiedInterface.setup).mock
108
+ .calls[0][0];
109
+ expect(setupCall.components).toStrictEqual(mockLocalDevState.projectNodes);
110
+ expect(setupCall.profileData).toStrictEqual(mockLocalDevState.projectProfileData);
111
+ });
112
+ });
113
+ describe('start', () => {
114
+ it('should call DevModeUnifiedInterface.start with correct parameters', async () => {
115
+ await uiExtensionsInterface.start();
116
+ expect(DevModeUnifiedInterface.start).toHaveBeenCalledWith({
117
+ accountId: mockLocalDevState.targetTestingAccountId,
118
+ projectConfig: mockLocalDevState.projectConfig,
119
+ requestPorts,
120
+ });
121
+ });
122
+ it('should use targetTestingAccountId from state', async () => {
123
+ await uiExtensionsInterface.start();
124
+ const startCall = vi.mocked(DevModeUnifiedInterface.start).mock
125
+ .calls[0][0];
126
+ expect(startCall.accountId).toBe(456); // targetTestingAccountId
127
+ });
128
+ it('should pass project config from state', async () => {
129
+ await uiExtensionsInterface.start();
130
+ const startCall = vi.mocked(DevModeUnifiedInterface.start).mock
131
+ .calls[0][0];
132
+ expect(startCall.projectConfig).toStrictEqual(mockLocalDevState.projectConfig);
133
+ });
134
+ });
135
+ describe('fileChange', () => {
136
+ it('should call DevModeUnifiedInterface.fileChange with correct parameters', async () => {
137
+ const filePath = 'src/components/TestCard.tsx';
138
+ const event = 'change';
139
+ await uiExtensionsInterface.fileChange(filePath, event);
140
+ expect(DevModeUnifiedInterface.fileChange).toHaveBeenCalledWith(filePath, event);
141
+ });
142
+ it('should handle different file events', async () => {
143
+ const testCases = [
144
+ { filePath: 'src/components/Card.tsx', event: 'add' },
145
+ { filePath: 'src/styles/main.css', event: 'change' },
146
+ { filePath: 'src/config.json', event: 'unlink' },
147
+ ];
148
+ for (const testCase of testCases) {
149
+ await uiExtensionsInterface.fileChange(testCase.filePath, testCase.event);
150
+ expect(DevModeUnifiedInterface.fileChange).toHaveBeenCalledWith(testCase.filePath, testCase.event);
151
+ }
152
+ expect(DevModeUnifiedInterface.fileChange).toHaveBeenCalledTimes(3);
153
+ });
154
+ });
155
+ describe('cleanup', () => {
156
+ it('should call DevModeUnifiedInterface.cleanup', async () => {
157
+ await uiExtensionsInterface.cleanup();
158
+ expect(DevModeUnifiedInterface.cleanup).toHaveBeenCalledWith();
159
+ });
160
+ });
161
+ });
@@ -99,7 +99,7 @@ describe('lib/projects/deploy', () => {
99
99
  const targetAccountId = 12345;
100
100
  const projectName = 'test-project';
101
101
  const buildId = 5;
102
- const useV3Api = true;
102
+ const useV2Api = true;
103
103
  const force = false;
104
104
  it('successfully deploys and returns deploy result', async () => {
105
105
  const mockDeployResponseData = {
@@ -126,8 +126,8 @@ describe('lib/projects/deploy', () => {
126
126
  data: mockDeployResponseData,
127
127
  });
128
128
  mockPollDeployStatus.mockResolvedValue(mockDeployResult);
129
- const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV3Api, force);
130
- expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, useV3Api, force);
129
+ const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
130
+ expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, useV2Api, force);
131
131
  expect(deploy).toEqual(mockDeployResult);
132
132
  });
133
133
  it('handles blocked deploy with warnings', async () => {
@@ -150,7 +150,7 @@ describe('lib/projects/deploy', () => {
150
150
  mockDeployProject.mockResolvedValue({
151
151
  data: mockBlockedResponse,
152
152
  });
153
- await handleProjectDeploy(targetAccountId, projectName, buildId, useV3Api, force);
153
+ await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
154
154
  expect(mockUiLogger.warn).toHaveBeenCalledWith(commands.project.deploy.errors.deployWarningsHeader);
155
155
  });
156
156
  it('handles blocked deploy with errors (cannot be forced)', async () => {
@@ -173,7 +173,7 @@ describe('lib/projects/deploy', () => {
173
173
  mockDeployProject.mockResolvedValue({
174
174
  data: mockBlockedResponse,
175
175
  });
176
- await handleProjectDeploy(targetAccountId, projectName, buildId, useV3Api, force);
176
+ await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
177
177
  expect(mockUiLogger.error).toHaveBeenCalledWith(commands.project.deploy.errors.deployBlockedHeader);
178
178
  expect(mockUiLogger.log).toHaveBeenCalledWith(commands.project.deploy.errors.deployIssueComponentWarning('component-1', 'module', 'This is an error'));
179
179
  });
@@ -192,19 +192,19 @@ describe('lib/projects/deploy', () => {
192
192
  mockDeployProject.mockResolvedValue({
193
193
  data: mockBlockedResponse,
194
194
  });
195
- await handleProjectDeploy(targetAccountId, projectName, buildId, useV3Api, force);
195
+ await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
196
196
  expect(mockUiLogger.warn).toHaveBeenCalledWith(commands.project.deploy.errors.deployWarningsHeader);
197
197
  expect(mockUiLogger.log).toHaveBeenCalledWith(commands.project.deploy.errors.deployIssueComponentGeneric('component-1', 'module'));
198
198
  });
199
199
  it('handles general deploy failure', async () => {
200
200
  mockDeployProject.mockResolvedValue({ data: null });
201
- const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV3Api, force);
201
+ const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
202
202
  expect(mockUiLogger.error).toHaveBeenCalledWith(commands.project.deploy.errors.deploy);
203
203
  expect(deploy).toBeUndefined();
204
204
  });
205
205
  it('handles undefined deploy response', async () => {
206
206
  mockDeployProject.mockResolvedValue({ data: undefined });
207
- const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV3Api, force);
207
+ const deploy = await handleProjectDeploy(targetAccountId, projectName, buildId, useV2Api, force);
208
208
  expect(mockUiLogger.error).toHaveBeenCalledWith(commands.project.deploy.errors.deploy);
209
209
  expect(deploy).toBeUndefined();
210
210
  });
@@ -221,7 +221,7 @@ describe('lib/projects/deploy', () => {
221
221
  });
222
222
  mockPollDeployStatus.mockResolvedValue({});
223
223
  await handleProjectDeploy(targetAccountId, projectName, buildId, false, true);
224
- expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, false, // useV3Api
224
+ expect(mockDeployProject).toHaveBeenCalledWith(targetAccountId, projectName, buildId, false, // useV2Api
225
225
  true // force
226
226
  );
227
227
  });
@@ -30,6 +30,8 @@ describe('isDeployedProjectUpToDateWithLocal', () => {
30
30
  componentRoot: '/local/path',
31
31
  componentConfigPath: '/local/path/config.json',
32
32
  configUpdatedSinceLastUpload: false,
33
+ removed: false,
34
+ parsingErrors: [],
33
35
  },
34
36
  componentDeps: {},
35
37
  metaFilePath: '/local/path',
@@ -1,23 +1,23 @@
1
- import { useV3Api } from '../platformVersion.js';
1
+ import { isV2Project } from '../platformVersion.js';
2
2
  describe('platformVersion', () => {
3
- describe('useV3Api', () => {
3
+ describe('isV2Project', () => {
4
4
  it('returns true if platform version is UNSTABLE', () => {
5
- expect(useV3Api('UNSTABLE')).toBe(true);
5
+ expect(isV2Project('UNSTABLE')).toBe(true);
6
6
  });
7
7
  it('returns true if platform version is equal to the minimum', () => {
8
- expect(useV3Api('2025.2')).toBe(true);
8
+ expect(isV2Project('2025.2')).toBe(true);
9
9
  });
10
10
  it('returns true if platform version is greater than the minimum', () => {
11
- expect(useV3Api('2026.2')).toBe(true);
11
+ expect(isV2Project('2026.2')).toBe(true);
12
12
  });
13
13
  it('returns false if platform version is less than the minimum', () => {
14
- expect(useV3Api('2025.0')).toBe(false);
14
+ expect(isV2Project('2025.0')).toBe(false);
15
15
  });
16
16
  it('returns false if platform version is invalid', () => {
17
- expect(useV3Api(null)).toBe(false);
17
+ expect(isV2Project(null)).toBe(false);
18
18
  });
19
19
  it('returns false for an invalid platform version', () => {
20
- expect(useV3Api('notplaformversion')).toBe(false);
20
+ expect(isV2Project('notplaformversion')).toBe(false);
21
21
  });
22
22
  });
23
23
  });
@@ -3,8 +3,8 @@ import os from 'os';
3
3
  import path from 'path';
4
4
  import { EXIT_CODES } from '../../enums/exitCodes.js';
5
5
  import { validateProjectConfig } from '../../projects/config.js';
6
- import { logger } from '@hubspot/local-dev-lib/logger';
7
- vi.mock('@hubspot/local-dev-lib/logger');
6
+ import { uiLogger } from '../../ui/logger.js';
7
+ vi.mock('../../ui/logger.js');
8
8
  describe('lib/projects', () => {
9
9
  describe('validateProjectConfig()', () => {
10
10
  let projectDir;
@@ -26,58 +26,58 @@ describe('lib/projects', () => {
26
26
  // @ts-ignore Testing invalid input
27
27
  validateProjectConfig(null, projectDir);
28
28
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
29
- expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*Unable to locate a project configuration file. Try running again from a project directory, or run*/));
29
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*Unable to locate a project configuration file. Try running again from a project directory, or run*/));
30
30
  });
31
31
  it('rejects configuration with missing name', () => {
32
32
  // @ts-ignore Testing invalid input
33
33
  validateProjectConfig({ srcDir: '.' }, projectDir);
34
34
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
35
- expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields*/));
35
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields*/));
36
36
  });
37
37
  it('rejects configuration with missing srcDir', () => {
38
38
  // @ts-ignore Testing invalid input
39
39
  validateProjectConfig({ name: 'hello' }, projectDir);
40
40
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
41
- expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields.*/));
41
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields.*/));
42
42
  });
43
43
  describe('rejects configuration with srcDir outside project directory', () => {
44
44
  it('for parent directory', () => {
45
45
  validateProjectConfig({ name: 'hello', srcDir: '..', platformVersion: '' }, projectDir);
46
46
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
47
- expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: ".."'));
47
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: ".."'));
48
48
  });
49
49
  it('for root directory', () => {
50
50
  validateProjectConfig({ name: 'hello', srcDir: '/', platformVersion: '' }, projectDir);
51
51
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
52
- expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: "/"'));
52
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: "/"'));
53
53
  });
54
54
  it('for complicated directory', () => {
55
55
  const srcDir = './src/././../src/../../src';
56
56
  validateProjectConfig({ name: 'hello', srcDir, platformVersion: '' }, projectDir);
57
57
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
58
- expect(logger.error).toHaveBeenCalledWith(expect.stringContaining(`srcDir: "${srcDir}"`));
58
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringContaining(`srcDir: "${srcDir}"`));
59
59
  });
60
60
  });
61
61
  it('rejects configuration with srcDir that does not exist', () => {
62
62
  validateProjectConfig({ name: 'hello', srcDir: 'foo', platformVersion: '' }, projectDir);
63
63
  expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
64
- expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*could not be found in.*/));
64
+ expect(uiLogger.error).toHaveBeenCalledWith(expect.stringMatching(/.*could not be found in.*/));
65
65
  });
66
66
  describe('accepts configuration with valid srcDir', () => {
67
67
  it('for current directory', () => {
68
68
  validateProjectConfig({ name: 'hello', srcDir: '.', platformVersion: '' }, projectDir);
69
69
  expect(exitMock).not.toHaveBeenCalled();
70
- expect(logger.error).not.toHaveBeenCalled();
70
+ expect(uiLogger.error).not.toHaveBeenCalled();
71
71
  });
72
72
  it('for relative directory', () => {
73
73
  validateProjectConfig({ name: 'hello', srcDir: './src', platformVersion: '' }, projectDir);
74
74
  expect(exitMock).not.toHaveBeenCalled();
75
- expect(logger.error).not.toHaveBeenCalled();
75
+ expect(uiLogger.error).not.toHaveBeenCalled();
76
76
  });
77
77
  it('for implied relative directory', () => {
78
78
  validateProjectConfig({ name: 'hello', srcDir: 'src', platformVersion: '' }, projectDir);
79
79
  expect(exitMock).not.toHaveBeenCalled();
80
- expect(logger.error).not.toHaveBeenCalled();
80
+ expect(uiLogger.error).not.toHaveBeenCalled();
81
81
  });
82
82
  });
83
83
  });
@@ -1,11 +1,11 @@
1
1
  import fs from 'fs';
2
2
  import * as HSfs from '@hubspot/local-dev-lib/fs';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
3
+ import { uiLogger } from '../../ui/logger.js';
4
4
  import { getComponentTypeFromConfigFile, loadConfigFile, getAppCardConfigs, getIsLegacyApp, componentIsApp, findProjectComponents, getProjectComponentTypes, getComponentUid, componentIsPublicApp, } from '../structure.js';
5
5
  import { ComponentTypes } from '../../../types/Projects.js';
6
6
  vi.mock('fs');
7
7
  vi.mock('@hubspot/local-dev-lib/fs');
8
- vi.mock('@hubspot/local-dev-lib/logger');
8
+ vi.mock('../../ui/logger.js');
9
9
  const mockedReadFileSync = fs.readFileSync;
10
10
  const mockedWalk = HSfs.walk;
11
11
  const getMockPrivateAppConfig = (cards = []) => ({
@@ -46,7 +46,7 @@ describe('lib/projects/structure', () => {
46
46
  throw new Error('File not found');
47
47
  });
48
48
  expect(loadConfigFile('nonexistent/path/app.json')).toBeNull();
49
- expect(logger.debug).toHaveBeenCalled();
49
+ expect(uiLogger.debug).toHaveBeenCalled();
50
50
  });
51
51
  });
52
52
  describe('getAppCardConfigs()', () => {
@@ -0,0 +1 @@
1
+ export {};