@hubspot/cli 7.5.11-experimental.0 → 7.6.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/bin/cli.js +102 -95
  2. package/commands/account/auth.d.ts +5 -7
  3. package/commands/account/auth.js +74 -87
  4. package/commands/account/clean.d.ts +3 -7
  5. package/commands/account/clean.js +16 -9
  6. package/commands/account/createOverride.d.ts +3 -7
  7. package/commands/account/createOverride.js +23 -6
  8. package/commands/account/info.d.ts +3 -7
  9. package/commands/account/info.js +13 -5
  10. package/commands/account/list.d.ts +3 -7
  11. package/commands/account/list.js +15 -8
  12. package/commands/account/remove.d.ts +3 -7
  13. package/commands/account/remove.js +21 -9
  14. package/commands/account/removeOverride.d.ts +3 -7
  15. package/commands/account/removeOverride.js +23 -6
  16. package/commands/account/rename.d.ts +3 -7
  17. package/commands/account/rename.js +16 -9
  18. package/commands/account/use.d.ts +5 -9
  19. package/commands/account/use.js +14 -6
  20. package/commands/account.d.ts +3 -4
  21. package/commands/account.js +33 -58
  22. package/commands/app/migrate.d.ts +1 -2
  23. package/commands/app/migrate.js +7 -8
  24. package/commands/app/secret/add.d.ts +7 -0
  25. package/commands/app/secret/add.js +64 -0
  26. package/commands/app/secret/delete.d.ts +8 -0
  27. package/commands/app/secret/delete.js +87 -0
  28. package/commands/app/secret/list.d.ts +6 -0
  29. package/commands/app/secret/list.js +64 -0
  30. package/commands/app/secret/update.d.ts +7 -0
  31. package/commands/app/secret/update.js +77 -0
  32. package/commands/app/secret.d.ts +3 -0
  33. package/commands/app/secret.js +30 -0
  34. package/commands/app.d.ts +2 -5
  35. package/commands/app.js +10 -8
  36. package/commands/auth.d.ts +5 -7
  37. package/commands/auth.js +29 -28
  38. package/commands/cms/convertFields.d.ts +7 -1
  39. package/commands/cms/convertFields.js +57 -41
  40. package/commands/cms/getReactModule.d.ts +7 -1
  41. package/commands/cms/getReactModule.js +52 -34
  42. package/commands/cms/lighthouseScore.d.ts +8 -1
  43. package/commands/cms/lighthouseScore.js +129 -100
  44. package/commands/cms.d.ts +3 -1
  45. package/commands/cms.js +22 -15
  46. package/commands/completion.d.ts +3 -1
  47. package/commands/completion.js +23 -12
  48. package/commands/config/migrate.d.ts +3 -7
  49. package/commands/config/migrate.js +37 -46
  50. package/commands/config/set.d.ts +5 -6
  51. package/commands/config/set.js +38 -14
  52. package/commands/config.d.ts +3 -4
  53. package/commands/config.js +18 -44
  54. package/commands/create/api-sample.d.ts +3 -1
  55. package/commands/create/api-sample.js +34 -38
  56. package/commands/create/app.d.ts +3 -1
  57. package/commands/create/app.js +9 -7
  58. package/commands/create/function.d.ts +3 -1
  59. package/commands/create/function.js +11 -10
  60. package/commands/create/index.d.ts +5 -1
  61. package/commands/create/index.js +23 -11
  62. package/commands/create/module.d.ts +3 -1
  63. package/commands/create/module.js +14 -13
  64. package/commands/create/react-app.d.ts +3 -1
  65. package/commands/create/react-app.js +10 -7
  66. package/commands/create/template.d.ts +3 -1
  67. package/commands/create/template.js +14 -14
  68. package/commands/create/vue-app.d.ts +3 -1
  69. package/commands/create/vue-app.js +10 -7
  70. package/commands/create/webpack-serverless.d.ts +3 -1
  71. package/commands/create/webpack-serverless.js +10 -7
  72. package/commands/create/website-theme.d.ts +3 -1
  73. package/commands/create/website-theme.js +10 -9
  74. package/commands/create.d.ts +4 -24
  75. package/commands/create.js +62 -74
  76. package/commands/customObject/create.d.ts +4 -9
  77. package/commands/customObject/create.js +17 -10
  78. package/commands/customObject/schema/create.d.ts +4 -9
  79. package/commands/customObject/schema/create.js +18 -11
  80. package/commands/customObject/schema/delete.d.ts +4 -9
  81. package/commands/customObject/schema/delete.js +17 -10
  82. package/commands/customObject/schema/fetch-all.d.ts +4 -9
  83. package/commands/customObject/schema/fetch-all.js +17 -10
  84. package/commands/customObject/schema/fetch.d.ts +4 -9
  85. package/commands/customObject/schema/fetch.js +17 -10
  86. package/commands/customObject/schema/list.d.ts +4 -8
  87. package/commands/customObject/schema/list.js +17 -10
  88. package/commands/customObject/schema/update.d.ts +4 -9
  89. package/commands/customObject/schema/update.js +18 -11
  90. package/commands/customObject/schema.d.ts +3 -5
  91. package/commands/customObject/schema.js +27 -54
  92. package/commands/customObject.d.ts +3 -4
  93. package/commands/customObject.js +18 -45
  94. package/commands/doctor.d.ts +6 -8
  95. package/commands/doctor.js +30 -21
  96. package/commands/feedback.d.ts +4 -1
  97. package/commands/feedback.js +38 -47
  98. package/commands/fetch.d.ts +12 -1
  99. package/commands/fetch.js +49 -33
  100. package/commands/filemanager/fetch.d.ts +4 -9
  101. package/commands/filemanager/fetch.js +18 -11
  102. package/commands/filemanager/upload.d.ts +4 -9
  103. package/commands/filemanager/upload.js +17 -11
  104. package/commands/filemanager.d.ts +3 -4
  105. package/commands/filemanager.js +18 -41
  106. package/commands/function/deploy.d.ts +6 -1
  107. package/commands/function/deploy.js +70 -50
  108. package/commands/function/list.d.ts +6 -1
  109. package/commands/function/list.js +44 -32
  110. package/commands/function/server.d.ts +10 -1
  111. package/commands/function/server.js +49 -38
  112. package/commands/function.d.ts +5 -1
  113. package/commands/function.js +22 -10
  114. package/commands/getStarted.d.ts +9 -0
  115. package/commands/getStarted.js +227 -0
  116. package/commands/hubdb/clear.d.ts +4 -9
  117. package/commands/hubdb/clear.js +17 -10
  118. package/commands/hubdb/create.d.ts +4 -9
  119. package/commands/hubdb/create.js +17 -10
  120. package/commands/hubdb/delete.d.ts +4 -9
  121. package/commands/hubdb/delete.js +17 -10
  122. package/commands/hubdb/fetch.d.ts +4 -9
  123. package/commands/hubdb/fetch.js +17 -10
  124. package/commands/hubdb/list.d.ts +4 -0
  125. package/commands/hubdb/list.js +83 -0
  126. package/commands/hubdb.d.ts +3 -2
  127. package/commands/hubdb.js +23 -45
  128. package/commands/init.d.ts +3 -7
  129. package/commands/init.js +17 -8
  130. package/commands/lint.d.ts +6 -4
  131. package/commands/lint.js +42 -43
  132. package/commands/list.d.ts +3 -7
  133. package/commands/list.js +17 -11
  134. package/commands/logs.d.ts +10 -1
  135. package/commands/logs.js +53 -44
  136. package/commands/mcp/setup.d.ts +7 -0
  137. package/commands/mcp/setup.js +52 -0
  138. package/commands/mcp/start.d.ts +3 -0
  139. package/commands/mcp/start.js +77 -0
  140. package/commands/mcp.d.ts +3 -0
  141. package/commands/mcp.js +26 -0
  142. package/commands/module/marketplace-validate.d.ts +6 -1
  143. package/commands/module/marketplace-validate.js +39 -29
  144. package/commands/module.d.ts +3 -1
  145. package/commands/module.js +23 -10
  146. package/commands/mv.d.ts +3 -7
  147. package/commands/mv.js +17 -11
  148. package/commands/open.d.ts +3 -7
  149. package/commands/open.js +17 -11
  150. package/commands/project/add.d.ts +5 -2
  151. package/commands/project/add.js +43 -80
  152. package/commands/project/cloneApp.d.ts +1 -1
  153. package/commands/project/cloneApp.js +2 -2
  154. package/commands/project/create.d.ts +2 -8
  155. package/commands/project/create.js +84 -55
  156. package/commands/project/deploy.d.ts +2 -0
  157. package/commands/project/deploy.js +67 -13
  158. package/commands/project/dev/deprecatedFlow.d.ts +8 -2
  159. package/commands/project/dev/deprecatedFlow.js +9 -1
  160. package/commands/project/dev/index.d.ts +1 -4
  161. package/commands/project/dev/index.js +88 -31
  162. package/commands/project/dev/unifiedFlow.d.ts +11 -2
  163. package/commands/project/dev/unifiedFlow.js +81 -41
  164. package/commands/project/listBuilds.js +2 -5
  165. package/commands/project/migrate.d.ts +1 -0
  166. package/commands/project/profile/add.d.ts +7 -0
  167. package/commands/project/profile/add.js +209 -0
  168. package/commands/project/profile/delete.d.ts +6 -0
  169. package/commands/project/profile/delete.js +123 -0
  170. package/commands/project/profile.d.ts +3 -0
  171. package/commands/project/profile.js +25 -0
  172. package/commands/project/upload.d.ts +1 -0
  173. package/commands/project/upload.js +22 -8
  174. package/commands/project/validate.d.ts +6 -0
  175. package/commands/project/validate.js +82 -0
  176. package/commands/project.js +4 -2
  177. package/commands/remove.d.ts +3 -7
  178. package/commands/remove.js +22 -22
  179. package/commands/sandbox/create.d.ts +4 -9
  180. package/commands/sandbox/create.js +18 -11
  181. package/commands/sandbox/delete.d.ts +4 -9
  182. package/commands/sandbox/delete.js +18 -11
  183. package/commands/sandbox.d.ts +3 -4
  184. package/commands/sandbox.js +18 -43
  185. package/commands/secret/addSecret.d.ts +4 -9
  186. package/commands/secret/addSecret.js +17 -10
  187. package/commands/secret/deleteSecret.d.ts +4 -9
  188. package/commands/secret/deleteSecret.js +17 -10
  189. package/commands/secret/listSecret.d.ts +4 -9
  190. package/commands/secret/listSecret.js +17 -10
  191. package/commands/secret/updateSecret.d.ts +4 -9
  192. package/commands/secret/updateSecret.js +17 -10
  193. package/commands/secret.d.ts +3 -4
  194. package/commands/secret.js +23 -48
  195. package/commands/testAccount/create.d.ts +6 -0
  196. package/commands/testAccount/create.js +100 -0
  197. package/commands/testAccount/createConfig.d.ts +10 -0
  198. package/commands/testAccount/createConfig.js +98 -0
  199. package/commands/testAccount/delete.d.ts +6 -0
  200. package/commands/testAccount/delete.js +48 -0
  201. package/commands/testAccount.d.ts +3 -0
  202. package/commands/testAccount.js +28 -0
  203. package/commands/theme/generate-selectors.d.ts +3 -7
  204. package/commands/theme/generate-selectors.js +20 -15
  205. package/commands/theme/marketplace-validate.d.ts +4 -9
  206. package/commands/theme/marketplace-validate.js +22 -17
  207. package/commands/theme/preview.d.ts +4 -9
  208. package/commands/theme/preview.js +32 -26
  209. package/commands/theme.d.ts +3 -4
  210. package/commands/theme.js +22 -47
  211. package/commands/upload.d.ts +12 -1
  212. package/commands/upload.js +116 -134
  213. package/commands/watch.d.ts +14 -1
  214. package/commands/watch.js +74 -75
  215. package/lang/en.d.ts +1135 -660
  216. package/lang/en.js +935 -471
  217. package/lang/en.lyaml +30 -213
  218. package/lib/accountTypes.js +1 -2
  219. package/lib/app/migrate.d.ts +23 -0
  220. package/lib/app/migrate.js +29 -6
  221. package/lib/app/migrate_legacy.js +7 -7
  222. package/lib/app/urls.d.ts +16 -0
  223. package/lib/app/urls.js +16 -0
  224. package/lib/commonOpts.d.ts +1 -3
  225. package/lib/commonOpts.js +1 -1
  226. package/lib/configMigrate.d.ts +2 -2
  227. package/lib/configMigrate.js +34 -55
  228. package/lib/configOptions.d.ts +4 -0
  229. package/lib/configOptions.js +41 -46
  230. package/lib/constants.d.ts +29 -0
  231. package/lib/constants.js +30 -1
  232. package/lib/dependencyManagement.d.ts +0 -5
  233. package/lib/dependencyManagement.js +13 -39
  234. package/lib/doctor/Doctor.js +3 -2
  235. package/lib/errorHandlers/index.js +7 -0
  236. package/lib/filesystem.d.ts +1 -1
  237. package/lib/generateSelectors.js +3 -5
  238. package/lib/interpolation.d.ts +2 -3
  239. package/lib/lang.d.ts +2 -3
  240. package/lib/marketplaceValidate.d.ts +12 -2
  241. package/lib/marketplaceValidate.js +22 -29
  242. package/lib/mcp/setup.d.ts +21 -0
  243. package/lib/mcp/setup.js +218 -0
  244. package/lib/middleware/autoUpdateMiddleware.d.ts +1 -0
  245. package/lib/middleware/autoUpdateMiddleware.js +89 -0
  246. package/lib/middleware/configMiddleware.js +23 -0
  247. package/lib/middleware/fireAlarmMiddleware.d.ts +2 -2
  248. package/lib/middleware/fireAlarmMiddleware.js +5 -3
  249. package/lib/npm.d.ts +9 -0
  250. package/lib/npm.js +36 -0
  251. package/lib/projectProfiles.d.ts +7 -0
  252. package/lib/projectProfiles.js +83 -0
  253. package/lib/projects/add/legacyAddComponent.d.ts +5 -0
  254. package/lib/projects/add/legacyAddComponent.js +48 -0
  255. package/lib/projects/add/v3AddComponent.d.ts +8 -0
  256. package/lib/projects/add/v3AddComponent.js +85 -0
  257. package/lib/projects/buildAndDeploy.js +18 -3
  258. package/lib/projects/components.d.ts +2 -0
  259. package/lib/projects/components.js +82 -0
  260. package/lib/projects/create/index.d.ts +23 -0
  261. package/lib/projects/create/index.js +33 -0
  262. package/lib/projects/create/legacy.d.ts +6 -0
  263. package/lib/projects/{create.js → create/legacy.js} +20 -11
  264. package/lib/projects/create/v3.d.ts +27 -0
  265. package/lib/projects/create/v3.js +158 -0
  266. package/lib/projects/localDev/AppDevModeInterface.d.ts +30 -0
  267. package/lib/projects/localDev/AppDevModeInterface.js +215 -0
  268. package/lib/projects/localDev/DevServerManagerV2.d.ts +11 -22
  269. package/lib/projects/localDev/DevServerManagerV2.js +19 -15
  270. package/lib/projects/localDev/LocalDevLogger.d.ts +30 -0
  271. package/lib/projects/localDev/LocalDevLogger.js +159 -0
  272. package/lib/projects/localDev/LocalDevManager.js +12 -5
  273. package/lib/projects/localDev/LocalDevProcess.d.ts +34 -0
  274. package/lib/projects/localDev/LocalDevProcess.js +201 -0
  275. package/lib/projects/localDev/LocalDevState.d.ts +50 -0
  276. package/lib/projects/localDev/LocalDevState.js +119 -0
  277. package/lib/projects/localDev/LocalDevWatcher.d.ts +10 -0
  278. package/lib/projects/localDev/LocalDevWatcher.js +53 -0
  279. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +20 -0
  280. package/lib/projects/localDev/LocalDevWebsocketServer.js +131 -0
  281. package/lib/projects/localDev/helpers.d.ts +3 -2
  282. package/lib/projects/localDev/helpers.js +32 -2
  283. package/lib/projects/upload.d.ts +5 -1
  284. package/lib/projects/upload.js +60 -20
  285. package/lib/projects/urls.d.ts +3 -0
  286. package/lib/projects/urls.js +17 -1
  287. package/lib/prompts/createApiSamplePrompt.d.ts +2 -10
  288. package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +17 -0
  289. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +96 -0
  290. package/lib/prompts/createProjectPrompt.d.ts +14 -5
  291. package/lib/prompts/createProjectPrompt.js +38 -13
  292. package/lib/prompts/createTemplatePrompt.d.ts +22 -4
  293. package/lib/prompts/installAppPrompt.d.ts +2 -0
  294. package/lib/prompts/installAppPrompt.js +45 -0
  295. package/lib/prompts/personalAccessKeyPrompt.js +35 -24
  296. package/lib/prompts/projectAddPrompt.d.ts +5 -1
  297. package/lib/prompts/projectAddPrompt.js +35 -7
  298. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
  299. package/lib/prompts/projectDevTargetAccountPrompt.js +6 -6
  300. package/lib/prompts/promptUtils.d.ts +4 -1
  301. package/lib/prompts/promptUtils.js +5 -1
  302. package/lib/prompts/selectAppPrompt.d.ts +2 -0
  303. package/lib/prompts/selectAppPrompt.js +40 -0
  304. package/lib/prompts/{selectPublicAppPrompt.d.ts → selectPublicAppForMigrationPrompt.d.ts} +1 -1
  305. package/lib/prompts/{selectPublicAppPrompt.js → selectPublicAppForMigrationPrompt.js} +8 -8
  306. package/lib/prompts/setAsDefaultAccountPrompt.js +10 -0
  307. package/lib/testUtils.d.ts +3 -3
  308. package/lib/testUtils.js +8 -9
  309. package/lib/ui/index.js +4 -1
  310. package/lib/upload.d.ts +1 -1
  311. package/lib/validation.js +4 -5
  312. package/lib/yargsUtils.d.ts +4 -0
  313. package/lib/yargsUtils.js +6 -0
  314. package/mcp-server/server.d.ts +1 -0
  315. package/mcp-server/server.js +18 -0
  316. package/mcp-server/tools/index.d.ts +2 -0
  317. package/mcp-server/tools/index.js +19 -0
  318. package/mcp-server/tools/project/AddFeatureToProject.d.ts +29 -0
  319. package/mcp-server/tools/project/AddFeatureToProject.js +85 -0
  320. package/mcp-server/tools/project/CreateProjectTool.d.ts +35 -0
  321. package/mcp-server/tools/project/CreateProjectTool.js +104 -0
  322. package/mcp-server/tools/project/DeployProject.d.ts +20 -0
  323. package/mcp-server/tools/project/DeployProject.js +50 -0
  324. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +17 -0
  325. package/mcp-server/tools/project/GuidedWalkthroughTool.js +58 -0
  326. package/mcp-server/tools/project/UploadProjectTools.d.ts +17 -0
  327. package/mcp-server/tools/project/UploadProjectTools.js +35 -0
  328. package/mcp-server/tools/project/ValidateProjectTool.d.ts +17 -0
  329. package/mcp-server/tools/project/ValidateProjectTool.js +35 -0
  330. package/mcp-server/tools/project/constants.d.ts +3 -0
  331. package/mcp-server/tools/project/constants.js +13 -0
  332. package/mcp-server/types.d.ts +14 -0
  333. package/mcp-server/types.js +17 -0
  334. package/mcp-server/utils/command.d.ts +3 -0
  335. package/mcp-server/utils/command.js +16 -0
  336. package/mcp-server/utils/content.d.ts +3 -0
  337. package/mcp-server/utils/content.js +21 -0
  338. package/mcp-server/utils/project.d.ts +5 -0
  339. package/mcp-server/utils/project.js +17 -0
  340. package/package.json +24 -16
  341. package/types/Cms.d.ts +30 -0
  342. package/types/Cms.js +2 -0
  343. package/types/LocalDev.d.ts +35 -0
  344. package/types/LocalDev.js +2 -0
  345. package/types/Projects.d.ts +19 -2
  346. package/types/Prompts.d.ts +0 -7
  347. package/types/Yargs.d.ts +10 -1
  348. package/lib/projects/create.d.ts +0 -5
  349. package/lib/projects/localDev/LocalDevManagerV2.d.ts +0 -64
  350. package/lib/projects/localDev/LocalDevManagerV2.js +0 -345
  351. package/lib/prompts/installPublicAppPrompt.d.ts +0 -1
  352. package/lib/prompts/installPublicAppPrompt.js +0 -41
@@ -0,0 +1,215 @@
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 config_1 = require("@hubspot/local-dev-lib/config");
8
+ const constants_1 = require("../../constants");
9
+ const exitCodes_1 = require("../../enums/exitCodes");
10
+ const structure_1 = require("../../projects/structure");
11
+ const ui_1 = require("../../ui");
12
+ const index_1 = require("../../errorHandlers/index");
13
+ const installAppPrompt_1 = require("../../prompts/installAppPrompt");
14
+ const promptUtils_1 = require("../../prompts/promptUtils");
15
+ const en_1 = require("../../../lang/en");
16
+ const logger_1 = require("../../ui/logger");
17
+ const urls_1 = require("../../app/urls");
18
+ const accountTypes_1 = require("../../accountTypes");
19
+ class AppDevModeInterface {
20
+ localDevState;
21
+ localDevLogger;
22
+ _appNode;
23
+ marketplaceAppInstalls;
24
+ constructor(options) {
25
+ this.localDevState = options.localDevState;
26
+ this.localDevLogger = options.localDevLogger;
27
+ if (!this.localDevState.targetProjectAccountId ||
28
+ !this.localDevState.projectConfig ||
29
+ !this.localDevState.projectDir) {
30
+ logger_1.uiLogger.error(en_1.lib.LocalDevManager.failedToInitialize);
31
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
32
+ }
33
+ }
34
+ // Assumes only one app per project
35
+ get appNode() {
36
+ if (this._appNode === undefined) {
37
+ this._appNode =
38
+ Object.values(this.localDevState.projectNodes).find(structure_1.isAppIRNode) ||
39
+ null;
40
+ }
41
+ return this._appNode;
42
+ }
43
+ get appData() {
44
+ if (!this.appNode) {
45
+ return undefined;
46
+ }
47
+ return this.localDevState.getAppDataByUid(this.appNode.uid);
48
+ }
49
+ set appData(appData) {
50
+ if (!this.appNode) {
51
+ return;
52
+ }
53
+ this.localDevState.setAppDataForUid(this.appNode.uid, appData);
54
+ }
55
+ isAutomaticallyInstallable() {
56
+ const targetTestingAccount = (0, config_1.getAccountConfig)(this.localDevState.targetTestingAccountId);
57
+ if (!targetTestingAccount) {
58
+ return false;
59
+ }
60
+ const isTestAccount = (0, accountTypes_1.isDeveloperTestAccount)(targetTestingAccount) ||
61
+ (0, accountTypes_1.isSandbox)(targetTestingAccount);
62
+ const hasCorrectParent = targetTestingAccount.parentAccountId ===
63
+ this.localDevState.targetProjectAccountId;
64
+ return (isTestAccount &&
65
+ hasCorrectParent &&
66
+ this.appNode?.config.auth.type === constants_1.APP_AUTH_TYPES.STATIC);
67
+ }
68
+ async getAppInstallUrl() {
69
+ if (this.appNode?.config.auth.type === constants_1.APP_AUTH_TYPES.OAUTH) {
70
+ return (0, urls_1.getOauthAppInstallUrl)({
71
+ targetAccountId: this.localDevState.targetTestingAccountId,
72
+ env: this.localDevState.env,
73
+ clientId: this.appData.clientId, // This is only called after checking that appData exists
74
+ scopes: this.appNode.config.auth.requiredScopes,
75
+ redirectUrls: this.appNode.config.auth.redirectUrls,
76
+ });
77
+ }
78
+ const { data: { results }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
79
+ const app = results.find(app => app.sourceId === this.appNode?.uid);
80
+ if (!app) {
81
+ logger_1.uiLogger.error(en_1.lib.LocalDevManager.appNotFound(this.localDevState.targetProjectAccountId, this.appNode?.uid));
82
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
83
+ }
84
+ return (0, urls_1.getStaticAuthAppInstallUrl)({
85
+ targetAccountId: this.localDevState.targetTestingAccountId,
86
+ env: this.localDevState.env,
87
+ appId: `${app.id}`,
88
+ });
89
+ }
90
+ async fetchAppData() {
91
+ const { data: { results: portalApps }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
92
+ const appData = portalApps.find(({ sourceId }) => sourceId === this.appNode?.uid);
93
+ if (!appData) {
94
+ return;
95
+ }
96
+ const { data: { uniquePortalInstallCount }, } = await (0, appsDev_1.fetchPublicAppProductionInstallCounts)(appData.id, this.localDevState.targetProjectAccountId);
97
+ this.appData = {
98
+ id: appData.id,
99
+ clientId: appData.clientId,
100
+ name: appData.name,
101
+ installationState: constants_1.APP_INSTALLATION_STATES.NOT_INSTALLED,
102
+ scopeGroupIds: appData.scopeGroupIds,
103
+ };
104
+ this.marketplaceAppInstalls = uniquePortalInstallCount;
105
+ }
106
+ async checkMarketplaceAppInstalls() {
107
+ if (!this.appData || !this.marketplaceAppInstalls) {
108
+ return;
109
+ }
110
+ (0, ui_1.uiLine)();
111
+ logger_1.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.appData.name, this.marketplaceAppInstalls));
112
+ logger_1.uiLogger.log(en_1.lib.LocalDevManager.activeInstallWarning.explanation);
113
+ (0, ui_1.uiLine)();
114
+ const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.LocalDevManager.activeInstallWarning.confirmationPrompt, { defaultAnswer: false });
115
+ if (!proceed) {
116
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
117
+ }
118
+ this.localDevLogger.addUploadWarning(en_1.lib.AppDevModeInterface.defaultMarketplaceAppWarning(this.marketplaceAppInstalls));
119
+ }
120
+ async autoInstallStaticAuthApp() {
121
+ const shouldInstall = await (0, installAppPrompt_1.installAppAutoPrompt)();
122
+ if (!shouldInstall) {
123
+ logger_1.uiLogger.log(en_1.lib.AppDevModeInterface.autoInstallDeclined);
124
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
125
+ }
126
+ await (0, appsDev_1.installStaticAuthAppOnTestAccount)(this.appData.id, this.localDevState.targetTestingAccountId, this.appData.scopeGroupIds);
127
+ }
128
+ async installAppOrOpenInstallUrl(isReinstall) {
129
+ if (this.isAutomaticallyInstallable()) {
130
+ try {
131
+ await this.autoInstallStaticAuthApp();
132
+ logger_1.uiLogger.success(en_1.lib.AppDevModeInterface.autoInstallSuccess(this.appData.name, this.localDevState.targetTestingAccountId));
133
+ return;
134
+ }
135
+ catch (e) {
136
+ logger_1.uiLogger.error(en_1.lib.AppDevModeInterface.autoInstallError(this.appData.name, this.localDevState.targetTestingAccountId));
137
+ }
138
+ }
139
+ const installUrl = await this.getAppInstallUrl();
140
+ await (0, installAppPrompt_1.installAppBrowserPrompt)(installUrl, isReinstall);
141
+ }
142
+ async checkTestAccountAppInstallation() {
143
+ if (!this.appNode || !this.appData) {
144
+ return {};
145
+ }
146
+ 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);
147
+ const isReinstall = previouslyAuthorizedScopeGroups.length > 0;
148
+ if (isInstalledWithScopeGroups) {
149
+ this.appData = {
150
+ ...this.appData,
151
+ installationState: constants_1.APP_INSTALLATION_STATES.INSTALLED,
152
+ };
153
+ }
154
+ else if (isReinstall) {
155
+ this.appData = {
156
+ ...this.appData,
157
+ installationState: constants_1.APP_INSTALLATION_STATES.INSTALLED_WITH_OUTDATED_SCOPES,
158
+ };
159
+ }
160
+ return { needsInstall: !isInstalledWithScopeGroups, isReinstall };
161
+ }
162
+ setUpLocalDevServerMessageListeners() {
163
+ this.localDevState.addListener('devServerMessage', message => {
164
+ if (message === constants_1.LOCAL_DEV_SERVER_MESSAGE_TYPES.WEBSOCKET_SERVER_CONNECTED) {
165
+ this.checkTestAccountAppInstallation();
166
+ }
167
+ });
168
+ }
169
+ // @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
170
+ // In the future, update UIE Dev Server to use LocalDevState
171
+ async setup(args) {
172
+ if (!this.appNode) {
173
+ return;
174
+ }
175
+ try {
176
+ await this.fetchAppData();
177
+ if (this.appNode.config.distribution === constants_1.APP_DISTRIBUTION_TYPES.MARKETPLACE) {
178
+ await this.checkMarketplaceAppInstalls();
179
+ }
180
+ const { needsInstall, isReinstall } = await this.checkTestAccountAppInstallation();
181
+ if (needsInstall) {
182
+ await this.installAppOrOpenInstallUrl(isReinstall || false);
183
+ }
184
+ }
185
+ catch (e) {
186
+ (0, index_1.logError)(e);
187
+ }
188
+ this.setUpLocalDevServerMessageListeners();
189
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.setup(args);
190
+ }
191
+ async start() {
192
+ if (!this.appNode) {
193
+ return;
194
+ }
195
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.start({
196
+ accountId: this.localDevState.targetTestingAccountId,
197
+ // @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
198
+ projectConfig: this.localDevState.projectConfig,
199
+ requestPorts: portManager_1.requestPorts,
200
+ });
201
+ }
202
+ async fileChange(filePath, event) {
203
+ if (!this.appNode) {
204
+ return;
205
+ }
206
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.fileChange(filePath, event);
207
+ }
208
+ async cleanup() {
209
+ if (!this.appNode) {
210
+ return;
211
+ }
212
+ return ui_extensions_dev_server_1.DevModeUnifiedInterface.cleanup();
213
+ }
214
+ }
215
+ exports.default = AppDevModeInterface;
@@ -1,33 +1,22 @@
1
- import { ProjectConfig } from '../../../types/Projects';
2
- import { IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types';
3
- type DevServerInterface = {
4
- setup?: Function;
5
- start?: (options: object) => Promise<void>;
6
- fileChange?: (filePath: string, event: string) => Promise<void>;
7
- cleanup?: () => Promise<void>;
1
+ import LocalDevState from './LocalDevState';
2
+ import LocalDevLogger from './LocalDevLogger';
3
+ type DevServerManagerV2ConstructorOptions = {
4
+ localDevState: LocalDevState;
5
+ logger: LocalDevLogger;
8
6
  };
9
7
  declare class DevServerManagerV2 {
10
8
  private initialized;
11
9
  private started;
12
10
  private devServers;
13
- constructor();
14
- iterateDevServers(callback: (serverInterface: DevServerInterface) => Promise<void>): Promise<void>;
15
- setup({ projectNodes, accountId, setActiveApp, }: {
16
- projectNodes: {
17
- [key: string]: IntermediateRepresentationNodeLocalDev;
18
- };
19
- accountId: number;
20
- setActiveApp: (appUid: string | undefined) => Promise<void>;
21
- }): Promise<void>;
22
- start({ accountId, projectConfig, }: {
23
- accountId: number;
24
- projectConfig: ProjectConfig;
25
- }): Promise<void>;
11
+ private localDevState;
12
+ constructor(options: DevServerManagerV2ConstructorOptions);
13
+ private iterateDevServers;
14
+ setup(): Promise<void>;
15
+ start(): Promise<void>;
26
16
  fileChange({ filePath, event, }: {
27
17
  filePath: string;
28
18
  event: string;
29
19
  }): Promise<void>;
30
20
  cleanup(): Promise<void>;
31
21
  }
32
- declare const Manager: DevServerManagerV2;
33
- export default Manager;
22
+ export default DevServerManagerV2;
@@ -1,56 +1,61 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  const logger_1 = require("@hubspot/local-dev-lib/logger");
4
7
  const promptUtils_1 = require("../../prompts/promptUtils");
5
- const ui_extensions_dev_server_1 = require("@hubspot/ui-extensions-dev-server");
6
8
  const portManager_1 = require("@hubspot/local-dev-lib/portManager");
7
9
  const urls_1 = require("@hubspot/local-dev-lib/urls");
8
10
  const config_1 = require("@hubspot/local-dev-lib/config");
11
+ const AppDevModeInterface_1 = __importDefault(require("./AppDevModeInterface"));
9
12
  const en_1 = require("../../../lang/en");
10
13
  class DevServerManagerV2 {
11
14
  initialized;
12
15
  started;
13
16
  devServers;
14
- constructor() {
17
+ localDevState;
18
+ constructor(options) {
15
19
  this.initialized = false;
16
20
  this.started = false;
17
- this.devServers = [ui_extensions_dev_server_1.DevModeUnifiedInterface];
21
+ this.localDevState = options.localDevState;
22
+ const AppsDevServer = new AppDevModeInterface_1.default({
23
+ localDevState: options.localDevState,
24
+ localDevLogger: options.logger,
25
+ });
26
+ this.devServers = [AppsDevServer];
18
27
  }
19
28
  async iterateDevServers(callback) {
20
29
  await Promise.all(this.devServers.map(devServer => callback(devServer)));
21
30
  }
22
- async setup({ projectNodes, accountId, setActiveApp, }) {
31
+ async setup() {
23
32
  let env;
24
- const accountConfig = (0, config_1.getAccountConfig)(accountId);
33
+ const accountConfig = (0, config_1.getAccountConfig)(this.localDevState.targetTestingAccountId);
25
34
  if (accountConfig) {
26
35
  env = accountConfig.env;
27
36
  }
28
37
  await (0, portManager_1.startPortManagerServer)();
29
38
  await this.iterateDevServers(async (serverInterface) => {
30
39
  if (serverInterface.setup) {
40
+ // @TODO: In the future, update UIE Dev Server to use LocalDevState
31
41
  await serverInterface.setup({
32
- components: projectNodes,
42
+ components: this.localDevState.projectNodes,
33
43
  promptUser: promptUtils_1.promptUser,
34
44
  logger: logger_1.logger,
35
45
  urls: {
36
46
  api: (0, urls_1.getHubSpotApiOrigin)(env),
37
47
  web: (0, urls_1.getHubSpotWebsiteOrigin)(env),
38
48
  },
39
- setActiveApp,
40
49
  });
41
50
  }
42
51
  });
43
52
  this.initialized = true;
44
53
  }
45
- async start({ accountId, projectConfig, }) {
54
+ async start() {
46
55
  if (this.initialized) {
47
56
  await this.iterateDevServers(async (serverInterface) => {
48
57
  if (serverInterface.start) {
49
- await serverInterface.start({
50
- accountId,
51
- projectConfig,
52
- requestPorts: portManager_1.requestPorts,
53
- });
58
+ await serverInterface.start();
54
59
  }
55
60
  });
56
61
  }
@@ -79,5 +84,4 @@ class DevServerManagerV2 {
79
84
  }
80
85
  }
81
86
  }
82
- const Manager = new DevServerManagerV2();
83
- exports.default = Manager;
87
+ exports.default = DevServerManagerV2;
@@ -0,0 +1,30 @@
1
+ import LocalDevState from './LocalDevState';
2
+ declare class LocalDevLogger {
3
+ private state;
4
+ private mostRecentUploadWarning;
5
+ private uploadWarnings;
6
+ constructor(state: LocalDevState);
7
+ private logUploadInstructions;
8
+ private handleError;
9
+ getUploadCommand(): string;
10
+ uploadWarning(): void;
11
+ addUploadWarning(warning: string): void;
12
+ clearUploadWarnings(): void;
13
+ missingComponentsWarning(components: string[]): void;
14
+ fileChangeError(e: unknown): void;
15
+ devServerSetupError(e: unknown): void;
16
+ devServerStartError(e: unknown): void;
17
+ devServerCleanupError(e: unknown): void;
18
+ noDeployedBuild(): void;
19
+ resetSpinnies(): void;
20
+ startupMessage(): void;
21
+ cleanupStart(): void;
22
+ cleanupError(): void;
23
+ cleanupSuccess(): void;
24
+ uploadInitiated(): void;
25
+ projectConfigMismatch(): void;
26
+ uploadError(error: unknown): void;
27
+ uploadSuccess(): void;
28
+ monitorConsoleOutput(): void;
29
+ }
30
+ export default LocalDevLogger;
@@ -0,0 +1,159 @@
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 config_1 = require("@hubspot/local-dev-lib/config");
7
+ const config_2 = require("@hubspot/local-dev-lib/config");
8
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
9
+ const logger_2 = require("../../ui/logger");
10
+ const ui_1 = require("../../ui");
11
+ const en_1 = require("../../../lang/en");
12
+ const SpinniesManager_1 = __importDefault(require("../../ui/SpinniesManager"));
13
+ const errorHandlers_1 = require("../../errorHandlers");
14
+ class LocalDevLogger {
15
+ state;
16
+ mostRecentUploadWarning;
17
+ uploadWarnings;
18
+ constructor(state) {
19
+ this.state = state;
20
+ this.mostRecentUploadWarning = null;
21
+ this.uploadWarnings = new Set();
22
+ }
23
+ logUploadInstructions(warning) {
24
+ logger_2.uiLogger.log('');
25
+ logger_2.uiLogger.warn(warning);
26
+ logger_2.uiLogger.log('');
27
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.instructionsHeader);
28
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.stopDev);
29
+ if (this.state.isGithubLinked) {
30
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.pushToGithub);
31
+ }
32
+ else {
33
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.runUpload(this.getUploadCommand()));
34
+ }
35
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.uploadWarning.restartDev);
36
+ }
37
+ handleError(e, langFunction) {
38
+ if (this.state.debug) {
39
+ logger_1.logger.error(e);
40
+ }
41
+ logger_2.uiLogger.error(langFunction(e instanceof Error ? e.message : ''));
42
+ }
43
+ getUploadCommand() {
44
+ const currentDefaultAccount = (0, config_2.getConfigDefaultAccount)() || undefined;
45
+ return this.state.targetProjectAccountId !==
46
+ (0, config_1.getAccountId)(currentDefaultAccount)
47
+ ? (0, ui_1.uiCommandReference)(`hs project upload --account=${this.state.targetProjectAccountId}`)
48
+ : (0, ui_1.uiCommandReference)('hs project upload');
49
+ }
50
+ uploadWarning() {
51
+ // At the moment, there is only one additional warning. We may need to do this in a
52
+ // more robust way in the future
53
+ const additionalWarnings = Array.from(this.uploadWarnings).join('\n\n');
54
+ const warning = `${en_1.lib.LocalDevManager.uploadWarning.defaultWarning} ${additionalWarnings}`;
55
+ // Avoid logging the warning to the console if it is currently the most
56
+ // recently logged warning. We do not want to spam the console with the same message.
57
+ if (warning !== this.mostRecentUploadWarning) {
58
+ this.logUploadInstructions(warning);
59
+ this.mostRecentUploadWarning = warning;
60
+ }
61
+ }
62
+ addUploadWarning(warning) {
63
+ this.uploadWarnings.add(warning);
64
+ }
65
+ clearUploadWarnings() {
66
+ this.uploadWarnings.clear();
67
+ }
68
+ missingComponentsWarning(components) {
69
+ const warning = en_1.lib.LocalDevManager.uploadWarning.missingComponents(components.join(', '));
70
+ if (warning !== this.mostRecentUploadWarning) {
71
+ this.logUploadInstructions(warning);
72
+ this.mostRecentUploadWarning = warning;
73
+ }
74
+ }
75
+ fileChangeError(e) {
76
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.fileChangeError);
77
+ }
78
+ devServerSetupError(e) {
79
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.setupError);
80
+ }
81
+ devServerStartError(e) {
82
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.startError);
83
+ }
84
+ devServerCleanupError(e) {
85
+ this.handleError(e, en_1.lib.LocalDevManager.devServer.cleanupError);
86
+ }
87
+ noDeployedBuild() {
88
+ logger_2.uiLogger.error(en_1.lib.LocalDevManager.noDeployedBuild(this.state.projectConfig.name, (0, ui_1.uiAccountDescription)(this.state.targetProjectAccountId), this.getUploadCommand()));
89
+ logger_2.uiLogger.log('');
90
+ }
91
+ resetSpinnies() {
92
+ SpinniesManager_1.default.stopAll();
93
+ SpinniesManager_1.default.init();
94
+ }
95
+ startupMessage() {
96
+ if (!this.state.debug) {
97
+ console.clear();
98
+ }
99
+ (0, ui_1.uiBetaTag)(en_1.lib.LocalDevManager.betaMessage);
100
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.learnMoreLocalDevServer);
101
+ logger_2.uiLogger.log('');
102
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.running(this.state.projectConfig.name, (0, ui_1.uiAccountDescription)(this.state.targetProjectAccountId)));
103
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.viewProjectLink(this.state.projectConfig.name, this.state.targetProjectAccountId));
104
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.viewLocalDevUILink(this.state.targetTestingAccountId));
105
+ logger_2.uiLogger.log('');
106
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.quitHelper);
107
+ (0, ui_1.uiLine)();
108
+ logger_2.uiLogger.log('');
109
+ }
110
+ cleanupStart() {
111
+ SpinniesManager_1.default.add('cleanupMessage', {
112
+ text: en_1.lib.LocalDevManager.exitingStart,
113
+ });
114
+ }
115
+ cleanupError() {
116
+ SpinniesManager_1.default.fail('cleanupMessage', {
117
+ text: en_1.lib.LocalDevManager.exitingFail,
118
+ });
119
+ }
120
+ cleanupSuccess() {
121
+ SpinniesManager_1.default.succeed('cleanupMessage', {
122
+ text: en_1.lib.LocalDevManager.exitingSucceed,
123
+ });
124
+ }
125
+ uploadInitiated() {
126
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.uploadInitiated);
127
+ }
128
+ projectConfigMismatch() {
129
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.projectConfigMismatch);
130
+ }
131
+ uploadError(error) {
132
+ logger_1.logger.log('');
133
+ (0, errorHandlers_1.logError)(error);
134
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.uploadFailed);
135
+ logger_1.logger.log('');
136
+ }
137
+ uploadSuccess() {
138
+ logger_1.logger.log('');
139
+ logger_2.uiLogger.log(en_1.lib.LocalDevProcess.uploadSuccess);
140
+ (0, ui_1.uiLine)();
141
+ logger_1.logger.log('');
142
+ }
143
+ monitorConsoleOutput() {
144
+ const originalStdoutWrite = process.stdout.write.bind(process.stdout);
145
+ function customStdoutWrite(chunk, encoding, callback) {
146
+ // Reset the most recently logged warning
147
+ if (this.mostRecentUploadWarning) {
148
+ this.mostRecentUploadWarning = null;
149
+ }
150
+ if (typeof encoding === 'function') {
151
+ return originalStdoutWrite(chunk, callback);
152
+ }
153
+ return originalStdoutWrite(chunk, encoding, callback);
154
+ }
155
+ customStdoutWrite.bind(this);
156
+ process.stdout.write = customStdoutWrite;
157
+ }
158
+ }
159
+ exports.default = LocalDevLogger;
@@ -14,17 +14,17 @@ const constants_1 = require("../../constants");
14
14
  const SpinniesManager_1 = __importDefault(require("../../ui/SpinniesManager"));
15
15
  const DevServerManager_1 = __importDefault(require("./DevServerManager"));
16
16
  const exitCodes_1 = require("../../enums/exitCodes");
17
- const urls_1 = require("../../projects/urls");
18
17
  const helpers_1 = require("./helpers");
19
18
  const structure_1 = require("../../projects/structure");
20
19
  const Projects_1 = require("../../../types/Projects");
21
20
  const ui_1 = require("../../ui");
22
21
  const index_1 = require("../../errorHandlers/index");
23
- const installPublicAppPrompt_1 = require("../../prompts/installPublicAppPrompt");
22
+ const installAppPrompt_1 = require("../../prompts/installAppPrompt");
24
23
  const promptUtils_1 = require("../../prompts/promptUtils");
25
24
  const process_1 = require("../../process");
26
25
  const en_1 = require("../../../lang/en");
27
26
  const logger_2 = require("../../ui/logger");
27
+ const urls_1 = require("../../app/urls");
28
28
  const WATCH_EVENTS = {
29
29
  add: 'add',
30
30
  change: 'change',
@@ -113,7 +113,7 @@ class LocalDevManager {
113
113
  return;
114
114
  }
115
115
  (0, ui_1.uiLine)();
116
- logger_2.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.activePublicAppData.name, this.publicAppActiveInstalls, this.publicAppActiveInstalls === 1 ? 'account' : 'accounts'));
116
+ logger_2.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.activePublicAppData.name, this.publicAppActiveInstalls));
117
117
  logger_2.uiLogger.log(en_1.lib.LocalDevManager.activeInstallWarning.explanation);
118
118
  (0, ui_1.uiLine)();
119
119
  const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.LocalDevManager.activeInstallWarning.confirmationPrompt, { defaultAnswer: false });
@@ -141,7 +141,7 @@ class LocalDevManager {
141
141
  logger_2.uiLogger.log((0, ui_1.uiLink)(en_1.lib.LocalDevManager.learnMoreLocalDevServer, 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
142
142
  logger_2.uiLogger.log('');
143
143
  logger_2.uiLogger.log(chalk_1.default.hex(ui_1.UI_COLORS.SORBET)(en_1.lib.LocalDevManager.running(this.projectConfig.name, (0, ui_1.uiAccountDescription)(this.targetAccountId))));
144
- logger_2.uiLogger.log((0, ui_1.uiLink)(en_1.lib.LocalDevManager.viewProjectLink, (0, urls_1.getProjectDetailUrl)(this.projectConfig.name, this.targetProjectAccountId) || ''));
144
+ logger_2.uiLogger.log(en_1.lib.LocalDevManager.viewProjectLink(this.projectConfig.name, this.targetProjectAccountId));
145
145
  if (this.activeApp?.type === Projects_1.ComponentTypes.PublicApp) {
146
146
  logger_2.uiLogger.log((0, ui_1.uiLink)(en_1.lib.LocalDevManager.viewTestAccountLink, (0, helpers_1.getAccountHomeUrl)(this.targetAccountId)));
147
147
  }
@@ -188,7 +188,14 @@ class LocalDevManager {
188
188
  const { data: { isInstalledWithScopeGroups, previouslyAuthorizedScopeGroups }, } = await (0, localDevAuth_1.fetchAppInstallationData)(this.targetAccountId, this.projectId, this.activeApp.config.uid, this.activeApp.config.auth.requiredScopes, this.activeApp.config.auth.optionalScopes);
189
189
  const isReinstall = previouslyAuthorizedScopeGroups.length > 0;
190
190
  if (!isInstalledWithScopeGroups) {
191
- await (0, installPublicAppPrompt_1.installPublicAppPrompt)(this.env, this.targetAccountId, this.activePublicAppData.clientId, this.activeApp.config.auth.requiredScopes, this.activeApp.config.auth.redirectUrls, isReinstall);
191
+ const installUrl = (0, urls_1.getOauthAppInstallUrl)({
192
+ targetAccountId: this.targetAccountId,
193
+ env: this.env,
194
+ clientId: this.activePublicAppData.clientId,
195
+ scopes: this.activeApp.config.auth.requiredScopes,
196
+ redirectUrls: this.activeApp.config.auth.redirectUrls,
197
+ });
198
+ await (0, installAppPrompt_1.installAppBrowserPrompt)(installUrl, isReinstall);
192
199
  }
193
200
  }
194
201
  updateKeypressListeners() {
@@ -0,0 +1,34 @@
1
+ import { IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types';
2
+ import LocalDevState from './LocalDevState';
3
+ import LocalDevLogger from './LocalDevLogger';
4
+ import { LocalDevStateConstructorOptions, LocalDevStateListener, LocalDevServerMessage } from '../../../types/LocalDev';
5
+ declare class LocalDevProcess {
6
+ private state;
7
+ private _logger;
8
+ private devServerManager;
9
+ constructor(options: LocalDevStateConstructorOptions);
10
+ get projectDir(): string;
11
+ get projectId(): number;
12
+ get projectName(): string;
13
+ get targetProjectAccountId(): number;
14
+ get targetTestingAccountId(): number;
15
+ get projectNodes(): {
16
+ [key: string]: IntermediateRepresentationNodeLocalDev;
17
+ };
18
+ get logger(): LocalDevLogger;
19
+ get configFilesUpdatedSinceLastUpload(): Set<string>;
20
+ private setupDevServers;
21
+ private startDevServers;
22
+ private cleanupDevServers;
23
+ private compareLocalProjectToDeployed;
24
+ private projectConfigValidForUpload;
25
+ private updateProjectNodes;
26
+ handleFileChange(filePath: string, event: string): Promise<void>;
27
+ handleConfigFileChange(filePath: string, event: string): Promise<void>;
28
+ start(): Promise<void>;
29
+ stop(showProgress?: boolean): Promise<void>;
30
+ uploadProject(): Promise<boolean>;
31
+ addStateListener<K extends keyof LocalDevState>(key: K, listener: LocalDevStateListener<K>, callOnInit?: boolean): void;
32
+ sendDevServerMessage(message: LocalDevServerMessage): void;
33
+ }
34
+ export default LocalDevProcess;