@hubspot/cli 7.5.1-experimental.0 → 7.5.2-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 (377) hide show
  1. package/api/migrate.d.ts +12 -3
  2. package/api/migrate.js +9 -2
  3. package/bin/cli.js +96 -93
  4. package/commands/account/auth.d.ts +6 -0
  5. package/commands/account/auth.js +167 -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 +33 -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 +64 -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 +10 -10
  38. package/commands/auth.d.ts +3 -7
  39. package/commands/auth.js +20 -25
  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 +22 -16
  48. package/commands/completion.d.ts +3 -1
  49. package/commands/completion.js +23 -13
  50. package/commands/config/migrate.d.ts +6 -0
  51. package/commands/config/migrate.js +75 -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 +19 -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 +62 -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 +20 -48
  96. package/commands/doctor.d.ts +6 -8
  97. package/commands/doctor.js +30 -22
  98. package/commands/feedback.d.ts +4 -1
  99. package/commands/feedback.js +38 -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 +18 -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 +22 -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 +22 -47
  126. package/commands/init.d.ts +3 -7
  127. package/commands/init.js +25 -23
  128. package/commands/lint.d.ts +6 -4
  129. package/commands/lint.js +42 -44
  130. package/commands/list.d.ts +3 -7
  131. package/commands/list.js +21 -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 -30
  136. package/commands/module.d.ts +3 -1
  137. package/commands/module.js +23 -12
  138. package/commands/mv.d.ts +3 -7
  139. package/commands/mv.js +20 -15
  140. package/commands/open.d.ts +3 -7
  141. package/commands/open.js +20 -15
  142. package/commands/project/add.d.ts +8 -9
  143. package/commands/project/add.js +53 -85
  144. package/commands/project/cloneApp.d.ts +6 -8
  145. package/commands/project/cloneApp.js +51 -47
  146. package/commands/project/create.d.ts +4 -1
  147. package/commands/project/create.js +132 -81
  148. package/commands/project/deploy.d.ts +4 -6
  149. package/commands/project/deploy.js +66 -36
  150. package/commands/project/dev/deprecatedFlow.d.ts +8 -2
  151. package/commands/project/dev/deprecatedFlow.js +41 -26
  152. package/commands/project/dev/index.d.ts +4 -5
  153. package/commands/project/dev/index.js +103 -33
  154. package/commands/project/dev/unifiedFlow.d.ts +11 -2
  155. package/commands/project/dev/unifiedFlow.js +87 -46
  156. package/commands/project/download.d.ts +3 -7
  157. package/commands/project/download.js +18 -19
  158. package/commands/project/installDeps.d.ts +6 -1
  159. package/commands/project/installDeps.js +48 -32
  160. package/commands/project/listBuilds.d.ts +3 -7
  161. package/commands/project/listBuilds.js +32 -27
  162. package/commands/project/logs.d.ts +10 -1
  163. package/commands/project/logs.js +73 -65
  164. package/commands/project/migrate.d.ts +7 -8
  165. package/commands/project/migrate.js +49 -26
  166. package/commands/project/migrateApp.d.ts +3 -8
  167. package/commands/project/migrateApp.js +23 -20
  168. package/commands/project/open.d.ts +3 -7
  169. package/commands/project/open.js +29 -21
  170. package/commands/project/profile/add.d.ts +7 -0
  171. package/commands/project/profile/add.js +209 -0
  172. package/commands/project/profile/delete.d.ts +6 -0
  173. package/commands/project/profile/delete.js +123 -0
  174. package/commands/project/profile.d.ts +3 -0
  175. package/commands/project/profile.js +25 -0
  176. package/commands/project/upload.d.ts +10 -1
  177. package/commands/project/upload.js +110 -56
  178. package/commands/project/watch.d.ts +6 -1
  179. package/commands/project/watch.js +95 -61
  180. package/commands/project.d.ts +3 -1
  181. package/commands/project.js +47 -37
  182. package/commands/remove.d.ts +3 -7
  183. package/commands/remove.js +22 -20
  184. package/commands/sandbox/create.d.ts +4 -9
  185. package/commands/sandbox/create.js +27 -21
  186. package/commands/sandbox/delete.d.ts +4 -9
  187. package/commands/sandbox/delete.js +35 -29
  188. package/commands/sandbox.d.ts +3 -4
  189. package/commands/sandbox.js +18 -44
  190. package/commands/secret/addSecret.d.ts +4 -9
  191. package/commands/secret/addSecret.js +21 -15
  192. package/commands/secret/deleteSecret.d.ts +4 -9
  193. package/commands/secret/deleteSecret.js +28 -18
  194. package/commands/secret/listSecret.d.ts +4 -9
  195. package/commands/secret/listSecret.js +19 -13
  196. package/commands/secret/updateSecret.d.ts +4 -9
  197. package/commands/secret/updateSecret.js +25 -17
  198. package/commands/secret.d.ts +3 -4
  199. package/commands/secret.js +23 -49
  200. package/commands/theme/generate-selectors.d.ts +3 -7
  201. package/commands/theme/generate-selectors.js +20 -16
  202. package/commands/theme/marketplace-validate.d.ts +4 -9
  203. package/commands/theme/marketplace-validate.js +22 -18
  204. package/commands/theme/preview.d.ts +4 -9
  205. package/commands/theme/preview.js +36 -30
  206. package/commands/theme.d.ts +3 -4
  207. package/commands/theme.js +22 -48
  208. package/commands/upload.d.ts +12 -1
  209. package/commands/upload.js +116 -135
  210. package/commands/watch.d.ts +14 -1
  211. package/commands/watch.js +74 -76
  212. package/lang/en.d.ts +3078 -0
  213. package/lang/en.js +2940 -3317
  214. package/lang/en.lyaml +89 -214
  215. package/lib/accountTypes.d.ts +1 -0
  216. package/lib/accountTypes.js +11 -0
  217. package/lib/app/migrate.d.ts +33 -4
  218. package/lib/app/migrate.js +171 -86
  219. package/lib/app/migrate_legacy.d.ts +2 -2
  220. package/lib/app/migrate_legacy.js +12 -11
  221. package/lib/app/urls.d.ts +16 -0
  222. package/lib/app/urls.js +16 -0
  223. package/lib/buildAccount.d.ts +1 -2
  224. package/lib/buildAccount.js +11 -10
  225. package/lib/commonOpts.d.ts +4 -7
  226. package/lib/commonOpts.js +47 -19
  227. package/lib/configMigrate.d.ts +2 -0
  228. package/lib/configMigrate.js +83 -0
  229. package/lib/configOptions.d.ts +4 -0
  230. package/lib/configOptions.js +41 -45
  231. package/lib/constants.d.ts +24 -0
  232. package/lib/constants.js +25 -1
  233. package/lib/dependencyManagement.d.ts +0 -5
  234. package/lib/dependencyManagement.js +14 -40
  235. package/lib/doctor/Diagnosis.d.ts +1 -2
  236. package/lib/doctor/Diagnosis.js +19 -16
  237. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
  238. package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
  239. package/lib/doctor/Doctor.d.ts +1 -0
  240. package/lib/doctor/Doctor.js +59 -45
  241. package/lib/errorHandlers/index.js +6 -7
  242. package/lib/errorHandlers/suppressError.js +18 -26
  243. package/lib/filesystem.d.ts +1 -1
  244. package/lib/generateSelectors.js +3 -6
  245. package/lib/hasFeature.d.ts +3 -1
  246. package/lib/interpolation.d.ts +2 -3
  247. package/lib/lang.d.ts +2 -3
  248. package/lib/marketplaceValidate.d.ts +12 -2
  249. package/lib/marketplaceValidate.js +22 -29
  250. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +3 -3
  251. package/lib/middleware/autoUpdateMiddleware.d.ts +1 -0
  252. package/lib/middleware/autoUpdateMiddleware.js +89 -0
  253. package/lib/middleware/configMiddleware.js +23 -3
  254. package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
  255. package/lib/middleware/fireAlarmMiddleware.js +125 -0
  256. package/lib/middleware/yargsChecksMiddleware.js +2 -2
  257. package/lib/npm.d.ts +9 -0
  258. package/lib/npm.js +36 -0
  259. package/lib/oauth.js +1 -2
  260. package/lib/process.js +1 -2
  261. package/lib/projectProfiles.d.ts +6 -0
  262. package/lib/projectProfiles.js +65 -0
  263. package/lib/projects/ProjectLogsManager.d.ts +1 -1
  264. package/lib/projects/ProjectLogsManager.js +16 -21
  265. package/lib/projects/add/legacyAddComponent.d.ts +5 -0
  266. package/lib/projects/add/legacyAddComponent.js +48 -0
  267. package/lib/projects/add/v3AddComponent.d.ts +8 -0
  268. package/lib/projects/add/v3AddComponent.js +85 -0
  269. package/lib/projects/buildAndDeploy.js +45 -41
  270. package/lib/projects/components.d.ts +2 -0
  271. package/lib/projects/components.js +82 -0
  272. package/lib/projects/config.d.ts +9 -0
  273. package/lib/projects/config.js +79 -0
  274. package/lib/projects/create/index.d.ts +23 -0
  275. package/lib/projects/create/index.js +33 -0
  276. package/lib/projects/create/legacy.d.ts +6 -0
  277. package/lib/projects/{create.js → create/legacy.js} +23 -15
  278. package/lib/projects/create/v3.d.ts +27 -0
  279. package/lib/projects/create/v3.js +158 -0
  280. package/lib/projects/ensureProjectExists.d.ts +11 -0
  281. package/lib/projects/ensureProjectExists.js +97 -0
  282. package/lib/projects/localDev/AppDevModeInterface.d.ts +26 -0
  283. package/lib/projects/localDev/AppDevModeInterface.js +178 -0
  284. package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
  285. package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
  286. package/lib/projects/localDev/DevServerManagerV2.d.ts +22 -0
  287. package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +22 -19
  288. package/lib/projects/localDev/LocalDevLogger.d.ts +30 -0
  289. package/lib/projects/localDev/LocalDevLogger.js +158 -0
  290. package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
  291. package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +57 -83
  292. package/lib/projects/localDev/LocalDevProcess.d.ts +33 -0
  293. package/lib/projects/localDev/LocalDevProcess.js +198 -0
  294. package/lib/projects/localDev/LocalDevState.d.ts +47 -0
  295. package/lib/projects/localDev/LocalDevState.js +109 -0
  296. package/lib/projects/localDev/LocalDevWatcher.d.ts +10 -0
  297. package/lib/projects/localDev/LocalDevWatcher.js +53 -0
  298. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +20 -0
  299. package/lib/projects/localDev/LocalDevWebsocketServer.js +130 -0
  300. package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +6 -4
  301. package/lib/{localDev.js → projects/localDev/helpers.js} +127 -114
  302. package/lib/projects/ui.d.ts +1 -0
  303. package/lib/projects/ui.js +15 -0
  304. package/lib/projects/upload.d.ts +14 -2
  305. package/lib/projects/upload.js +25 -35
  306. package/lib/projects/urls.d.ts +1 -0
  307. package/lib/projects/urls.js +6 -0
  308. package/lib/projects/watch.d.ts +1 -1
  309. package/lib/projects/watch.js +21 -18
  310. package/lib/prompts/accountNamePrompt.js +16 -13
  311. package/lib/prompts/accountsPrompt.js +1 -2
  312. package/lib/prompts/cmsFieldPrompt.js +1 -2
  313. package/lib/prompts/createApiSamplePrompt.d.ts +2 -10
  314. package/lib/prompts/createApiSamplePrompt.js +4 -5
  315. package/lib/prompts/createFunctionPrompt.js +13 -14
  316. package/lib/prompts/createModulePrompt.js +8 -9
  317. package/lib/prompts/createProjectPrompt.d.ts +20 -4
  318. package/lib/prompts/createProjectPrompt.js +41 -13
  319. package/lib/prompts/createTemplatePrompt.d.ts +22 -4
  320. package/lib/prompts/createTemplatePrompt.js +1 -2
  321. package/lib/prompts/downloadProjectPrompt.js +3 -4
  322. package/lib/prompts/installAppPrompt.d.ts +1 -0
  323. package/lib/prompts/installAppPrompt.js +35 -0
  324. package/lib/prompts/personalAccessKeyPrompt.js +17 -18
  325. package/lib/prompts/previewPrompt.js +5 -6
  326. package/lib/prompts/projectAddPrompt.d.ts +5 -1
  327. package/lib/prompts/projectAddPrompt.js +35 -8
  328. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
  329. package/lib/prompts/projectDevTargetAccountPrompt.js +15 -16
  330. package/lib/prompts/projectNamePrompt.js +5 -6
  331. package/lib/prompts/projectsLogsPrompt.js +3 -2
  332. package/lib/prompts/promptUtils.d.ts +3 -2
  333. package/lib/prompts/promptUtils.js +2 -1
  334. package/lib/prompts/sandboxesPrompt.js +5 -6
  335. package/lib/prompts/secretPrompt.js +2 -3
  336. package/lib/prompts/selectAppPrompt.d.ts +2 -0
  337. package/lib/prompts/selectAppPrompt.js +40 -0
  338. package/lib/prompts/selectHubDBTablePrompt.js +11 -8
  339. package/lib/prompts/{selectPublicAppPrompt.d.ts → selectPublicAppForMigrationPrompt.d.ts} +1 -1
  340. package/lib/prompts/{selectPublicAppPrompt.js → selectPublicAppForMigrationPrompt.js} +8 -9
  341. package/lib/prompts/setAsDefaultAccountPrompt.js +11 -2
  342. package/lib/prompts/uploadPrompt.js +4 -5
  343. package/lib/sandboxSync.js +15 -14
  344. package/lib/sandboxes.js +12 -13
  345. package/lib/serverlessLogs.js +4 -6
  346. package/lib/testUtils.d.ts +3 -3
  347. package/lib/testUtils.js +8 -9
  348. package/lib/ui/SpinniesManager.d.ts +1 -1
  349. package/lib/ui/boxen.d.ts +5 -0
  350. package/lib/ui/boxen.js +30 -0
  351. package/lib/ui/git.js +8 -9
  352. package/lib/ui/index.d.ts +4 -2
  353. package/lib/ui/index.js +20 -17
  354. package/lib/ui/logger.d.ts +10 -0
  355. package/lib/ui/logger.js +15 -0
  356. package/lib/ui/serverlessFunctionLogs.js +2 -3
  357. package/lib/ui/spinniesUtils.d.ts +5 -5
  358. package/lib/upload.d.ts +1 -1
  359. package/lib/validation.js +4 -5
  360. package/lib/yargsUtils.d.ts +5 -1
  361. package/lib/yargsUtils.js +6 -0
  362. package/package.json +16 -10
  363. package/types/Cms.d.ts +30 -0
  364. package/types/Cms.js +2 -0
  365. package/types/LocalDev.d.ts +33 -0
  366. package/types/LocalDev.js +2 -0
  367. package/types/Projects.d.ts +19 -2
  368. package/types/Prompts.d.ts +0 -7
  369. package/types/Yargs.d.ts +14 -14
  370. package/lib/DevServerManagerV2.d.ts +0 -33
  371. package/lib/LocalDevManagerV2.d.ts +0 -64
  372. package/lib/LocalDevManagerV2.js +0 -377
  373. package/lib/projects/create.d.ts +0 -5
  374. package/lib/projects/index.d.ts +0 -21
  375. package/lib/projects/index.js +0 -194
  376. package/lib/prompts/installPublicAppPrompt.d.ts +0 -1
  377. package/lib/prompts/installPublicAppPrompt.js +0 -40
@@ -0,0 +1,10 @@
1
+ import LocalDevProcess from './LocalDevProcess';
2
+ declare class LocalDevWatcher {
3
+ private localDevProcess;
4
+ private watcher;
5
+ constructor(localDevProcess: LocalDevProcess);
6
+ private handleWatchEvent;
7
+ start(): void;
8
+ stop(): Promise<void>;
9
+ }
10
+ export default LocalDevWatcher;
@@ -0,0 +1,53 @@
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
+ const path_1 = __importDefault(require("path"));
7
+ const chokidar_1 = __importDefault(require("chokidar"));
8
+ const constants_1 = require("../../constants");
9
+ const WATCH_EVENTS = {
10
+ add: 'add',
11
+ change: 'change',
12
+ unlink: 'unlink',
13
+ unlinkDir: 'unlinkDir',
14
+ };
15
+ class LocalDevWatcher {
16
+ localDevProcess;
17
+ watcher;
18
+ constructor(localDevProcess) {
19
+ this.localDevProcess = localDevProcess;
20
+ this.watcher = null;
21
+ }
22
+ handleWatchEvent(filePath, event, configPaths) {
23
+ if (configPaths.includes(filePath)) {
24
+ return this.localDevProcess.handleConfigFileChange(filePath, event);
25
+ }
26
+ return this.localDevProcess.handleFileChange(filePath, event);
27
+ }
28
+ start() {
29
+ this.watcher = chokidar_1.default.watch(this.localDevProcess.projectDir, {
30
+ ignoreInitial: true,
31
+ ignored: ['**/dist'],
32
+ });
33
+ const configPaths = Object.values(this.localDevProcess.projectNodes).map(component => component.localDev.componentConfigPath);
34
+ const projectConfigPath = path_1.default.join(this.localDevProcess.projectDir, constants_1.PROJECT_CONFIG_FILE);
35
+ configPaths.push(projectConfigPath);
36
+ this.watcher.on('add', filePath => {
37
+ this.handleWatchEvent(filePath, WATCH_EVENTS.add, configPaths);
38
+ });
39
+ this.watcher.on('change', filePath => {
40
+ this.handleWatchEvent(filePath, WATCH_EVENTS.change, configPaths);
41
+ });
42
+ this.watcher.on('unlink', filePath => {
43
+ this.handleWatchEvent(filePath, WATCH_EVENTS.unlink, configPaths);
44
+ });
45
+ this.watcher.on('unlinkDir', filePath => {
46
+ this.handleWatchEvent(filePath, WATCH_EVENTS.unlinkDir, configPaths);
47
+ });
48
+ }
49
+ async stop() {
50
+ await this.watcher?.close();
51
+ }
52
+ }
53
+ exports.default = LocalDevWatcher;
@@ -0,0 +1,20 @@
1
+ import LocalDevProcess from './LocalDevProcess';
2
+ declare class LocalDevWebsocketServer {
3
+ private server?;
4
+ private _websocket?;
5
+ private debug?;
6
+ private localDevProcess;
7
+ private ALLOWED_ORIGINS;
8
+ constructor(localDevProcess: LocalDevProcess, debug?: boolean);
9
+ private websocket;
10
+ private log;
11
+ private logError;
12
+ private sendMessage;
13
+ private handleUpload;
14
+ private setupMessageHandlers;
15
+ private sendProjectData;
16
+ private setupStateListeners;
17
+ start(): Promise<void>;
18
+ shutdown(): void;
19
+ }
20
+ export default LocalDevWebsocketServer;
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ws_1 = require("ws");
4
+ const portManager_1 = require("@hubspot/local-dev-lib/portManager");
5
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
6
+ const constants_1 = require("../../constants");
7
+ const en_1 = require("../../../lang/en");
8
+ const SERVER_INSTANCE_ID = 'local-dev-ui-websocket-server';
9
+ const LOG_PREFIX = '[LocalDevWebsocketServer]';
10
+ class LocalDevWebsocketServer {
11
+ server;
12
+ _websocket;
13
+ debug;
14
+ localDevProcess;
15
+ ALLOWED_ORIGINS = [
16
+ 'https://hubspot.com',
17
+ 'https://hubspotqa.com',
18
+ 'https://local.hubspot.com',
19
+ 'https://local.hubspotqa.com',
20
+ ];
21
+ constructor(localDevProcess, debug) {
22
+ this.localDevProcess = localDevProcess;
23
+ this.debug = debug;
24
+ }
25
+ websocket() {
26
+ if (!this._websocket) {
27
+ throw new Error(en_1.lib.LocalDevWebsocketServer.errors.notInitialized(LOG_PREFIX));
28
+ }
29
+ return this._websocket;
30
+ }
31
+ log(message) {
32
+ if (this.debug) {
33
+ logger_1.logger.log(LOG_PREFIX, message);
34
+ }
35
+ }
36
+ logError(message) {
37
+ if (this.debug) {
38
+ logger_1.logger.error(LOG_PREFIX, message);
39
+ }
40
+ }
41
+ sendMessage(message) {
42
+ this.websocket().send(JSON.stringify(message));
43
+ }
44
+ async handleUpload() {
45
+ const uploadSuccess = await this.localDevProcess.uploadProject();
46
+ if (uploadSuccess) {
47
+ this.sendMessage({
48
+ type: constants_1.LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPLOAD_SUCCESS,
49
+ });
50
+ }
51
+ else {
52
+ this.sendMessage({
53
+ type: constants_1.LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPLOAD_FAILURE,
54
+ });
55
+ }
56
+ }
57
+ setupMessageHandlers() {
58
+ this.websocket().on('message', data => {
59
+ try {
60
+ const message = JSON.parse(data.toString());
61
+ if (!message.type) {
62
+ this.logError(en_1.lib.LocalDevWebsocketServer.errors.missingTypeField(data.toString()));
63
+ return;
64
+ }
65
+ switch (message.type) {
66
+ case constants_1.LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.UPLOAD:
67
+ this.handleUpload();
68
+ break;
69
+ default:
70
+ this.logError(en_1.lib.LocalDevWebsocketServer.errors.unknownMessageType(message.type));
71
+ }
72
+ }
73
+ catch (e) {
74
+ this.logError(en_1.lib.LocalDevWebsocketServer.errors.invalidJSON(data.toString()));
75
+ }
76
+ });
77
+ }
78
+ sendProjectData() {
79
+ this.sendMessage({
80
+ type: constants_1.LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPDATE_PROJECT_DATA,
81
+ data: {
82
+ projectName: this.localDevProcess.projectName,
83
+ projectId: this.localDevProcess.projectId,
84
+ targetProjectAccountId: this.localDevProcess.targetProjectAccountId,
85
+ targetTestingAccountId: this.localDevProcess.targetTestingAccountId,
86
+ },
87
+ });
88
+ }
89
+ setupStateListeners() {
90
+ this.localDevProcess.addStateListener('projectNodes', nodes => {
91
+ this.sendMessage({
92
+ type: constants_1.LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPDATE_PROJECT_NODES,
93
+ data: nodes,
94
+ });
95
+ }, true);
96
+ this.localDevProcess.addStateListener('appData', appData => {
97
+ this.sendMessage({
98
+ type: constants_1.LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPDATE_APP_DATA,
99
+ data: appData,
100
+ });
101
+ }, true);
102
+ }
103
+ async start() {
104
+ const portManagerIsRunning = await (0, portManager_1.isPortManagerServerRunning)();
105
+ if (!portManagerIsRunning) {
106
+ throw new Error(en_1.lib.LocalDevWebsocketServer.errors.portManagerNotRunning(LOG_PREFIX));
107
+ }
108
+ const portData = await (0, portManager_1.requestPorts)([{ instanceId: SERVER_INSTANCE_ID }]);
109
+ const port = portData[SERVER_INSTANCE_ID];
110
+ this.server = new ws_1.WebSocketServer({ port });
111
+ this.log(en_1.lib.LocalDevWebsocketServer.logs.startup(port));
112
+ this.server.on('connection', (ws, req) => {
113
+ const origin = req.headers.origin;
114
+ if (!origin || !this.ALLOWED_ORIGINS.includes(origin)) {
115
+ ws.close(1008, en_1.lib.LocalDevWebsocketServer.errors.originNotAllowed(origin));
116
+ return;
117
+ }
118
+ this._websocket = ws;
119
+ this.sendProjectData();
120
+ this.setupMessageHandlers();
121
+ this.setupStateListeners();
122
+ });
123
+ }
124
+ shutdown() {
125
+ this.server?.close();
126
+ this.server = undefined;
127
+ this._websocket = undefined;
128
+ }
129
+ }
130
+ exports.default = LocalDevWebsocketServer;
@@ -2,11 +2,11 @@ import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
2
2
  import { Environment } from '@hubspot/local-dev-lib/types/Config';
3
3
  import { DeveloperTestAccount } from '@hubspot/local-dev-lib/types/developerTestAccounts';
4
4
  import { Project } from '@hubspot/local-dev-lib/types/Project';
5
- import { ProjectConfig } from '../types/Projects';
6
- import { ProjectDevTargetAccountPromptResponse } from '../types/Prompts';
7
5
  import { Build } from '@hubspot/local-dev-lib/types/Build';
6
+ import { ProjectConfig } from '../../../types/Projects';
7
+ import { ProjectDevTargetAccountPromptResponse } from '../../prompts/projectDevTargetAccountPrompt';
8
8
  export declare function confirmDefaultAccountIsTarget(accountConfig: CLIAccount): Promise<void>;
9
- export declare function checkIfDefaultAccountIsSupported(accountConfig: CLIAccount, hasPublicApps: boolean): void;
9
+ export declare function checkIfDefaultAccountIsSupported(accountConfig: CLIAccount, hasPublicApps: boolean): Promise<void>;
10
10
  export declare function checkIfParentAccountIsAuthed(accountConfig: CLIAccount): void;
11
11
  export declare function checkIfAccountFlagIsSupported(accountConfig: CLIAccount, hasPublicApps: boolean): void;
12
12
  export declare function suggestRecommendedNestedAccount(accounts: CLIAccount[], accountConfig: CLIAccount, hasPublicApps: boolean): Promise<ProjectDevTargetAccountPromptResponse>;
@@ -14,5 +14,7 @@ export declare function createSandboxForLocalDev(accountId: number, accountConfi
14
14
  export declare function createDeveloperTestAccountForLocalDev(accountId: number, accountConfig: CLIAccount, env: Environment): Promise<number>;
15
15
  export declare function useExistingDevTestAccount(env: Environment, account: DeveloperTestAccount): Promise<void>;
16
16
  export declare function createNewProjectForLocalDev(projectConfig: ProjectConfig, targetAccountId: number, shouldCreateWithoutConfirmation: boolean, hasPublicApps: boolean): Promise<Project>;
17
- export declare function createInitialBuildForNewProject(projectConfig: ProjectConfig, projectDir: string, targetAccountId: number, sendIr?: boolean): Promise<Build>;
17
+ export declare function createInitialBuildForNewProject(projectConfig: ProjectConfig, projectDir: string, targetAccountId: number, sendIR?: boolean, profile?: string): Promise<Build>;
18
18
  export declare function getAccountHomeUrl(accountId: number): string;
19
+ export declare function hasSandboxes(account: CLIAccount): Promise<boolean>;
20
+ export declare function selectAccountTypePrompt(accountConfig: CLIAccount): Promise<string | null>;
@@ -14,7 +14,8 @@ exports.useExistingDevTestAccount = useExistingDevTestAccount;
14
14
  exports.createNewProjectForLocalDev = createNewProjectForLocalDev;
15
15
  exports.createInitialBuildForNewProject = createInitialBuildForNewProject;
16
16
  exports.getAccountHomeUrl = getAccountHomeUrl;
17
- const logger_1 = require("@hubspot/local-dev-lib/logger");
17
+ exports.hasSandboxes = hasSandboxes;
18
+ exports.selectAccountTypePrompt = selectAccountTypePrompt;
18
19
  const config_1 = require("@hubspot/local-dev-lib/constants/config");
19
20
  const index_1 = require("@hubspot/local-dev-lib/errors/index");
20
21
  const urls_1 = require("@hubspot/local-dev-lib/urls");
@@ -23,70 +24,59 @@ const projects_1 = require("@hubspot/local-dev-lib/api/projects");
23
24
  const environments_1 = require("@hubspot/local-dev-lib/constants/environments");
24
25
  const auth_1 = require("@hubspot/local-dev-lib/constants/auth");
25
26
  const getAccountIdentifier_1 = require("@hubspot/local-dev-lib/config/getAccountIdentifier");
26
- const projectDevTargetAccountPrompt_1 = require("./prompts/projectDevTargetAccountPrompt");
27
- const promptUtils_1 = require("./prompts/promptUtils");
28
- const sandboxes_1 = require("./sandboxes");
29
- const sandboxSync_1 = require("./sandboxSync");
30
- const developerTestAccounts_1 = require("./developerTestAccounts");
31
- const ui_1 = require("./ui");
32
- const SpinniesManager_1 = __importDefault(require("./ui/SpinniesManager"));
33
- const lang_1 = require("./lang");
34
- const exitCodes_1 = require("./enums/exitCodes");
35
- const usageTracking_1 = require("./usageTracking");
36
- const accountTypes_1 = require("./accountTypes");
37
- const upload_1 = require("./projects/upload");
38
- const buildAndDeploy_1 = require("./projects/buildAndDeploy");
39
- const constants_1 = require("./constants");
40
- const index_2 = require("./errorHandlers/index");
41
- const buildAccount_1 = require("./buildAccount");
42
- const accountNamePrompt_1 = require("./prompts/accountNamePrompt");
43
- const i18nKey = 'lib.localDev';
27
+ const sandboxHubs_1 = require("@hubspot/local-dev-lib/api/sandboxHubs");
28
+ const projectDevTargetAccountPrompt_1 = require("../../prompts/projectDevTargetAccountPrompt");
29
+ const promptUtils_1 = require("../../prompts/promptUtils");
30
+ const sandboxes_1 = require("../../sandboxes");
31
+ const sandboxSync_1 = require("../../sandboxSync");
32
+ const developerTestAccounts_1 = require("../../developerTestAccounts");
33
+ const ui_1 = require("../../ui");
34
+ const SpinniesManager_1 = __importDefault(require("../../ui/SpinniesManager"));
35
+ const exitCodes_1 = require("../../enums/exitCodes");
36
+ const usageTracking_1 = require("../../usageTracking");
37
+ const accountTypes_1 = require("../../accountTypes");
38
+ const upload_1 = require("../../projects/upload");
39
+ const buildAndDeploy_1 = require("../../projects/buildAndDeploy");
40
+ const constants_1 = require("../../constants");
41
+ const index_2 = require("../../errorHandlers/index");
42
+ const buildAccount_1 = require("../../buildAccount");
43
+ const accountNamePrompt_1 = require("../../prompts/accountNamePrompt");
44
+ const en_1 = require("../../../lang/en");
45
+ const logger_1 = require("../../ui/logger");
44
46
  // If the user passed in the --account flag, confirm they want to use that account as
45
47
  // their target account, otherwise exit
46
48
  async function confirmDefaultAccountIsTarget(accountConfig) {
47
49
  if (!accountConfig.name || !accountConfig.accountType) {
48
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.confirmDefaultAccountIsTarget.configError`, {
49
- authCommand: (0, ui_1.uiCommandReference)('hs auth'),
50
- }));
50
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget.configError);
51
51
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
52
52
  }
53
- logger_1.logger.log();
53
+ logger_1.uiLogger.log('');
54
54
  const useDefaultAccount = await (0, projectDevTargetAccountPrompt_1.confirmDefaultAccountPrompt)(accountConfig.name, config_1.HUBSPOT_ACCOUNT_TYPE_STRINGS[accountConfig.accountType]);
55
55
  if (!useDefaultAccount) {
56
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
57
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
58
- devCommand: (0, ui_1.uiCommandReference)('hs project dev'),
59
- }));
56
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget
57
+ .declineDefaultAccountExplanation);
60
58
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
61
59
  }
62
60
  }
63
61
  // Confirm the default account is supported for the type of apps being developed
64
- function checkIfDefaultAccountIsSupported(accountConfig, hasPublicApps) {
62
+ async function checkIfDefaultAccountIsSupported(accountConfig, hasPublicApps) {
63
+ const defaultAccountIsUnified = await (0, accountTypes_1.isUnifiedAccount)(accountConfig);
65
64
  if (hasPublicApps &&
66
65
  !((0, accountTypes_1.isAppDeveloperAccount)(accountConfig) ||
67
- (0, accountTypes_1.isDeveloperTestAccount)(accountConfig))) {
68
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.checkIfDefaultAccountIsSupported.publicApp`, {
69
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
70
- authCommand: (0, ui_1.uiCommandReference)('hs auth'),
71
- }));
66
+ (0, accountTypes_1.isDeveloperTestAccount)(accountConfig) ||
67
+ defaultAccountIsUnified)) {
68
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.checkIfDefaultAccountIsSupported.publicApp);
72
69
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
73
70
  }
74
71
  else if (!hasPublicApps && (0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
75
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.checkIfDefaultAccountIsSupported.privateApp`, {
76
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
77
- authCommand: (0, ui_1.uiCommandReference)('hs auth'),
78
- }));
72
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.checkIfDefaultAccountIsSupported.privateApp);
79
73
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
80
74
  }
81
75
  }
82
76
  function checkIfParentAccountIsAuthed(accountConfig) {
83
77
  if (!accountConfig.parentAccountId ||
84
78
  !(0, config_2.getAccountConfig)(accountConfig.parentAccountId)) {
85
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.checkIfParentAccountIsAuthed.notAuthedError`, {
86
- accountId: accountConfig.parentAccountId || '',
87
- accountIdentifier: (0, ui_1.uiAccountDescription)((0, getAccountIdentifier_1.getAccountIdentifier)(accountConfig)),
88
- authCommand: (0, ui_1.uiCommandReference)(`hs auth --account=${accountConfig.parentAccountId}`),
89
- }));
79
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.checkIfParentAccountIsAuthed.notAuthedError(accountConfig.parentAccountId || '', (0, ui_1.uiAccountDescription)((0, getAccountIdentifier_1.getAccountIdentifier)(accountConfig))));
90
80
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
91
81
  }
92
82
  }
@@ -94,34 +84,30 @@ function checkIfParentAccountIsAuthed(accountConfig) {
94
84
  function checkIfAccountFlagIsSupported(accountConfig, hasPublicApps) {
95
85
  if (hasPublicApps) {
96
86
  if (!(0, accountTypes_1.isDeveloperTestAccount)(accountConfig)) {
97
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.invalidPublicAppAccount`, {
98
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
99
- devCommand: (0, ui_1.uiCommandReference)('hs project dev'),
100
- }));
87
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.validateAccountOption.invalidPublicAppAccount);
101
88
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
102
89
  }
103
90
  checkIfParentAccountIsAuthed(accountConfig);
104
91
  }
105
92
  else if ((0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
106
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.invalidPrivateAppAccount`, {
107
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
108
- }));
93
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.validateAccountOption.invalidPrivateAppAccount);
109
94
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
110
95
  }
111
96
  }
112
97
  // If the user isn't using the recommended account type, prompt them to use or create one
113
98
  async function suggestRecommendedNestedAccount(accounts, accountConfig, hasPublicApps) {
114
- logger_1.logger.log();
99
+ logger_1.uiLogger.log('');
115
100
  (0, ui_1.uiLine)();
116
101
  if (hasPublicApps) {
117
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.publicAppNonDeveloperTestAccountWarning`));
102
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.validateAccountOption
103
+ .publicAppNonDeveloperTestAccountWarning);
118
104
  }
119
105
  else {
120
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.nonSandboxWarning`));
106
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.validateAccountOption.nonSandboxWarning);
121
107
  }
122
108
  (0, ui_1.uiLine)();
123
- logger_1.logger.log();
124
- const targetAccountPrompt = (0, accountTypes_1.isAppDeveloperAccount)(accountConfig)
109
+ logger_1.uiLogger.log('');
110
+ const targetAccountPrompt = hasPublicApps
125
111
  ? projectDevTargetAccountPrompt_1.selectDeveloperTestTargetAccountPrompt
126
112
  : projectDevTargetAccountPrompt_1.selectSandboxTargetAccountPrompt;
127
113
  return targetAccountPrompt(accounts, accountConfig);
@@ -133,15 +119,10 @@ async function createSandboxForLocalDev(accountId, accountConfig, env) {
133
119
  }
134
120
  catch (err) {
135
121
  if ((0, index_1.isMissingScopeError)(err)) {
136
- logger_1.logger.error((0, lang_1.i18n)('lib.sandbox.create.failure.scopes.message', {
137
- accountName: accountConfig.name || accountId,
138
- }));
122
+ logger_1.uiLogger.error(en_1.lib.sandbox.create.developer.failure.scopes.message);
139
123
  const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
140
124
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
141
- logger_1.logger.info((0, lang_1.i18n)('lib.sandbox.create.failure.scopes.instructions', {
142
- accountName: accountConfig.name || accountId,
143
- url,
144
- }));
125
+ logger_1.uiLogger.info(en_1.lib.sandbox.create.developer.failure.scopes.instructions(accountConfig.name || accountId, url));
145
126
  }
146
127
  else {
147
128
  (0, index_2.logError)(err);
@@ -157,7 +138,7 @@ async function createSandboxForLocalDev(accountId, accountConfig, env) {
157
138
  const targetAccountId = result.sandbox.sandboxHubId;
158
139
  const sandboxAccountConfig = (0, config_2.getAccountConfig)(result.sandbox.sandboxHubId);
159
140
  if (!sandboxAccountConfig) {
160
- logger_1.logger.error((0, lang_1.i18n)('lib.sandbox.create.failure.generic'));
141
+ logger_1.uiLogger.error(en_1.lib.sandbox.create.developer.failure.generic);
161
142
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
162
143
  }
163
144
  const syncTasks = await (0, sandboxes_1.getAvailableSyncTypes)(accountConfig, sandboxAccountConfig);
@@ -185,15 +166,10 @@ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, e
185
166
  }
186
167
  catch (err) {
187
168
  if ((0, index_1.isMissingScopeError)(err)) {
188
- logger_1.logger.error((0, lang_1.i18n)('lib.developerTestAccount.create.failure.scopes.message', {
189
- accountName: accountConfig.name || accountId,
190
- }));
169
+ logger_1.uiLogger.error(en_1.lib.developerTestAccount.create.failure.scopes.message);
191
170
  const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
192
171
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
193
- logger_1.logger.info((0, lang_1.i18n)('lib.developerTestAccount.create.failure.scopes.instructions', {
194
- accountName: accountConfig.name || accountId,
195
- url,
196
- }));
172
+ logger_1.uiLogger.info(en_1.lib.developerTestAccount.create.failure.scopes.instructions(accountConfig.name || accountId, url));
197
173
  }
198
174
  else {
199
175
  (0, index_2.logError)(err);
@@ -207,7 +183,7 @@ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, e
207
183
  });
208
184
  (0, usageTracking_1.trackCommandMetadataUsage)('developer-test-account-create', { step: 'project-dev' }, accountId);
209
185
  const result = await (0, buildAccount_1.buildDeveloperTestAccount)(name, accountConfig, env, maxTestPortals);
210
- return result.id;
186
+ return result;
211
187
  }
212
188
  catch (err) {
213
189
  (0, index_2.logError)(err);
@@ -218,91 +194,86 @@ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, e
218
194
  async function useExistingDevTestAccount(env, account) {
219
195
  const useExistingDevTestAcct = await (0, projectDevTargetAccountPrompt_1.confirmUseExistingDeveloperTestAccountPrompt)(account);
220
196
  if (!useExistingDevTestAcct) {
221
- logger_1.logger.log('');
222
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
223
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
224
- devCommand: (0, ui_1.uiCommandReference)('hs project dev'),
225
- }));
226
- logger_1.logger.log('');
197
+ logger_1.uiLogger.log('');
198
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget
199
+ .declineDefaultAccountExplanation);
200
+ logger_1.uiLogger.log('');
227
201
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
228
202
  }
229
203
  const devTestAcctConfigName = await (0, buildAccount_1.saveAccountToConfig)(account.id, account.accountName, env);
230
- logger_1.logger.success((0, lang_1.i18n)(`lib.developerTestAccount.create.success.configFileUpdated`, {
231
- accountName: devTestAcctConfigName,
232
- authType: auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.name,
233
- }));
204
+ logger_1.uiLogger.success(en_1.lib.developerTestAccount.create.success.configFileUpdated(devTestAcctConfigName, auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.name));
234
205
  }
235
206
  // Prompt the user to create a new project if one doesn't exist on their target account
236
207
  async function createNewProjectForLocalDev(projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) {
237
208
  // Create the project without prompting if this is a newly created sandbox
238
209
  let shouldCreateProject = shouldCreateWithoutConfirmation;
239
210
  if (!shouldCreateProject) {
240
- const explanationString = (0, lang_1.i18n)(hasPublicApps
241
- ? `${i18nKey}.createNewProjectForLocalDev.publicAppProjectMustExistExplanation`
242
- : `${i18nKey}.createNewProjectForLocalDev.projectMustExistExplanation`, {
243
- accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
244
- projectName: projectConfig.name,
245
- });
246
- logger_1.logger.log();
211
+ const explanationLangFunction = hasPublicApps
212
+ ? en_1.lib.localDevHelpers.createNewProjectForLocalDev
213
+ .publicAppProjectMustExistExplanation
214
+ : en_1.lib.localDevHelpers.createNewProjectForLocalDev
215
+ .projectMustExistExplanation;
216
+ const explanationString = explanationLangFunction(projectConfig.name, targetAccountId);
217
+ logger_1.uiLogger.log('');
247
218
  (0, ui_1.uiLine)();
248
- logger_1.logger.log(explanationString);
219
+ logger_1.uiLogger.log(explanationString);
249
220
  (0, ui_1.uiLine)();
250
- shouldCreateProject = await (0, promptUtils_1.confirmPrompt)((0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.createProject`, {
251
- accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
252
- projectName: projectConfig.name,
253
- }));
221
+ shouldCreateProject = await (0, promptUtils_1.confirmPrompt)(en_1.lib.localDevHelpers.createNewProjectForLocalDev.createProject(projectConfig.name, (0, ui_1.uiAccountDescription)(targetAccountId)));
254
222
  }
255
223
  if (shouldCreateProject) {
256
224
  SpinniesManager_1.default.add('createProject', {
257
- text: (0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.creatingProject`, {
258
- accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
259
- projectName: projectConfig.name,
260
- }),
225
+ text: en_1.lib.localDevHelpers.createNewProjectForLocalDev.creatingProject(projectConfig.name, (0, ui_1.uiAccountDescription)(targetAccountId)),
261
226
  });
262
227
  try {
263
228
  const { data: project } = await (0, projects_1.createProject)(targetAccountId, projectConfig.name);
264
229
  SpinniesManager_1.default.succeed('createProject', {
265
- text: (0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.createdProject`, {
266
- accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
267
- projectName: projectConfig.name,
268
- }),
230
+ text: en_1.lib.localDevHelpers.createNewProjectForLocalDev.createdProject(projectConfig.name, (0, ui_1.uiAccountDescription)(targetAccountId)),
269
231
  succeedColor: 'white',
270
232
  });
271
233
  return project;
272
234
  }
273
235
  catch (err) {
274
236
  SpinniesManager_1.default.fail('createProject');
275
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.failedToCreateProject`));
237
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.createNewProjectForLocalDev.failedToCreateProject);
276
238
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
277
239
  }
278
240
  }
279
241
  else {
280
242
  // We cannot continue if the project does not exist in the target account
281
- logger_1.logger.log();
282
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.choseNotToCreateProject`));
243
+ logger_1.uiLogger.log('');
244
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.createNewProjectForLocalDev.choseNotToCreateProject);
283
245
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
284
246
  }
285
247
  }
286
248
  function projectUploadCallback(accountId, projectConfig, tempFile, buildId) {
287
249
  if (!buildId) {
288
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.initialUploadMessage`, {
289
- uploadCommand: (0, ui_1.uiCommandReference)('hs project upload'),
290
- }));
250
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.createInitialBuildForNewProject.genericError);
291
251
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
292
252
  }
293
253
  return (0, buildAndDeploy_1.pollProjectBuildAndDeploy)(accountId, projectConfig, tempFile, buildId, true);
294
254
  }
295
255
  // Create an initial build if the project was newly created in the account
296
256
  // Return the newly deployed build
297
- async function createInitialBuildForNewProject(projectConfig, projectDir, targetAccountId, sendIr) {
298
- const { result: initialUploadResult, uploadError } = await (0, upload_1.handleProjectUpload)(targetAccountId, projectConfig, projectDir, projectUploadCallback, (0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.initialUploadMessage`), sendIr);
257
+ async function createInitialBuildForNewProject(projectConfig, projectDir, targetAccountId, sendIR, profile) {
258
+ const { result: initialUploadResult, uploadError } = await (0, upload_1.handleProjectUpload)({
259
+ accountId: targetAccountId,
260
+ projectConfig,
261
+ projectDir,
262
+ callbackFunc: projectUploadCallback,
263
+ uploadMessage: en_1.lib.localDevHelpers.createInitialBuildForNewProject
264
+ .initialUploadMessage,
265
+ forceCreate: true,
266
+ skipValidation: true,
267
+ sendIR,
268
+ profile,
269
+ });
299
270
  if (uploadError) {
300
271
  if ((0, index_1.isSpecifiedError)(uploadError, {
301
272
  subCategory: constants_1.PROJECT_ERROR_TYPES.PROJECT_LOCKED,
302
273
  })) {
303
- logger_1.logger.log();
304
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.projectLockedError`));
305
- logger_1.logger.log();
274
+ logger_1.uiLogger.log('');
275
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.createInitialBuildForNewProject.projectLockedError);
276
+ logger_1.uiLogger.log('');
306
277
  }
307
278
  else {
308
279
  (0, index_2.logError)(uploadError, new index_2.ApiErrorContext({
@@ -323,11 +294,11 @@ async function createInitialBuildForNewProject(projectConfig, projectDir, target
323
294
  initialUploadResult.deployResult[constants_1.PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
324
295
  }
325
296
  const failedSubTasks = subTasks.filter(task => task.status === 'FAILURE');
326
- logger_1.logger.log();
297
+ logger_1.uiLogger.log('');
327
298
  failedSubTasks.forEach(failedSubTask => {
328
- logger_1.logger.error(failedSubTask.errorMessage);
299
+ logger_1.uiLogger.error(failedSubTask.errorMessage);
329
300
  });
330
- logger_1.logger.log();
301
+ logger_1.uiLogger.log('');
331
302
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
332
303
  }
333
304
  return initialUploadResult.buildResult;
@@ -336,3 +307,45 @@ function getAccountHomeUrl(accountId) {
336
307
  const baseUrl = (0, urls_1.getHubSpotWebsiteOrigin)((0, config_2.getEnv)(accountId) === 'qa' ? environments_1.ENVIRONMENTS.QA : environments_1.ENVIRONMENTS.PROD);
337
308
  return `${baseUrl}/home?portalId=${accountId}`;
338
309
  }
310
+ async function hasSandboxes(account) {
311
+ const accountId = (0, getAccountIdentifier_1.getAccountIdentifier)(account);
312
+ if (!accountId) {
313
+ return false;
314
+ }
315
+ try {
316
+ const { data: { usage }, } = await (0, sandboxHubs_1.getSandboxUsageLimits)(accountId);
317
+ return usage.STANDARD.limit > 0 || usage.DEVELOPER.limit > 0;
318
+ }
319
+ catch (e) {
320
+ (0, index_2.debugError)(e);
321
+ return false;
322
+ }
323
+ }
324
+ // Top level prompt to choose the type of account to test on
325
+ async function selectAccountTypePrompt(accountConfig) {
326
+ const hasAccessToSandboxes = await hasSandboxes(accountConfig);
327
+ const result = await (0, promptUtils_1.listPrompt)(en_1.lib.localDevHelpers.selectAccountTypePrompt.message, {
328
+ choices: [
329
+ {
330
+ name: en_1.lib.localDevHelpers.selectAccountTypePrompt
331
+ .developerTestAccountOption,
332
+ value: config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
333
+ },
334
+ {
335
+ name: en_1.lib.localDevHelpers.selectAccountTypePrompt
336
+ .sandboxAccountOption,
337
+ value: config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
338
+ disabled: !hasAccessToSandboxes
339
+ ? en_1.lib.localDevHelpers.selectAccountTypePrompt
340
+ .sandboxAccountOptionDisabled
341
+ : false,
342
+ },
343
+ {
344
+ name: en_1.lib.localDevHelpers.selectAccountTypePrompt
345
+ .productionAccountOption,
346
+ value: null,
347
+ },
348
+ ],
349
+ });
350
+ return result;
351
+ }
@@ -0,0 +1 @@
1
+ export declare function logFeedbackMessage(buildId: number): void;