@hubspot/cli 7.7.35-experimental.0 → 7.8.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/bin/cli.js +31 -25
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/doctor.test.js +16 -16
  4. package/commands/__tests__/getStarted.test.js +2 -2
  5. package/commands/__tests__/mcp.test.js +1 -1
  6. package/commands/__tests__/project.test.js +0 -3
  7. package/commands/account/clean.js +18 -27
  8. package/commands/account/createOverride.js +13 -31
  9. package/commands/account/info.js +20 -31
  10. package/commands/account/list.js +16 -22
  11. package/commands/account/remove.js +12 -20
  12. package/commands/account/removeOverride.js +11 -21
  13. package/commands/account/rename.js +6 -9
  14. package/commands/account/use.js +12 -26
  15. package/commands/account.js +2 -2
  16. package/commands/app/__tests__/migrate.test.js +5 -6
  17. package/commands/app/migrate.js +13 -19
  18. package/commands/app/secret/add.js +2 -1
  19. package/commands/app/secret/delete.js +2 -1
  20. package/commands/app/secret/list.js +2 -1
  21. package/commands/app/secret/update.js +2 -1
  22. package/commands/app/secret.js +2 -1
  23. package/commands/app.js +2 -2
  24. package/commands/auth.d.ts +1 -0
  25. package/commands/auth.js +16 -7
  26. package/commands/cms/convertFields.js +7 -9
  27. package/commands/cms/getReactModule.js +9 -14
  28. package/commands/cms/lighthouseScore.js +33 -36
  29. package/commands/cms.js +2 -2
  30. package/commands/completion.js +3 -3
  31. package/commands/config/set.d.ts +1 -1
  32. package/commands/config/set.js +64 -37
  33. package/commands/config.js +2 -2
  34. package/commands/create.js +2 -2
  35. package/commands/customObject/create.js +10 -12
  36. package/commands/customObject/schema/create.js +9 -11
  37. package/commands/customObject/schema/delete.js +16 -16
  38. package/commands/customObject/schema/fetch-all.js +12 -11
  39. package/commands/customObject/schema/fetch.js +15 -15
  40. package/commands/customObject/schema/list.js +4 -4
  41. package/commands/customObject/schema/update.js +13 -13
  42. package/commands/customObject/schema.js +2 -2
  43. package/commands/customObject.js +6 -7
  44. package/commands/doctor.js +8 -11
  45. package/commands/feedback.js +7 -12
  46. package/commands/fetch.js +8 -8
  47. package/commands/filemanager/fetch.js +7 -7
  48. package/commands/filemanager/upload.js +15 -34
  49. package/commands/filemanager.js +2 -2
  50. package/commands/function/deploy.js +11 -29
  51. package/commands/function/list.js +8 -8
  52. package/commands/function/server.js +9 -11
  53. package/commands/function.d.ts +1 -1
  54. package/commands/function.js +2 -2
  55. package/commands/getStarted.d.ts +0 -2
  56. package/commands/getStarted.js +4 -4
  57. package/commands/hubdb/clear.js +7 -15
  58. package/commands/hubdb/create.js +9 -15
  59. package/commands/hubdb/delete.js +8 -15
  60. package/commands/hubdb/fetch.js +6 -9
  61. package/commands/hubdb.d.ts +1 -1
  62. package/commands/hubdb.js +2 -2
  63. package/commands/init.js +2 -3
  64. package/commands/lint.js +16 -16
  65. package/commands/list.js +8 -14
  66. package/commands/logs.js +14 -20
  67. package/commands/mcp/__tests__/setup.test.js +2 -2
  68. package/commands/mcp/setup.js +11 -2
  69. package/commands/mcp.js +3 -3
  70. package/commands/mv.js +6 -17
  71. package/commands/open.js +5 -5
  72. package/commands/project/__tests__/add.test.js +4 -2
  73. package/commands/project/__tests__/create.test.js +6 -6
  74. package/commands/project/__tests__/deploy.test.js +3 -7
  75. package/commands/project/__tests__/devUnifiedFlow.test.js +2 -4
  76. package/commands/project/__tests__/installDeps.test.js +8 -8
  77. package/commands/project/__tests__/logs.test.js +1 -4
  78. package/commands/project/__tests__/migrate.test.js +6 -7
  79. package/commands/project/__tests__/migrateApp.test.js +3 -7
  80. package/commands/project/__tests__/profile.test.js +1 -1
  81. package/commands/project/__tests__/validate.test.js +98 -0
  82. package/commands/project/add.js +4 -8
  83. package/commands/project/cloneApp.js +14 -19
  84. package/commands/project/create.js +2 -9
  85. package/commands/project/deploy.js +5 -5
  86. package/commands/project/dev/deprecatedFlow.js +7 -16
  87. package/commands/project/dev/index.js +16 -13
  88. package/commands/project/dev/unifiedFlow.js +8 -4
  89. package/commands/project/download.js +10 -14
  90. package/commands/project/installDeps.js +8 -9
  91. package/commands/project/listBuilds.js +12 -21
  92. package/commands/project/logs.js +21 -24
  93. package/commands/project/migrate.js +41 -13
  94. package/commands/project/migrateApp.js +10 -17
  95. package/commands/project/open.js +6 -14
  96. package/commands/project/profile/add.js +3 -3
  97. package/commands/project/profile/delete.js +1 -2
  98. package/commands/project/profile.js +2 -3
  99. package/commands/project/upload.js +16 -25
  100. package/commands/project/validate.js +7 -7
  101. package/commands/project/watch.js +13 -22
  102. package/commands/project.js +2 -3
  103. package/commands/sandbox/__tests__/create.test.js +5 -5
  104. package/commands/sandbox/create.js +22 -32
  105. package/commands/sandbox/delete.js +35 -63
  106. package/commands/sandbox.js +2 -2
  107. package/commands/secret/addSecret.js +7 -17
  108. package/commands/secret/deleteSecret.js +10 -20
  109. package/commands/secret/listSecret.js +8 -10
  110. package/commands/secret/updateSecret.js +9 -17
  111. package/commands/secret.js +2 -2
  112. package/commands/testAccount/__tests__/delete.test.js +2 -4
  113. package/commands/testAccount/delete.d.ts +4 -3
  114. package/commands/testAccount/delete.js +155 -14
  115. package/commands/testAccount/importData.d.ts +1 -1
  116. package/commands/testAccount/importData.js +1 -1
  117. package/commands/testAccount.js +1 -1
  118. package/lang/en.d.ts +317 -98
  119. package/lang/en.js +312 -96
  120. package/lang/en.lyaml +2 -2
  121. package/lib/__tests__/buildAccount.test.js +2 -1
  122. package/lib/__tests__/commonOpts.test.js +1 -1
  123. package/lib/__tests__/dependencyManagement.test.js +1 -1
  124. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  125. package/lib/__tests__/npm.test.js +1 -1
  126. package/lib/__tests__/oauth.test.js +4 -4
  127. package/lib/__tests__/process.test.js +10 -5
  128. package/lib/__tests__/sandboxSync.test.js +8 -8
  129. package/lib/__tests__/sandboxes.test.js +8 -8
  130. package/lib/__tests__/serverlessLogs.test.js +1 -1
  131. package/lib/__tests__/usageTracking.test.js +5 -5
  132. package/lib/__tests__/validation.test.js +2 -1
  133. package/lib/__tests__/yargsUtils.test.js +83 -9
  134. package/lib/app/__tests__/migrate.test.js +19 -56
  135. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  136. package/lib/app/migrate.d.ts +2 -8
  137. package/lib/app/migrate.js +5 -80
  138. package/lib/app/migrate_legacy.js +20 -24
  139. package/lib/buildAccount.js +25 -57
  140. package/lib/commonOpts.d.ts +1 -1
  141. package/lib/commonOpts.js +25 -22
  142. package/lib/configOptions.js +7 -0
  143. package/lib/constants.d.ts +13 -0
  144. package/lib/constants.js +17 -0
  145. package/lib/dependencyManagement.js +9 -27
  146. package/lib/developerTestAccounts.js +9 -23
  147. package/lib/doctor/Diagnosis.js +11 -23
  148. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  149. package/lib/doctor/Doctor.js +42 -90
  150. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  151. package/lib/errorHandlers/index.js +12 -20
  152. package/lib/errorHandlers/suppressError.js +10 -17
  153. package/lib/lang.js +6 -5
  154. package/lib/links.d.ts +1 -0
  155. package/lib/links.js +14 -7
  156. package/lib/mcp/setup.js +1 -1
  157. package/lib/middleware/__test__/commandTargetingUtils.test.d.ts +1 -0
  158. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  159. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  160. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  161. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  162. package/lib/middleware/commandTargetingUtils.js +78 -0
  163. package/lib/middleware/configMiddleware.d.ts +1 -1
  164. package/lib/middleware/configMiddleware.js +21 -81
  165. package/lib/middleware/fireAlarmMiddleware.js +15 -5
  166. package/lib/middleware/gitMiddleware.js +5 -1
  167. package/lib/middleware/notificationsMiddleware.js +5 -11
  168. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  169. package/lib/npm.js +2 -2
  170. package/lib/oauth.js +5 -5
  171. package/lib/process.js +5 -4
  172. package/lib/projects/__tests__/AppDevModeInterface.test.js +2 -0
  173. package/lib/projects/__tests__/LocalDevProcess.test.js +227 -16
  174. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +86 -60
  175. package/lib/projects/__tests__/deploy.test.js +71 -6
  176. package/lib/projects/__tests__/localDevProjectHelpers.test.js +6 -2
  177. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  178. package/lib/projects/__tests__/projects.test.js +12 -12
  179. package/lib/projects/__tests__/structure.test.js +3 -3
  180. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  181. package/lib/projects/__tests__/upload.test.js +82 -0
  182. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  183. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  184. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  185. package/lib/projects/create/__tests__/v3.test.js +80 -5
  186. package/lib/projects/create/index.js +2 -2
  187. package/lib/projects/create/legacy.js +2 -2
  188. package/lib/projects/create/v3.js +10 -8
  189. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  190. package/lib/projects/localDev/AppDevModeInterface.js +21 -12
  191. package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
  192. package/lib/projects/localDev/LocalDevLogger.js +27 -6
  193. package/lib/projects/localDev/LocalDevManager.js +4 -5
  194. package/lib/projects/localDev/LocalDevProcess.d.ts +7 -5
  195. package/lib/projects/localDev/LocalDevProcess.js +90 -19
  196. package/lib/projects/localDev/LocalDevState.d.ts +9 -8
  197. package/lib/projects/localDev/LocalDevState.js +18 -17
  198. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +2 -1
  199. package/lib/projects/localDev/LocalDevWebsocketServer.js +62 -33
  200. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  201. package/lib/projects/localDev/helpers/project.js +42 -1
  202. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +4 -0
  203. package/lib/projects/localDev/localDevWebsocketServerUtils.js +10 -0
  204. package/lib/projects/platformVersion.d.ts +1 -1
  205. package/lib/projects/platformVersion.js +1 -1
  206. package/lib/projects/pollProjectBuildAndDeploy.js +4 -4
  207. package/lib/projects/structure.js +6 -6
  208. package/lib/projects/upload.d.ts +1 -1
  209. package/lib/projects/upload.js +17 -8
  210. package/lib/prompts/accountNamePrompt.js +14 -19
  211. package/lib/prompts/accountsPrompt.js +2 -2
  212. package/lib/prompts/cmsFieldPrompt.js +2 -2
  213. package/lib/prompts/createApiSamplePrompt.js +5 -5
  214. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  215. package/lib/prompts/createFunctionPrompt.js +14 -14
  216. package/lib/prompts/createModulePrompt.js +9 -9
  217. package/lib/prompts/createTemplatePrompt.js +2 -2
  218. package/lib/prompts/downloadProjectPrompt.js +5 -8
  219. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  220. package/lib/prompts/previewPrompt.js +6 -6
  221. package/lib/prompts/projectAddPrompt.js +8 -1
  222. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  223. package/lib/prompts/projectNamePrompt.js +4 -8
  224. package/lib/prompts/projectsLogsPrompt.js +2 -4
  225. package/lib/prompts/promptUtils.js +30 -9
  226. package/lib/prompts/sandboxesPrompt.js +7 -7
  227. package/lib/prompts/secretPrompt.js +3 -3
  228. package/lib/prompts/selectAppPrompt.js +3 -3
  229. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  230. package/lib/prompts/selectProjectTemplatePrompt.js +2 -0
  231. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  232. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  233. package/lib/prompts/uploadPrompt.js +5 -5
  234. package/lib/sandboxSync.js +24 -41
  235. package/lib/sandboxes.js +19 -47
  236. package/lib/schema.js +3 -3
  237. package/lib/serverlessLogs.js +11 -13
  238. package/lib/theme/__tests__/migrate.test.d.ts +1 -0
  239. package/lib/theme/__tests__/migrate.test.js +233 -0
  240. package/lib/theme/migrate.d.ts +13 -0
  241. package/lib/theme/migrate.js +90 -0
  242. package/lib/ui/SpinniesManager.d.ts +2 -0
  243. package/lib/ui/SpinniesManager.js +7 -0
  244. package/lib/ui/boxen.js +1 -2
  245. package/lib/ui/git.js +13 -10
  246. package/lib/ui/index.js +38 -37
  247. package/lib/ui/serverlessFunctionLogs.js +9 -7
  248. package/lib/ui/uiMessages.d.ts +68 -0
  249. package/lib/ui/uiMessages.js +71 -0
  250. package/lib/usageTracking.js +8 -8
  251. package/lib/validation.js +20 -23
  252. package/lib/yargsUtils.d.ts +1 -1
  253. package/lib/yargsUtils.js +12 -5
  254. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  255. package/mcp-server/tools/index.js +4 -0
  256. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +2 -2
  257. package/mcp-server/tools/project/CreateProjectTool.d.ts +2 -2
  258. package/mcp-server/tools/project/DocsSearchTool.d.ts +4 -1
  259. package/mcp-server/tools/project/DocsSearchTool.js +5 -5
  260. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  261. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  262. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  263. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  264. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -1
  265. package/mcp-server/tools/project/GetConfigValuesTool.js +12 -6
  266. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  267. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +12 -10
  268. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  269. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  270. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  271. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  272. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -7
  273. package/mcp-server/utils/__tests__/cliConfig.test.d.ts +1 -0
  274. package/mcp-server/utils/__tests__/cliConfig.test.js +110 -0
  275. package/mcp-server/utils/cliConfig.d.ts +1 -0
  276. package/mcp-server/utils/cliConfig.js +12 -0
  277. package/mcp-server/utils/toolUsageTracking.js +2 -2
  278. package/package.json +4 -4
  279. package/types/LocalDev.d.ts +19 -3
  280. package/ui/index.js +1 -1
  281. package/lib/middleware/__test__/utils.test.js +0 -51
  282. package/lib/middleware/utils.d.ts +0 -8
  283. package/lib/middleware/utils.js +0 -14
  284. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
@@ -3,7 +3,7 @@ import { marketplaceDistribution, oAuth, privateDistribution, staticAuth, EMPTY_
3
3
  import { commands, lib } from '../../../lang/en.js';
4
4
  import { listPrompt } from '../../prompts/promptUtils.js';
5
5
  import chalk from 'chalk';
6
- import { useV3Api } from '../platformVersion.js';
6
+ import { isV2Project } from '../platformVersion.js';
7
7
  import path from 'path';
8
8
  import { getConfigForPlatformVersion } from './legacy.js';
9
9
  import { logError } from '../../errorHandlers/index.js';
@@ -52,6 +52,7 @@ export async function createV3App(providedAuth, providedDistribution) {
52
52
  const componentTypeToGateMap = {
53
53
  [AppEventsKey]: FEATURES.APP_EVENTS,
54
54
  [PagesKey]: FEATURES.APPS_HOME,
55
+ 'workflow-action-tool': FEATURES.AGENT_TOOLS,
55
56
  };
56
57
  export async function calculateComponentTemplateChoices(components, authType, distribution, accountId, projectMetadata) {
57
58
  const enabledComponents = [];
@@ -73,18 +74,19 @@ export async function calculateComponentTemplateChoices(components, authType, di
73
74
  }
74
75
  if (Array.isArray(supportedAuthTypes) &&
75
76
  authType &&
76
- !supportedAuthTypes.includes(authType)) {
77
+ !supportedAuthTypes.includes(authType.toLowerCase())) {
77
78
  disabledReasons.push(commands.project.add.error.authTypeNotAllowed(authType));
78
79
  }
79
80
  if (Array.isArray(supportedDistributions) &&
80
81
  distribution &&
81
- !supportedDistributions.includes(distribution)) {
82
+ !supportedDistributions.includes(distribution.toLowerCase())) {
82
83
  disabledReasons.push(commands.project.add.error.distributionNotAllowed(distribution));
83
84
  }
84
- if (componentTypeToGateMap[template.type]) {
85
- const isUngated = await hasFeature(accountId, componentTypeToGateMap[template.type]);
85
+ const templateGate = componentTypeToGateMap[template.cliSelector || template.type];
86
+ if (templateGate) {
87
+ const isUngated = await hasFeature(accountId, templateGate);
86
88
  if (!isUngated) {
87
- disabledReasons.push(commands.project.add.error.portalDoesNotHaveAccessToThisFeature(accountId));
89
+ disabledReasons.unshift(commands.project.add.error.portalDoesNotHaveAccessToThisFeature(accountId));
88
90
  }
89
91
  }
90
92
  if (disabledReasons.length > 0) {
@@ -96,7 +98,7 @@ export async function calculateComponentTemplateChoices(components, authType, di
96
98
  }
97
99
  else {
98
100
  enabledComponents.push({
99
- name: template.label,
101
+ name: `${template.label} [${template.cliSelector || template.type}]`,
100
102
  value: template,
101
103
  });
102
104
  }
@@ -146,7 +148,7 @@ export async function v3ComponentFlow(platformVersion, projectBase, providedAuth
146
148
  };
147
149
  }
148
150
  export function generateComponentPaths({ selectProjectTemplatePromptResponse, platformVersion, repoConfig, projectContents, authType, distribution, }) {
149
- if (!useV3Api(platformVersion)) {
151
+ if (!isV2Project(platformVersion)) {
150
152
  return [];
151
153
  }
152
154
  const components = selectProjectTemplatePromptResponse.componentTemplates?.map((componentTemplate) => {
@@ -15,6 +15,8 @@ declare class AppDevModeInterface {
15
15
  private get appNode();
16
16
  private get appData();
17
17
  private set appData(value);
18
+ private isStaticAuthApp;
19
+ private isOAuthApp;
18
20
  private getAppInstallUrl;
19
21
  private fetchAppData;
20
22
  private checkMarketplaceAppInstalls;
@@ -54,6 +54,12 @@ class AppDevModeInterface {
54
54
  }
55
55
  this.localDevState.setAppDataForUid(this.appNode.uid, appData);
56
56
  }
57
+ isStaticAuthApp() {
58
+ return (this.appNode?.config.auth.type.toLowerCase() === APP_AUTH_TYPES.STATIC);
59
+ }
60
+ isOAuthApp() {
61
+ return (this.appNode?.config.auth.type.toLowerCase() === APP_AUTH_TYPES.OAUTH);
62
+ }
57
63
  // @TODO: Restore test account auto install functionality
58
64
  // private isAutomaticallyInstallable(): boolean {
59
65
  // const targetTestingAccount = getAccountConfig(
@@ -71,11 +77,11 @@ class AppDevModeInterface {
71
77
  // return (
72
78
  // isTestAccount &&
73
79
  // hasCorrectParent &&
74
- // this.appNode?.config.auth.type === APP_AUTH_TYPES.STATIC
80
+ // this.isStaticAuthApp()
75
81
  // );
76
82
  // }
77
83
  async getAppInstallUrl() {
78
- if (this.appNode?.config.auth.type === APP_AUTH_TYPES.OAUTH) {
84
+ if (this.appNode && this.isOAuthApp()) {
79
85
  return getOauthAppInstallUrl({
80
86
  targetAccountId: this.localDevState.targetTestingAccountId,
81
87
  env: this.localDevState.env,
@@ -177,13 +183,16 @@ class AppDevModeInterface {
177
183
  // );
178
184
  // }
179
185
  // }
186
+ const staticAuthInstallOptions = this.isStaticAuthApp()
187
+ ? {
188
+ testingAccountId: this.localDevState.targetTestingAccountId,
189
+ projectAccountId: this.localDevState.targetProjectAccountId,
190
+ projectName: this.localDevState.projectConfig.name,
191
+ appUid: this.appNode.uid,
192
+ }
193
+ : undefined;
180
194
  const installUrl = await this.getAppInstallUrl();
181
- await installAppBrowserPrompt(installUrl, isReinstall, {
182
- testingAccountId: this.localDevState.targetTestingAccountId,
183
- projectAccountId: this.localDevState.targetProjectAccountId,
184
- projectName: this.localDevState.projectConfig.name,
185
- appUid: this.appNode.uid,
186
- });
195
+ await installAppBrowserPrompt(installUrl, isReinstall, staticAuthInstallOptions);
187
196
  }
188
197
  async checkTestAccountAppInstallation() {
189
198
  if (!this.appNode || !this.appData) {
@@ -216,12 +225,12 @@ class AppDevModeInterface {
216
225
  const newDistribution = newAppNode?.config.distribution;
217
226
  const oldAuthType = this.appNode?.config.auth.type;
218
227
  const newAuthType = newAppNode?.config.auth.type;
219
- if (newDistribution === APP_DISTRIBUTION_TYPES.MARKETPLACE &&
220
- oldDistribution !== APP_DISTRIBUTION_TYPES.MARKETPLACE) {
228
+ if (newDistribution?.toLowerCase() === APP_DISTRIBUTION_TYPES.MARKETPLACE &&
229
+ oldDistribution?.toLowerCase() !== APP_DISTRIBUTION_TYPES.MARKETPLACE) {
221
230
  this.localDevState.addUploadWarning(lib.AppDevModeInterface.distributionChanged);
222
231
  }
223
- else if (newAuthType === APP_AUTH_TYPES.OAUTH &&
224
- oldAuthType !== APP_AUTH_TYPES.OAUTH) {
232
+ else if (newAuthType?.toLowerCase() === APP_AUTH_TYPES.OAUTH &&
233
+ oldAuthType?.toLowerCase() !== APP_AUTH_TYPES.OAUTH) {
225
234
  this.localDevState.addUploadWarning(lib.AppDevModeInterface.authTypeChanged);
226
235
  }
227
236
  };
@@ -18,9 +18,13 @@ declare class LocalDevLogger {
18
18
  cleanupError(): void;
19
19
  cleanupSuccess(): void;
20
20
  uploadInitiated(): void;
21
+ deployInitiated(): void;
21
22
  projectConfigMismatch(): void;
22
23
  uploadError(error: unknown): void;
23
24
  uploadSuccess(): void;
25
+ uploadSuccessAutoDeployDisabled(): void;
26
+ deployError(error?: unknown): void;
27
+ deploySuccess(): void;
24
28
  monitorConsoleOutput(): void;
25
29
  }
26
30
  export default LocalDevLogger;
@@ -1,6 +1,5 @@
1
1
  import { getAccountId, hasLocalStateFlag } from '@hubspot/local-dev-lib/config';
2
2
  import { getConfigDefaultAccount } from '@hubspot/local-dev-lib/config';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
4
3
  import { uiLogger } from '../../ui/logger.js';
5
4
  import { uiBetaTag, uiLine, uiAccountDescription, uiCommandReference, } from '../../ui/index.js';
6
5
  import { lib } from '../../../lang/en.js';
@@ -26,7 +25,7 @@ class LocalDevLogger {
26
25
  }
27
26
  handleError(e, langFunction) {
28
27
  if (this.state.debug) {
29
- logger.error(e);
28
+ uiLogger.error(e instanceof Error ? e.message : String(e));
30
29
  }
31
30
  uiLogger.error(langFunction(e instanceof Error ? e.message : ''));
32
31
  }
@@ -112,20 +111,42 @@ class LocalDevLogger {
112
111
  uploadInitiated() {
113
112
  uiLogger.log(lib.LocalDevProcess.uploadInitiated);
114
113
  }
114
+ deployInitiated() {
115
+ uiLogger.log(lib.LocalDevProcess.deployInitiated);
116
+ }
115
117
  projectConfigMismatch() {
116
118
  uiLogger.log(lib.LocalDevProcess.projectConfigMismatch);
117
119
  }
118
120
  uploadError(error) {
119
- logger.log('');
121
+ uiLogger.log('');
120
122
  logError(error);
121
123
  uiLogger.log(lib.LocalDevProcess.uploadFailed);
122
- logger.log('');
124
+ uiLogger.log('');
123
125
  }
124
126
  uploadSuccess() {
125
- logger.log('');
127
+ uiLogger.log('');
126
128
  uiLogger.log(lib.LocalDevProcess.uploadSuccess);
127
129
  uiLine();
128
- logger.log('');
130
+ uiLogger.log('');
131
+ }
132
+ uploadSuccessAutoDeployDisabled() {
133
+ uiLogger.warn(lib.LocalDevProcess.uploadSuccessAutoDeployDisabled);
134
+ uiLine();
135
+ uiLogger.log('');
136
+ }
137
+ deployError(error) {
138
+ uiLogger.log('');
139
+ if (error) {
140
+ logError(error);
141
+ }
142
+ uiLogger.log(lib.LocalDevProcess.deployFailed);
143
+ uiLogger.log('');
144
+ }
145
+ deploySuccess() {
146
+ uiLogger.log('');
147
+ uiLogger.log(lib.LocalDevProcess.deploySuccess);
148
+ uiLine();
149
+ uiLogger.log('');
129
150
  }
130
151
  monitorConsoleOutput() {
131
152
  const originalStdoutWrite = process.stdout.write.bind(process.stdout);
@@ -4,7 +4,6 @@ import chalk from 'chalk';
4
4
  import { fetchAppInstallationData } from '@hubspot/local-dev-lib/api/localDevAuth';
5
5
  import { fetchPublicAppsForPortal, fetchPublicAppProductionInstallCounts, } from '@hubspot/local-dev-lib/api/appsDev';
6
6
  import { getAccountId, getConfigDefaultAccount, } from '@hubspot/local-dev-lib/config';
7
- import { logger } from '@hubspot/local-dev-lib/logger';
8
7
  import { PROJECT_CONFIG_FILE } from '../../constants.js';
9
8
  import SpinniesManager from '../../ui/SpinniesManager.js';
10
9
  import DevServerManager from './DevServerManager.js';
@@ -324,7 +323,7 @@ class LocalDevManager {
324
323
  }
325
324
  catch (e) {
326
325
  if (this.debug) {
327
- logger.error(e);
326
+ uiLogger.error(e instanceof Error ? e.message : String(e));
328
327
  }
329
328
  uiLogger.error(lib.LocalDevManager.devServer.setupError(e instanceof Error ? e.message : ''));
330
329
  return false;
@@ -339,7 +338,7 @@ class LocalDevManager {
339
338
  }
340
339
  catch (e) {
341
340
  if (this.debug) {
342
- logger.error(e);
341
+ uiLogger.error(e instanceof Error ? e.message : String(e));
343
342
  }
344
343
  uiLogger.error(lib.LocalDevManager.devServer.startError(e instanceof Error ? e.message : ''));
345
344
  process.exit(EXIT_CODES.ERROR);
@@ -351,7 +350,7 @@ class LocalDevManager {
351
350
  }
352
351
  catch (e) {
353
352
  if (this.debug) {
354
- logger.error(e);
353
+ uiLogger.error(e instanceof Error ? e.message : String(e));
355
354
  }
356
355
  uiLogger.error(lib.LocalDevManager.devServer.fileChangeError(e instanceof Error ? e.message : ''));
357
356
  }
@@ -363,7 +362,7 @@ class LocalDevManager {
363
362
  }
364
363
  catch (e) {
365
364
  if (this.debug) {
366
- logger.error(e);
365
+ uiLogger.error(e instanceof Error ? e.message : String(e));
367
366
  }
368
367
  uiLogger.error(lib.LocalDevManager.devServer.cleanupError(e instanceof Error ? e.message : ''));
369
368
  return false;
@@ -1,15 +1,15 @@
1
1
  import { IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types.js';
2
+ import { Project } from '@hubspot/local-dev-lib/types/Project';
2
3
  import LocalDevState from './LocalDevState.js';
3
4
  import LocalDevLogger from './LocalDevLogger.js';
4
- import { LocalDevStateConstructorOptions, LocalDevStateListener, LocalDevServerMessage } from '../../../types/LocalDev.js';
5
+ import { LocalDevStateConstructorOptions, LocalDevStateListener, LocalDevServerMessage, LocalDevProjectUploadResult, LocalDevProjectDeployResult } from '../../../types/LocalDev.js';
5
6
  declare class LocalDevProcess {
6
7
  private state;
7
8
  private _logger;
8
9
  private devServerManager;
9
10
  constructor(options: LocalDevStateConstructorOptions);
10
11
  get projectDir(): string;
11
- get projectId(): number;
12
- get projectName(): string;
12
+ get projectData(): Project;
13
13
  get targetProjectAccountId(): number;
14
14
  get targetTestingAccountId(): number;
15
15
  get projectNodes(): {
@@ -22,13 +22,15 @@ declare class LocalDevProcess {
22
22
  private projectConfigValidForUpload;
23
23
  private getIntermediateRepresentation;
24
24
  private updateProjectNodes;
25
- private updateProjectNodesAfterUpload;
25
+ private updateProjectNodesAfterDeploy;
26
26
  private openLocalDevUi;
27
+ private updateProjectData;
27
28
  handleFileChange(filePath: string, event: string): Promise<void>;
28
29
  handleConfigFileChange(): Promise<void>;
29
30
  start(): Promise<void>;
30
31
  stop(showProgress?: boolean): Promise<void>;
31
- uploadProject(): Promise<boolean>;
32
+ uploadProject(): Promise<LocalDevProjectUploadResult>;
33
+ deployLatestBuild(force?: boolean): Promise<LocalDevProjectDeployResult>;
32
34
  addStateListener<K extends keyof LocalDevState>(key: K, listener: LocalDevStateListener<K>): void;
33
35
  sendDevServerMessage(message: LocalDevServerMessage): void;
34
36
  removeStateListener<K extends keyof LocalDevState>(key: K, listener: LocalDevStateListener<K>): void;
@@ -1,5 +1,6 @@
1
1
  import { translateForLocalDev } from '@hubspot/project-parsing-lib';
2
2
  import { hasLocalStateFlag } from '@hubspot/local-dev-lib/config';
3
+ import { fetchProject } from '@hubspot/local-dev-lib/api/projects';
3
4
  import path from 'path';
4
5
  import open from 'open';
5
6
  import LocalDevState from './LocalDevState.js';
@@ -8,10 +9,13 @@ import DevServerManagerV2 from './DevServerManagerV2.js';
8
9
  import { EXIT_CODES } from '../../enums/exitCodes.js';
9
10
  import { getProjectConfig } from '../config.js';
10
11
  import { handleProjectUpload } from '../upload.js';
12
+ import { handleProjectDeploy } from '../deploy.js';
11
13
  import { pollProjectBuildAndDeploy } from '../pollProjectBuildAndDeploy.js';
12
14
  import { getLocalDevUiUrl } from '../urls.js';
13
- import { CONFIG_LOCAL_STATE_FLAGS } from '../../constants.js';
15
+ import { CONFIG_LOCAL_STATE_FLAGS, PROJECT_DEPLOY_STATES, } from '../../constants.js';
14
16
  import { isAutoOpenBrowserEnabled } from '../../configOptions.js';
17
+ import { lib } from '../../../lang/en.js';
18
+ import { debugError } from '../../errorHandlers/index.js';
15
19
  class LocalDevProcess {
16
20
  state;
17
21
  _logger;
@@ -27,11 +31,8 @@ class LocalDevProcess {
27
31
  get projectDir() {
28
32
  return this.state.projectDir;
29
33
  }
30
- get projectId() {
31
- return this.state.projectId;
32
- }
33
- get projectName() {
34
- return this.state.projectName;
34
+ get projectData() {
35
+ return this.state.projectData;
35
36
  }
36
37
  get targetProjectAccountId() {
37
38
  return this.state.targetProjectAccountId;
@@ -87,34 +88,43 @@ class LocalDevProcess {
87
88
  });
88
89
  return true;
89
90
  }
90
- getIntermediateRepresentation(projectNodesAtLastUpload) {
91
+ getIntermediateRepresentation(projectNodesAtLastDeploy) {
91
92
  return translateForLocalDev({
92
93
  projectSourceDir: path.join(this.state.projectDir, this.state.projectConfig.srcDir),
93
94
  platformVersion: this.state.projectConfig.platformVersion,
94
95
  accountId: this.state.targetProjectAccountId,
95
96
  }, {
96
- projectNodesAtLastUpload,
97
+ projectNodesAtLastUpload: projectNodesAtLastDeploy,
97
98
  profile: this.state.profile,
98
99
  });
99
100
  }
100
101
  async updateProjectNodes() {
101
- const intermediateRepresentation = await this.getIntermediateRepresentation(this.state.projectNodesAtLastUpload);
102
+ const intermediateRepresentation = await this.getIntermediateRepresentation(this.state.projectNodesAtLastDeploy);
102
103
  this.state.projectNodes =
103
104
  intermediateRepresentation.intermediateNodesIndexedByUid;
104
105
  this.state.projectProfileData = intermediateRepresentation.profileData;
105
106
  }
106
- async updateProjectNodesAfterUpload() {
107
+ async updateProjectNodesAfterDeploy() {
107
108
  const intermediateRepresentation = await this.getIntermediateRepresentation();
108
109
  this.state.projectNodes =
109
110
  intermediateRepresentation.intermediateNodesIndexedByUid;
110
111
  this.state.projectProfileData = intermediateRepresentation.profileData;
111
- this.state.projectNodesAtLastUpload =
112
+ this.state.projectNodesAtLastDeploy =
112
113
  intermediateRepresentation.intermediateNodesIndexedByUid;
113
114
  }
114
115
  openLocalDevUi() {
115
116
  const showWelcomeScreen = !hasLocalStateFlag(CONFIG_LOCAL_STATE_FLAGS.LOCAL_DEV_UI_WELCOME);
116
117
  open(getLocalDevUiUrl(this.state.targetTestingAccountId, showWelcomeScreen));
117
118
  }
119
+ async updateProjectData() {
120
+ try {
121
+ const { data: projectData } = await fetchProject(this.state.targetProjectAccountId, this.state.projectConfig.name);
122
+ this.state.projectData = projectData;
123
+ }
124
+ catch (e) {
125
+ debugError(e);
126
+ }
127
+ }
118
128
  async handleFileChange(filePath, event) {
119
129
  await this.updateProjectNodes();
120
130
  try {
@@ -162,24 +172,85 @@ class LocalDevProcess {
162
172
  const isUploadable = await this.projectConfigValidForUpload();
163
173
  if (!isUploadable) {
164
174
  this.logger.projectConfigMismatch();
165
- return false;
175
+ return {
176
+ uploadSuccess: false,
177
+ buildSuccess: false,
178
+ deploySuccess: false,
179
+ };
166
180
  }
167
- const { uploadError } = await handleProjectUpload({
181
+ const { uploadError, result } = await handleProjectUpload({
168
182
  accountId: this.state.targetProjectAccountId,
169
183
  projectConfig: this.state.projectConfig,
170
184
  projectDir: this.state.projectDir,
171
185
  callbackFunc: pollProjectBuildAndDeploy,
172
186
  sendIR: true,
173
- skipValidation: true,
174
187
  });
188
+ const deploy = result?.deployResult;
175
189
  if (uploadError) {
176
190
  this.logger.uploadError(uploadError);
177
- return false;
191
+ return {
192
+ uploadSuccess: false,
193
+ buildSuccess: false,
194
+ deploySuccess: false,
195
+ deployId: deploy?.deployId,
196
+ };
178
197
  }
179
- await this.updateProjectNodesAfterUpload();
180
- this.logger.uploadSuccess();
181
- this.state.clearUploadWarnings();
182
- return true;
198
+ await this.updateProjectData();
199
+ if (deploy && deploy.status === PROJECT_DEPLOY_STATES.FAILURE) {
200
+ return {
201
+ uploadSuccess: false,
202
+ buildSuccess: true,
203
+ deploySuccess: false,
204
+ deployId: deploy.deployId,
205
+ };
206
+ }
207
+ else if (!deploy) {
208
+ this.logger.uploadSuccessAutoDeployDisabled();
209
+ }
210
+ else {
211
+ await this.updateProjectNodesAfterDeploy();
212
+ this.state.clearUploadWarnings();
213
+ this.logger.uploadSuccess();
214
+ }
215
+ return {
216
+ uploadSuccess: true,
217
+ buildSuccess: true,
218
+ deploySuccess: Boolean(deploy),
219
+ deployId: deploy?.deployId,
220
+ };
221
+ }
222
+ async deployLatestBuild(force = false) {
223
+ this.logger.deployInitiated();
224
+ if (!this.state.projectData.latestBuild) {
225
+ this.logger.deployError(lib.LocalDevProcess.noBuildToDeploy);
226
+ return {
227
+ success: false,
228
+ };
229
+ }
230
+ let deploy;
231
+ try {
232
+ deploy = await handleProjectDeploy(this.state.targetProjectAccountId, this.state.projectConfig.name, this.state.projectData.latestBuild.buildId, true, force);
233
+ }
234
+ catch (error) {
235
+ this.logger.deployError(error);
236
+ return {
237
+ success: false,
238
+ };
239
+ }
240
+ const success = deploy?.status === PROJECT_DEPLOY_STATES.SUCCESS;
241
+ if (success) {
242
+ await this.updateProjectData();
243
+ this.logger.deploySuccess();
244
+ await this.updateProjectNodesAfterDeploy();
245
+ this.state.clearUploadWarnings();
246
+ }
247
+ else {
248
+ this.logger.deployError();
249
+ }
250
+ return {
251
+ success,
252
+ deployId: deploy?.deployId,
253
+ };
183
254
  }
184
255
  addStateListener(key, listener) {
185
256
  this.state.addListener(key, listener);
@@ -1,5 +1,6 @@
1
1
  import { IntermediateRepresentationNodeLocalDev, HSProfileVariables } from '@hubspot/project-parsing-lib/src/lib/types.js';
2
2
  import { Environment } from '@hubspot/local-dev-lib/types/Config';
3
+ import { Project } from '@hubspot/local-dev-lib/types/Project';
3
4
  import { ProjectConfig } from '../../../types/Projects.js';
4
5
  import { LocalDevStateConstructorOptions, LocalDevStateListener, AppLocalDevData, LocalDevServerMessage } from '../../../types/LocalDev.js';
5
6
  declare class LocalDevState {
@@ -8,26 +9,23 @@ declare class LocalDevState {
8
9
  private _profile?;
9
10
  private _projectConfig;
10
11
  private _projectDir;
11
- private _projectId;
12
- private _projectName;
12
+ private _projectData;
13
13
  private _debug;
14
14
  private _projectNodes;
15
15
  private _projectProfileData;
16
- private _projectNodesAtLastUpload;
16
+ private _projectNodesAtLastDeploy;
17
17
  private _env;
18
18
  private _listeners;
19
19
  private _appData;
20
20
  private _devServerMessage;
21
21
  private _uploadWarnings;
22
- constructor({ targetProjectAccountId, targetTestingAccountId, projectConfig, projectDir, projectId, projectName, debug, initialProjectNodes, initialProjectProfileData, profile, env, }: LocalDevStateConstructorOptions);
22
+ constructor({ targetProjectAccountId, targetTestingAccountId, projectConfig, projectDir, projectData, debug, initialProjectNodes, initialProjectProfileData, profile, env, }: LocalDevStateConstructorOptions);
23
23
  private runListeners;
24
24
  get targetProjectAccountId(): number;
25
25
  get targetTestingAccountId(): number;
26
26
  get profile(): string | undefined;
27
27
  get projectConfig(): ProjectConfig;
28
28
  get projectDir(): string;
29
- get projectId(): number;
30
- get projectName(): string;
31
29
  get debug(): boolean;
32
30
  get projectNodes(): {
33
31
  [key: string]: IntermediateRepresentationNodeLocalDev;
@@ -37,12 +35,15 @@ declare class LocalDevState {
37
35
  });
38
36
  get projectProfileData(): HSProfileVariables;
39
37
  set projectProfileData(profileData: HSProfileVariables);
40
- get projectNodesAtLastUpload(): {
38
+ get projectNodesAtLastDeploy(): {
41
39
  [key: string]: IntermediateRepresentationNodeLocalDev;
42
40
  };
43
- set projectNodesAtLastUpload(nodes: {
41
+ set projectNodesAtLastDeploy(nodes: {
44
42
  [key: string]: IntermediateRepresentationNodeLocalDev;
45
43
  });
44
+ get projectData(): Project;
45
+ get projectId(): number;
46
+ set projectData(projectData: Project);
46
47
  get env(): Environment;
47
48
  get appData(): Record<string, AppLocalDevData>;
48
49
  getAppDataByUid(uid: string): AppLocalDevData | undefined;
@@ -5,28 +5,26 @@ class LocalDevState {
5
5
  _profile;
6
6
  _projectConfig;
7
7
  _projectDir;
8
- _projectId;
9
- _projectName;
8
+ _projectData;
10
9
  _debug;
11
10
  _projectNodes;
12
11
  _projectProfileData;
13
- _projectNodesAtLastUpload;
12
+ _projectNodesAtLastDeploy;
14
13
  _env;
15
14
  _listeners;
16
15
  _appData;
17
16
  _devServerMessage;
18
17
  _uploadWarnings;
19
- constructor({ targetProjectAccountId, targetTestingAccountId, projectConfig, projectDir, projectId, projectName, debug, initialProjectNodes, initialProjectProfileData, profile, env, }) {
18
+ constructor({ targetProjectAccountId, targetTestingAccountId, projectConfig, projectDir, projectData, debug, initialProjectNodes, initialProjectProfileData, profile, env, }) {
20
19
  this._targetProjectAccountId = targetProjectAccountId;
21
20
  this._targetTestingAccountId = targetTestingAccountId;
22
21
  this._profile = profile;
23
22
  this._projectConfig = projectConfig;
24
23
  this._projectDir = projectDir;
25
- this._projectId = projectId;
26
- this._projectName = projectName;
24
+ this._projectData = projectData;
27
25
  this._debug = debug || false;
28
26
  this._projectNodes = initialProjectNodes;
29
- this._projectNodesAtLastUpload = initialProjectNodes;
27
+ this._projectNodesAtLastDeploy = initialProjectNodes;
30
28
  this._projectProfileData = initialProjectProfileData;
31
29
  this._env = env;
32
30
  this._appData = {};
@@ -54,12 +52,6 @@ class LocalDevState {
54
52
  get projectDir() {
55
53
  return this._projectDir;
56
54
  }
57
- get projectId() {
58
- return this._projectId;
59
- }
60
- get projectName() {
61
- return this._projectName;
62
- }
63
55
  get debug() {
64
56
  return this._debug;
65
57
  }
@@ -76,11 +68,20 @@ class LocalDevState {
76
68
  set projectProfileData(profileData) {
77
69
  this._projectProfileData = profileData;
78
70
  }
79
- get projectNodesAtLastUpload() {
80
- return structuredClone(this._projectNodesAtLastUpload);
71
+ get projectNodesAtLastDeploy() {
72
+ return structuredClone(this._projectNodesAtLastDeploy);
73
+ }
74
+ set projectNodesAtLastDeploy(nodes) {
75
+ this._projectNodesAtLastDeploy = nodes;
76
+ }
77
+ get projectData() {
78
+ return structuredClone(this._projectData);
79
+ }
80
+ get projectId() {
81
+ return this.projectData.id;
81
82
  }
82
- set projectNodesAtLastUpload(nodes) {
83
- this._projectNodesAtLastUpload = nodes;
83
+ set projectData(projectData) {
84
+ this._projectData = projectData;
84
85
  }
85
86
  get env() {
86
87
  return this._env;
@@ -3,13 +3,14 @@ declare class LocalDevWebsocketServer {
3
3
  private server?;
4
4
  private debug?;
5
5
  private localDevProcess;
6
- private ALLOWED_ORIGINS;
7
6
  constructor(localDevProcess: LocalDevProcess, debug?: boolean);
8
7
  private log;
9
8
  private logError;
10
9
  private sendMessage;
11
10
  private handleUpload;
11
+ private handleDeploy;
12
12
  private setupMessageHandlers;
13
+ private sendCliMetadata;
13
14
  private sendProjectData;
14
15
  private setupProjectNodesListener;
15
16
  private setupAppDataListener;