@hubspot/cli 7.7.34-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 (293) 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 +3 -8
  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 +3 -10
  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.d.ts +2 -2
  100. package/commands/project/upload.js +17 -26
  101. package/commands/project/validate.js +7 -7
  102. package/commands/project/watch.js +13 -22
  103. package/commands/project.js +2 -3
  104. package/commands/sandbox/__tests__/create.test.js +5 -5
  105. package/commands/sandbox/create.js +22 -32
  106. package/commands/sandbox/delete.js +35 -63
  107. package/commands/sandbox.js +2 -2
  108. package/commands/secret/addSecret.js +7 -17
  109. package/commands/secret/deleteSecret.js +10 -20
  110. package/commands/secret/listSecret.js +8 -10
  111. package/commands/secret/updateSecret.js +9 -17
  112. package/commands/secret.js +2 -2
  113. package/commands/testAccount/__tests__/delete.test.js +2 -4
  114. package/commands/testAccount/create.js +0 -3
  115. package/commands/testAccount/delete.d.ts +4 -3
  116. package/commands/testAccount/delete.js +155 -14
  117. package/commands/testAccount/importData.d.ts +1 -1
  118. package/commands/testAccount/importData.js +1 -1
  119. package/commands/testAccount.js +1 -1
  120. package/lang/en.d.ts +317 -120
  121. package/lang/en.js +312 -118
  122. package/lang/en.lyaml +2 -2
  123. package/lib/__tests__/buildAccount.test.js +2 -1
  124. package/lib/__tests__/commonOpts.test.js +1 -1
  125. package/lib/__tests__/dependencyManagement.test.js +1 -1
  126. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  127. package/lib/__tests__/npm.test.js +1 -1
  128. package/lib/__tests__/oauth.test.js +4 -4
  129. package/lib/__tests__/process.test.js +10 -5
  130. package/lib/__tests__/sandboxSync.test.js +8 -8
  131. package/lib/__tests__/sandboxes.test.js +8 -8
  132. package/lib/__tests__/serverlessLogs.test.js +1 -1
  133. package/lib/__tests__/usageTracking.test.js +5 -5
  134. package/lib/__tests__/validation.test.js +2 -1
  135. package/lib/__tests__/yargsUtils.test.js +83 -9
  136. package/lib/app/__tests__/migrate.test.js +19 -56
  137. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  138. package/lib/app/migrate.d.ts +2 -8
  139. package/lib/app/migrate.js +5 -80
  140. package/lib/app/migrate_legacy.js +20 -24
  141. package/lib/buildAccount.js +25 -57
  142. package/lib/commonOpts.d.ts +1 -1
  143. package/lib/commonOpts.js +25 -22
  144. package/lib/configOptions.js +7 -0
  145. package/lib/constants.d.ts +13 -0
  146. package/lib/constants.js +17 -0
  147. package/lib/dependencyManagement.js +9 -27
  148. package/lib/developerTestAccounts.js +9 -23
  149. package/lib/doctor/Diagnosis.js +11 -23
  150. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  151. package/lib/doctor/Doctor.js +42 -90
  152. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  153. package/lib/errorHandlers/index.js +12 -20
  154. package/lib/errorHandlers/suppressError.js +10 -17
  155. package/lib/lang.js +6 -5
  156. package/lib/links.d.ts +1 -0
  157. package/lib/links.js +14 -7
  158. package/lib/mcp/setup.js +1 -1
  159. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  160. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  161. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  162. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  163. package/lib/middleware/commandTargetingUtils.js +78 -0
  164. package/lib/middleware/configMiddleware.d.ts +1 -1
  165. package/lib/middleware/configMiddleware.js +21 -81
  166. package/lib/middleware/fireAlarmMiddleware.js +15 -5
  167. package/lib/middleware/gitMiddleware.js +5 -1
  168. package/lib/middleware/notificationsMiddleware.js +5 -11
  169. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  170. package/lib/npm.js +2 -2
  171. package/lib/oauth.js +5 -5
  172. package/lib/process.js +5 -4
  173. package/lib/projectProfiles.d.ts +1 -1
  174. package/lib/projectProfiles.js +2 -10
  175. package/lib/projects/__tests__/AppDevModeInterface.test.js +2 -0
  176. package/lib/projects/__tests__/LocalDevProcess.test.js +227 -16
  177. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +86 -60
  178. package/lib/projects/__tests__/deploy.test.js +71 -6
  179. package/lib/projects/__tests__/localDevProjectHelpers.test.js +6 -2
  180. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  181. package/lib/projects/__tests__/projects.test.js +12 -12
  182. package/lib/projects/__tests__/structure.test.js +3 -3
  183. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  184. package/lib/projects/__tests__/upload.test.js +82 -0
  185. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  186. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  187. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  188. package/lib/projects/create/__tests__/v3.test.js +80 -5
  189. package/lib/projects/create/index.js +2 -2
  190. package/lib/projects/create/legacy.js +2 -2
  191. package/lib/projects/create/v3.js +10 -8
  192. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  193. package/lib/projects/localDev/AppDevModeInterface.js +21 -12
  194. package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
  195. package/lib/projects/localDev/LocalDevLogger.js +27 -6
  196. package/lib/projects/localDev/LocalDevManager.js +4 -5
  197. package/lib/projects/localDev/LocalDevProcess.d.ts +7 -5
  198. package/lib/projects/localDev/LocalDevProcess.js +90 -19
  199. package/lib/projects/localDev/LocalDevState.d.ts +9 -8
  200. package/lib/projects/localDev/LocalDevState.js +18 -17
  201. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +2 -1
  202. package/lib/projects/localDev/LocalDevWebsocketServer.js +62 -33
  203. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  204. package/lib/projects/localDev/helpers/project.js +42 -1
  205. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +4 -0
  206. package/lib/projects/localDev/localDevWebsocketServerUtils.js +10 -0
  207. package/lib/projects/platformVersion.d.ts +1 -1
  208. package/lib/projects/platformVersion.js +1 -1
  209. package/lib/projects/pollProjectBuildAndDeploy.js +4 -4
  210. package/lib/projects/structure.d.ts +2 -2
  211. package/lib/projects/structure.js +6 -6
  212. package/lib/projects/upload.d.ts +2 -3
  213. package/lib/projects/upload.js +17 -9
  214. package/lib/prompts/accountNamePrompt.js +14 -19
  215. package/lib/prompts/accountsPrompt.js +2 -2
  216. package/lib/prompts/cmsFieldPrompt.js +2 -2
  217. package/lib/prompts/createApiSamplePrompt.js +5 -5
  218. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  219. package/lib/prompts/createFunctionPrompt.js +14 -14
  220. package/lib/prompts/createModulePrompt.js +9 -9
  221. package/lib/prompts/createTemplatePrompt.js +2 -2
  222. package/lib/prompts/downloadProjectPrompt.js +5 -8
  223. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  224. package/lib/prompts/previewPrompt.js +6 -6
  225. package/lib/prompts/projectAddPrompt.js +8 -1
  226. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  227. package/lib/prompts/projectNamePrompt.js +4 -8
  228. package/lib/prompts/projectsLogsPrompt.js +2 -4
  229. package/lib/prompts/promptUtils.js +30 -9
  230. package/lib/prompts/sandboxesPrompt.js +7 -7
  231. package/lib/prompts/secretPrompt.js +3 -3
  232. package/lib/prompts/selectAppPrompt.js +3 -3
  233. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  234. package/lib/prompts/selectProjectTemplatePrompt.js +2 -0
  235. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  236. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  237. package/lib/prompts/uploadPrompt.js +5 -5
  238. package/lib/sandboxSync.js +24 -41
  239. package/lib/sandboxes.js +19 -47
  240. package/lib/schema.js +3 -3
  241. package/lib/serverlessLogs.js +11 -13
  242. package/lib/theme/__tests__/migrate.test.d.ts +1 -0
  243. package/lib/theme/__tests__/migrate.test.js +233 -0
  244. package/lib/theme/migrate.d.ts +13 -0
  245. package/lib/theme/migrate.js +90 -0
  246. package/lib/ui/SpinniesManager.d.ts +2 -0
  247. package/lib/ui/SpinniesManager.js +7 -0
  248. package/lib/ui/boxen.js +1 -2
  249. package/lib/ui/git.js +13 -10
  250. package/lib/ui/index.js +38 -37
  251. package/lib/ui/serverlessFunctionLogs.js +9 -7
  252. package/lib/ui/uiMessages.d.ts +68 -0
  253. package/lib/ui/uiMessages.js +71 -0
  254. package/lib/usageTracking.js +8 -8
  255. package/lib/validation.js +20 -23
  256. package/lib/yargsUtils.d.ts +1 -1
  257. package/lib/yargsUtils.js +12 -5
  258. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  259. package/mcp-server/tools/index.js +4 -0
  260. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +2 -2
  261. package/mcp-server/tools/project/CreateProjectTool.d.ts +2 -2
  262. package/mcp-server/tools/project/DocsSearchTool.d.ts +4 -1
  263. package/mcp-server/tools/project/DocsSearchTool.js +5 -5
  264. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  265. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  266. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  267. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  268. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -1
  269. package/mcp-server/tools/project/GetConfigValuesTool.js +12 -6
  270. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  271. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +12 -10
  272. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  273. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  274. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  275. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  276. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -7
  277. package/mcp-server/utils/__tests__/cliConfig.test.d.ts +1 -0
  278. package/mcp-server/utils/__tests__/cliConfig.test.js +110 -0
  279. package/mcp-server/utils/cliConfig.d.ts +1 -0
  280. package/mcp-server/utils/cliConfig.js +12 -0
  281. package/mcp-server/utils/toolUsageTracking.js +2 -2
  282. package/package.json +4 -4
  283. package/types/LocalDev.d.ts +19 -3
  284. package/types/Yargs.d.ts +1 -1
  285. package/ui/index.js +1 -1
  286. package/commands/app/__tests__/install.test.js +0 -47
  287. package/commands/app/install.d.ts +0 -8
  288. package/commands/app/install.js +0 -122
  289. package/lib/middleware/__test__/utils.test.js +0 -51
  290. package/lib/middleware/utils.d.ts +0 -8
  291. package/lib/middleware/utils.js +0 -14
  292. /package/commands/{app/__tests__/install.test.d.ts → project/__tests__/validate.test.d.ts} +0 -0
  293. /package/lib/middleware/__test__/{utils.test.d.ts → commandTargetingUtils.test.d.ts} +0 -0
@@ -1,51 +1,66 @@
1
1
  import { WebSocketServer } from 'ws';
2
2
  import { isPortManagerServerRunning, requestPorts, } from '@hubspot/local-dev-lib/portManager';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
3
+ import { uiLogger } from '../../ui/logger.js';
4
4
  import { addLocalStateFlag } from '@hubspot/local-dev-lib/config';
5
- import { LOCAL_DEV_UI_MESSAGE_SEND_TYPES, LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES, LOCAL_DEV_SERVER_MESSAGE_TYPES, CONFIG_LOCAL_STATE_FLAGS, } from '../../constants.js';
5
+ import { LOCAL_DEV_UI_MESSAGE_SEND_TYPES, LOCAL_DEV_SERVER_MESSAGE_TYPES, CONFIG_LOCAL_STATE_FLAGS, } from '../../constants.js';
6
6
  import { lib } from '../../../lang/en.js';
7
7
  import { removeAnsiCodes } from '../../ui/removeAnsiCodes.js';
8
+ import { isDeployWebsocketMessage, isViewedWelcomeScreenWebsocketMessage, isUploadWebsocketMessage, } from './localDevWebsocketServerUtils.js';
9
+ import pkg from '../../../package.json' with { type: 'json' };
8
10
  const SERVER_INSTANCE_ID = 'local-dev-ui-websocket-server';
11
+ const LOCAL_DEV_WEBSOCKET_SERVER_VERSION = 1;
9
12
  const LOG_PREFIX = '[LocalDevWebsocketServer]';
13
+ const DOMAINS = ['hubspot.com', 'hubspotqa.com'];
14
+ const SUBDOMAINS = ['local', 'app', 'app-na2', 'app-na3', 'app-ap1', 'app-eu1'];
15
+ const ALLOWED_ORIGIN_REGEX = new RegExp(`^https://(${SUBDOMAINS.join('|')})\\.(${DOMAINS.join('|')})$`);
10
16
  class LocalDevWebsocketServer {
11
17
  server;
12
18
  debug;
13
19
  localDevProcess;
14
- ALLOWED_ORIGINS = [
15
- 'https://app.hubspot.com',
16
- 'https://app.hubspotqa.com',
17
- 'https://local.hubspot.com',
18
- 'https://local.hubspotqa.com',
19
- ];
20
20
  constructor(localDevProcess, debug) {
21
21
  this.localDevProcess = localDevProcess;
22
22
  this.debug = debug;
23
23
  }
24
24
  log(message) {
25
25
  if (this.debug) {
26
- logger.log(LOG_PREFIX, message);
26
+ uiLogger.log(`${LOG_PREFIX} ${message}`);
27
27
  }
28
28
  }
29
29
  logError(message) {
30
30
  if (this.debug) {
31
- logger.error(LOG_PREFIX, message);
31
+ uiLogger.error(`${LOG_PREFIX} ${message}`);
32
32
  }
33
33
  }
34
34
  sendMessage(websocket, message) {
35
35
  websocket.send(JSON.stringify(message));
36
36
  }
37
37
  async handleUpload(websocket) {
38
- const uploadSuccess = await this.localDevProcess.uploadProject();
39
- if (uploadSuccess) {
40
- this.sendMessage(websocket, {
41
- type: LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPLOAD_SUCCESS,
42
- });
43
- }
44
- else {
45
- this.sendMessage(websocket, {
46
- type: LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPLOAD_FAILURE,
47
- });
48
- }
38
+ const { uploadSuccess, buildSuccess, deploySuccess, deployId } = await this.localDevProcess.uploadProject();
39
+ this.sendMessage(websocket, {
40
+ type: uploadSuccess
41
+ ? LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPLOAD_SUCCESS
42
+ : LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPLOAD_FAILURE,
43
+ data: {
44
+ latestBuild: this.localDevProcess.projectData.latestBuild,
45
+ deployedBuild: this.localDevProcess.projectData.deployedBuild,
46
+ buildSuccess,
47
+ deploySuccess,
48
+ deployId,
49
+ },
50
+ });
51
+ }
52
+ async handleDeploy(websocket, force) {
53
+ const { success, deployId } = await this.localDevProcess.deployLatestBuild(force);
54
+ this.sendMessage(websocket, {
55
+ type: success
56
+ ? LOCAL_DEV_UI_MESSAGE_SEND_TYPES.DEPLOY_SUCCESS
57
+ : LOCAL_DEV_UI_MESSAGE_SEND_TYPES.DEPLOY_FAILURE,
58
+ data: {
59
+ latestBuild: this.localDevProcess.projectData.latestBuild,
60
+ deployedBuild: this.localDevProcess.projectData.deployedBuild,
61
+ latestDeployId: deployId,
62
+ },
63
+ });
49
64
  }
50
65
  setupMessageHandlers(websocket) {
51
66
  websocket.on('message', data => {
@@ -55,15 +70,17 @@ class LocalDevWebsocketServer {
55
70
  this.logError(lib.LocalDevWebsocketServer.errors.missingTypeField(data.toString()));
56
71
  return;
57
72
  }
58
- switch (message.type) {
59
- case LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.UPLOAD:
60
- this.handleUpload(websocket);
61
- break;
62
- case LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.VIEWED_WELCOME_SCREEN:
63
- addLocalStateFlag(CONFIG_LOCAL_STATE_FLAGS.LOCAL_DEV_UI_WELCOME);
64
- break;
65
- default:
66
- this.logError(lib.LocalDevWebsocketServer.errors.unknownMessageType(message.type));
73
+ if (isUploadWebsocketMessage(message)) {
74
+ this.handleUpload(websocket);
75
+ }
76
+ else if (isDeployWebsocketMessage(message)) {
77
+ this.handleDeploy(websocket, message.data.force);
78
+ }
79
+ else if (isViewedWelcomeScreenWebsocketMessage(message)) {
80
+ addLocalStateFlag(CONFIG_LOCAL_STATE_FLAGS.LOCAL_DEV_UI_WELCOME);
81
+ }
82
+ else {
83
+ this.logError(lib.LocalDevWebsocketServer.errors.unknownMessageType(message.type));
67
84
  }
68
85
  }
69
86
  catch (e) {
@@ -71,12 +88,23 @@ class LocalDevWebsocketServer {
71
88
  }
72
89
  });
73
90
  }
91
+ sendCliMetadata(websocket) {
92
+ this.sendMessage(websocket, {
93
+ type: LOCAL_DEV_UI_MESSAGE_SEND_TYPES.CLI_METADATA,
94
+ data: {
95
+ cliVersion: pkg.version,
96
+ localDevWebsocketServerVersion: LOCAL_DEV_WEBSOCKET_SERVER_VERSION,
97
+ },
98
+ });
99
+ }
74
100
  sendProjectData(websocket) {
75
101
  this.sendMessage(websocket, {
76
102
  type: LOCAL_DEV_UI_MESSAGE_SEND_TYPES.UPDATE_PROJECT_DATA,
77
103
  data: {
78
- projectName: this.localDevProcess.projectName,
79
- projectId: this.localDevProcess.projectId,
104
+ projectName: this.localDevProcess.projectData.name,
105
+ projectId: this.localDevProcess.projectData.id,
106
+ latestBuild: this.localDevProcess.projectData.latestBuild,
107
+ deployedBuild: this.localDevProcess.projectData.deployedBuild,
80
108
  targetProjectAccountId: this.localDevProcess.targetProjectAccountId,
81
109
  targetTestingAccountId: this.localDevProcess.targetTestingAccountId,
82
110
  },
@@ -135,10 +163,11 @@ class LocalDevWebsocketServer {
135
163
  this.log(lib.LocalDevWebsocketServer.logs.startup(port));
136
164
  this.server.on('connection', (ws, req) => {
137
165
  const origin = req.headers.origin;
138
- if (!origin || !this.ALLOWED_ORIGINS.includes(origin)) {
166
+ if (!origin || !ALLOWED_ORIGIN_REGEX.test(origin)) {
139
167
  ws.close(1008, lib.LocalDevWebsocketServer.errors.originNotAllowed(origin));
140
168
  return;
141
169
  }
170
+ this.sendCliMetadata(ws);
142
171
  this.sendProjectData(ws);
143
172
  this.setupMessageHandlers(ws);
144
173
  this.setupStateListeners(ws);
@@ -10,3 +10,4 @@ export declare function compareLocalProjectToDeployed(projectConfig: ProjectConf
10
10
  export declare function isDeployedProjectUpToDateWithLocal(projectConfig: ProjectConfig, accountId: number, deployedBuildId: number, localProjectNodes: {
11
11
  [key: string]: IntermediateRepresentationNodeLocalDev;
12
12
  }, profile?: string): Promise<boolean>;
13
+ export declare function checkAndInstallDependencies(): Promise<void>;
@@ -18,8 +18,9 @@ import SpinniesManager from '../../../ui/SpinniesManager.js';
18
18
  import { EXIT_CODES } from '../../../enums/exitCodes.js';
19
19
  import { handleProjectUpload } from '../../upload.js';
20
20
  import { pollProjectBuildAndDeploy } from '../../pollProjectBuildAndDeploy.js';
21
- import { logError } from '../../../errorHandlers/index.js';
21
+ import { debugError, logError } from '../../../errorHandlers/index.js';
22
22
  import { ApiErrorContext } from '../../../errorHandlers/index.js';
23
+ import { getProjectPackageJsonLocations, hasMissingPackages, installPackages, } from '../../../dependencyManagement.js';
23
24
  // Prompt the user to create a new project if one doesn't exist on their target account
24
25
  export async function createNewProjectForLocalDev(projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) {
25
26
  // Create the project without prompting if this is a newly created sandbox
@@ -163,6 +164,10 @@ export async function isDeployedProjectUpToDateWithLocal(projectConfig, accountI
163
164
  }, { profile });
164
165
  return isDeepEqual(localProjectNodes, deployedProjectNodes, ['localDev']);
165
166
  }
167
+ catch (err) {
168
+ debugError(err);
169
+ return false;
170
+ }
166
171
  finally {
167
172
  // Clean up temporary directory
168
173
  if (tempDir && (await fs.pathExists(tempDir))) {
@@ -170,3 +175,39 @@ export async function isDeployedProjectUpToDateWithLocal(projectConfig, accountI
170
175
  }
171
176
  }
172
177
  }
178
+ export async function checkAndInstallDependencies() {
179
+ SpinniesManager.init();
180
+ uiLogger.log('');
181
+ SpinniesManager.add('checkingDependencies', {
182
+ text: lib.localDevHelpers.project.checkAndInstallDependencies
183
+ .checkingDependencies,
184
+ });
185
+ try {
186
+ const installLocations = await getProjectPackageJsonLocations();
187
+ const locationsToInstall = [];
188
+ for (const location of installLocations) {
189
+ if (await hasMissingPackages(location)) {
190
+ locationsToInstall.push(location);
191
+ }
192
+ }
193
+ if (locationsToInstall.length > 0) {
194
+ SpinniesManager.remove('checkingDependencies');
195
+ await installPackages({ installLocations: locationsToInstall });
196
+ }
197
+ else {
198
+ SpinniesManager.succeed('checkingDependencies', {
199
+ text: lib.localDevHelpers.project.checkAndInstallDependencies
200
+ .dependenciesUpToDate,
201
+ });
202
+ }
203
+ uiLogger.log('');
204
+ }
205
+ catch (e) {
206
+ logError(e);
207
+ SpinniesManager.fail('checkingDependencies', {
208
+ text: lib.localDevHelpers.project.checkAndInstallDependencies
209
+ .dependenciesFailure,
210
+ });
211
+ process.exit(EXIT_CODES.ERROR);
212
+ }
213
+ }
@@ -0,0 +1,4 @@
1
+ import { LocalDevDeployWebsocketMessage, LocalDevWebsocketMessage } from '../../../types/LocalDev.js';
2
+ export declare function isUploadWebsocketMessage(message: LocalDevWebsocketMessage): boolean;
3
+ export declare function isDeployWebsocketMessage(message: LocalDevWebsocketMessage): message is LocalDevDeployWebsocketMessage;
4
+ export declare function isViewedWelcomeScreenWebsocketMessage(message: LocalDevWebsocketMessage): boolean;
@@ -0,0 +1,10 @@
1
+ import { LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES } from '../../constants.js';
2
+ export function isUploadWebsocketMessage(message) {
3
+ return message.type === LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.UPLOAD;
4
+ }
5
+ export function isDeployWebsocketMessage(message) {
6
+ return message.type === LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.DEPLOY;
7
+ }
8
+ export function isViewedWelcomeScreenWebsocketMessage(message) {
9
+ return (message.type === LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.VIEWED_WELCOME_SCREEN);
10
+ }
@@ -1 +1 @@
1
- export declare function useV3Api(platformVersion?: string | null): boolean;
1
+ export declare function isV2Project(platformVersion?: string | null): boolean;
@@ -1,4 +1,4 @@
1
- export function useV3Api(platformVersion) {
1
+ export function isV2Project(platformVersion) {
2
2
  if (!platformVersion || typeof platformVersion !== 'string') {
3
3
  return false;
4
4
  }
@@ -278,10 +278,10 @@ export async function displayWarnLogs(accountId, projectName, taskId, isDeploy =
278
278
  }
279
279
  }
280
280
  if (result && result.logs) {
281
- const logLength = result.logs.length;
282
- result.logs.forEach((log, i) => {
283
- uiLogger.warn(log.message);
284
- if (i < logLength - 1) {
281
+ const dedupedLogs = result.logs.reduce((acc, log) => acc.add(log.message), new Set());
282
+ Array.from(dedupedLogs).forEach((log, i) => {
283
+ uiLogger.warn(log);
284
+ if (i < dedupedLogs.size - 1) {
285
285
  uiLogger.log('');
286
286
  }
287
287
  });
@@ -1,5 +1,5 @@
1
1
  import { ComponentTypes, Component, GenericComponentConfig, PublicAppComponentConfig, PrivateAppComponentConfig, AppCardComponentConfig } from '../../types/Projects.js';
2
- import { IntermediateRepresentationNode, IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types.js';
2
+ import { IntermediateRepresentationNodeLocalDev } from '@hubspot/project-parsing-lib/src/lib/types.js';
3
3
  import { AppIRNode } from '../../types/ProjectComponents.js';
4
4
  export declare const CONFIG_FILES: {
5
5
  [k in ComponentTypes]: string;
@@ -15,4 +15,4 @@ export declare function getProjectComponentTypes(components: Array<Component>):
15
15
  export declare function getComponentUid(component?: Component | null): string | null;
16
16
  export declare function componentIsApp(component?: Component | null): component is Component<PublicAppComponentConfig | PrivateAppComponentConfig>;
17
17
  export declare function componentIsPublicApp(component?: Component | null): component is Component<PublicAppComponentConfig>;
18
- export declare function isAppIRNode(component: IntermediateRepresentationNodeLocalDev | IntermediateRepresentationNode): component is AppIRNode;
18
+ export declare function isAppIRNode(component: IntermediateRepresentationNodeLocalDev): component is AppIRNode;
@@ -1,14 +1,14 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { walk } from '@hubspot/local-dev-lib/fs';
4
- import { logger } from '@hubspot/local-dev-lib/logger';
4
+ import { uiLogger } from '../ui/logger.js';
5
5
  import { logError } from '../errorHandlers/index.js';
6
6
  import { ComponentTypes, } from '../../types/Projects.js';
7
- import { IR_COMPONENT_TYPES } from '../constants.js';
7
+ import { IR_COMPONENT_TYPES, LEGACY_PRIVATE_APP_FILE, LEGACY_PUBLIC_APP_FILE, THEME_FILE, } from '../constants.js';
8
8
  export const CONFIG_FILES = {
9
- [ComponentTypes.PrivateApp]: 'app.json',
10
- [ComponentTypes.PublicApp]: 'public-app.json',
11
- [ComponentTypes.HublTheme]: 'theme.json',
9
+ [ComponentTypes.PrivateApp]: LEGACY_PRIVATE_APP_FILE,
10
+ [ComponentTypes.PublicApp]: LEGACY_PUBLIC_APP_FILE,
11
+ [ComponentTypes.HublTheme]: THEME_FILE,
12
12
  };
13
13
  export function getComponentTypeFromConfigFile(configFile) {
14
14
  let key;
@@ -27,7 +27,7 @@ export function loadConfigFile(configPath) {
27
27
  return parsedConfig;
28
28
  }
29
29
  catch (e) {
30
- logger.debug(e);
30
+ uiLogger.debug(e);
31
31
  }
32
32
  }
33
33
  return null;
@@ -1,5 +1,4 @@
1
1
  import { FileResult } from 'tmp';
2
- import { IntermediateRepresentation } from '@hubspot/project-parsing-lib';
3
2
  import { ProjectConfig } from '../../types/Projects.js';
4
3
  type ProjectUploadCallbackFunction<T> = (accountId: number, projectConfig: ProjectConfig, tempFile: FileResult, buildId: number) => Promise<T>;
5
4
  type ProjectUploadResult<T> = {
@@ -19,7 +18,7 @@ type HandleProjectUploadArg<T> = {
19
18
  profile?: string;
20
19
  };
21
20
  export declare function handleProjectUpload<T>({ accountId, projectConfig, projectDir, callbackFunc, profile, uploadMessage, forceCreate, isUploadCommand, sendIR, skipValidation, }: HandleProjectUploadArg<T>): Promise<ProjectUploadResult<T>>;
22
- export declare function validateSourceDirectory(srcDir: string, projectConfig: ProjectConfig): void;
21
+ export declare function validateSourceDirectory(srcDir: string, projectConfig: ProjectConfig, projectDir: string): Promise<void>;
23
22
  export declare function validateNoHSMetaMismatch(srcDir: string, projectConfig: ProjectConfig): Promise<void>;
24
- export declare function handleTranslate(projectDir: string, projectConfig: ProjectConfig, accountId: number, skipValidation: boolean, profile: string | undefined): Promise<IntermediateRepresentation | undefined>;
23
+ export declare function handleTranslate(projectDir: string, projectConfig: ProjectConfig, accountId: number, skipValidation: boolean, profile: string | undefined): Promise<unknown>;
25
24
  export {};
@@ -12,9 +12,11 @@ import util from 'node:util';
12
12
  import { lib } from '../../lang/en.js';
13
13
  import { ensureProjectExists } from './ensureProjectExists.js';
14
14
  import { uiLogger } from '../ui/logger.js';
15
- import { useV3Api } from './platformVersion.js';
15
+ import { isV2Project } from './platformVersion.js';
16
16
  import { EXIT_CODES } from '../enums/exitCodes.js';
17
17
  import ProjectValidationError from '../errors/ProjectValidationError.js';
18
+ import { walk } from '@hubspot/local-dev-lib/fs';
19
+ import { LEGACY_CONFIG_FILES } from '../constants.js';
18
20
  async function uploadProjectFiles(accountId, projectName, filePath, uploadMessage, platformVersion, intermediateRepresentation) {
19
21
  SpinniesManager.init({});
20
22
  const accountIdentifier = uiAccountDescription(accountId) || `${accountId}`;
@@ -45,7 +47,7 @@ async function uploadProjectFiles(accountId, projectName, filePath, uploadMessag
45
47
  export async function handleProjectUpload({ accountId, projectConfig, projectDir, callbackFunc, profile, uploadMessage = '', forceCreate = false, isUploadCommand = false, sendIR = false, skipValidation = false, }) {
46
48
  const srcDir = path.resolve(projectDir, projectConfig.srcDir);
47
49
  try {
48
- validateSourceDirectory(srcDir, projectConfig);
50
+ await validateSourceDirectory(srcDir, projectConfig, projectDir);
49
51
  }
50
52
  catch (e) {
51
53
  logError(e);
@@ -70,8 +72,7 @@ export async function handleProjectUpload({ accountId, projectConfig, projectDir
70
72
  intermediateRepresentation = await handleTranslate(projectDir, projectConfig, accountId, skipValidation, profile);
71
73
  }
72
74
  catch (e) {
73
- logError(e);
74
- process.exit(EXIT_CODES.ERROR);
75
+ resolve({ uploadError: e });
75
76
  }
76
77
  }
77
78
  await ensureProjectExists(accountId, projectConfig.name, {
@@ -105,15 +106,23 @@ export async function handleProjectUpload({ accountId, projectConfig, projectDir
105
106
  archive.finalize();
106
107
  return result;
107
108
  }
108
- export function validateSourceDirectory(srcDir, projectConfig) {
109
- const filenames = fs.readdirSync(srcDir);
110
- if (!filenames || filenames.length === 0) {
109
+ export async function validateSourceDirectory(srcDir, projectConfig, projectDir) {
110
+ const projectFilePaths = await walk(srcDir, ['node_modules']);
111
+ if (!projectFilePaths || projectFilePaths.length === 0) {
111
112
  throw new ProjectValidationError(lib.projectUpload.handleProjectUpload.emptySource(projectConfig.srcDir));
112
113
  }
114
+ if (isV2Project(projectConfig.platformVersion)) {
115
+ projectFilePaths.forEach(filePath => {
116
+ const filename = path.basename(filePath);
117
+ if (LEGACY_CONFIG_FILES.includes(filename)) {
118
+ uiLogger.warn(lib.projectUpload.handleProjectUpload.legacyFileDetected(path.relative(projectDir, filePath), projectConfig.platformVersion));
119
+ }
120
+ });
121
+ }
113
122
  }
114
123
  export async function validateNoHSMetaMismatch(srcDir, projectConfig) {
115
124
  const hasHsMetaFiles = await projectContainsHsMetaFiles(srcDir);
116
- if (!useV3Api(projectConfig.platformVersion) && hasHsMetaFiles) {
125
+ if (!isV2Project(projectConfig.platformVersion) && hasHsMetaFiles) {
117
126
  throw new ProjectValidationError(lib.projectUpload.wrongPlatformVersionMetaFiles);
118
127
  }
119
128
  }
@@ -133,5 +142,4 @@ export async function handleTranslate(projectDir, projectConfig, accountId, skip
133
142
  }
134
143
  throw e;
135
144
  }
136
- return undefined;
137
145
  }
@@ -1,26 +1,24 @@
1
1
  import { accountNameExistsInConfig } from '@hubspot/local-dev-lib/config';
2
2
  import { promptUser } from './promptUtils.js';
3
- import { i18n } from '../lang.js';
3
+ import { lib } from '../../lang/en.js';
4
4
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
5
5
  export function getCliAccountNamePromptConfig(defaultName) {
6
6
  return {
7
7
  name: 'name',
8
- message: i18n(`lib.prompts.accountNamePrompt.enterAccountName`),
8
+ message: lib.prompts.accountNamePrompt.enterAccountName,
9
9
  default: defaultName,
10
10
  validate(val) {
11
11
  if (typeof val !== 'string') {
12
- return i18n(`lib.prompts.accountNamePrompt.errors.invalidName`);
12
+ return lib.prompts.accountNamePrompt.errors.invalidName;
13
13
  }
14
14
  else if (!val.length) {
15
- return i18n(`lib.prompts.accountNamePrompt.errors.nameRequired`);
15
+ return lib.prompts.accountNamePrompt.errors.nameRequired;
16
16
  }
17
17
  else if (val.indexOf(' ') >= 0) {
18
- return i18n(`lib.prompts.accountNamePrompt.errors.spacesInName`);
18
+ return lib.prompts.accountNamePrompt.errors.spacesInName;
19
19
  }
20
20
  return accountNameExistsInConfig(val)
21
- ? i18n(`lib.prompts.accountNamePrompt.errors.accountNameExists`, {
22
- name: val,
23
- })
21
+ ? lib.prompts.accountNamePrompt.errors.accountNameExists(val)
24
22
  : true;
25
23
  },
26
24
  };
@@ -37,14 +35,13 @@ export function hubspotAccountNamePrompt({ accountType, currentPortalCount = 0,
37
35
  let defaultName;
38
36
  if (isSandbox) {
39
37
  promptMessageString = isDevelopmentSandbox
40
- ? i18n(`lib.prompts.accountNamePrompt.enterDevelopmentSandboxName`)
41
- : i18n(`lib.prompts.accountNamePrompt.enterStandardSandboxName`);
38
+ ? lib.prompts.accountNamePrompt.enterDevelopmentSandboxName
39
+ : lib.prompts.accountNamePrompt.enterStandardSandboxName;
42
40
  }
43
41
  else if (isDeveloperTestAccount) {
44
- promptMessageString = i18n(`lib.prompts.accountNamePrompt.enterDeveloperTestAccountName`);
45
- defaultName = i18n(`lib.prompts.accountNamePrompt.developerTestAccountDefaultName`, {
46
- count: currentPortalCount + 1,
47
- });
42
+ promptMessageString =
43
+ lib.prompts.accountNamePrompt.enterDeveloperTestAccountName;
44
+ defaultName = lib.prompts.accountNamePrompt.developerTestAccountDefaultName(currentPortalCount + 1);
48
45
  }
49
46
  return promptUser([
50
47
  {
@@ -52,15 +49,13 @@ export function hubspotAccountNamePrompt({ accountType, currentPortalCount = 0,
52
49
  message: promptMessageString,
53
50
  validate(val) {
54
51
  if (typeof val !== 'string') {
55
- return i18n(`lib.prompts.accountNamePrompt.errors.invalidName`);
52
+ return lib.prompts.accountNamePrompt.errors.invalidName;
56
53
  }
57
54
  else if (!val.trim().length) {
58
- return i18n(`lib.prompts.accountNamePrompt.errors.nameRequired`);
55
+ return lib.prompts.accountNamePrompt.errors.nameRequired;
59
56
  }
60
57
  return accountNameExistsInConfig(val)
61
- ? i18n(`lib.prompts.accountNamePrompt.errors.accountNameExists`, {
62
- name: val,
63
- })
58
+ ? lib.prompts.accountNamePrompt.errors.accountNameExists(val)
64
59
  : true;
65
60
  },
66
61
  default: defaultName,
@@ -1,7 +1,7 @@
1
1
  import { getConfigDefaultAccount, getConfigAccounts, } from '@hubspot/local-dev-lib/config';
2
2
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
3
3
  import { promptUser } from './promptUtils.js';
4
- import { i18n } from '../lang.js';
4
+ import { commands } from '../../lang/en.js';
5
5
  import { uiAccountDescription } from '../ui/index.js';
6
6
  function mapAccountChoices(portals) {
7
7
  return (portals?.map(p => ({
@@ -17,7 +17,7 @@ export async function selectAccountFromConfig(prompt = '') {
17
17
  type: 'list',
18
18
  name: 'default',
19
19
  pageSize: 20,
20
- message: prompt || i18n(`commands.account.subcommands.use.promptMessage`),
20
+ message: prompt || commands.account.subcommands.use.promptMessage,
21
21
  choices: mapAccountChoices(accountsList),
22
22
  default: defaultAccount ?? undefined,
23
23
  },
@@ -1,7 +1,7 @@
1
1
  import path from 'path';
2
2
  import fs from 'fs';
3
3
  import { promptUser } from './promptUtils.js';
4
- import { i18n } from '../lang.js';
4
+ import { lib } from '../../lang/en.js';
5
5
  import { escapeRegExp } from '@hubspot/local-dev-lib/escapeRegExp';
6
6
  const FIELDS_FILES = ['fields.json', 'fields.js', 'fields.cjs', 'fields.mjs'];
7
7
  export async function fieldsJsPrompt(filePath, projectDir, skipFiles = []) {
@@ -26,7 +26,7 @@ export async function fieldsJsPrompt(filePath, projectDir, skipFiles = []) {
26
26
  }));
27
27
  const promptVal = await promptUser([
28
28
  {
29
- message: i18n(`lib.prompts.uploadPrompt.fieldsPrompt`, { dir: fileDir }),
29
+ message: lib.prompts.uploadPrompt.fieldsPrompt(fileDir),
30
30
  type: 'list',
31
31
  name: 'filePathChoice',
32
32
  choices: selection,
@@ -1,10 +1,10 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  function getSampleTypesPrompt(choices) {
4
4
  return {
5
5
  type: 'rawlist',
6
6
  name: 'sampleType',
7
- message: i18n(`lib.prompts.createApiSamplePrompt.selectApiSampleApp`),
7
+ message: lib.prompts.createApiSamplePrompt.selectApiSampleApp,
8
8
  choices: choices.map(choice => ({
9
9
  name: `${choice.name} - ${choice.description}`,
10
10
  value: choice.id,
@@ -15,7 +15,7 @@ function getSampleTypesPrompt(choices) {
15
15
  resolve(true);
16
16
  }
17
17
  else {
18
- reject(i18n(`lib.prompts.createApiSamplePrompt.errors.apiSampleAppRequired`));
18
+ reject(lib.prompts.createApiSamplePrompt.errors.apiSampleAppRequired);
19
19
  }
20
20
  });
21
21
  },
@@ -25,7 +25,7 @@ function getLanguagesPrompt(choices) {
25
25
  return {
26
26
  type: 'rawlist',
27
27
  name: 'sampleLanguage',
28
- message: i18n(`lib.prompts.createApiSamplePrompt.selectLanguage`),
28
+ message: lib.prompts.createApiSamplePrompt.selectLanguage,
29
29
  choices: choices.map(choice => ({
30
30
  name: choice,
31
31
  value: choice,
@@ -35,7 +35,7 @@ function getLanguagesPrompt(choices) {
35
35
  if (input && input.length > 0) {
36
36
  resolve(true);
37
37
  }
38
- reject(i18n(`lib.prompts.createApiSamplePrompt.errors.languageRequired`));
38
+ reject(lib.prompts.createApiSamplePrompt.errors.languageRequired);
39
39
  });
40
40
  },
41
41
  };
@@ -94,7 +94,16 @@ export async function createDeveloperTestAccountConfigPrompt(args = {}, supportF
94
94
  },
95
95
  ],
96
96
  });
97
- if (useDefaultAccountLevelsPromptResult.useDefaultAccountLevels === 'manual') {
97
+ if (useDefaultAccountLevelsPromptResult.useDefaultAccountLevels === 'default') {
98
+ accountLevelsArray = [
99
+ { hub: 'MARKETING', tier: AccountTiers.ENTERPRISE },
100
+ { hub: 'OPS', tier: AccountTiers.ENTERPRISE },
101
+ { hub: 'SERVICE', tier: AccountTiers.ENTERPRISE },
102
+ { hub: 'SALES', tier: AccountTiers.ENTERPRISE },
103
+ { hub: 'CONTENT', tier: AccountTiers.ENTERPRISE },
104
+ ];
105
+ }
106
+ else {
98
107
  const accountLevelsPromptResult = await promptUser({
99
108
  name: 'testAccountLevels',
100
109
  message: lib.prompts.createDeveloperTestAccountConfigPrompt.tiersPrompt,
@@ -1,33 +1,33 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  const FUNCTIONS_FOLDER_PROMPT = {
4
4
  name: 'functionsFolder',
5
- message: i18n(`lib.prompts.createFunctionPrompt.enterFolder`),
5
+ message: lib.prompts.createFunctionPrompt.enterFolder,
6
6
  validate(val) {
7
7
  if (typeof val !== 'string') {
8
- return i18n(`lib.prompts.createFunctionPrompt.errors.invalid`);
8
+ return lib.prompts.createFunctionPrompt.errors.invalid;
9
9
  }
10
10
  else if (!val.length) {
11
- return i18n(`lib.prompts.createFunctionPrompt.errors.blank`);
11
+ return lib.prompts.createFunctionPrompt.errors.blank;
12
12
  }
13
13
  else if (val.indexOf(' ') >= 0) {
14
- return i18n(`lib.prompts.createFunctionPrompt.errors.space`);
14
+ return lib.prompts.createFunctionPrompt.errors.space;
15
15
  }
16
16
  return true;
17
17
  },
18
18
  };
19
19
  const FUNCTION_FILENAME_PROMPT = {
20
20
  name: 'filename',
21
- message: i18n(`lib.prompts.createFunctionPrompt.enterFilename`),
21
+ message: lib.prompts.createFunctionPrompt.enterFilename,
22
22
  validate(val) {
23
23
  if (typeof val !== 'string') {
24
- return i18n(`lib.prompts.createFunctionPrompt.errors.invalid`);
24
+ return lib.prompts.createFunctionPrompt.errors.invalid;
25
25
  }
26
26
  else if (!val.length) {
27
- return i18n(`lib.prompts.createFunctionPrompt.errors.blank`);
27
+ return lib.prompts.createFunctionPrompt.errors.blank;
28
28
  }
29
29
  else if (val.indexOf(' ') >= 0) {
30
- return i18n(`lib.prompts.createFunctionPrompt.errors.space`);
30
+ return lib.prompts.createFunctionPrompt.errors.space;
31
31
  }
32
32
  return true;
33
33
  },
@@ -35,22 +35,22 @@ const FUNCTION_FILENAME_PROMPT = {
35
35
  const ENDPOINT_METHOD_PROMPT = {
36
36
  type: 'list',
37
37
  name: 'endpointMethod',
38
- message: i18n(`lib.prompts.createFunctionPrompt.selectEndpointMethod`),
38
+ message: lib.prompts.createFunctionPrompt.selectEndpointMethod,
39
39
  default: 'GET',
40
40
  choices: ['DELETE', 'GET', 'PATCH', 'POST', 'PUT'],
41
41
  };
42
42
  const ENDPOINT_PATH_PROMPT = {
43
43
  name: 'endpointPath',
44
- message: i18n(`lib.prompts.createFunctionPrompt.enterEndpointPath`),
44
+ message: lib.prompts.createFunctionPrompt.enterEndpointPath,
45
45
  validate(val) {
46
46
  if (typeof val !== 'string') {
47
- return i18n(`lib.prompts.createFunctionPrompt.errors.invalid`);
47
+ return lib.prompts.createFunctionPrompt.errors.invalid;
48
48
  }
49
49
  else if (!val.length) {
50
- return i18n(`lib.prompts.createFunctionPrompt.errors.blank`);
50
+ return lib.prompts.createFunctionPrompt.errors.blank;
51
51
  }
52
52
  else if (val.indexOf(' ') >= 0) {
53
- return i18n(`lib.prompts.createFunctionPrompt.errors.space`);
53
+ return lib.prompts.createFunctionPrompt.errors.space;
54
54
  }
55
55
  return true;
56
56
  },