@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
@@ -1,14 +1,14 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  const MODULE_LABEL_PROMPT = {
4
4
  name: 'moduleLabel',
5
- message: i18n(`lib.prompts.createModulePrompt.enterLabel`),
5
+ message: lib.prompts.createModulePrompt.enterLabel,
6
6
  validate(val) {
7
7
  if (typeof val !== 'string') {
8
- return i18n(`lib.prompts.createModulePrompt.errors.invalidLabel`);
8
+ return lib.prompts.createModulePrompt.errors.invalidLabel;
9
9
  }
10
10
  else if (!val.length) {
11
- return i18n(`lib.prompts.createModulePrompt.errors.labelRequired`);
11
+ return lib.prompts.createModulePrompt.errors.labelRequired;
12
12
  }
13
13
  return true;
14
14
  },
@@ -16,13 +16,13 @@ const MODULE_LABEL_PROMPT = {
16
16
  const REACT_TYPE_PROMPT = {
17
17
  type: 'confirm',
18
18
  name: 'reactType',
19
- message: i18n(`lib.prompts.createModulePrompt.selectReactType`),
19
+ message: lib.prompts.createModulePrompt.selectReactType,
20
20
  default: false,
21
21
  };
22
22
  const CONTENT_TYPES_PROMPT = {
23
23
  type: 'checkbox',
24
24
  name: 'contentTypes',
25
- message: i18n(`lib.prompts.createModulePrompt.selectContentType`),
25
+ message: lib.prompts.createModulePrompt.selectContentType,
26
26
  choices: [
27
27
  { name: 'Any', value: 'ANY', checked: true },
28
28
  { name: 'Landing page', value: 'LANDING_PAGE' },
@@ -42,20 +42,20 @@ const CONTENT_TYPES_PROMPT = {
42
42
  if (input.length > 0) {
43
43
  resolve(true);
44
44
  }
45
- reject(i18n(`lib.prompts.createModulePrompt.errors.contentTypeRequired`));
45
+ reject(lib.prompts.createModulePrompt.errors.contentTypeRequired);
46
46
  });
47
47
  },
48
48
  };
49
49
  const GLOBAL_PROMPT = {
50
50
  type: 'confirm',
51
51
  name: 'global',
52
- message: i18n(`lib.prompts.createModulePrompt.confirmGlobal`),
52
+ message: lib.prompts.createModulePrompt.confirmGlobal,
53
53
  default: false,
54
54
  };
55
55
  const AVAILABLE_FOR_NEW_CONTENT = {
56
56
  type: 'confirm',
57
57
  name: 'availableForNewContent',
58
- message: i18n(`lib.prompts.createModulePrompt.availableForNewContent`),
58
+ message: lib.prompts.createModulePrompt.availableForNewContent,
59
59
  default: true,
60
60
  };
61
61
  export function createModulePrompt(commandArgs = {}) {
@@ -1,5 +1,5 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  const templateTypeChoices = [
4
4
  { name: 'page', value: 'page-template' },
5
5
  { name: 'email', value: 'email-template' },
@@ -13,7 +13,7 @@ const templateTypeChoices = [
13
13
  const TEMPLATE_TYPE_PROMPT = {
14
14
  type: 'list',
15
15
  name: 'templateType',
16
- message: i18n(`lib.prompts.createTemplatePrompt.selectTemplate`),
16
+ message: lib.prompts.createTemplatePrompt.selectTemplate,
17
17
  default: 'page',
18
18
  choices: templateTypeChoices,
19
19
  };
@@ -2,16 +2,16 @@ import { promptUser } from './promptUtils.js';
2
2
  import { getAccountId } from '@hubspot/local-dev-lib/config';
3
3
  import { fetchProjects } from '@hubspot/local-dev-lib/api/projects';
4
4
  import { logError, ApiErrorContext } from '../errorHandlers/index.js';
5
- import { logger } from '@hubspot/local-dev-lib/logger';
5
+ import { uiLogger } from '../ui/logger.js';
6
6
  import { EXIT_CODES } from '../enums/exitCodes.js';
7
- import { i18n } from '../lang.js';
7
+ import { lib } from '../../lang/en.js';
8
8
  async function createProjectsList(accountId) {
9
9
  try {
10
10
  if (accountId) {
11
11
  const { data: projects } = await fetchProjects(accountId);
12
12
  return projects.results;
13
13
  }
14
- logger.error(i18n(`lib.prompts.downloadProjectPrompt.errors.accountIdRequired`));
14
+ uiLogger.error(lib.prompts.downloadProjectPrompt.errors.accountIdRequired);
15
15
  process.exit(EXIT_CODES.ERROR);
16
16
  }
17
17
  catch (e) {
@@ -28,11 +28,8 @@ export async function downloadProjectPrompt(promptOptions) {
28
28
  message: () => {
29
29
  return promptOptions.project &&
30
30
  !projectsList.find(p => p.name === promptOptions.name)
31
- ? i18n(`lib.prompts.downloadProjectPrompt.errors.projectNotFound`, {
32
- projectName: promptOptions.project,
33
- accountId: accountId || '',
34
- })
35
- : i18n(`lib.prompts.downloadProjectPrompt.selectProject`);
31
+ ? lib.prompts.downloadProjectPrompt.errors.projectNotFound(promptOptions.project, accountId || 0)
32
+ : lib.prompts.downloadProjectPrompt.selectProject;
36
33
  },
37
34
  when: !promptOptions.project ||
38
35
  !projectsList.find(p => p.name === promptOptions.project),
@@ -2,7 +2,7 @@ import open from 'open';
2
2
  import { OAUTH_SCOPES, DEFAULT_OAUTH_SCOPES, } from '@hubspot/local-dev-lib/constants/auth';
3
3
  import { deleteEmptyConfigFile } from '@hubspot/local-dev-lib/config';
4
4
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
5
- import { logger } from '@hubspot/local-dev-lib/logger';
5
+ import { uiLogger } from '../ui/logger.js';
6
6
  import { promptUser } from './promptUtils.js';
7
7
  import { getCliAccountNamePromptConfig, } from './accountNamePrompt.js';
8
8
  import { uiInfoSection } from '../ui/index.js';
@@ -17,7 +17,7 @@ export async function personalAccessKeyPrompt({ env, account, }) {
17
17
  let url = `${websiteOrigin}/l/personal-access-key`;
18
18
  if (process.env.BROWSER !== 'none') {
19
19
  uiInfoSection(lib.prompts.personalAccessKeyPrompt.personalAccessKeySetupTitle, () => {
20
- logger.log(lib.prompts.personalAccessKeyPrompt.personalAccessKeyBrowserOpenPrep);
20
+ uiLogger.log(lib.prompts.personalAccessKeyPrompt.personalAccessKeyBrowserOpenPrep);
21
21
  });
22
22
  if (account) {
23
23
  url = `${websiteOrigin}/personal-access-key/${account}`;
@@ -33,7 +33,7 @@ export async function personalAccessKeyPrompt({ env, account, }) {
33
33
  lib.prompts.personalAccessKeyPrompt.personalAccessKeyPromptChoices
34
34
  .OPEN_BROWSER) {
35
35
  open(url, { url: true });
36
- logger.log(lib.prompts.personalAccessKeyPrompt.logs.openingWebBrowser(url));
36
+ uiLogger.log(lib.prompts.personalAccessKeyPrompt.logs.openingWebBrowser(url));
37
37
  }
38
38
  }
39
39
  const { personalAccessKey } = await promptUser(PERSONAL_ACCESS_KEY);
@@ -1,29 +1,29 @@
1
1
  import path from 'path';
2
2
  import { getCwd } from '@hubspot/local-dev-lib/path';
3
3
  import { promptUser } from './promptUtils.js';
4
- import { i18n } from '../lang.js';
4
+ import { lib } from '../../lang/en.js';
5
5
  export async function previewPrompt(promptOptions = {}) {
6
6
  return promptUser([
7
7
  {
8
8
  name: 'src',
9
- message: i18n(`lib.prompts.previewPrompt.enterSrc`),
9
+ message: lib.prompts.previewPrompt.enterSrc,
10
10
  when: !promptOptions.src,
11
11
  default: '.',
12
12
  validate: (input) => {
13
13
  if (!input) {
14
- return i18n(`lib.prompts.previewPrompt.errors.srcRequired`);
14
+ return lib.prompts.previewPrompt.errors.srcRequired;
15
15
  }
16
16
  return true;
17
17
  },
18
18
  },
19
19
  {
20
20
  name: 'dest',
21
- message: i18n(`lib.prompts.previewPrompt.enterDest`),
21
+ message: lib.prompts.previewPrompt.enterDest,
22
22
  when: !promptOptions.dest,
23
23
  default: path.basename(getCwd()),
24
24
  validate: (input) => {
25
25
  if (!input) {
26
- return i18n(`lib.prompts.previewPrompt.errors.destRequired`);
26
+ return lib.prompts.previewPrompt.errors.destRequired;
27
27
  }
28
28
  return true;
29
29
  },
@@ -34,7 +34,7 @@ export async function previewProjectPrompt(themeComponents) {
34
34
  return promptUser([
35
35
  {
36
36
  name: 'themeComponentPath',
37
- message: i18n(`lib.prompts.previewPrompt.themeProjectSelect`),
37
+ message: lib.prompts.previewPrompt.themeProjectSelect,
38
38
  type: 'list',
39
39
  choices: themeComponents.map(t => {
40
40
  const themeName = path.basename(t.path);
@@ -1,6 +1,7 @@
1
1
  import { Separator } from '@inquirer/prompts';
2
2
  import { promptUser } from './promptUtils.js';
3
3
  import { lib } from '../../lang/en.js';
4
+ import { uiLogger } from '../ui/logger.js';
4
5
  function findComponentByPathOrLabel(components, componentPathOrLabel) {
5
6
  return components.find(c => c.path === componentPathOrLabel || c.label === componentPathOrLabel);
6
7
  }
@@ -59,13 +60,19 @@ export async function projectAddPromptV3(components, selectedFeatures) {
59
60
  }
60
61
  });
61
62
  }
63
+ if (!components?.length) {
64
+ uiLogger.error(lib.prompts.projectAddPrompt.errors.noSelectableChoices);
65
+ uiLogger.log('');
66
+ return { componentTemplate: [] };
67
+ }
62
68
  const result = await promptUser([
63
69
  {
64
70
  name: 'componentTemplate',
65
- message: lib.prompts.projectAddPrompt.selectType,
71
+ message: lib.prompts.projectAddPrompt.selectFeatures,
66
72
  when: !selectedFeatures && selectedComponents.length === 0,
67
73
  type: 'checkbox',
68
74
  choices: components,
75
+ pageSize: components.length,
69
76
  },
70
77
  ]);
71
78
  if (!result.componentTemplate) {
@@ -2,11 +2,11 @@ import { getAccountId } from '@hubspot/local-dev-lib/config';
2
2
  import { getSandboxUsageLimits } from '@hubspot/local-dev-lib/api/sandboxHubs';
3
3
  import { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } from '@hubspot/local-dev-lib/constants/config';
4
4
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
5
- import { logger } from '@hubspot/local-dev-lib/logger';
6
5
  import { fetchDeveloperTestAccounts } from '@hubspot/local-dev-lib/api/developerTestAccounts';
7
6
  import { promptUser } from './promptUtils.js';
8
- import { i18n } from '../lang.js';
9
- import { uiAccountDescription, uiCommandReference } from '../ui/index.js';
7
+ import { lib } from '../../lang/en.js';
8
+ import { uiLogger } from '../ui/logger.js';
9
+ import { uiAccountDescription } from '../ui/index.js';
10
10
  import { isSandbox } from '../accountTypes.js';
11
11
  import { EXIT_CODES } from '../enums/exitCodes.js';
12
12
  function mapNestedAccount(accountConfig) {
@@ -36,12 +36,12 @@ export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountC
36
36
  sandboxUsage = data.usage;
37
37
  }
38
38
  else {
39
- logger.error(i18n(`lib.prompts.projectDevTargetAccountPrompt.noAccountId`));
39
+ uiLogger.error(lib.prompts.projectDevTargetAccountPrompt.noAccountId);
40
40
  process.exit(EXIT_CODES.ERROR);
41
41
  }
42
42
  }
43
43
  catch (err) {
44
- logger.debug('Unable to fetch sandbox usage limits: ', err);
44
+ uiLogger.debug('Unable to fetch sandbox usage limits: ', err);
45
45
  }
46
46
  const sandboxAccounts = accounts
47
47
  .reverse()
@@ -49,15 +49,11 @@ export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountC
49
49
  let disabledMessage = false;
50
50
  if (sandboxUsage['DEVELOPER'] && sandboxUsage['DEVELOPER'].available === 0) {
51
51
  if (sandboxAccounts.length < sandboxUsage['DEVELOPER'].limit) {
52
- disabledMessage = i18n(`lib.prompts.projectDevTargetAccountPrompt.sandboxLimitWithSuggestion`, {
53
- authCommand: uiCommandReference('hs auth'),
54
- limit: sandboxUsage['DEVELOPER'].limit,
55
- });
52
+ disabledMessage =
53
+ lib.prompts.projectDevTargetAccountPrompt.sandboxLimitWithSuggestion(sandboxUsage['DEVELOPER'].limit, 'hs auth');
56
54
  }
57
55
  else {
58
- disabledMessage = i18n(`lib.prompts.projectDevTargetAccountPrompt.sandboxLimit`, {
59
- limit: sandboxUsage['DEVELOPER'].limit,
60
- });
56
+ disabledMessage = lib.prompts.projectDevTargetAccountPrompt.sandboxLimit(sandboxUsage['DEVELOPER'].limit);
61
57
  }
62
58
  }
63
59
  // Order choices by Developer Sandbox -> Standard Sandbox
@@ -69,7 +65,7 @@ export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountC
69
65
  .filter(a => a.accountType === HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX)
70
66
  .map(mapNestedAccount),
71
67
  {
72
- name: i18n(`lib.prompts.projectDevTargetAccountPrompt.createNewSandboxOption`),
68
+ name: lib.prompts.projectDevTargetAccountPrompt.createNewSandboxOption,
73
69
  value: {
74
70
  targetAccountId: null,
75
71
  createNestedAccount: true,
@@ -77,7 +73,8 @@ export async function selectSandboxTargetAccountPrompt(accounts, defaultAccountC
77
73
  disabled: disabledMessage,
78
74
  },
79
75
  {
80
- name: i18n(`lib.prompts.projectDevTargetAccountPrompt.chooseDefaultAccountOption`),
76
+ name: lib.prompts.projectDevTargetAccountPrompt
77
+ .chooseDefaultAccountOption,
81
78
  value: {
82
79
  targetAccountId: defaultAccountId,
83
80
  createNestedAccount: false,
@@ -95,21 +92,19 @@ export async function selectDeveloperTestTargetAccountPrompt(accounts, defaultAc
95
92
  devTestAccountsResponse = data;
96
93
  }
97
94
  else {
98
- logger.error(i18n(`lib.prompts.projectDevTargetAccountPrompt.noAccountId`));
95
+ uiLogger.error(lib.prompts.projectDevTargetAccountPrompt.noAccountId);
99
96
  process.exit(EXIT_CODES.ERROR);
100
97
  }
101
98
  }
102
99
  catch (err) {
103
- logger.debug('Unable to fetch developer test account usage limits: ', err);
100
+ uiLogger.debug('Unable to fetch developer test account usage limits: ', err);
104
101
  }
105
102
  let disabledMessage = false;
106
103
  if (devTestAccountsResponse &&
107
104
  devTestAccountsResponse.results.length >=
108
105
  devTestAccountsResponse.maxTestPortals) {
109
- disabledMessage = i18n(`lib.prompts.projectDevTargetAccountPrompt.developerTestAccountLimit`, {
110
- authCommand: uiCommandReference('hs auth'),
111
- limit: devTestAccountsResponse.maxTestPortals,
112
- });
106
+ disabledMessage =
107
+ lib.prompts.projectDevTargetAccountPrompt.developerTestAccountLimit(devTestAccountsResponse.maxTestPortals);
113
108
  }
114
109
  const devTestAccounts = [];
115
110
  if (devTestAccountsResponse && devTestAccountsResponse.results) {
@@ -130,7 +125,8 @@ export async function selectDeveloperTestTargetAccountPrompt(accounts, defaultAc
130
125
  const choices = [
131
126
  ...devTestAccounts,
132
127
  {
133
- name: i18n(`lib.prompts.projectDevTargetAccountPrompt.createNewDeveloperTestAccountOption`),
128
+ name: lib.prompts.projectDevTargetAccountPrompt
129
+ .createNewDeveloperTestAccountOption,
134
130
  value: {
135
131
  targetAccountId: null,
136
132
  createNestedAccount: true,
@@ -146,10 +142,7 @@ async function selectTargetAccountPrompt(defaultAccountId, accountType, choices)
146
142
  {
147
143
  name: 'targetAccountInfo',
148
144
  type: 'list',
149
- message: i18n(`lib.prompts.projectDevTargetAccountPrompt.promptMessage`, {
150
- accountIdentifier: uiAccountDescription(accountId),
151
- accountType,
152
- }),
145
+ message: lib.prompts.projectDevTargetAccountPrompt.promptMessage(accountType, uiAccountDescription(accountId)),
153
146
  choices,
154
147
  loop: false,
155
148
  },
@@ -161,10 +154,7 @@ export async function confirmDefaultAccountPrompt(accountName, accountType) {
161
154
  {
162
155
  name: 'useDefaultAccount',
163
156
  type: 'confirm',
164
- message: i18n(`lib.prompts.projectDevTargetAccountPrompt.confirmDefaultAccount`, {
165
- accountName,
166
- accountType,
167
- }),
157
+ message: lib.prompts.projectDevTargetAccountPrompt.confirmDefaultAccount(accountName, accountType),
168
158
  },
169
159
  ]);
170
160
  return useDefaultAccount;
@@ -174,9 +164,7 @@ export async function confirmUseExistingDeveloperTestAccountPrompt(account) {
174
164
  {
175
165
  name: 'confirmUseExistingDeveloperTestAccount',
176
166
  type: 'confirm',
177
- message: i18n(`lib.prompts.projectDevTargetAccountPrompt.confirmUseExistingDeveloperTestAccount`, {
178
- accountName: getNonConfigDeveloperTestAccountName(account),
179
- }),
167
+ message: lib.prompts.projectDevTargetAccountPrompt.confirmUseExistingDeveloperTestAccount(getNonConfigDeveloperTestAccountName(account)),
180
168
  },
181
169
  ]);
182
170
  return confirmUseExistingDeveloperTestAccount;
@@ -1,25 +1,21 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  import { ensureProjectExists } from '../projects/ensureProjectExists.js';
4
- import { uiAccountDescription } from '../ui/index.js';
5
4
  export async function projectNamePrompt(accountId, options = {}) {
6
5
  const result = await promptUser({
7
6
  name: 'projectName',
8
- message: i18n(`lib.prompts.projectNamePrompt.enterName`),
7
+ message: lib.prompts.projectNamePrompt.enterName,
9
8
  when: !options.project,
10
9
  validate: async (val) => {
11
10
  if (typeof val !== 'string' || !val) {
12
- return i18n(`lib.prompts.projectNamePrompt.errors.invalidName`);
11
+ return lib.prompts.projectNamePrompt.errors.invalidName;
13
12
  }
14
13
  const { projectExists } = await ensureProjectExists(accountId, val, {
15
14
  allowCreate: false,
16
15
  noLogs: true,
17
16
  });
18
17
  if (!projectExists) {
19
- return i18n(`lib.prompts.projectNamePrompt.errors.projectDoesNotExist`, {
20
- projectName: val,
21
- accountIdentifier: uiAccountDescription(accountId),
22
- });
18
+ return lib.prompts.projectNamePrompt.errors.projectDoesNotExist(val, accountId);
23
19
  }
24
20
  return true;
25
21
  },
@@ -1,4 +1,4 @@
1
- import { i18n } from '../lang.js';
1
+ import { lib } from '../../lang/en.js';
2
2
  import { promptUser } from './promptUtils.js';
3
3
  export async function projectLogsPrompt({ functionChoices, promptOptions, projectName = '', }) {
4
4
  if (!functionChoices) {
@@ -11,9 +11,7 @@ export async function projectLogsPrompt({ functionChoices, promptOptions, projec
11
11
  {
12
12
  name: 'functionName',
13
13
  type: 'list',
14
- message: i18n(`lib.prompts.projectLogsPrompt.functionName`, {
15
- projectName,
16
- }),
14
+ message: lib.prompts.projectLogsPrompt.functionName(projectName),
17
15
  when: () => (!promptOptions || !promptOptions.function) &&
18
16
  functionChoices.length > 0,
19
17
  choices: functionChoices,
@@ -1,11 +1,29 @@
1
1
  import { confirm, Separator as _Separator, select, input, checkbox, password, number, } from '@inquirer/prompts';
2
2
  import { EXIT_CODES } from '../enums/exitCodes.js';
3
3
  import chalk from 'chalk';
4
+ import { lib } from '../../lang/en.js';
5
+ import { uiLogger } from '../ui/logger.js';
4
6
  export const Separator = new _Separator();
5
7
  export const PROMPT_THEME = { prefix: { idle: chalk.green('?') } };
6
8
  function isUserCancellationError(error) {
7
9
  return error instanceof Error && error.name === 'ExitPromptError';
8
10
  }
11
+ function isNoSelectableChoicesError(error) {
12
+ return (error instanceof Error && error.message?.includes('No selectable choices'));
13
+ }
14
+ function handlePromptError(config, error) {
15
+ if (isUserCancellationError(error)) {
16
+ process.exit(EXIT_CODES.SUCCESS);
17
+ }
18
+ if (isNoSelectableChoicesError(error)) {
19
+ if (!Array.isArray(config)) {
20
+ uiLogger.log(config.message);
21
+ }
22
+ uiLogger.error(lib.prompts.promptUtils.errors.noSelectableChoices);
23
+ process.exit(EXIT_CODES.ERROR);
24
+ }
25
+ throw error;
26
+ }
9
27
  function mapPromptChoicesToChoices(choices) {
10
28
  return (choices?.map(choice => {
11
29
  if (typeof choice === 'string') {
@@ -86,10 +104,7 @@ export async function promptUser(config) {
86
104
  }
87
105
  }
88
106
  catch (error) {
89
- if (isUserCancellationError(error)) {
90
- process.exit(EXIT_CODES.SUCCESS);
91
- }
92
- throw error;
107
+ handlePromptError(config, error);
93
108
  }
94
109
  }
95
110
  function handleRawListPrompt(config) {
@@ -133,11 +148,16 @@ function handleCheckboxPrompt(config) {
133
148
  validate: config.validate,
134
149
  loop: config.loop,
135
150
  theme: PROMPT_THEME,
151
+ shortcuts: {
152
+ invert: null,
153
+ },
136
154
  }).then(resp => ({ [config.name]: resp }));
137
155
  }
138
156
  function handleConfirmPrompt(config) {
139
- return confirmPrompt(config.message, {
140
- defaultAnswer: config.default,
157
+ return confirm({
158
+ message: config.message,
159
+ default: config.default,
160
+ theme: PROMPT_THEME,
141
161
  }).then(resp => ({ [config.name]: resp }));
142
162
  }
143
163
  function handleInputPrompt(config) {
@@ -162,12 +182,13 @@ function handleSelectPrompt(config) {
162
182
  }
163
183
  export async function confirmPrompt(message, options = {}) {
164
184
  const { defaultAnswer = true } = options;
165
- const choice = await confirm({
185
+ const { confirm: result } = await promptUser({
186
+ name: 'confirm',
187
+ type: 'confirm',
166
188
  message,
167
189
  default: defaultAnswer,
168
- theme: PROMPT_THEME,
169
190
  });
170
- return choice;
191
+ return result;
171
192
  }
172
193
  export async function listPrompt(message, { choices, when, defaultAnswer, validate, loop, }) {
173
194
  const { choice } = await promptUser({
@@ -1,5 +1,5 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  import { uiAccountDescription } from '../ui/index.js';
4
4
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
5
5
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
@@ -25,15 +25,15 @@ export async function sandboxTypePrompt() {
25
25
  return promptUser([
26
26
  {
27
27
  name: 'type',
28
- message: i18n(`lib.prompts.sandboxesPrompt.type.message`),
28
+ message: lib.prompts.sandboxesPrompt.type.message,
29
29
  type: 'list',
30
30
  choices: [
31
31
  {
32
- name: i18n(`lib.prompts.sandboxesPrompt.type.developer`),
32
+ name: lib.prompts.sandboxesPrompt.type.developer,
33
33
  value: HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
34
34
  },
35
35
  {
36
- name: i18n(`lib.prompts.sandboxesPrompt.type.standard`),
36
+ name: lib.prompts.sandboxesPrompt.type.standard,
37
37
  value: HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX,
38
38
  },
39
39
  ],
@@ -52,9 +52,9 @@ export function deleteSandboxPrompt(promptParentAccount = false) {
52
52
  return promptUser([
53
53
  {
54
54
  name: 'account',
55
- message: i18n(promptParentAccount
56
- ? `lib.prompts.sandboxesPrompt.selectParentAccountName`
57
- : `lib.prompts.sandboxesPrompt.selectAccountName`),
55
+ message: promptParentAccount
56
+ ? lib.prompts.sandboxesPrompt.selectParentAccountName
57
+ : lib.prompts.sandboxesPrompt.selectAccountName,
58
58
  type: 'list',
59
59
  pageSize: 20,
60
60
  choices,
@@ -1,12 +1,12 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  export function secretValuePrompt() {
4
4
  return promptUser([
5
5
  {
6
6
  name: 'secretValue',
7
7
  type: 'password',
8
8
  mask: '*',
9
- message: i18n(`lib.prompts.secretPrompt.enterValue`),
9
+ message: lib.prompts.secretPrompt.enterValue,
10
10
  },
11
11
  ]);
12
12
  }
@@ -15,7 +15,7 @@ export function secretNamePrompt() {
15
15
  {
16
16
  name: 'secretName',
17
17
  type: 'input',
18
- message: i18n(`lib.prompts.secretPrompt.enterName`),
18
+ message: lib.prompts.secretPrompt.enterName,
19
19
  },
20
20
  ]);
21
21
  }
@@ -1,4 +1,4 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
1
+ import { uiLogger } from '../ui/logger.js';
2
2
  import { fetchPublicAppsForPortal } from '@hubspot/local-dev-lib/api/appsDev';
3
3
  import { debugError } from '../errorHandlers/index.js';
4
4
  import { lib } from '../../lang/en.js';
@@ -15,7 +15,7 @@ export async function selectAppPrompt(accountId, appId) {
15
15
  debugError(err);
16
16
  }
17
17
  if (availableApps.length === 0) {
18
- logger.error(lib.prompts.selectAppPrompt.errors.noApps);
18
+ uiLogger.error(lib.prompts.selectAppPrompt.errors.noApps);
19
19
  return null;
20
20
  }
21
21
  if (appId) {
@@ -24,7 +24,7 @@ export async function selectAppPrompt(accountId, appId) {
24
24
  return targetApp;
25
25
  }
26
26
  else {
27
- logger.error(lib.prompts.selectAppPrompt.errors.invalidAppId);
27
+ uiLogger.error(lib.prompts.selectAppPrompt.errors.invalidAppId);
28
28
  }
29
29
  }
30
30
  const appPromptValue = await listPrompt(lib.prompts.selectAppPrompt.selectAppId, {
@@ -1,8 +1,8 @@
1
1
  import fs from 'fs';
2
2
  import { promptUser } from './promptUtils.js';
3
- import { i18n } from '../lang.js';
3
+ import { lib } from '../../lang/en.js';
4
4
  import { debugError } from '../errorHandlers/index.js';
5
- import { logger } from '@hubspot/local-dev-lib/logger';
5
+ import { uiLogger } from '../ui/logger.js';
6
6
  import { fetchTables } from '@hubspot/local-dev-lib/api/hubdb';
7
7
  import { EXIT_CODES } from '../enums/exitCodes.js';
8
8
  import { isValidPath, untildify } from '@hubspot/local-dev-lib/path';
@@ -10,18 +10,14 @@ async function fetchHubDBOptions(accountId) {
10
10
  try {
11
11
  const { data: { results: tables }, } = await fetchTables(accountId);
12
12
  if (tables.length === 0) {
13
- logger.log(i18n(`lib.prompts.selectHubDBTablePrompt.errors.noTables`, {
14
- accountId,
15
- }));
13
+ uiLogger.log(lib.prompts.selectHubDBTablePrompt.errors.noTables(accountId.toString()));
16
14
  process.exit(EXIT_CODES.SUCCESS);
17
15
  }
18
16
  return tables;
19
17
  }
20
18
  catch (error) {
21
19
  debugError(error, { accountId });
22
- logger.error(i18n(`lib.prompts.selectHubDBTablePrompt.errors.errorFetchingTables`, {
23
- accountId,
24
- }));
20
+ uiLogger.error(lib.prompts.selectHubDBTablePrompt.errors.errorFetchingTables(accountId.toString()));
25
21
  process.exit(EXIT_CODES.ERROR);
26
22
  }
27
23
  }
@@ -32,7 +28,7 @@ export async function selectHubDBTablePrompt({ accountId, options, skipDestPromp
32
28
  return promptUser([
33
29
  {
34
30
  name: 'tableId',
35
- message: i18n(`lib.prompts.selectHubDBTablePrompt.selectTable`),
31
+ message: lib.prompts.selectHubDBTablePrompt.selectTable,
36
32
  when: !id && !isValidTable,
37
33
  type: 'list',
38
34
  choices: hubdbTables.map(table => {
@@ -44,17 +40,17 @@ export async function selectHubDBTablePrompt({ accountId, options, skipDestPromp
44
40
  },
45
41
  {
46
42
  name: 'dest',
47
- message: i18n(`lib.prompts.selectHubDBTablePrompt.enterDest`),
43
+ message: lib.prompts.selectHubDBTablePrompt.enterDest,
48
44
  when: !options.dest && !skipDestPrompt,
49
45
  validate: (input) => {
50
46
  if (!input) {
51
- return i18n(`lib.prompts.selectHubDBTablePrompt.errors.destRequired`);
47
+ return lib.prompts.selectHubDBTablePrompt.errors.destRequired;
52
48
  }
53
49
  if (fs.existsSync(input)) {
54
- return i18n(`lib.prompts.selectHubDBTablePrompt.errors.invalidDest`);
50
+ return lib.prompts.selectHubDBTablePrompt.errors.invalidDest;
55
51
  }
56
52
  if (!isValidPath(input)) {
57
- return i18n(`lib.prompts.selectHubDBTablePrompt.errors.invalidCharacters`);
53
+ return lib.prompts.selectHubDBTablePrompt.errors.invalidCharacters;
58
54
  }
59
55
  return true;
60
56
  },
@@ -51,6 +51,8 @@ export async function selectProjectTemplatePrompt(promptOptions, projectTemplate
51
51
  selectedComponents.length === 0,
52
52
  type: 'checkbox',
53
53
  choices: componentTemplates,
54
+ loop: false,
55
+ pageSize: componentTemplates?.length,
54
56
  },
55
57
  ]);
56
58
  if (!result.componentTemplates) {