@hubspot/cli 7.4.9-experimental.0 → 7.5.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 (381) hide show
  1. package/api/migrate.d.ts +14 -4
  2. package/api/migrate.js +16 -2
  3. package/bin/cli.js +9 -187
  4. package/commands/account/auth.d.ts +6 -0
  5. package/commands/account/auth.js +198 -0
  6. package/commands/account/clean.d.ts +3 -7
  7. package/commands/account/clean.js +54 -14
  8. package/commands/account/createOverride.d.ts +6 -0
  9. package/commands/account/createOverride.js +121 -0
  10. package/commands/account/info.d.ts +3 -7
  11. package/commands/account/info.js +51 -9
  12. package/commands/account/list.d.ts +3 -7
  13. package/commands/account/list.js +38 -13
  14. package/commands/account/remove.d.ts +3 -7
  15. package/commands/account/remove.js +57 -11
  16. package/commands/account/removeOverride.d.ts +6 -0
  17. package/commands/account/removeOverride.js +93 -0
  18. package/commands/account/rename.d.ts +3 -7
  19. package/commands/account/rename.js +16 -9
  20. package/commands/account/use.d.ts +5 -9
  21. package/commands/account/use.js +39 -9
  22. package/commands/account.d.ts +3 -4
  23. package/commands/account.js +35 -53
  24. package/commands/app/migrate.d.ts +5 -6
  25. package/commands/app/migrate.js +60 -44
  26. package/commands/app/secret/add.d.ts +7 -0
  27. package/commands/app/secret/add.js +62 -0
  28. package/commands/app/secret/delete.d.ts +8 -0
  29. package/commands/app/secret/delete.js +87 -0
  30. package/commands/app/secret/list.d.ts +6 -0
  31. package/commands/app/secret/list.js +64 -0
  32. package/commands/app/secret/update.d.ts +7 -0
  33. package/commands/app/secret/update.js +77 -0
  34. package/commands/app/secret.d.ts +3 -0
  35. package/commands/app/secret.js +30 -0
  36. package/commands/app.d.ts +2 -5
  37. package/commands/app.js +12 -10
  38. package/commands/auth.d.ts +3 -7
  39. package/commands/auth.js +25 -15
  40. package/commands/cms/convertFields.d.ts +7 -1
  41. package/commands/cms/convertFields.js +57 -41
  42. package/commands/cms/getReactModule.d.ts +7 -1
  43. package/commands/cms/getReactModule.js +52 -34
  44. package/commands/cms/lighthouseScore.d.ts +8 -1
  45. package/commands/cms/lighthouseScore.js +133 -100
  46. package/commands/cms.d.ts +3 -1
  47. package/commands/cms.js +24 -16
  48. package/commands/completion.d.ts +3 -1
  49. package/commands/completion.js +25 -13
  50. package/commands/config/migrate.d.ts +6 -0
  51. package/commands/config/migrate.js +94 -0
  52. package/commands/config/set.d.ts +10 -1
  53. package/commands/config/set.js +61 -32
  54. package/commands/config.d.ts +3 -1
  55. package/commands/config.js +21 -11
  56. package/commands/create/api-sample.d.ts +3 -1
  57. package/commands/create/api-sample.js +34 -36
  58. package/commands/create/app.d.ts +3 -1
  59. package/commands/create/app.js +9 -7
  60. package/commands/create/function.d.ts +3 -1
  61. package/commands/create/function.js +11 -10
  62. package/commands/create/index.d.ts +5 -1
  63. package/commands/create/index.js +23 -11
  64. package/commands/create/module.d.ts +3 -1
  65. package/commands/create/module.js +14 -13
  66. package/commands/create/react-app.d.ts +3 -1
  67. package/commands/create/react-app.js +10 -7
  68. package/commands/create/template.d.ts +3 -1
  69. package/commands/create/template.js +14 -14
  70. package/commands/create/vue-app.d.ts +3 -1
  71. package/commands/create/vue-app.js +10 -7
  72. package/commands/create/webpack-serverless.d.ts +3 -1
  73. package/commands/create/webpack-serverless.js +10 -7
  74. package/commands/create/website-theme.d.ts +3 -1
  75. package/commands/create/website-theme.js +10 -9
  76. package/commands/create.d.ts +4 -24
  77. package/commands/create.js +64 -75
  78. package/commands/customObject/create.d.ts +4 -9
  79. package/commands/customObject/create.js +17 -10
  80. package/commands/customObject/schema/create.d.ts +4 -9
  81. package/commands/customObject/schema/create.js +18 -11
  82. package/commands/customObject/schema/delete.d.ts +4 -9
  83. package/commands/customObject/schema/delete.js +21 -11
  84. package/commands/customObject/schema/fetch-all.d.ts +4 -9
  85. package/commands/customObject/schema/fetch-all.js +19 -11
  86. package/commands/customObject/schema/fetch.d.ts +4 -9
  87. package/commands/customObject/schema/fetch.js +19 -11
  88. package/commands/customObject/schema/list.d.ts +4 -8
  89. package/commands/customObject/schema/list.js +17 -10
  90. package/commands/customObject/schema/update.d.ts +4 -9
  91. package/commands/customObject/schema/update.js +18 -11
  92. package/commands/customObject/schema.d.ts +3 -5
  93. package/commands/customObject/schema.js +27 -54
  94. package/commands/customObject.d.ts +3 -4
  95. package/commands/customObject.js +22 -48
  96. package/commands/doctor.d.ts +6 -8
  97. package/commands/doctor.js +32 -22
  98. package/commands/feedback.d.ts +4 -1
  99. package/commands/feedback.js +40 -48
  100. package/commands/fetch.d.ts +12 -1
  101. package/commands/fetch.js +49 -34
  102. package/commands/filemanager/fetch.d.ts +4 -9
  103. package/commands/filemanager/fetch.js +18 -11
  104. package/commands/filemanager/upload.d.ts +4 -9
  105. package/commands/filemanager/upload.js +17 -11
  106. package/commands/filemanager.d.ts +3 -4
  107. package/commands/filemanager.js +20 -42
  108. package/commands/function/deploy.d.ts +6 -1
  109. package/commands/function/deploy.js +70 -50
  110. package/commands/function/list.d.ts +6 -1
  111. package/commands/function/list.js +44 -32
  112. package/commands/function/server.d.ts +10 -1
  113. package/commands/function/server.js +49 -38
  114. package/commands/function.d.ts +5 -1
  115. package/commands/function.js +24 -11
  116. package/commands/hubdb/clear.d.ts +4 -9
  117. package/commands/hubdb/clear.js +21 -15
  118. package/commands/hubdb/create.d.ts +4 -9
  119. package/commands/hubdb/create.js +23 -17
  120. package/commands/hubdb/delete.d.ts +4 -9
  121. package/commands/hubdb/delete.js +24 -16
  122. package/commands/hubdb/fetch.d.ts +4 -9
  123. package/commands/hubdb/fetch.js +20 -14
  124. package/commands/hubdb.d.ts +3 -2
  125. package/commands/hubdb.js +24 -47
  126. package/commands/init.d.ts +3 -7
  127. package/commands/init.js +28 -23
  128. package/commands/lint.d.ts +6 -4
  129. package/commands/lint.js +44 -44
  130. package/commands/list.d.ts +3 -7
  131. package/commands/list.js +23 -16
  132. package/commands/logs.d.ts +10 -1
  133. package/commands/logs.js +53 -45
  134. package/commands/module/marketplace-validate.d.ts +6 -1
  135. package/commands/module/marketplace-validate.js +39 -28
  136. package/commands/module.d.ts +3 -1
  137. package/commands/module.js +22 -12
  138. package/commands/mv.d.ts +3 -7
  139. package/commands/mv.js +22 -15
  140. package/commands/open.d.ts +3 -7
  141. package/commands/open.js +22 -15
  142. package/commands/project/add.d.ts +3 -7
  143. package/commands/project/add.js +28 -23
  144. package/commands/project/cloneApp.d.ts +6 -8
  145. package/commands/project/cloneApp.js +51 -47
  146. package/commands/project/create.d.ts +10 -1
  147. package/commands/project/create.js +85 -63
  148. package/commands/project/deploy.d.ts +4 -6
  149. package/commands/project/deploy.js +66 -36
  150. package/commands/project/dev/deprecatedFlow.js +32 -25
  151. package/commands/project/dev/index.d.ts +4 -5
  152. package/commands/project/dev/index.js +70 -25
  153. package/commands/project/dev/unifiedFlow.d.ts +2 -1
  154. package/commands/project/dev/unifiedFlow.js +90 -36
  155. package/commands/project/download.d.ts +3 -7
  156. package/commands/project/download.js +18 -19
  157. package/commands/project/installDeps.d.ts +6 -1
  158. package/commands/project/installDeps.js +48 -32
  159. package/commands/project/listBuilds.d.ts +3 -7
  160. package/commands/project/listBuilds.js +32 -27
  161. package/commands/project/logs.d.ts +10 -1
  162. package/commands/project/logs.js +73 -65
  163. package/commands/project/migrate.d.ts +7 -0
  164. package/commands/project/migrate.js +71 -0
  165. package/commands/project/migrateApp.d.ts +3 -8
  166. package/commands/project/migrateApp.js +23 -20
  167. package/commands/project/open.d.ts +3 -7
  168. package/commands/project/open.js +29 -21
  169. package/commands/project/profile/add.d.ts +7 -0
  170. package/commands/project/profile/add.js +209 -0
  171. package/commands/project/profile/delete.d.ts +6 -0
  172. package/commands/project/profile/delete.js +123 -0
  173. package/commands/project/profile.d.ts +3 -0
  174. package/commands/project/profile.js +25 -0
  175. package/commands/project/upload.d.ts +10 -1
  176. package/commands/project/upload.js +110 -56
  177. package/commands/project/watch.d.ts +6 -1
  178. package/commands/project/watch.js +95 -61
  179. package/commands/project.d.ts +3 -1
  180. package/commands/project.js +49 -35
  181. package/commands/remove.d.ts +3 -7
  182. package/commands/remove.js +25 -15
  183. package/commands/sandbox/create.d.ts +4 -9
  184. package/commands/sandbox/create.js +27 -21
  185. package/commands/sandbox/delete.d.ts +4 -9
  186. package/commands/sandbox/delete.js +35 -29
  187. package/commands/sandbox.d.ts +3 -4
  188. package/commands/sandbox.js +20 -44
  189. package/commands/secret/addSecret.d.ts +4 -9
  190. package/commands/secret/addSecret.js +21 -15
  191. package/commands/secret/deleteSecret.d.ts +4 -9
  192. package/commands/secret/deleteSecret.js +28 -18
  193. package/commands/secret/listSecret.d.ts +4 -9
  194. package/commands/secret/listSecret.js +19 -13
  195. package/commands/secret/updateSecret.d.ts +4 -9
  196. package/commands/secret/updateSecret.js +25 -17
  197. package/commands/secret.d.ts +3 -4
  198. package/commands/secret.js +25 -49
  199. package/commands/theme/generate-selectors.d.ts +3 -7
  200. package/commands/theme/generate-selectors.js +18 -11
  201. package/commands/theme/marketplace-validate.d.ts +4 -9
  202. package/commands/theme/marketplace-validate.js +21 -15
  203. package/commands/theme/preview.d.ts +4 -9
  204. package/commands/theme/preview.js +31 -24
  205. package/commands/theme.d.ts +3 -4
  206. package/commands/theme.js +23 -47
  207. package/commands/upload.d.ts +12 -1
  208. package/commands/upload.js +118 -98
  209. package/commands/watch.d.ts +14 -1
  210. package/commands/watch.js +76 -66
  211. package/lang/en.d.ts +3016 -0
  212. package/lang/en.js +2877 -3315
  213. package/lang/en.lyaml +126 -62
  214. package/lib/accountTypes.d.ts +1 -0
  215. package/lib/accountTypes.js +13 -0
  216. package/lib/app/migrate.d.ts +33 -4
  217. package/lib/app/migrate.js +218 -93
  218. package/lib/app/migrate_legacy.d.ts +2 -2
  219. package/lib/app/migrate_legacy.js +16 -13
  220. package/lib/app/urls.d.ts +16 -0
  221. package/lib/app/urls.js +16 -0
  222. package/lib/buildAccount.d.ts +1 -2
  223. package/lib/buildAccount.js +11 -10
  224. package/lib/commonOpts.d.ts +3 -4
  225. package/lib/commonOpts.js +46 -18
  226. package/lib/configMigrate.d.ts +2 -0
  227. package/lib/configMigrate.js +118 -0
  228. package/lib/configOptions.d.ts +4 -0
  229. package/lib/configOptions.js +41 -45
  230. package/lib/constants.d.ts +10 -0
  231. package/lib/constants.js +11 -1
  232. package/lib/dependencyManagement.d.ts +0 -5
  233. package/lib/dependencyManagement.js +14 -40
  234. package/lib/doctor/Diagnosis.d.ts +1 -2
  235. package/lib/doctor/Diagnosis.js +19 -16
  236. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
  237. package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
  238. package/lib/doctor/Doctor.d.ts +1 -0
  239. package/lib/doctor/Doctor.js +59 -45
  240. package/lib/errorHandlers/index.js +6 -7
  241. package/lib/errorHandlers/suppressError.js +18 -26
  242. package/lib/filesystem.d.ts +1 -1
  243. package/lib/generateSelectors.js +1 -2
  244. package/lib/hasFeature.d.ts +3 -1
  245. package/lib/interpolation.d.ts +2 -3
  246. package/lib/lang.d.ts +2 -3
  247. package/lib/middleware/__test__/configMiddleware.test.d.ts +1 -0
  248. package/lib/middleware/__test__/configMiddleware.test.js +194 -0
  249. package/lib/middleware/__test__/gitMiddleware.test.d.ts +1 -0
  250. package/lib/middleware/__test__/gitMiddleware.test.js +76 -0
  251. package/lib/middleware/__test__/notificationsMiddleware.test.d.ts +1 -0
  252. package/lib/middleware/__test__/notificationsMiddleware.test.js +10 -0
  253. package/lib/middleware/__test__/requestMiddleware.test.d.ts +1 -0
  254. package/lib/middleware/__test__/requestMiddleware.test.js +20 -0
  255. package/lib/middleware/__test__/utils.test.d.ts +1 -0
  256. package/lib/middleware/__test__/utils.test.js +53 -0
  257. package/lib/middleware/__test__/yargsChecksMiddleware.test.d.ts +1 -0
  258. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +81 -0
  259. package/lib/middleware/autoUpdateMiddleware.d.ts +1 -0
  260. package/lib/middleware/autoUpdateMiddleware.js +89 -0
  261. package/lib/middleware/configMiddleware.d.ts +13 -0
  262. package/lib/middleware/configMiddleware.js +124 -0
  263. package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
  264. package/lib/middleware/fireAlarmMiddleware.js +123 -0
  265. package/lib/middleware/gitMiddleware.d.ts +2 -0
  266. package/lib/middleware/gitMiddleware.js +14 -0
  267. package/lib/middleware/notificationsMiddleware.d.ts +1 -0
  268. package/lib/middleware/notificationsMiddleware.js +38 -0
  269. package/lib/middleware/requestMiddleware.d.ts +1 -0
  270. package/lib/middleware/requestMiddleware.js +11 -0
  271. package/lib/middleware/utils.d.ts +8 -0
  272. package/lib/middleware/utils.js +17 -0
  273. package/lib/middleware/yargsChecksMiddleware.d.ts +4 -0
  274. package/lib/middleware/yargsChecksMiddleware.js +24 -0
  275. package/lib/npm.d.ts +9 -0
  276. package/lib/npm.js +36 -0
  277. package/lib/oauth.js +1 -2
  278. package/lib/process.js +1 -2
  279. package/lib/projectProfiles.d.ts +6 -0
  280. package/lib/projectProfiles.js +65 -0
  281. package/lib/projects/ProjectLogsManager.d.ts +1 -1
  282. package/lib/projects/ProjectLogsManager.js +16 -21
  283. package/lib/projects/buildAndDeploy.js +45 -41
  284. package/lib/projects/config.d.ts +9 -0
  285. package/lib/projects/config.js +79 -0
  286. package/lib/projects/create.js +5 -6
  287. package/lib/projects/ensureProjectExists.d.ts +11 -0
  288. package/lib/projects/ensureProjectExists.js +97 -0
  289. package/lib/projects/localDev/AppDevModeInterface.d.ts +26 -0
  290. package/lib/projects/localDev/AppDevModeInterface.js +156 -0
  291. package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
  292. package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
  293. package/lib/projects/localDev/DevServerManagerV2.d.ts +22 -0
  294. package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +22 -19
  295. package/lib/projects/localDev/LocalDevLogger.d.ts +30 -0
  296. package/lib/projects/localDev/LocalDevLogger.js +158 -0
  297. package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
  298. package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +57 -83
  299. package/lib/projects/localDev/LocalDevProcess.d.ts +27 -0
  300. package/lib/projects/localDev/LocalDevProcess.js +171 -0
  301. package/lib/projects/localDev/LocalDevState.d.ts +37 -0
  302. package/lib/projects/localDev/LocalDevState.js +78 -0
  303. package/lib/projects/localDev/LocalDevWatcher.d.ts +10 -0
  304. package/lib/projects/localDev/LocalDevWatcher.js +56 -0
  305. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +17 -0
  306. package/lib/projects/localDev/LocalDevWebsocketServer.js +92 -0
  307. package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +6 -4
  308. package/lib/{localDev.js → projects/localDev/helpers.js} +127 -114
  309. package/lib/projects/ui.d.ts +1 -0
  310. package/lib/projects/ui.js +15 -0
  311. package/lib/projects/upload.d.ts +14 -2
  312. package/lib/projects/upload.js +19 -35
  313. package/lib/projects/urls.d.ts +1 -0
  314. package/lib/projects/urls.js +6 -0
  315. package/lib/projects/watch.d.ts +1 -1
  316. package/lib/projects/watch.js +21 -18
  317. package/lib/prompts/accountNamePrompt.js +16 -13
  318. package/lib/prompts/accountsPrompt.js +1 -2
  319. package/lib/prompts/cmsFieldPrompt.js +1 -2
  320. package/lib/prompts/createApiSamplePrompt.d.ts +2 -10
  321. package/lib/prompts/createApiSamplePrompt.js +4 -5
  322. package/lib/prompts/createFunctionPrompt.js +13 -14
  323. package/lib/prompts/createModulePrompt.js +8 -9
  324. package/lib/prompts/createProjectPrompt.d.ts +11 -4
  325. package/lib/prompts/createProjectPrompt.js +14 -9
  326. package/lib/prompts/createTemplatePrompt.d.ts +22 -4
  327. package/lib/prompts/createTemplatePrompt.js +1 -2
  328. package/lib/prompts/downloadProjectPrompt.js +3 -4
  329. package/lib/prompts/installAppPrompt.d.ts +1 -0
  330. package/lib/prompts/installAppPrompt.js +35 -0
  331. package/lib/prompts/personalAccessKeyPrompt.js +17 -18
  332. package/lib/prompts/previewPrompt.js +5 -6
  333. package/lib/prompts/projectAddPrompt.js +4 -5
  334. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
  335. package/lib/prompts/projectDevTargetAccountPrompt.js +15 -16
  336. package/lib/prompts/projectNamePrompt.js +5 -6
  337. package/lib/prompts/projectsLogsPrompt.js +3 -2
  338. package/lib/prompts/promptUtils.d.ts +3 -2
  339. package/lib/prompts/promptUtils.js +2 -1
  340. package/lib/prompts/sandboxesPrompt.js +5 -6
  341. package/lib/prompts/secretPrompt.js +2 -3
  342. package/lib/prompts/selectAppPrompt.d.ts +2 -0
  343. package/lib/prompts/selectAppPrompt.js +40 -0
  344. package/lib/prompts/selectHubDBTablePrompt.js +11 -8
  345. package/lib/prompts/{selectPublicAppPrompt.d.ts → selectPublicAppForMigrationPrompt.d.ts} +1 -1
  346. package/lib/prompts/{selectPublicAppPrompt.js → selectPublicAppForMigrationPrompt.js} +8 -9
  347. package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
  348. package/lib/prompts/uploadPrompt.js +4 -5
  349. package/lib/sandboxSync.js +15 -14
  350. package/lib/sandboxes.js +12 -13
  351. package/lib/serverlessLogs.js +4 -6
  352. package/lib/testUtils.d.ts +3 -3
  353. package/lib/testUtils.js +8 -9
  354. package/lib/ui/SpinniesManager.d.ts +1 -1
  355. package/lib/ui/boxen.d.ts +5 -0
  356. package/lib/ui/boxen.js +30 -0
  357. package/lib/ui/git.js +8 -9
  358. package/lib/ui/index.d.ts +4 -2
  359. package/lib/ui/index.js +20 -17
  360. package/lib/ui/logger.d.ts +10 -0
  361. package/lib/ui/logger.js +15 -0
  362. package/lib/ui/serverlessFunctionLogs.js +2 -3
  363. package/lib/ui/spinniesUtils.d.ts +5 -5
  364. package/lib/upload.d.ts +1 -1
  365. package/lib/validation.js +4 -5
  366. package/lib/yargsUtils.d.ts +5 -1
  367. package/lib/yargsUtils.js +6 -0
  368. package/package.json +10 -6
  369. package/types/Cms.d.ts +30 -0
  370. package/types/Cms.js +2 -0
  371. package/types/LocalDev.d.ts +24 -0
  372. package/types/LocalDev.js +2 -0
  373. package/types/Prompts.d.ts +0 -7
  374. package/types/Yargs.d.ts +12 -11
  375. package/lib/DevServerManagerV2.d.ts +0 -33
  376. package/lib/LocalDevManagerV2.d.ts +0 -64
  377. package/lib/LocalDevManagerV2.js +0 -377
  378. package/lib/projects/index.d.ts +0 -20
  379. package/lib/projects/index.js +0 -194
  380. package/lib/prompts/installPublicAppPrompt.d.ts +0 -1
  381. package/lib/prompts/installPublicAppPrompt.js +0 -40
@@ -8,16 +8,17 @@ exports.useV3Api = useV3Api;
8
8
  exports.displayWarnLogs = displayWarnLogs;
9
9
  exports.pollProjectBuildAndDeploy = pollProjectBuildAndDeploy;
10
10
  const chalk_1 = __importDefault(require("chalk"));
11
- const logger_1 = require("@hubspot/local-dev-lib/logger");
12
11
  const projects_1 = require("@hubspot/local-dev-lib/api/projects");
13
12
  const constants_1 = require("../constants");
14
13
  const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
15
- const lang_1 = require("../lang");
16
14
  const errorHandlers_1 = require("../errorHandlers");
17
15
  const ui_1 = require("../ui");
18
16
  const urls_1 = require("./urls");
19
17
  const exitCodes_1 = require("../enums/exitCodes");
20
- const i18nKey = 'lib.projectBuildAndDeploy';
18
+ const en_1 = require("../../lang/en");
19
+ const logger_1 = require("../ui/logger");
20
+ const constants_2 = require("@hubspot/project-parsing-lib/src/lib/constants");
21
+ const project_parsing_lib_1 = require("@hubspot/project-parsing-lib");
21
22
  const SPINNER_STATUS = {
22
23
  SPINNING: 'spinning',
23
24
  };
@@ -50,19 +51,14 @@ function getSubtaskType(task) {
50
51
  return task.deployType;
51
52
  }
52
53
  function handleTaskStatusError(statusText) {
53
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.makePollTaskStatusFunc.errorFetchingTaskStatus`, {
54
- taskType: statusText.TYPE_KEY === constants_1.PROJECT_BUILD_TEXT.TYPE_KEY
55
- ? 'build'
56
- : 'deploy',
57
- openCommand: (0, ui_1.uiCommandReference)('hs project open'),
58
- }));
54
+ logger_1.uiLogger.error(en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc.errorFetchingTaskStatus(statusText.TYPE_KEY === constants_1.PROJECT_BUILD_TEXT.TYPE_KEY ? 'build' : 'deploy'));
59
55
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
60
56
  }
61
57
  function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrings, linkToHubSpot, }) {
62
58
  return async function (accountId, taskName, taskId, deployedBuildId, silenceLogs = false) {
63
59
  const displayId = deployedBuildId || taskId;
64
60
  if (linkToHubSpot && !silenceLogs) {
65
- logger_1.logger.log(`\n${linkToHubSpot(accountId, taskName, taskId, deployedBuildId)}\n`);
61
+ logger_1.uiLogger.log(`\n${linkToHubSpot(accountId, taskName, taskId, deployedBuildId)}\n`);
66
62
  }
67
63
  SpinniesManager_1.default.init();
68
64
  const overallTaskSpinniesKey = `overallTaskStatus-${statusText.STATUS_TEXT}`;
@@ -77,14 +73,27 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
77
73
  structureFn(accountId, taskName, taskId),
78
74
  ]);
79
75
  const subtasks = getSubtasks(initialTaskStatus);
80
- const tasksById = subtasks.reduce((acc, subtask) => {
76
+ const hiddenComponentBuildIds = [];
77
+ const tasksById = subtasks
78
+ .filter(subtask => {
79
+ // TODO: Remove this filtering logic when visible=false for SERVERLESS_PACKAGE
80
+ const shouldBeVisible = getSubtaskType(subtask) !== (0, project_parsing_lib_1.mapToInternalType)(constants_2.AppFunctionsPackageKey);
81
+ if (!shouldBeVisible) {
82
+ hiddenComponentBuildIds.push(subtask.id);
83
+ }
84
+ return shouldBeVisible;
85
+ })
86
+ .reduce((acc, subtask) => {
81
87
  const { id, visible } = subtask;
82
88
  if (visible) {
83
89
  acc[id] = subtask;
84
90
  }
85
91
  return acc;
86
92
  }, {});
87
- const structuredTasks = Object.keys(taskStructure).map(key => {
93
+ const structuredTasks = Object.keys(taskStructure)
94
+ // TODO: Remove this filtering logic when visible=false for SERVERLESS_PACKAGE
95
+ .filter(buildId => !hiddenComponentBuildIds.includes(buildId))
96
+ .map(key => {
88
97
  return {
89
98
  ...tasksById[key],
90
99
  subtasks: taskStructure[key]
@@ -95,9 +104,10 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
95
104
  const numComponents = structuredTasks.length;
96
105
  const componentCountText = silenceLogs
97
106
  ? ''
98
- : (0, lang_1.i18n)(numComponents === 1
99
- ? `${i18nKey}.makePollTaskStatusFunc.componentCountSingular`
100
- : `${i18nKey}.makePollTaskStatusFunc.componentCount`, { numComponents }) + '\n';
107
+ : numComponents === 1
108
+ ? en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc
109
+ .componentCountSingular
110
+ : en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc.componentCount(numComponents);
101
111
  SpinniesManager_1.default.update(overallTaskSpinniesKey, {
102
112
  text: `${statusStrings.INITIALIZE(taskName, displayId)}\n${componentCountText}`,
103
113
  });
@@ -129,7 +139,7 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
129
139
  taskStatus = data;
130
140
  }
131
141
  catch (e) {
132
- logger_1.logger.debug(e);
142
+ logger_1.uiLogger.debug(e);
133
143
  (0, errorHandlers_1.logError)(e, new errorHandlers_1.ApiErrorContext({
134
144
  accountId,
135
145
  projectName: taskName,
@@ -152,8 +162,10 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
152
162
  if (status === statusText.STATES.SUCCESS ||
153
163
  status === statusText.STATES.FAILURE) {
154
164
  const taskStatusText = subtask.status === statusText.STATES.SUCCESS
155
- ? (0, lang_1.i18n)(`${i18nKey}.makePollTaskStatusFunc.successStatusText`)
156
- : (0, lang_1.i18n)(`${i18nKey}.makePollTaskStatusFunc.failedStatusText`);
165
+ ? en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc
166
+ .successStatusText
167
+ : en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc
168
+ .failedStatusText;
157
169
  const hasNewline = spinner?.text?.includes('\n') || Boolean(topLevelTask);
158
170
  const updatedText = `${spinner?.text?.replace('\n', '')} ${taskStatusText}${hasNewline ? '\n' : ''}`;
159
171
  if (status === statusText.STATES.SUCCESS) {
@@ -181,23 +193,23 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
181
193
  if (!silenceLogs) {
182
194
  const failedSubtasks = subtasks.filter(subtask => subtask.status === 'FAILURE');
183
195
  (0, ui_1.uiLine)();
184
- logger_1.logger.log(`${statusStrings.SUBTASK_FAIL(failedSubtasks.length === 1
196
+ logger_1.uiLogger.log(`${statusStrings.SUBTASK_FAIL(failedSubtasks.length === 1
185
197
  ? getSubtaskName(failedSubtasks[0])
186
198
  : failedSubtasks.length + ' components', displayId)}\n`);
187
- logger_1.logger.log('See below for a summary of errors.');
199
+ logger_1.uiLogger.log(en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc.errorSummary);
188
200
  (0, ui_1.uiLine)();
189
201
  const displayErrors = failedSubtasks.filter(subtask => subtask?.standardError?.subCategory !==
190
202
  constants_1.PROJECT_ERROR_TYPES.SUBBUILD_FAILED &&
191
203
  subtask?.standardError?.subCategory !==
192
204
  constants_1.PROJECT_ERROR_TYPES.SUBDEPLOY_FAILED);
193
205
  displayErrors.forEach(subTask => {
194
- logger_1.logger.log(`\n--- ${chalk_1.default.bold(getSubtaskName(subTask))} failed with the following error ---`);
195
- logger_1.logger.error(subTask.errorMessage);
206
+ logger_1.uiLogger.log(`\n--- ${chalk_1.default.bold(getSubtaskName(subTask))} failed with the following error ---`);
207
+ logger_1.uiLogger.error(subTask.errorMessage);
196
208
  // Log nested errors
197
209
  if (subTask.standardError && subTask.standardError.errors) {
198
- logger_1.logger.log();
210
+ logger_1.uiLogger.log('');
199
211
  subTask.standardError.errors.forEach(error => {
200
- logger_1.logger.log(error.message);
212
+ logger_1.uiLogger.log(error.message);
201
213
  });
202
214
  }
203
215
  });
@@ -224,11 +236,11 @@ function pollBuildAutodeployStatus(accountId, taskName, buildId) {
224
236
  build = response.data;
225
237
  }
226
238
  catch (e) {
227
- logger_1.logger.debug(e);
228
- return reject(new Error((0, lang_1.i18n)(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId })));
239
+ logger_1.uiLogger.debug(e);
240
+ return reject(new Error(en_1.lib.projectBuildAndDeploy.pollBuildAutodeployStatusError(buildId)));
229
241
  }
230
242
  if (!build || !build.status) {
231
- return reject(new Error((0, lang_1.i18n)(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId })));
243
+ return reject(new Error(en_1.lib.projectBuildAndDeploy.pollBuildAutodeployStatusError(buildId)));
232
244
  }
233
245
  if (build.deployStatusTaskLocator || maxIntervals <= 0) {
234
246
  clearInterval(pollInterval);
@@ -287,9 +299,9 @@ async function displayWarnLogs(accountId, projectName, taskId, isDeploy = false)
287
299
  if (result && result.logs) {
288
300
  const logLength = result.logs.length;
289
301
  result.logs.forEach((log, i) => {
290
- logger_1.logger.warn(log.message);
302
+ logger_1.uiLogger.warn(log.message);
291
303
  if (i < logLength - 1) {
292
- logger_1.logger.log('');
304
+ logger_1.uiLogger.log('');
293
305
  }
294
306
  });
295
307
  }
@@ -311,10 +323,7 @@ async function pollProjectBuildAndDeploy(accountId, projectConfig, tempFile, bui
311
323
  }
312
324
  else if (buildStatus.isAutoDeployEnabled) {
313
325
  if (!silenceLogs) {
314
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.pollProjectBuildAndDeploy.buildSucceededAutomaticallyDeploying`, {
315
- accountIdentifier: (0, ui_1.uiAccountDescription)(accountId),
316
- buildId,
317
- }));
326
+ logger_1.uiLogger.log(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.buildSucceededAutomaticallyDeploying(buildId, (0, ui_1.uiAccountDescription)(accountId)));
318
327
  await displayWarnLogs(accountId, projectConfig.name, buildId);
319
328
  }
320
329
  // autoDeployId of 0 indicates a skipped deploy
@@ -331,22 +340,17 @@ async function pollProjectBuildAndDeploy(accountId, projectConfig, tempFile, bui
331
340
  }
332
341
  }
333
342
  else if (!silenceLogs) {
334
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.pollProjectBuildAndDeploy.unableToFindAutodeployStatus`, {
335
- buildId,
336
- viewDeploysLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.pollProjectBuildAndDeploy.viewDeploys`), (0, urls_1.getProjectActivityUrl)(projectConfig.name, accountId)),
337
- }));
343
+ logger_1.uiLogger.log(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.unableToFindAutodeployStatus(buildId, (0, ui_1.uiLink)(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.viewDeploys, (0, urls_1.getProjectActivityUrl)(projectConfig.name, accountId))));
338
344
  }
339
345
  }
340
346
  try {
341
347
  if (tempFile) {
342
348
  tempFile.removeCallback();
343
- logger_1.logger.debug((0, lang_1.i18n)(`${i18nKey}.pollProjectBuildAndDeploy.cleanedUpTempFile`, {
344
- path: tempFile.name,
345
- }));
349
+ logger_1.uiLogger.debug(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.cleanedUpTempFile(tempFile.name));
346
350
  }
347
351
  }
348
352
  catch (e) {
349
- logger_1.logger.error(e);
353
+ (0, errorHandlers_1.logError)(e);
350
354
  }
351
355
  if (result && result.deployResult) {
352
356
  await displayWarnLogs(accountId, projectConfig.name, result.deployResult.deployId, true);
@@ -0,0 +1,9 @@
1
+ import { ProjectConfig } from '../../types/Projects';
2
+ export declare function writeProjectConfig(configPath: string, config: ProjectConfig): boolean;
3
+ export declare function getIsInProject(dir?: string): boolean;
4
+ export interface LoadedProjectConfig {
5
+ projectDir: string | null;
6
+ projectConfig: ProjectConfig | null;
7
+ }
8
+ export declare function getProjectConfig(dir?: string): Promise<LoadedProjectConfig>;
9
+ export declare function validateProjectConfig(projectConfig: ProjectConfig | null, projectDir: string | null): asserts projectConfig is ProjectConfig;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.writeProjectConfig = writeProjectConfig;
7
+ exports.getIsInProject = getIsInProject;
8
+ exports.getProjectConfig = getProjectConfig;
9
+ exports.validateProjectConfig = validateProjectConfig;
10
+ const fs_extra_1 = __importDefault(require("fs-extra"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const findup_sync_1 = __importDefault(require("findup-sync"));
13
+ const path_2 = require("@hubspot/local-dev-lib/path");
14
+ const constants_1 = require("../constants");
15
+ const en_1 = require("../../lang/en");
16
+ const exitCodes_1 = require("../enums/exitCodes");
17
+ const logger_1 = require("../ui/logger");
18
+ function writeProjectConfig(configPath, config) {
19
+ try {
20
+ fs_extra_1.default.ensureFileSync(configPath);
21
+ fs_extra_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2));
22
+ logger_1.uiLogger.debug(`Wrote project config at ${configPath}`);
23
+ }
24
+ catch (e) {
25
+ logger_1.uiLogger.debug(e);
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ function getIsInProject(dir) {
31
+ const configPath = getProjectConfigPath(dir);
32
+ return !!configPath;
33
+ }
34
+ function getProjectConfigPath(dir) {
35
+ const projectDir = dir ? (0, path_2.getAbsoluteFilePath)(dir) : (0, path_2.getCwd)();
36
+ const configPath = (0, findup_sync_1.default)(constants_1.PROJECT_CONFIG_FILE, {
37
+ cwd: projectDir,
38
+ nocase: true,
39
+ });
40
+ return configPath;
41
+ }
42
+ async function getProjectConfig(dir) {
43
+ const configPath = getProjectConfigPath(dir);
44
+ if (!configPath) {
45
+ return { projectConfig: null, projectDir: null };
46
+ }
47
+ try {
48
+ const config = fs_extra_1.default.readFileSync(configPath);
49
+ const projectConfig = JSON.parse(config.toString());
50
+ return {
51
+ projectDir: path_1.default.dirname(configPath),
52
+ projectConfig,
53
+ };
54
+ }
55
+ catch (e) {
56
+ logger_1.uiLogger.error(en_1.lib.projects.getProjectConfig.error);
57
+ return { projectConfig: null, projectDir: null };
58
+ }
59
+ }
60
+ function validateProjectConfig(projectConfig, projectDir) {
61
+ if (!projectConfig || !projectDir) {
62
+ logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.configNotFound);
63
+ return process.exit(exitCodes_1.EXIT_CODES.ERROR);
64
+ }
65
+ if (!projectConfig.name || !projectConfig.srcDir) {
66
+ logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.configMissingFields);
67
+ return process.exit(exitCodes_1.EXIT_CODES.ERROR);
68
+ }
69
+ const resolvedPath = path_1.default.resolve(projectDir, projectConfig.srcDir);
70
+ if (!resolvedPath.startsWith(projectDir)) {
71
+ const projectConfigFile = path_1.default.relative('.', path_1.default.join(projectDir, constants_1.PROJECT_CONFIG_FILE));
72
+ logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.srcOutsideProjectDir(projectConfigFile, projectConfig.srcDir));
73
+ return process.exit(exitCodes_1.EXIT_CODES.ERROR);
74
+ }
75
+ if (!fs_extra_1.default.existsSync(resolvedPath)) {
76
+ logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.srcDirNotFound(projectConfig.srcDir, projectDir));
77
+ return process.exit(exitCodes_1.EXIT_CODES.ERROR);
78
+ }
79
+ }
@@ -3,13 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EMPTY_PROJECT_TEMPLATE_NAME = void 0;
4
4
  exports.getProjectComponentListFromRepo = getProjectComponentListFromRepo;
5
5
  exports.getProjectTemplateListFromRepo = getProjectTemplateListFromRepo;
6
- const logger_1 = require("@hubspot/local-dev-lib/logger");
7
6
  const github_1 = require("@hubspot/local-dev-lib/api/github");
8
7
  const constants_1 = require("../constants");
9
8
  const exitCodes_1 = require("../enums/exitCodes");
10
- const lang_1 = require("../lang");
11
9
  const index_1 = require("../errorHandlers/index");
12
- const i18nKey = 'lib.projects.create';
10
+ const en_1 = require("../../lang/en");
11
+ const logger_1 = require("../ui/logger");
13
12
  exports.EMPTY_PROJECT_TEMPLATE_NAME = 'no-template';
14
13
  const PROJECT_TEMPLATE_PROPERTIES = ['name', 'label', 'path', 'insertPath'];
15
14
  async function getProjectComponentListFromRepo(githubRef) {
@@ -34,17 +33,17 @@ async function getProjectTemplateListFromRepo(templateSource, githubRef) {
34
33
  }
35
34
  catch (e) {
36
35
  (0, index_1.debugError)(e);
37
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.missingConfigFileTemplateSource`));
36
+ logger_1.uiLogger.error(en_1.lib.projects.create.errors.missingConfigFileTemplateSource);
38
37
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
39
38
  }
40
39
  if (!config || !config[constants_1.PROJECT_COMPONENT_TYPES.PROJECTS]) {
41
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noProjectsInConfig`));
40
+ logger_1.uiLogger.error(en_1.lib.projects.create.errors.noProjectsInConfig);
42
41
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
43
42
  }
44
43
  const templates = config[constants_1.PROJECT_COMPONENT_TYPES.PROJECTS];
45
44
  const templatesContainAllProperties = templates.every(config => PROJECT_TEMPLATE_PROPERTIES.every(p => Object.prototype.hasOwnProperty.call(config, p)));
46
45
  if (!templatesContainAllProperties) {
47
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.missingPropertiesInConfig`));
46
+ logger_1.uiLogger.error(en_1.lib.projects.create.errors.missingPropertiesInConfig);
48
47
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
49
48
  }
50
49
  return templates;
@@ -0,0 +1,11 @@
1
+ import { Project } from '@hubspot/local-dev-lib/types/Project';
2
+ export declare function ensureProjectExists(accountId: number, projectName: string, { forceCreate, allowCreate, noLogs, withPolling, uploadCommand, }?: {
3
+ forceCreate?: boolean | undefined;
4
+ allowCreate?: boolean | undefined;
5
+ noLogs?: boolean | undefined;
6
+ withPolling?: boolean | undefined;
7
+ uploadCommand?: boolean | undefined;
8
+ }): Promise<{
9
+ projectExists: boolean;
10
+ project?: Project;
11
+ }>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureProjectExists = ensureProjectExists;
7
+ const projects_1 = require("@hubspot/local-dev-lib/api/projects");
8
+ const index_1 = require("@hubspot/local-dev-lib/errors/index");
9
+ const constants_1 = require("../constants");
10
+ const promptUtils_1 = require("../prompts/promptUtils");
11
+ const exitCodes_1 = require("../enums/exitCodes");
12
+ const ui_1 = require("../ui");
13
+ const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
14
+ const index_2 = require("../errorHandlers/index");
15
+ const en_1 = require("../../lang/en");
16
+ const logger_1 = require("../ui/logger");
17
+ async function pollFetchProject(accountId, projectName) {
18
+ // Temporary solution for gating slowness. Retry on 403 statusCode
19
+ return new Promise((resolve, reject) => {
20
+ let pollCount = 0;
21
+ SpinniesManager_1.default.init();
22
+ SpinniesManager_1.default.add('pollFetchProject', {
23
+ text: en_1.lib.projects.pollFetchProject.checkingProject((0, ui_1.uiAccountDescription)(accountId)),
24
+ });
25
+ const pollInterval = setInterval(async () => {
26
+ try {
27
+ const response = await (0, projects_1.fetchProject)(accountId, projectName);
28
+ if (response && response.data) {
29
+ SpinniesManager_1.default.remove('pollFetchProject');
30
+ clearInterval(pollInterval);
31
+ resolve(response);
32
+ }
33
+ }
34
+ catch (err) {
35
+ if ((0, index_1.isSpecifiedError)(err, {
36
+ statusCode: 403,
37
+ category: 'GATED',
38
+ subCategory: 'BuildPipelineErrorType.PORTAL_GATED',
39
+ }) &&
40
+ pollCount < 15) {
41
+ pollCount += 1;
42
+ }
43
+ else {
44
+ SpinniesManager_1.default.remove('pollFetchProject');
45
+ clearInterval(pollInterval);
46
+ reject(err);
47
+ }
48
+ }
49
+ }, constants_1.DEFAULT_POLLING_DELAY);
50
+ });
51
+ }
52
+ async function ensureProjectExists(accountId, projectName, { forceCreate = false, allowCreate = true, noLogs = false, withPolling = false, uploadCommand = false, } = {}) {
53
+ const accountIdentifier = (0, ui_1.uiAccountDescription)(accountId);
54
+ try {
55
+ const { data: project } = withPolling
56
+ ? await pollFetchProject(accountId, projectName)
57
+ : await (0, projects_1.fetchProject)(accountId, projectName);
58
+ return { projectExists: !!project, project };
59
+ }
60
+ catch (err) {
61
+ if ((0, index_1.isSpecifiedError)(err, { statusCode: 404 })) {
62
+ let shouldCreateProject = forceCreate;
63
+ if (allowCreate && !shouldCreateProject) {
64
+ const promptLangFunction = uploadCommand
65
+ ? en_1.lib.projects.ensureProjectExists.createPromptUpload
66
+ : en_1.lib.projects.ensureProjectExists.createPrompt;
67
+ const promptResult = await (0, promptUtils_1.promptUser)([
68
+ {
69
+ name: 'shouldCreateProject',
70
+ message: promptLangFunction(projectName, accountIdentifier),
71
+ type: 'confirm',
72
+ },
73
+ ]);
74
+ shouldCreateProject = promptResult.shouldCreateProject;
75
+ }
76
+ if (shouldCreateProject) {
77
+ try {
78
+ const { data: project } = await (0, projects_1.createProject)(accountId, projectName);
79
+ logger_1.uiLogger.success(en_1.lib.projects.ensureProjectExists.createSuccess(projectName, accountIdentifier));
80
+ return { projectExists: true, project };
81
+ }
82
+ catch (err) {
83
+ (0, index_2.logError)(err, new index_2.ApiErrorContext({ accountId }));
84
+ return { projectExists: false };
85
+ }
86
+ }
87
+ else {
88
+ if (!noLogs) {
89
+ logger_1.uiLogger.log(en_1.lib.projects.ensureProjectExists.notFound(projectName, accountIdentifier));
90
+ }
91
+ return { projectExists: false };
92
+ }
93
+ }
94
+ (0, index_2.logError)(err, new index_2.ApiErrorContext({ accountId }));
95
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
96
+ }
97
+ }
@@ -0,0 +1,26 @@
1
+ import { PublicApp } from '@hubspot/local-dev-lib/types/Apps';
2
+ import { AppIRNode } from '../../../types/ProjectComponents';
3
+ import LocalDevState from './LocalDevState';
4
+ import LocalDevLogger from './LocalDevLogger';
5
+ type AppDevModeInterfaceConstructorOptions = {
6
+ localDevState: LocalDevState;
7
+ localDevLogger: LocalDevLogger;
8
+ };
9
+ declare class AppDevModeInterface {
10
+ localDevState: LocalDevState;
11
+ localDevLogger: LocalDevLogger;
12
+ _appNode?: AppIRNode | null;
13
+ appData?: PublicApp;
14
+ marketplaceAppInstalls?: number;
15
+ constructor(options: AppDevModeInterfaceConstructorOptions);
16
+ private get appNode();
17
+ private getAppInstallUrl;
18
+ private fetchAppData;
19
+ private checkMarketplaceAppInstalls;
20
+ private checkTestAccountAppInstallation;
21
+ setup(args: any): Promise<void>;
22
+ start(): Promise<void>;
23
+ fileChange(filePath: string, event: string): Promise<void>;
24
+ cleanup(): Promise<void>;
25
+ }
26
+ export default AppDevModeInterface;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const localDevAuth_1 = require("@hubspot/local-dev-lib/api/localDevAuth");
4
+ const appsDev_1 = require("@hubspot/local-dev-lib/api/appsDev");
5
+ const ui_extensions_dev_server_1 = require("@hubspot/ui-extensions-dev-server");
6
+ const portManager_1 = require("@hubspot/local-dev-lib/portManager");
7
+ const constants_1 = require("../../constants");
8
+ const exitCodes_1 = require("../../enums/exitCodes");
9
+ const structure_1 = require("../../projects/structure");
10
+ const ui_1 = require("../../ui");
11
+ const index_1 = require("../../errorHandlers/index");
12
+ const installAppPrompt_1 = require("../../prompts/installAppPrompt");
13
+ const promptUtils_1 = require("../../prompts/promptUtils");
14
+ const en_1 = require("../../../lang/en");
15
+ const logger_1 = require("../../ui/logger");
16
+ const urls_1 = require("../../app/urls");
17
+ class AppDevModeInterface {
18
+ localDevState;
19
+ localDevLogger;
20
+ _appNode;
21
+ appData;
22
+ marketplaceAppInstalls;
23
+ constructor(options) {
24
+ this.localDevState = options.localDevState;
25
+ this.localDevLogger = options.localDevLogger;
26
+ // Static auth apps are currently only installable in the portal that the project resides in
27
+ // This limitation will eventually be removed, but in the meantime we need this check or the install
28
+ // will always fail with a confusing message
29
+ if (this.appNode?.config.auth.type === constants_1.APP_AUTH_TYPES.STATIC &&
30
+ this.localDevState.targetTestingAccountId !==
31
+ this.localDevState.targetProjectAccountId) {
32
+ logger_1.uiLogger.error(en_1.lib.LocalDevManager.staticAuthAccountsMustMatch);
33
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
34
+ }
35
+ if (!this.localDevState.targetProjectAccountId ||
36
+ !this.localDevState.projectConfig ||
37
+ !this.localDevState.projectDir) {
38
+ logger_1.uiLogger.error(en_1.lib.LocalDevManager.failedToInitialize);
39
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
40
+ }
41
+ }
42
+ // Assumes only one app per project
43
+ get appNode() {
44
+ if (this._appNode === undefined) {
45
+ this._appNode =
46
+ Object.values(this.localDevState.projectNodes).find(structure_1.isAppIRNode) ||
47
+ null;
48
+ }
49
+ return this._appNode;
50
+ }
51
+ async getAppInstallUrl() {
52
+ if (this.appNode?.config.auth.type === constants_1.APP_AUTH_TYPES.OAUTH) {
53
+ return (0, urls_1.getOauthAppInstallUrl)({
54
+ targetAccountId: this.localDevState.targetTestingAccountId,
55
+ env: this.localDevState.env,
56
+ clientId: this.appData.clientId, // This is only called after checking that appData exists
57
+ scopes: this.appNode.config.auth.requiredScopes,
58
+ redirectUrls: this.appNode.config.auth.redirectUrls,
59
+ });
60
+ }
61
+ const { data: { results }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
62
+ const app = results.find(app => app.sourceId === this.appNode?.uid);
63
+ if (!app) {
64
+ logger_1.uiLogger.error(en_1.lib.LocalDevManager.staticAuthAccountsMustMatch);
65
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
66
+ }
67
+ return (0, urls_1.getStaticAuthAppInstallUrl)({
68
+ targetAccountId: this.localDevState.targetTestingAccountId,
69
+ env: this.localDevState.env,
70
+ appId: `${app.id}`,
71
+ });
72
+ }
73
+ async fetchAppData() {
74
+ const { data: { results: portalApps }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
75
+ const appData = portalApps.find(({ sourceId }) => sourceId === this.appNode?.uid);
76
+ if (!appData) {
77
+ return;
78
+ }
79
+ const { data: { uniquePortalInstallCount }, } = await (0, appsDev_1.fetchPublicAppProductionInstallCounts)(appData.id, this.localDevState.targetProjectAccountId);
80
+ this.appData = appData;
81
+ this.marketplaceAppInstalls = uniquePortalInstallCount;
82
+ }
83
+ async checkMarketplaceAppInstalls() {
84
+ if (!this.appData || !this.marketplaceAppInstalls) {
85
+ return;
86
+ }
87
+ (0, ui_1.uiLine)();
88
+ logger_1.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.appData.name, this.marketplaceAppInstalls));
89
+ logger_1.uiLogger.log(en_1.lib.LocalDevManager.activeInstallWarning.explanation);
90
+ (0, ui_1.uiLine)();
91
+ const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.LocalDevManager.activeInstallWarning.confirmationPrompt, { defaultAnswer: false });
92
+ if (!proceed) {
93
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
94
+ }
95
+ this.localDevLogger.addUploadWarning(en_1.lib.AppDevModeInterface.defaultMarketplaceAppWarning(this.marketplaceAppInstalls));
96
+ }
97
+ async checkTestAccountAppInstallation() {
98
+ if (!this.appNode || !this.appData) {
99
+ return;
100
+ }
101
+ // If the app is static auth, always prompt the user to install the app.
102
+ // We are currently going this because we have no method to determine if the static auth app
103
+ // is already installed in the portal
104
+ if (this.appNode.config.auth.type === constants_1.APP_AUTH_TYPES.STATIC) {
105
+ return (0, installAppPrompt_1.installAppPrompt)(await this.getAppInstallUrl(), false);
106
+ }
107
+ const { data: { isInstalledWithScopeGroups, previouslyAuthorizedScopeGroups }, } = await (0, localDevAuth_1.fetchAppInstallationData)(this.localDevState.targetTestingAccountId, this.localDevState.projectId, this.appNode.uid, this.appNode.config.auth.requiredScopes, this.appNode.config.auth.optionalScopes);
108
+ const isReinstall = previouslyAuthorizedScopeGroups.length > 0;
109
+ if (!isInstalledWithScopeGroups) {
110
+ const installUrl = await this.getAppInstallUrl();
111
+ await (0, installAppPrompt_1.installAppPrompt)(installUrl, isReinstall);
112
+ }
113
+ }
114
+ // @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
115
+ // In the future, update UIE Dev Server to use LocalDevState
116
+ async setup(args) {
117
+ if (!this.appNode) {
118
+ return;
119
+ }
120
+ try {
121
+ await this.fetchAppData();
122
+ if (this.appNode.config.distribution === constants_1.APP_DISTRIBUTION_TYPES.MARKETPLACE) {
123
+ await this.checkMarketplaceAppInstalls();
124
+ }
125
+ await this.checkTestAccountAppInstallation();
126
+ }
127
+ catch (e) {
128
+ (0, index_1.logError)(e);
129
+ }
130
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.setup(args);
131
+ }
132
+ async start() {
133
+ if (!this.appNode) {
134
+ return;
135
+ }
136
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.start({
137
+ accountId: this.localDevState.targetTestingAccountId,
138
+ // @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
139
+ projectConfig: this.localDevState.projectConfig,
140
+ requestPorts: portManager_1.requestPorts,
141
+ });
142
+ }
143
+ async fileChange(filePath, event) {
144
+ if (!this.appNode) {
145
+ return;
146
+ }
147
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.fileChange(filePath, event);
148
+ }
149
+ async cleanup() {
150
+ if (!this.appNode) {
151
+ return;
152
+ }
153
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.cleanup();
154
+ }
155
+ }
156
+ exports.default = AppDevModeInterface;
@@ -1,4 +1,4 @@
1
- import { ProjectConfig, ComponentTypes, Component } from '../types/Projects';
1
+ import { ProjectConfig, ComponentTypes, Component } from '../../../types/Projects';
2
2
  type DevServerInterface = {
3
3
  setup?: Function;
4
4
  start?: (options: object) => Promise<void>;