@hubspot/cli 8.0.10-experimental.7 → 8.0.11-experimental.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/api/__tests__/migrate.test.d.ts +1 -0
  2. package/api/__tests__/migrate.test.js +199 -0
  3. package/commands/__tests__/account.test.d.ts +1 -0
  4. package/commands/__tests__/account.test.js +69 -0
  5. package/commands/__tests__/auth.test.d.ts +1 -0
  6. package/commands/__tests__/auth.test.js +43 -0
  7. package/commands/__tests__/cms.test.d.ts +1 -0
  8. package/commands/__tests__/cms.test.js +87 -0
  9. package/commands/__tests__/config.test.d.ts +1 -0
  10. package/commands/__tests__/config.test.js +44 -0
  11. package/commands/__tests__/customObject.test.d.ts +1 -0
  12. package/commands/__tests__/customObject.test.js +68 -0
  13. package/commands/__tests__/doctor.test.d.ts +1 -0
  14. package/commands/__tests__/doctor.test.js +132 -0
  15. package/commands/__tests__/feedback.test.d.ts +1 -0
  16. package/commands/__tests__/feedback.test.js +24 -0
  17. package/commands/__tests__/filemanager.test.d.ts +1 -0
  18. package/commands/__tests__/filemanager.test.js +45 -0
  19. package/commands/__tests__/getStarted.test.d.ts +1 -0
  20. package/commands/__tests__/getStarted.test.js +173 -0
  21. package/commands/__tests__/hubdb.test.d.ts +1 -0
  22. package/commands/__tests__/hubdb.test.js +50 -0
  23. package/commands/__tests__/init.test.d.ts +1 -0
  24. package/commands/__tests__/init.test.js +42 -0
  25. package/commands/__tests__/mcp.test.d.ts +1 -0
  26. package/commands/__tests__/mcp.test.js +46 -0
  27. package/commands/__tests__/open.test.d.ts +1 -0
  28. package/commands/__tests__/open.test.js +58 -0
  29. package/commands/__tests__/project.test.d.ts +1 -0
  30. package/commands/__tests__/project.test.js +125 -0
  31. package/commands/__tests__/sandbox.test.d.ts +1 -0
  32. package/commands/__tests__/sandbox.test.js +44 -0
  33. package/commands/__tests__/secret.test.d.ts +1 -0
  34. package/commands/__tests__/secret.test.js +49 -0
  35. package/commands/__tests__/testAccount.test.d.ts +1 -0
  36. package/commands/__tests__/testAccount.test.js +57 -0
  37. package/commands/__tests__/upgrade.test.d.ts +1 -0
  38. package/commands/__tests__/upgrade.test.js +309 -0
  39. package/commands/account/__tests__/auth.test.d.ts +1 -0
  40. package/commands/account/__tests__/auth.test.js +206 -0
  41. package/commands/account/__tests__/clean.test.d.ts +1 -0
  42. package/commands/account/__tests__/clean.test.js +28 -0
  43. package/commands/account/__tests__/createOverride.test.d.ts +1 -0
  44. package/commands/account/__tests__/createOverride.test.js +32 -0
  45. package/commands/account/__tests__/info.test.d.ts +1 -0
  46. package/commands/account/__tests__/info.test.js +28 -0
  47. package/commands/account/__tests__/list.test.d.ts +1 -0
  48. package/commands/account/__tests__/list.test.js +153 -0
  49. package/commands/account/__tests__/remove.test.d.ts +1 -0
  50. package/commands/account/__tests__/remove.test.js +36 -0
  51. package/commands/account/__tests__/removeOverride.d.ts +1 -0
  52. package/commands/account/__tests__/removeOverride.js +25 -0
  53. package/commands/account/__tests__/rename.test.d.ts +1 -0
  54. package/commands/account/__tests__/rename.test.js +82 -0
  55. package/commands/account/__tests__/use.test.d.ts +1 -0
  56. package/commands/account/__tests__/use.test.js +170 -0
  57. package/commands/app/__tests__/migrate.test.d.ts +1 -0
  58. package/commands/app/__tests__/migrate.test.js +111 -0
  59. package/commands/app/secret/__tests__/add.test.d.ts +1 -0
  60. package/commands/app/secret/__tests__/add.test.js +140 -0
  61. package/commands/app/secret/__tests__/delete.test.d.ts +1 -0
  62. package/commands/app/secret/__tests__/delete.test.js +28 -0
  63. package/commands/app/secret/__tests__/list.test.d.ts +1 -0
  64. package/commands/app/secret/__tests__/list.test.js +25 -0
  65. package/commands/app/secret/__tests__/update.test.d.ts +1 -0
  66. package/commands/app/secret/__tests__/update.test.js +28 -0
  67. package/commands/cms/__tests__/delete.test.d.ts +1 -0
  68. package/commands/cms/__tests__/delete.test.js +39 -0
  69. package/commands/cms/__tests__/fetch.test.d.ts +1 -0
  70. package/commands/cms/__tests__/fetch.test.js +156 -0
  71. package/commands/cms/__tests__/function.test.d.ts +1 -0
  72. package/commands/cms/__tests__/function.test.js +50 -0
  73. package/commands/cms/__tests__/lint.test.d.ts +1 -0
  74. package/commands/cms/__tests__/lint.test.js +33 -0
  75. package/commands/cms/__tests__/list.test.d.ts +1 -0
  76. package/commands/cms/__tests__/list.test.js +42 -0
  77. package/commands/cms/__tests__/module.test.d.ts +1 -0
  78. package/commands/cms/__tests__/module.test.js +45 -0
  79. package/commands/cms/__tests__/mv.test.d.ts +1 -0
  80. package/commands/cms/__tests__/mv.test.js +46 -0
  81. package/commands/cms/__tests__/theme.test.d.ts +1 -0
  82. package/commands/cms/__tests__/theme.test.js +54 -0
  83. package/commands/cms/__tests__/upload.test.d.ts +1 -0
  84. package/commands/cms/__tests__/upload.test.js +312 -0
  85. package/commands/cms/__tests__/watch.test.d.ts +1 -0
  86. package/commands/cms/__tests__/watch.test.js +204 -0
  87. package/commands/cms/function/__tests__/logs.test.d.ts +1 -0
  88. package/commands/cms/function/__tests__/logs.test.js +70 -0
  89. package/commands/cms/theme/__tests__/generate-selectors.test.d.ts +1 -0
  90. package/commands/cms/theme/__tests__/generate-selectors.test.js +28 -0
  91. package/commands/cms/theme/__tests__/marketplace-validate.test.d.ts +1 -0
  92. package/commands/cms/theme/__tests__/marketplace-validate.test.js +36 -0
  93. package/commands/cms/theme/__tests__/preview.test.d.ts +1 -0
  94. package/commands/cms/theme/__tests__/preview.test.js +54 -0
  95. package/commands/customObject/__tests__/create.test.d.ts +1 -0
  96. package/commands/customObject/__tests__/create.test.js +40 -0
  97. package/commands/customObject/__tests__/createSchema.test.d.ts +1 -0
  98. package/commands/customObject/__tests__/createSchema.test.js +28 -0
  99. package/commands/customObject/__tests__/deleteSchema.test.d.ts +1 -0
  100. package/commands/customObject/__tests__/deleteSchema.test.js +42 -0
  101. package/commands/customObject/__tests__/fetch-all-schemas.test.d.ts +1 -0
  102. package/commands/customObject/__tests__/fetch-all-schemas.test.js +41 -0
  103. package/commands/customObject/__tests__/fetchSchema.test.d.ts +1 -0
  104. package/commands/customObject/__tests__/fetchSchema.test.js +45 -0
  105. package/commands/customObject/__tests__/listSchemas.test.d.ts +1 -0
  106. package/commands/customObject/__tests__/listSchemas.test.js +29 -0
  107. package/commands/customObject/__tests__/updateSchema.test.d.ts +1 -0
  108. package/commands/customObject/__tests__/updateSchema.test.js +40 -0
  109. package/commands/filemanager/__tests__/fetch.test.d.ts +1 -0
  110. package/commands/filemanager/__tests__/fetch.test.js +32 -0
  111. package/commands/filemanager/__tests__/upload.test.d.ts +1 -0
  112. package/commands/filemanager/__tests__/upload.test.js +191 -0
  113. package/commands/hubdb/__tests__/clear.test.d.ts +1 -0
  114. package/commands/hubdb/__tests__/clear.test.js +28 -0
  115. package/commands/hubdb/__tests__/create.test.d.ts +1 -0
  116. package/commands/hubdb/__tests__/create.test.js +28 -0
  117. package/commands/hubdb/__tests__/delete.test.d.ts +1 -0
  118. package/commands/hubdb/__tests__/delete.test.js +28 -0
  119. package/commands/hubdb/__tests__/fetch.test.d.ts +1 -0
  120. package/commands/hubdb/__tests__/fetch.test.js +28 -0
  121. package/commands/hubdb/__tests__/list.test.d.ts +1 -0
  122. package/commands/hubdb/__tests__/list.test.js +88 -0
  123. package/commands/mcp/__tests__/setup.test.d.ts +1 -0
  124. package/commands/mcp/__tests__/setup.test.js +26 -0
  125. package/commands/mcp/__tests__/start.test.d.ts +1 -0
  126. package/commands/mcp/__tests__/start.test.js +144 -0
  127. package/commands/project/__tests__/add.test.d.ts +1 -0
  128. package/commands/project/__tests__/add.test.js +107 -0
  129. package/commands/project/__tests__/create.test.d.ts +1 -0
  130. package/commands/project/__tests__/create.test.js +97 -0
  131. package/commands/project/__tests__/deploy.test.d.ts +1 -0
  132. package/commands/project/__tests__/deploy.test.js +307 -0
  133. package/commands/project/__tests__/dev.test.d.ts +1 -0
  134. package/commands/project/__tests__/dev.test.js +273 -0
  135. package/commands/project/__tests__/devUnifiedFlow.test.d.ts +1 -0
  136. package/commands/project/__tests__/devUnifiedFlow.test.js +434 -0
  137. package/commands/project/__tests__/download.test.d.ts +1 -0
  138. package/commands/project/__tests__/download.test.js +39 -0
  139. package/commands/project/__tests__/info.test.d.ts +1 -0
  140. package/commands/project/__tests__/info.test.js +145 -0
  141. package/commands/project/__tests__/installDeps.test.d.ts +1 -0
  142. package/commands/project/__tests__/installDeps.test.js +140 -0
  143. package/commands/project/__tests__/lint.test.d.ts +1 -0
  144. package/commands/project/__tests__/lint.test.js +704 -0
  145. package/commands/project/__tests__/list.test.d.ts +1 -0
  146. package/commands/project/__tests__/list.test.js +31 -0
  147. package/commands/project/__tests__/listBuilds.test.d.ts +1 -0
  148. package/commands/project/__tests__/listBuilds.test.js +38 -0
  149. package/commands/project/__tests__/logs.test.d.ts +1 -0
  150. package/commands/project/__tests__/logs.test.js +202 -0
  151. package/commands/project/__tests__/migrate.test.d.ts +1 -0
  152. package/commands/project/__tests__/migrate.test.js +106 -0
  153. package/commands/project/__tests__/open.test.d.ts +1 -0
  154. package/commands/project/__tests__/open.test.js +39 -0
  155. package/commands/project/__tests__/profile.test.d.ts +1 -0
  156. package/commands/project/__tests__/profile.test.js +42 -0
  157. package/commands/project/__tests__/updateDeps.test.d.ts +1 -0
  158. package/commands/project/__tests__/updateDeps.test.js +140 -0
  159. package/commands/project/__tests__/upload.test.d.ts +1 -0
  160. package/commands/project/__tests__/upload.test.js +234 -0
  161. package/commands/project/__tests__/validate.test.d.ts +1 -0
  162. package/commands/project/__tests__/validate.test.js +381 -0
  163. package/commands/project/__tests__/watch.test.d.ts +1 -0
  164. package/commands/project/__tests__/watch.test.js +35 -0
  165. package/commands/project/info.d.ts +4 -0
  166. package/commands/project/info.js +67 -0
  167. package/commands/project.js +2 -0
  168. package/commands/sandbox/__tests__/create.test.d.ts +1 -0
  169. package/commands/sandbox/__tests__/create.test.js +198 -0
  170. package/commands/sandbox/__tests__/delete.test.d.ts +1 -0
  171. package/commands/sandbox/__tests__/delete.test.js +31 -0
  172. package/commands/secret/__tests__/addSecret.test.d.ts +1 -0
  173. package/commands/secret/__tests__/addSecret.test.js +162 -0
  174. package/commands/secret/__tests__/deleteSecret.test.d.ts +1 -0
  175. package/commands/secret/__tests__/deleteSecret.test.js +41 -0
  176. package/commands/secret/__tests__/listSecret.test.d.ts +1 -0
  177. package/commands/secret/__tests__/listSecret.test.js +29 -0
  178. package/commands/secret/__tests__/updateSecret.test.d.ts +1 -0
  179. package/commands/secret/__tests__/updateSecret.test.js +29 -0
  180. package/commands/testAccount/__tests__/create.test.d.ts +1 -0
  181. package/commands/testAccount/__tests__/create.test.js +106 -0
  182. package/commands/testAccount/__tests__/createConfig.test.d.ts +1 -0
  183. package/commands/testAccount/__tests__/createConfig.test.js +32 -0
  184. package/commands/testAccount/__tests__/delete.test.d.ts +1 -0
  185. package/commands/testAccount/__tests__/delete.test.js +29 -0
  186. package/commands/testAccount/__tests__/importData.test.d.ts +1 -0
  187. package/commands/testAccount/__tests__/importData.test.js +92 -0
  188. package/lang/en.d.ts +31 -0
  189. package/lang/en.js +31 -0
  190. package/lib/__tests__/CLIWebSocketServer.test.d.ts +1 -0
  191. package/lib/__tests__/CLIWebSocketServer.test.js +252 -0
  192. package/lib/__tests__/accountAuth.test.d.ts +1 -0
  193. package/lib/__tests__/accountAuth.test.js +258 -0
  194. package/lib/__tests__/accountTypes.test.d.ts +1 -0
  195. package/lib/__tests__/accountTypes.test.js +98 -0
  196. package/lib/__tests__/buildAccount.test.d.ts +1 -0
  197. package/lib/__tests__/buildAccount.test.js +211 -0
  198. package/lib/__tests__/cliUpgradeUtils.test.d.ts +1 -0
  199. package/lib/__tests__/cliUpgradeUtils.test.js +131 -0
  200. package/lib/__tests__/commandSuggestion.test.d.ts +1 -0
  201. package/lib/__tests__/commandSuggestion.test.js +121 -0
  202. package/lib/__tests__/commonOpts.test.d.ts +1 -0
  203. package/lib/__tests__/commonOpts.test.js +80 -0
  204. package/lib/__tests__/dependencyManagement.test.d.ts +1 -0
  205. package/lib/__tests__/dependencyManagement.test.js +1067 -0
  206. package/lib/__tests__/developerTestAccounts.test.d.ts +1 -0
  207. package/lib/__tests__/developerTestAccounts.test.js +156 -0
  208. package/lib/__tests__/hasFeature.test.d.ts +1 -0
  209. package/lib/__tests__/hasFeature.test.js +167 -0
  210. package/lib/__tests__/http.test.d.ts +1 -0
  211. package/lib/__tests__/http.test.js +40 -0
  212. package/lib/__tests__/importData.test.d.ts +1 -0
  213. package/lib/__tests__/importData.test.js +98 -0
  214. package/lib/__tests__/npmCli.test.d.ts +1 -0
  215. package/lib/__tests__/npmCli.test.js +84 -0
  216. package/lib/__tests__/oauth.test.d.ts +1 -0
  217. package/lib/__tests__/oauth.test.js +109 -0
  218. package/lib/__tests__/parsing.test.d.ts +1 -0
  219. package/lib/__tests__/parsing.test.js +34 -0
  220. package/lib/__tests__/polling.test.d.ts +1 -0
  221. package/lib/__tests__/polling.test.js +76 -0
  222. package/lib/__tests__/process.test.d.ts +1 -0
  223. package/lib/__tests__/process.test.js +89 -0
  224. package/lib/__tests__/sandboxes.test.d.ts +1 -0
  225. package/lib/__tests__/sandboxes.test.js +128 -0
  226. package/lib/__tests__/serverlessLogs.test.d.ts +1 -0
  227. package/lib/__tests__/serverlessLogs.test.js +163 -0
  228. package/lib/__tests__/usageTracking.test.d.ts +1 -0
  229. package/lib/__tests__/usageTracking.test.js +197 -0
  230. package/lib/__tests__/validation.test.d.ts +1 -0
  231. package/lib/__tests__/validation.test.js +143 -0
  232. package/lib/__tests__/yargsUtils.test.d.ts +1 -0
  233. package/lib/__tests__/yargsUtils.test.js +124 -0
  234. package/lib/app/__tests__/migrate.test.d.ts +1 -0
  235. package/lib/app/__tests__/migrate.test.js +638 -0
  236. package/lib/doctor/__tests__/Diagnosis.test.d.ts +1 -0
  237. package/lib/doctor/__tests__/Diagnosis.test.js +84 -0
  238. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.d.ts +1 -0
  239. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +177 -0
  240. package/lib/doctor/__tests__/Doctor.test.d.ts +1 -0
  241. package/lib/doctor/__tests__/Doctor.test.js +560 -0
  242. package/lib/errorHandlers/__tests__/index.test.d.ts +1 -0
  243. package/lib/errorHandlers/__tests__/index.test.js +278 -0
  244. package/lib/mcp/__tests__/setup.test.d.ts +1 -0
  245. package/lib/mcp/__tests__/setup.test.js +523 -0
  246. package/lib/middleware/__tests__/commandTargetingUtils.test.d.ts +1 -0
  247. package/lib/middleware/__tests__/commandTargetingUtils.test.js +99 -0
  248. package/lib/middleware/__tests__/configMiddleware.test.d.ts +1 -0
  249. package/lib/middleware/__tests__/configMiddleware.test.js +118 -0
  250. package/lib/middleware/__tests__/gitMiddleware.test.d.ts +1 -0
  251. package/lib/middleware/__tests__/gitMiddleware.test.js +43 -0
  252. package/lib/middleware/__tests__/requestMiddleware.test.d.ts +1 -0
  253. package/lib/middleware/__tests__/requestMiddleware.test.js +15 -0
  254. package/lib/middleware/__tests__/usageTrackingMiddleware.test.d.ts +1 -0
  255. package/lib/middleware/__tests__/usageTrackingMiddleware.test.js +44 -0
  256. package/lib/middleware/__tests__/yargsChecksMiddleware.test.d.ts +1 -0
  257. package/lib/middleware/__tests__/yargsChecksMiddleware.test.js +39 -0
  258. package/lib/projects/__tests__/AppDevModeInterface.test.d.ts +1 -0
  259. package/lib/projects/__tests__/AppDevModeInterface.test.js +541 -0
  260. package/lib/projects/__tests__/DevServerManager.test.d.ts +1 -0
  261. package/lib/projects/__tests__/DevServerManager.test.js +185 -0
  262. package/lib/projects/__tests__/DevSessionManager.test.d.ts +1 -0
  263. package/lib/projects/__tests__/DevSessionManager.test.js +250 -0
  264. package/lib/projects/__tests__/LocalDevProcess.test.d.ts +1 -0
  265. package/lib/projects/__tests__/LocalDevProcess.test.js +481 -0
  266. package/lib/projects/__tests__/LocalDevWebsocketServer.test.d.ts +1 -0
  267. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +231 -0
  268. package/lib/projects/__tests__/ProjectLogsManager.test.d.ts +1 -0
  269. package/lib/projects/__tests__/ProjectLogsManager.test.js +302 -0
  270. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +1 -0
  271. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +160 -0
  272. package/lib/projects/__tests__/components.test.d.ts +1 -0
  273. package/lib/projects/__tests__/components.test.js +440 -0
  274. package/lib/projects/__tests__/deploy.test.d.ts +1 -0
  275. package/lib/projects/__tests__/deploy.test.js +231 -0
  276. package/lib/projects/__tests__/localDevProjectHelpers.test.d.ts +1 -0
  277. package/lib/projects/__tests__/localDevProjectHelpers.test.js +120 -0
  278. package/lib/projects/__tests__/platformVersion.test.d.ts +1 -0
  279. package/lib/projects/__tests__/platformVersion.test.js +63 -0
  280. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.d.ts +1 -0
  281. package/lib/projects/__tests__/pollProjectBuildAndDeploy.test.js +328 -0
  282. package/lib/projects/__tests__/projectInfo.test.d.ts +1 -0
  283. package/lib/projects/__tests__/projectInfo.test.js +114 -0
  284. package/lib/projects/__tests__/projectProfiles.test.d.ts +1 -0
  285. package/lib/projects/__tests__/projectProfiles.test.js +441 -0
  286. package/lib/projects/__tests__/projects.test.d.ts +1 -0
  287. package/lib/projects/__tests__/projects.test.js +58 -0
  288. package/lib/projects/__tests__/structure.test.d.ts +1 -0
  289. package/lib/projects/__tests__/structure.test.js +210 -0
  290. package/lib/projects/__tests__/uieLinting.test.d.ts +1 -0
  291. package/lib/projects/__tests__/uieLinting.test.js +631 -0
  292. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  293. package/lib/projects/__tests__/upload.test.js +183 -0
  294. package/lib/projects/add/__tests__/legacyAddComponent.test.d.ts +1 -0
  295. package/lib/projects/add/__tests__/legacyAddComponent.test.js +245 -0
  296. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
  297. package/lib/projects/add/__tests__/v2AddComponent.test.js +343 -0
  298. package/lib/projects/create/__tests__/legacy.test.d.ts +1 -0
  299. package/lib/projects/create/__tests__/legacy.test.js +72 -0
  300. package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
  301. package/lib/projects/create/__tests__/v2.test.js +257 -0
  302. package/lib/projects/projectInfo.d.ts +22 -0
  303. package/lib/projects/projectInfo.js +104 -0
  304. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.d.ts +1 -0
  305. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +157 -0
  306. package/lib/prompts/__tests__/createFunctionPrompt.test.d.ts +1 -0
  307. package/lib/prompts/__tests__/createFunctionPrompt.test.js +129 -0
  308. package/lib/prompts/__tests__/createModulePrompt.test.d.ts +1 -0
  309. package/lib/prompts/__tests__/createModulePrompt.test.js +187 -0
  310. package/lib/prompts/__tests__/createTemplatePrompt.test.d.ts +1 -0
  311. package/lib/prompts/__tests__/createTemplatePrompt.test.js +102 -0
  312. package/lib/prompts/__tests__/downloadProjectPrompt.test.d.ts +1 -0
  313. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +31 -0
  314. package/lib/prompts/__tests__/projectAddPrompt.test.d.ts +1 -0
  315. package/lib/prompts/__tests__/projectAddPrompt.test.js +143 -0
  316. package/lib/prompts/__tests__/projectsLogsPrompt.test.d.ts +1 -0
  317. package/lib/prompts/__tests__/projectsLogsPrompt.test.js +37 -0
  318. package/lib/prompts/__tests__/selectProjectTemplatePrompt.test.d.ts +1 -0
  319. package/lib/prompts/__tests__/selectProjectTemplatePrompt.test.js +160 -0
  320. package/lib/theme/__tests__/migrate.test.d.ts +1 -0
  321. package/lib/theme/__tests__/migrate.test.js +247 -0
  322. package/lib/ui/__tests__/SpinniesManager.test.d.ts +1 -0
  323. package/lib/ui/__tests__/SpinniesManager.test.js +488 -0
  324. package/lib/ui/__tests__/removeAnsiCodes.test.d.ts +1 -0
  325. package/lib/ui/__tests__/removeAnsiCodes.test.js +84 -0
  326. package/mcp-server/tools/cms/HsCreateTemplateTool.d.ts +1 -1
  327. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.d.ts +1 -0
  328. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +254 -0
  329. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.d.ts +1 -0
  330. package/mcp-server/tools/cms/__tests__/HsCreateModuleTool.test.js +227 -0
  331. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.d.ts +1 -0
  332. package/mcp-server/tools/cms/__tests__/HsCreateTemplateTool.test.js +208 -0
  333. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.d.ts +1 -0
  334. package/mcp-server/tools/cms/__tests__/HsFunctionLogsTool.test.js +186 -0
  335. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.d.ts +1 -0
  336. package/mcp-server/tools/cms/__tests__/HsListFunctionsTool.test.js +124 -0
  337. package/mcp-server/tools/cms/__tests__/HsListTool.test.d.ts +1 -0
  338. package/mcp-server/tools/cms/__tests__/HsListTool.test.js +124 -0
  339. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.d.ts +1 -0
  340. package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.js +157 -0
  341. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.d.ts +1 -0
  342. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +131 -0
  343. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.d.ts +1 -0
  344. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +461 -0
  345. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.d.ts +1 -0
  346. package/mcp-server/tools/project/__tests__/DeployProjectTool.test.js +125 -0
  347. package/mcp-server/tools/project/__tests__/DocFetchTool.test.d.ts +1 -0
  348. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +125 -0
  349. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.d.ts +1 -0
  350. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +210 -0
  351. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  352. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +146 -0
  353. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  354. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +124 -0
  355. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.d.ts +1 -0
  356. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +307 -0
  357. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +1 -0
  358. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +242 -0
  359. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.d.ts +1 -0
  360. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +209 -0
  361. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.d.ts +1 -0
  362. package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +158 -0
  363. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.d.ts +1 -0
  364. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +187 -0
  365. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.d.ts +1 -0
  366. package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +118 -0
  367. package/mcp-server/utils/__tests__/command.test.d.ts +1 -0
  368. package/mcp-server/utils/__tests__/command.test.js +275 -0
  369. package/mcp-server/utils/__tests__/content.test.d.ts +1 -0
  370. package/mcp-server/utils/__tests__/content.test.js +164 -0
  371. package/mcp-server/utils/__tests__/feedbackTracking.test.d.ts +1 -0
  372. package/mcp-server/utils/__tests__/feedbackTracking.test.js +69 -0
  373. package/package.json +2 -6
@@ -0,0 +1,328 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import chalk from 'chalk';
3
+ import { pollBuildStatus, pollDeployStatus, } from '../pollProjectBuildAndDeploy.js';
4
+ import { getBuildStatus, getBuildStructure, getDeployStatus, getDeployStructure, } from '@hubspot/local-dev-lib/api/projects';
5
+ import SpinniesManager from '../../ui/SpinniesManager.js';
6
+ import { uiLogger } from '../../ui/logger.js';
7
+ // Mock external dependencies
8
+ vi.mock('@hubspot/local-dev-lib/api/projects');
9
+ vi.mock('@hubspot/local-dev-lib/config');
10
+ vi.mock('../../ui/SpinniesManager.js');
11
+ vi.mock('../../ui/index.js', async (importOriginal) => {
12
+ const actual = (await importOriginal());
13
+ return {
14
+ ...actual,
15
+ uiLine: vi.fn(),
16
+ uiLink: vi.fn((text) => text),
17
+ uiAccountDescription: vi.fn((accountId) => `account ${accountId}`),
18
+ };
19
+ });
20
+ vi.mock('../../errorHandlers/index.js');
21
+ const mockGetBuildStatus = vi.mocked(getBuildStatus);
22
+ const mockGetBuildStructure = vi.mocked(getBuildStructure);
23
+ const mockGetDeployStatus = vi.mocked(getDeployStatus);
24
+ const mockGetDeployStructure = vi.mocked(getDeployStructure);
25
+ describe('lib/projects/pollProjectBuildAndDeploy', () => {
26
+ beforeEach(() => {
27
+ vi.resetAllMocks();
28
+ vi.useFakeTimers();
29
+ // Mock SpinniesManager methods
30
+ vi.mocked(SpinniesManager.init).mockImplementation(() => { });
31
+ vi.mocked(SpinniesManager.add).mockImplementation(() => { });
32
+ vi.mocked(SpinniesManager.update).mockImplementation(() => { });
33
+ vi.mocked(SpinniesManager.succeed).mockImplementation(() => { });
34
+ vi.mocked(SpinniesManager.fail).mockImplementation(() => { });
35
+ vi.mocked(SpinniesManager.remove).mockImplementation(() => { });
36
+ vi.mocked(SpinniesManager.pick).mockReturnValue(undefined);
37
+ });
38
+ afterEach(() => {
39
+ vi.useRealTimers();
40
+ });
41
+ describe('pollBuildStatus', () => {
42
+ it('logs correct INITIALIZE message when build starts', async () => {
43
+ const mockBuild = {
44
+ buildId: 123,
45
+ status: 'SUCCESS',
46
+ subbuildStatuses: [],
47
+ enqueuedAt: '2023-01-01T00:00:00Z',
48
+ startedAt: '2023-01-01T00:01:00Z',
49
+ finishedAt: '2023-01-01T00:05:00Z',
50
+ portalId: 12345,
51
+ projectName: 'test-project',
52
+ // @ts-expect-error - Testing with minimal Build object, activitySource not relevant for this test
53
+ activitySource: undefined,
54
+ // @ts-expect-error - Testing with minimal Build object, createdAt not relevant for this test
55
+ createdAt: undefined,
56
+ // @ts-expect-error - Testing with minimal Build object, deployableState not relevant for this test
57
+ deployableState: undefined,
58
+ // @ts-expect-error - Testing successful build without deploy locator
59
+ deployStatusTaskLocator: undefined,
60
+ source: 'HUBSPOT_USER',
61
+ isAutoDeployEnabled: false,
62
+ autoDeployId: 0,
63
+ };
64
+ mockGetBuildStatus.mockResolvedValue({ data: mockBuild });
65
+ mockGetBuildStructure.mockResolvedValue({
66
+ data: { topLevelComponentsWithChildren: {} },
67
+ });
68
+ pollBuildStatus(12345, 'test-project', 123, null, true);
69
+ // Wait for initial async setup to complete
70
+ await vi.waitFor(() => {
71
+ expect(SpinniesManager.update).toHaveBeenCalled();
72
+ });
73
+ // Check that SpinniesManager.update was called with correct INITIALIZE message
74
+ expect(SpinniesManager.update).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
75
+ text: expect.stringContaining(`Building ${chalk.bold('test-project')} #123`),
76
+ }));
77
+ // Complete the polling
78
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
79
+ await vi.runOnlyPendingTimersAsync();
80
+ });
81
+ it('logs correct SUCCESS message when build completes', async () => {
82
+ const mockBuild = {
83
+ buildId: 456,
84
+ status: 'SUCCESS',
85
+ subbuildStatuses: [],
86
+ enqueuedAt: '2023-01-01T00:00:00Z',
87
+ startedAt: '2023-01-01T00:01:00Z',
88
+ finishedAt: '2023-01-01T00:05:00Z',
89
+ portalId: 12345,
90
+ projectName: 'my-project',
91
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
92
+ activitySource: undefined,
93
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
94
+ createdAt: undefined,
95
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
96
+ deployableState: undefined,
97
+ // @ts-expect-error - Testing successful build without deploy locator
98
+ deployStatusTaskLocator: undefined,
99
+ source: 'HUBSPOT_USER',
100
+ isAutoDeployEnabled: false,
101
+ autoDeployId: 0,
102
+ };
103
+ mockGetBuildStatus.mockResolvedValue({ data: mockBuild });
104
+ mockGetBuildStructure.mockResolvedValue({
105
+ data: { topLevelComponentsWithChildren: {} },
106
+ });
107
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
108
+ pollBuildStatus(12345, 'my-project', 456, null, true);
109
+ // Wait for polling to complete
110
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
111
+ await vi.runOnlyPendingTimersAsync();
112
+ // Check that SpinniesManager.succeed was called with correct SUCCESS message
113
+ expect(SpinniesManager.succeed).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
114
+ text: `Built ${chalk.bold('my-project')} #456`,
115
+ }));
116
+ });
117
+ it('logs correct FAIL message when build fails', async () => {
118
+ const mockBuild = {
119
+ buildId: 789,
120
+ status: 'FAILURE',
121
+ subbuildStatuses: [],
122
+ enqueuedAt: '2023-01-01T00:00:00Z',
123
+ startedAt: '2023-01-01T00:01:00Z',
124
+ finishedAt: '2023-01-01T00:05:00Z',
125
+ portalId: 12345,
126
+ projectName: 'failed-project',
127
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
128
+ activitySource: undefined,
129
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
130
+ createdAt: undefined,
131
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
132
+ deployableState: undefined,
133
+ // @ts-expect-error - Testing failed build without deploy locator
134
+ deployStatusTaskLocator: undefined,
135
+ source: 'HUBSPOT_USER',
136
+ isAutoDeployEnabled: false,
137
+ autoDeployId: 0,
138
+ };
139
+ mockGetBuildStatus.mockResolvedValue({ data: mockBuild });
140
+ mockGetBuildStructure.mockResolvedValue({
141
+ data: { topLevelComponentsWithChildren: {} },
142
+ });
143
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
144
+ pollBuildStatus(12345, 'failed-project', 789, null, true);
145
+ // Wait for polling to complete
146
+ await vi.runOnlyPendingTimersAsync();
147
+ // Check that SpinniesManager.fail was called with correct FAIL message
148
+ expect(SpinniesManager.fail).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
149
+ text: `Failed to build ${chalk.bold('failed-project')} #789`,
150
+ }));
151
+ });
152
+ it('logs correct SUBTASK_FAIL message with proper parameter order', async () => {
153
+ const mockBuild = {
154
+ buildId: 999,
155
+ status: 'FAILURE',
156
+ subbuildStatuses: [
157
+ {
158
+ id: 'sub-1',
159
+ buildName: 'api-component',
160
+ buildType: 'APP',
161
+ status: 'FAILURE',
162
+ visible: true,
163
+ errorMessage: 'Build failed',
164
+ standardError: null,
165
+ finishedAt: '2023-01-01T00:05:00Z',
166
+ rootPath: '/src',
167
+ startedAt: '2023-01-01T00:01:00Z',
168
+ },
169
+ ],
170
+ enqueuedAt: '2023-01-01T00:00:00Z',
171
+ startedAt: '2023-01-01T00:01:00Z',
172
+ finishedAt: '2023-01-01T00:05:00Z',
173
+ portalId: 12345,
174
+ projectName: 'test-project',
175
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
176
+ activitySource: undefined,
177
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
178
+ createdAt: undefined,
179
+ // @ts-expect-error - Testing with minimal Build object, non-essential fields omitted
180
+ deployableState: undefined,
181
+ // @ts-expect-error - Testing failed build without deploy locator
182
+ deployStatusTaskLocator: undefined,
183
+ source: 'HUBSPOT_USER',
184
+ isAutoDeployEnabled: false,
185
+ autoDeployId: 0,
186
+ };
187
+ mockGetBuildStatus.mockResolvedValue({ data: mockBuild });
188
+ mockGetBuildStructure.mockResolvedValue({
189
+ data: { topLevelComponentsWithChildren: { 'sub-1': [] } },
190
+ });
191
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
192
+ pollBuildStatus(12345, 'test-project', 999, null, false);
193
+ // Wait for polling to complete
194
+ await vi.runOnlyPendingTimersAsync();
195
+ // Verify SUBTASK_FAIL message has correct parameter order (name first, buildId second)
196
+ // The message should be: "Build #999 failed because there was a problem\nbuilding api-component"
197
+ expect(uiLogger.log).toHaveBeenCalledWith(expect.stringContaining('Build #999 failed because there was a problem'));
198
+ expect(uiLogger.log).toHaveBeenCalledWith(expect.stringContaining(`building ${chalk.bold('api-component')}`));
199
+ });
200
+ });
201
+ describe('pollDeployStatus', () => {
202
+ it('logs correct INITIALIZE message when deploy starts', async () => {
203
+ const mockDeploy = {
204
+ deployId: 123,
205
+ buildId: 100,
206
+ status: 'SUCCESS',
207
+ subdeployStatuses: [],
208
+ enqueuedAt: '2023-01-01T00:00:00Z',
209
+ startedAt: '2023-01-01T00:01:00Z',
210
+ finishedAt: '2023-01-01T00:05:00Z',
211
+ portalId: 12345,
212
+ projectName: 'test-project',
213
+ userId: 456,
214
+ source: 'HUBSPOT_USER',
215
+ };
216
+ mockGetDeployStatus.mockResolvedValue({ data: mockDeploy });
217
+ mockGetDeployStructure.mockResolvedValue({
218
+ data: { topLevelComponentsWithChildren: {} },
219
+ });
220
+ pollDeployStatus(12345, 'test-project', 123, 100, true);
221
+ // Wait for initial async setup to complete
222
+ await vi.waitFor(() => {
223
+ expect(SpinniesManager.update).toHaveBeenCalled();
224
+ });
225
+ // Check that SpinniesManager.update was called with correct INITIALIZE message
226
+ expect(SpinniesManager.update).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
227
+ text: expect.stringContaining(`Deploying build #100 in ${chalk.bold('test-project')}`),
228
+ }));
229
+ // Complete the polling
230
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
231
+ await vi.runOnlyPendingTimersAsync();
232
+ });
233
+ it('logs correct SUCCESS message when deploy completes', async () => {
234
+ const mockDeploy = {
235
+ deployId: 456,
236
+ buildId: 200,
237
+ status: 'SUCCESS',
238
+ subdeployStatuses: [],
239
+ enqueuedAt: '2023-01-01T00:00:00Z',
240
+ startedAt: '2023-01-01T00:01:00Z',
241
+ finishedAt: '2023-01-01T00:05:00Z',
242
+ portalId: 12345,
243
+ projectName: 'my-project',
244
+ userId: 456,
245
+ source: 'HUBSPOT_USER',
246
+ };
247
+ mockGetDeployStatus.mockResolvedValue({ data: mockDeploy });
248
+ mockGetDeployStructure.mockResolvedValue({
249
+ data: { topLevelComponentsWithChildren: {} },
250
+ });
251
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
252
+ pollDeployStatus(12345, 'my-project', 456, 200, true);
253
+ // Wait for polling to complete
254
+ await vi.runOnlyPendingTimersAsync();
255
+ // Check that SpinniesManager.succeed was called with correct SUCCESS message
256
+ expect(SpinniesManager.succeed).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
257
+ text: `Deployed build #200 in ${chalk.bold('my-project')}`,
258
+ }));
259
+ });
260
+ it('logs correct FAIL message when deploy fails', async () => {
261
+ const mockDeploy = {
262
+ deployId: 789,
263
+ buildId: 300,
264
+ status: 'FAILURE',
265
+ subdeployStatuses: [],
266
+ enqueuedAt: '2023-01-01T00:00:00Z',
267
+ startedAt: '2023-01-01T00:01:00Z',
268
+ finishedAt: '2023-01-01T00:05:00Z',
269
+ portalId: 12345,
270
+ projectName: 'failed-project',
271
+ userId: 456,
272
+ source: 'HUBSPOT_USER',
273
+ };
274
+ mockGetDeployStatus.mockResolvedValue({ data: mockDeploy });
275
+ mockGetDeployStructure.mockResolvedValue({
276
+ data: { topLevelComponentsWithChildren: {} },
277
+ });
278
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
279
+ pollDeployStatus(12345, 'failed-project', 789, 300, true);
280
+ // Wait for polling to complete
281
+ await vi.runOnlyPendingTimersAsync();
282
+ // Check that SpinniesManager.fail was called with correct FAIL message
283
+ expect(SpinniesManager.fail).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
284
+ text: `Failed to deploy build #300 in ${chalk.bold('failed-project')}`,
285
+ }));
286
+ });
287
+ it('logs correct SUBTASK_FAIL message with proper parameter order', async () => {
288
+ const mockDeploy = {
289
+ deployId: 888,
290
+ buildId: 999,
291
+ status: 'FAILURE',
292
+ subdeployStatuses: [
293
+ {
294
+ id: 'sub-1',
295
+ deployName: 'api-component',
296
+ deployType: 'APP',
297
+ status: 'FAILURE',
298
+ visible: true,
299
+ errorMessage: 'Deploy failed',
300
+ standardError: null,
301
+ action: 'DEPLOY',
302
+ finishedAt: '2023-01-01T00:05:00Z',
303
+ startedAt: '2023-01-01T00:01:00Z',
304
+ },
305
+ ],
306
+ enqueuedAt: '2023-01-01T00:00:00Z',
307
+ startedAt: '2023-01-01T00:01:00Z',
308
+ finishedAt: '2023-01-01T00:05:00Z',
309
+ portalId: 12345,
310
+ projectName: 'test-project',
311
+ userId: 456,
312
+ source: 'HUBSPOT_USER',
313
+ };
314
+ mockGetDeployStatus.mockResolvedValue({ data: mockDeploy });
315
+ mockGetDeployStructure.mockResolvedValue({
316
+ data: { topLevelComponentsWithChildren: { 'sub-1': [] } },
317
+ });
318
+ vi.mocked(SpinniesManager.hasActiveSpinners).mockReturnValue(true);
319
+ pollDeployStatus(12345, 'test-project', 888, 999, false);
320
+ // Wait for polling to complete
321
+ await vi.runOnlyPendingTimersAsync();
322
+ // Verify SUBTASK_FAIL message has correct parameter order (name first, deployedBuildId second)
323
+ // The message should be: "Deploy for build #999 failed because there was a\nproblem deploying api-component"
324
+ expect(uiLogger.log).toHaveBeenCalledWith(expect.stringContaining('Deploy for build #999 failed because there was a'));
325
+ expect(uiLogger.log).toHaveBeenCalledWith(expect.stringContaining(`deploying ${chalk.bold('api-component')}`));
326
+ });
327
+ });
328
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,114 @@
1
+ import { fetchAppMetadataBySourceId } from '@hubspot/local-dev-lib/api/appsDev';
2
+ import { getProjectInfo } from '../projectInfo.js';
3
+ import { getProjectDetailUrl } from '../urls.js';
4
+ vi.mock('@hubspot/local-dev-lib/api/appsDev');
5
+ vi.mock('../urls');
6
+ vi.mock('../../errorHandlers/index.js');
7
+ const mockedFetchAppMetadataBySourceId = vi.mocked(fetchAppMetadataBySourceId);
8
+ const mockedGetProjectDetailUrl = vi.mocked(getProjectDetailUrl);
9
+ const mockProject = {
10
+ id: 42,
11
+ name: 'my-project',
12
+ deployedBuild: {
13
+ buildId: 7,
14
+ isAutoDeployEnabled: true,
15
+ subbuildStatuses: [
16
+ {
17
+ buildName: 'my-app',
18
+ buildType: 'APPLICATION',
19
+ },
20
+ {
21
+ buildName: 'card-one',
22
+ buildType: 'APP_CARD',
23
+ userDefinedId: 'card-one-uid',
24
+ },
25
+ {
26
+ buildName: 'func-one',
27
+ buildType: 'SERVERLESS_FUNCTION',
28
+ },
29
+ ],
30
+ },
31
+ };
32
+ const mockAppMetadata = {
33
+ name: 'My App',
34
+ id: 99,
35
+ authType: 'OAUTH',
36
+ distributionType: 'PRIVATE',
37
+ };
38
+ describe('lib/projects/projectInfo', () => {
39
+ beforeEach(() => {
40
+ mockedGetProjectDetailUrl.mockReturnValue('https://app.hubspot.com/project/my-project');
41
+ mockedFetchAppMetadataBySourceId.mockResolvedValue({
42
+ data: mockAppMetadata,
43
+ });
44
+ });
45
+ describe('getProjectInfo', () => {
46
+ it('should return project metadata', async () => {
47
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
48
+ expect(result.projectName).toEqual('my-project');
49
+ expect(result.platformVersion).toEqual('2025.2');
50
+ expect(result.projectId).toEqual(42);
51
+ expect(result.deployedBuildId).toEqual(7);
52
+ expect(result.autoDeployEnabled).toEqual(true);
53
+ });
54
+ it('should include projectUrl when available', async () => {
55
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
56
+ expect(result.projectUrl).toEqual('https://app.hubspot.com/project/my-project');
57
+ });
58
+ it('should not include projectUrl when getProjectDetailUrl returns undefined', async () => {
59
+ mockedGetProjectDetailUrl.mockReturnValue(undefined);
60
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
61
+ expect(result.projectUrl).toBeUndefined();
62
+ });
63
+ it('should fetch and include app metadata for APPLICATION subbuild', async () => {
64
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
65
+ expect(mockedFetchAppMetadataBySourceId).toHaveBeenCalledWith(42, 'my-app', 100);
66
+ expect(result.app).toEqual({
67
+ name: 'My App',
68
+ id: 99,
69
+ uid: 'my-app',
70
+ authType: 'OAUTH',
71
+ distributionType: 'PRIVATE',
72
+ });
73
+ });
74
+ it('should gracefully handle app metadata fetch failure', async () => {
75
+ mockedFetchAppMetadataBySourceId.mockRejectedValue(new Error('App fetch failed'));
76
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
77
+ expect(result.app).toBeUndefined();
78
+ });
79
+ it('should not fetch app metadata when no APPLICATION subbuild exists', async () => {
80
+ const projectWithoutApp = {
81
+ ...mockProject,
82
+ deployedBuild: {
83
+ ...mockProject.deployedBuild,
84
+ subbuildStatuses: [
85
+ {
86
+ buildName: 'card-one',
87
+ buildType: 'APP_CARD',
88
+ userDefinedId: 'card-one-uid',
89
+ },
90
+ ],
91
+ },
92
+ };
93
+ const result = await getProjectInfo(projectWithoutApp, '2025.2', 100);
94
+ expect(mockedFetchAppMetadataBySourceId).not.toHaveBeenCalled();
95
+ expect(result.app).toBeUndefined();
96
+ });
97
+ it('should use userDefinedId for component uid when available', async () => {
98
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
99
+ const cardComponent = result.components.find(c => c.type === 'APP_CARD');
100
+ expect(cardComponent?.uid).toEqual('card-one-uid');
101
+ });
102
+ it('should fall back to buildName when userDefinedId is not present', async () => {
103
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
104
+ const funcComponent = result.components.find(c => c.type === 'SERVERLESS_FUNCTION');
105
+ expect(funcComponent?.uid).toEqual('func-one');
106
+ });
107
+ it('should exclude APPLICATION subbuild from components list', async () => {
108
+ const result = await getProjectInfo(mockProject, '2025.2', 100);
109
+ const appComponent = result.components.find(c => c.type === 'APPLICATION');
110
+ expect(appComponent).toBeUndefined();
111
+ expect(result.components).toHaveLength(2);
112
+ });
113
+ });
114
+ });
@@ -0,0 +1 @@
1
+ export {};