@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,25 +1,25 @@
1
1
  import path from 'path';
2
2
  import { getAccountConfig } from '@hubspot/local-dev-lib/config';
3
- import { useV3Api } from '../../lib/projects/platformVersion.js';
3
+ import { isV2Project } from '../../lib/projects/platformVersion.js';
4
4
  import { trackCommandUsage } from '../../lib/usageTracking.js';
5
5
  import { uiLogger } from '../../lib/ui/logger.js';
6
- import { getProjectConfig, validateProjectConfig as validateProjectConfig, } from '../../lib/projects/config.js';
6
+ import { getProjectConfig, validateProjectConfig, } from '../../lib/projects/config.js';
7
7
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
8
8
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
9
- import { validateSourceDirectory as validateSourceDirectory, handleTranslate, } from '../../lib/projects/upload.js';
9
+ import { validateSourceDirectory, handleTranslate, } from '../../lib/projects/upload.js';
10
10
  import { commands } from '../../lang/en.js';
11
11
  import { loadAndValidateProfile } from '../../lib/projectProfiles.js';
12
12
  import { logError } from '../../lib/errorHandlers/index.js';
13
13
  const command = 'validate';
14
- const describe = undefined;
14
+ const describe = commands.project.validate.describe;
15
15
  async function handler(args) {
16
16
  const { derivedAccountId, profile } = args;
17
17
  const { projectConfig, projectDir } = await getProjectConfig();
18
- if (!projectConfig) {
18
+ if (!projectConfig || !projectDir) {
19
19
  uiLogger.error(commands.project.validate.mustBeRanWithinAProject);
20
20
  process.exit(EXIT_CODES.ERROR);
21
21
  }
22
- if (!useV3Api(projectConfig?.platformVersion)) {
22
+ if (!isV2Project(projectConfig?.platformVersion)) {
23
23
  uiLogger.error(commands.project.validate.badVersion);
24
24
  process.exit(EXIT_CODES.ERROR);
25
25
  }
@@ -31,7 +31,7 @@ async function handler(args) {
31
31
  trackCommandUsage('project-validate', { type: accountType }, targetAccountId);
32
32
  const srcDir = path.resolve(projectDir, projectConfig.srcDir);
33
33
  try {
34
- validateSourceDirectory(srcDir, projectConfig);
34
+ await validateSourceDirectory(srcDir, projectConfig, projectDir);
35
35
  }
36
36
  catch (e) {
37
37
  logError(e);
@@ -1,11 +1,10 @@
1
1
  import { cancelStagedBuild, fetchProjectBuilds, } from '@hubspot/local-dev-lib/api/projects';
2
2
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
3
- import { useV3Api } from '../../lib/projects/platformVersion.js';
4
- import { uiCommandReference, uiLink, uiBetaTag } from '../../lib/ui/index.js';
5
- import { i18n } from '../../lib/lang.js';
3
+ import { isV2Project } from '../../lib/projects/platformVersion.js';
4
+ import { commands } from '../../lang/en.js';
6
5
  import { createWatcher } from '../../lib/projects/watch.js';
7
6
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
8
- import { logger } from '@hubspot/local-dev-lib/logger';
7
+ import { uiLogger } from '../../lib/ui/logger.js';
9
8
  import { PROJECT_ERROR_TYPES } from '../../lib/constants.js';
10
9
  import { trackCommandUsage } from '../../lib/usageTracking.js';
11
10
  import { getProjectConfig, validateProjectConfig, } from '../../lib/projects/config.js';
@@ -16,7 +15,7 @@ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
16
15
  import { handleKeypress, handleExit } from '../../lib/process.js';
17
16
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
18
17
  const command = 'watch';
19
- const describe = uiBetaTag(i18n(`commands.project.subcommands.watch.describe`), false);
18
+ const describe = commands.project.watch.describe;
20
19
  async function handleBuildStatus(accountId, projectName, buildId) {
21
20
  const { isAutoDeployEnabled, deployStatusTaskLocator } = await pollBuildStatus(accountId, projectName, buildId, null);
22
21
  if (isAutoDeployEnabled && deployStatusTaskLocator) {
@@ -26,7 +25,7 @@ async function handleBuildStatus(accountId, projectName, buildId) {
26
25
  }
27
26
  function handleUserInput(accountId, projectName, currentBuildId) {
28
27
  const onTerminate = async () => {
29
- logger.log(i18n(`commands.project.subcommands.watch.logs.processExited`));
28
+ uiLogger.log(commands.project.watch.logs.processExited);
30
29
  if (currentBuildId) {
31
30
  try {
32
31
  await cancelStagedBuild(accountId, projectName);
@@ -61,16 +60,11 @@ async function handler(args) {
61
60
  const { projectConfig, projectDir } = await getProjectConfig();
62
61
  validateProjectConfig(projectConfig, projectDir);
63
62
  if (!projectConfig || !projectDir) {
64
- logger.error(i18n(`commands.project.subcommands.watch.errors.projectConfigNotFound`));
63
+ uiLogger.error(commands.project.watch.errors.projectConfigNotFound);
65
64
  return process.exit(EXIT_CODES.ERROR);
66
65
  }
67
- if (useV3Api(projectConfig.platformVersion)) {
68
- logger.error(i18n(`commands.project.subcommands.watch.errors.v3ApiError`, {
69
- command: uiCommandReference('hs project watch'),
70
- newCommand: uiCommandReference('hs project dev'),
71
- platformVersion: projectConfig.platformVersion,
72
- linkToDocs: uiLink('How to develop locally.', 'https://developers.hubspot.com/docs/guides/crm/ui-extensions/local-development'),
73
- }));
66
+ if (isV2Project(projectConfig.platformVersion)) {
67
+ uiLogger.error(projectConfig.platformVersion);
74
68
  return process.exit(EXIT_CODES.ERROR);
75
69
  }
76
70
  validateProjectConfig(projectConfig, projectDir);
@@ -93,9 +87,9 @@ async function handler(args) {
93
87
  if (isSpecifiedError(uploadError, {
94
88
  subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
95
89
  })) {
96
- logger.log();
97
- logger.error(i18n(`commands.project.subcommands.watch.errors.projectLockedError`));
98
- logger.log();
90
+ uiLogger.log('');
91
+ uiLogger.error(commands.project.watch.errors.projectLockedError);
92
+ uiLogger.log('');
99
93
  }
100
94
  else {
101
95
  logError(uploadError, new ApiErrorContext({
@@ -117,14 +111,11 @@ async function handler(args) {
117
111
  function projectWatchBuilder(yargs) {
118
112
  yargs.option('initial-upload', {
119
113
  alias: 'i',
120
- describe: i18n(`commands.project.subcommands.watch.options.initialUpload.describe`),
114
+ describe: commands.project.watch.options.initialUpload.describe,
121
115
  type: 'boolean',
122
116
  });
123
117
  yargs.example([
124
- [
125
- '$0 project watch',
126
- i18n(`commands.project.subcommands.watch.examples.default`),
127
- ],
118
+ ['$0 project watch', commands.project.watch.examples.default],
128
119
  ]);
129
120
  return yargs;
130
121
  }
@@ -1,5 +1,4 @@
1
- import { i18n } from '../lib/lang.js';
2
- import { uiBetaTag } from '../lib/ui/index.js';
1
+ import { commands } from '../lang/en.js';
3
2
  import deploy from './project/deploy.js';
4
3
  import create from './project/create.js';
5
4
  import upload from './project/upload.js';
@@ -18,7 +17,7 @@ import profile from './project/profile.js';
18
17
  import projectValidate from './project/validate.js';
19
18
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
20
19
  const command = ['project', 'projects'];
21
- const describe = uiBetaTag(i18n(`commands.project.describe`), false);
20
+ const describe = commands.project.describe;
22
21
  function projectBuilder(yargs) {
23
22
  yargs
24
23
  .command(create)
@@ -10,11 +10,11 @@ import { trackCommandUsage } from '../../../lib/usageTracking.js';
10
10
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
11
11
  import * as buildAccount from '../../../lib/buildAccount.js';
12
12
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
13
- import { logger } from '@hubspot/local-dev-lib/logger';
13
+ import { uiLogger } from '../../../lib/ui/logger.js';
14
14
  import * as sandboxesLib from '../../../lib/sandboxes.js';
15
15
  import * as sandboxSync from '../../../lib/sandboxSync.js';
16
16
  import { vi } from 'vitest';
17
- vi.mock('@hubspot/local-dev-lib/logger');
17
+ vi.mock('../../../lib/ui/logger.js');
18
18
  vi.mock('@hubspot/local-dev-lib/config');
19
19
  vi.mock('../../../lib/commonOpts');
20
20
  vi.mock('../../../lib/hasFeature');
@@ -207,7 +207,7 @@ describe('commands/sandbox/create', () => {
207
207
  type: 'invalid',
208
208
  force: true,
209
209
  });
210
- expect(logger.error).toHaveBeenCalledTimes(1);
210
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
211
211
  expect(processExitSpy).toHaveBeenCalled();
212
212
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
213
213
  });
@@ -217,7 +217,7 @@ describe('commands/sandbox/create', () => {
217
217
  type: 'standard',
218
218
  force: true,
219
219
  });
220
- expect(logger.error).toHaveBeenCalled();
220
+ expect(uiLogger.error).toHaveBeenCalled();
221
221
  expect(processExitSpy).toHaveBeenCalled();
222
222
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
223
223
  });
@@ -230,7 +230,7 @@ describe('commands/sandbox/create', () => {
230
230
  ...args,
231
231
  type: 'developer',
232
232
  });
233
- expect(logger.error).toHaveBeenCalled();
233
+ expect(uiLogger.error).toHaveBeenCalled();
234
234
  expect(processExitSpy).toHaveBeenCalled();
235
235
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
236
236
  });
@@ -1,12 +1,12 @@
1
1
  import { getAccountConfig, getEnv } from '@hubspot/local-dev-lib/config';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
2
+ import { uiLogger } from '../../lib/ui/logger.js';
3
3
  import { isMissingScopeError } from '@hubspot/local-dev-lib/errors/index';
4
4
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
5
5
  import { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } from '@hubspot/local-dev-lib/constants/config';
6
6
  import { getValidEnv } from '@hubspot/local-dev-lib/environment';
7
- import { i18n } from '../../lib/lang.js';
7
+ import { commands, lib } from '../../lang/en.js';
8
8
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
9
- import { uiFeatureHighlight, uiBetaTag, uiCommandReference, } from '../../lib/ui/index.js';
9
+ import { uiFeatureHighlight, uiBetaTag } from '../../lib/ui/index.js';
10
10
  import { SANDBOX_TYPE_MAP, getAvailableSyncTypes, SYNC_TYPES, validateSandboxUsageLimits, } from '../../lib/sandboxes.js';
11
11
  import { trackCommandUsage } from '../../lib/usageTracking.js';
12
12
  import { sandboxTypePrompt } from '../../lib/prompts/sandboxesPrompt.js';
@@ -19,7 +19,7 @@ import { makeYargsBuilder } from '../../lib/yargsUtils.js';
19
19
  import { hasFeature } from '../../lib/hasFeature.js';
20
20
  import { FEATURES } from '../../lib/constants.js';
21
21
  const command = 'create';
22
- const describe = uiBetaTag(i18n(`commands.sandbox.subcommands.create.describe`), false);
22
+ const describe = uiBetaTag(commands.sandbox.subcommands.create.describe, false);
23
23
  async function handler(args) {
24
24
  const { name, type, force, derivedAccountId } = args;
25
25
  const accountConfig = getAccountConfig(derivedAccountId);
@@ -27,19 +27,13 @@ async function handler(args) {
27
27
  trackCommandUsage('sandbox-create', {}, derivedAccountId);
28
28
  // Check if account config exists
29
29
  if (!accountConfig) {
30
- logger.error(i18n(`commands.sandbox.subcommands.create.failure.noAccountConfig`, {
31
- accountId: derivedAccountId,
32
- authCommand: uiCommandReference('hs auth'),
33
- }));
30
+ uiLogger.error(commands.sandbox.subcommands.create.failure.noAccountConfig(derivedAccountId));
34
31
  process.exit(EXIT_CODES.ERROR);
35
32
  }
36
33
  // Default account is not a production portal
37
34
  if (accountConfig.accountType &&
38
35
  accountConfig.accountType !== HUBSPOT_ACCOUNT_TYPES.STANDARD) {
39
- logger.error(i18n(`commands.sandbox.subcommands.create.failure.invalidAccountType`, {
40
- accountType: HUBSPOT_ACCOUNT_TYPE_STRINGS[HUBSPOT_ACCOUNT_TYPES[accountConfig.accountType]],
41
- accountName: accountConfig.name || '',
42
- }));
36
+ uiLogger.error(commands.sandbox.subcommands.create.failure.invalidAccountType(HUBSPOT_ACCOUNT_TYPE_STRINGS[HUBSPOT_ACCOUNT_TYPES[accountConfig.accountType]], accountConfig.name || ''));
43
37
  process.exit(EXIT_CODES.ERROR);
44
38
  }
45
39
  let typePrompt;
@@ -49,7 +43,7 @@ async function handler(args) {
49
43
  typePrompt = await sandboxTypePrompt();
50
44
  }
51
45
  else {
52
- logger.error(i18n(`commands.sandbox.subcommands.create.failure.optionMissing.type`));
46
+ uiLogger.error(commands.sandbox.subcommands.create.failure.optionMissing.type);
53
47
  process.exit(EXIT_CODES.ERROR);
54
48
  }
55
49
  }
@@ -62,15 +56,14 @@ async function handler(args) {
62
56
  }
63
57
  catch (err) {
64
58
  if (isMissingScopeError(err)) {
65
- logger.error(i18n('lib.sandbox.create.failure.scopes.message', {
66
- accountName: accountConfig.name || derivedAccountId,
67
- }));
59
+ uiLogger.error(sandboxType === 'DEVELOPMENT_SANDBOX'
60
+ ? lib.sandbox.create.developer.failure.scopes.message
61
+ : lib.sandbox.create.standard.failure.scopes.message);
68
62
  const websiteOrigin = getHubSpotWebsiteOrigin(env);
69
63
  const url = `${websiteOrigin}/personal-access-key/${derivedAccountId}`;
70
- logger.info(i18n('lib.sandbox.create.failure.scopes.instructions', {
71
- accountName: accountConfig.name || derivedAccountId,
72
- url,
73
- }));
64
+ uiLogger.info(sandboxType === 'DEVELOPMENT_SANDBOX'
65
+ ? lib.sandbox.create.developer.failure.scopes.instructions(accountConfig.name || derivedAccountId, url)
66
+ : lib.sandbox.create.standard.failure.scopes.instructions(accountConfig.name || derivedAccountId, url));
74
67
  }
75
68
  else {
76
69
  logError(err);
@@ -82,13 +75,13 @@ async function handler(args) {
82
75
  namePrompt = await hubspotAccountNamePrompt({ accountType: sandboxType });
83
76
  }
84
77
  else {
85
- logger.error(i18n(`commands.sandbox.subcommands.create.failure.optionMissing.name`));
78
+ uiLogger.error(commands.sandbox.subcommands.create.failure.optionMissing.name);
86
79
  process.exit(EXIT_CODES.ERROR);
87
80
  }
88
81
  }
89
82
  const sandboxName = name || (namePrompt && namePrompt.name);
90
83
  if (!sandboxName) {
91
- logger.error(i18n(`commands.sandbox.subcommands.create.failure.optionMissing.name`));
84
+ uiLogger.error(commands.sandbox.subcommands.create.failure.optionMissing.name);
92
85
  process.exit(EXIT_CODES.ERROR);
93
86
  }
94
87
  let contactRecordsSyncPromptResult = false;
@@ -100,7 +93,7 @@ async function handler(args) {
100
93
  {
101
94
  name: 'contactRecordsSyncPrompt',
102
95
  type: 'confirm',
103
- message: i18n('lib.sandbox.sync.confirm.syncContactRecords.standard'),
96
+ message: commands.sandbox.sync.confirm.syncContactRecords.standard,
104
97
  },
105
98
  ]);
106
99
  contactRecordsSyncPromptResult = contactRecordsSyncPrompt;
@@ -121,10 +114,7 @@ async function handler(args) {
121
114
  const sandboxAccountConfig = getAccountConfig(result.sandbox.sandboxHubId);
122
115
  // Check if sandbox account config exists
123
116
  if (!sandboxAccountConfig) {
124
- logger.error(i18n(`commands.sandbox.subcommands.create.failure.noSandboxAccountConfig`, {
125
- accountId: result.sandbox.sandboxHubId,
126
- authCommand: uiCommandReference('hs auth'),
127
- }));
117
+ uiLogger.error(commands.sandbox.subcommands.create.failure.noSandboxAccountConfig(result.sandbox.sandboxHubId));
128
118
  process.exit(EXIT_CODES.ERROR);
129
119
  }
130
120
  if (result && !canCreateV2Sandbox) {
@@ -160,20 +150,20 @@ function sandboxCreateBuilder(yargs) {
160
150
  yargs.option('force', {
161
151
  type: 'boolean',
162
152
  alias: 'f',
163
- describe: i18n(`commands.sandbox.subcommands.create.options.force.describe`),
153
+ describe: commands.sandbox.subcommands.create.options.force.describe,
164
154
  });
165
155
  yargs.option('name', {
166
- describe: i18n(`commands.sandbox.subcommands.create.options.name.describe`),
156
+ describe: commands.sandbox.subcommands.create.options.name.describe,
167
157
  type: 'string',
168
158
  });
169
159
  yargs.option('type', {
170
- describe: i18n(`commands.sandbox.subcommands.create.options.type.describe`),
160
+ describe: commands.sandbox.subcommands.create.options.type.describe,
171
161
  choices: Object.keys(SANDBOX_TYPE_MAP),
172
162
  });
173
163
  yargs.example([
174
164
  [
175
- '$0 sandbox create --name=MySandboxAccount --type=STANDARD',
176
- i18n(`commands.sandbox.subcommands.create.examples.default`),
165
+ '$0 sandbox create --name=MySandboxAccount --type=standard',
166
+ commands.sandbox.subcommands.create.examples.default,
177
167
  ],
178
168
  ]);
179
169
  return yargs;
@@ -1,4 +1,4 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
1
+ import { uiLogger } from '../../lib/ui/logger.js';
2
2
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
3
3
  import { deleteSandbox } from '@hubspot/local-dev-lib/api/sandboxHubs';
4
4
  import { getEnv, removeSandboxAccountFromConfig, updateDefaultAccount, getAccountId, getConfigAccounts, } from '@hubspot/local-dev-lib/config';
@@ -7,15 +7,15 @@ import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
7
7
  import { getValidEnv } from '@hubspot/local-dev-lib/environment';
8
8
  import { trackCommandUsage } from '../../lib/usageTracking.js';
9
9
  import { logError, debugError } from '../../lib/errorHandlers/index.js';
10
- import { i18n } from '../../lib/lang.js';
10
+ import { commands } from '../../lang/en.js';
11
11
  import { deleteSandboxPrompt } from '../../lib/prompts/sandboxesPrompt.js';
12
12
  import { selectAccountFromConfig } from '../../lib/prompts/accountsPrompt.js';
13
13
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
14
14
  import { promptUser } from '../../lib/prompts/promptUtils.js';
15
- import { uiAccountDescription, uiBetaTag, uiCommandReference, } from '../../lib/ui/index.js';
15
+ import { uiBetaTag } from '../../lib/ui/index.js';
16
16
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
17
17
  const command = 'delete';
18
- const describe = uiBetaTag(i18n(`commands.sandbox.subcommands.delete.describe`), false);
18
+ const describe = uiBetaTag(commands.sandbox.subcommands.delete.describe, false);
19
19
  async function handler(args) {
20
20
  const { userProvidedAccount, derivedAccountId, force } = args;
21
21
  trackCommandUsage('sandbox-delete', {}, derivedAccountId);
@@ -26,21 +26,19 @@ async function handler(args) {
26
26
  }
27
27
  else {
28
28
  // Account is required, throw error if force flag is present and no account is specified
29
- logger.log('');
30
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.noAccount`));
29
+ uiLogger.log('');
30
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noAccount);
31
31
  process.exit(EXIT_CODES.ERROR);
32
32
  }
33
33
  if (!accountPrompt) {
34
- logger.log('');
35
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.noSandboxAccounts`, {
36
- authCommand: uiCommandReference('hs auth'),
37
- }));
34
+ uiLogger.log('');
35
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noSandboxAccounts);
38
36
  process.exit(EXIT_CODES.ERROR);
39
37
  }
40
38
  }
41
39
  const sandboxAccountId = getAccountId(userProvidedAccount || accountPrompt.account);
42
40
  if (!sandboxAccountId) {
43
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.noSandboxAccountId`));
41
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noSandboxAccountId);
44
42
  process.exit(EXIT_CODES.ERROR);
45
43
  }
46
44
  const isDefaultAccount = sandboxAccountId === getAccountId();
@@ -55,17 +53,13 @@ async function handler(args) {
55
53
  else if (!force) {
56
54
  const parentAccountPrompt = await deleteSandboxPrompt(true);
57
55
  if (!parentAccountPrompt) {
58
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.noParentAccount`, {
59
- authCommand: uiCommandReference('hs auth'),
60
- }));
56
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noParentAccount);
61
57
  process.exit(EXIT_CODES.ERROR);
62
58
  }
63
59
  parentAccountId = getAccountId(parentAccountPrompt.account);
64
60
  }
65
61
  else {
66
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.noParentAccount`, {
67
- authCommand: uiCommandReference('hs auth'),
68
- }));
62
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noParentAccount);
69
63
  process.exit(EXIT_CODES.ERROR);
70
64
  }
71
65
  }
@@ -73,23 +67,15 @@ async function handler(args) {
73
67
  const url = `${baseUrl}/sandboxes/${parentAccountId}`;
74
68
  const command = `hs auth ${getEnv(sandboxAccountId) === 'qa' ? '--qa' : ''} --account=${parentAccountId}`;
75
69
  if (parentAccountId && !getAccountId(parentAccountId)) {
76
- logger.log('');
77
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.noParentPortalAvailable`, {
78
- parentAccountId,
79
- url,
80
- command,
81
- }));
82
- logger.log('');
70
+ uiLogger.log('');
71
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noParentPortalAvailable(command, url));
72
+ uiLogger.log('');
83
73
  process.exit(EXIT_CODES.ERROR);
84
74
  }
85
- logger.debug(i18n(`commands.sandbox.subcommands.delete.debug.deleting`, {
86
- account: uiAccountDescription(sandboxAccountId),
87
- }));
75
+ uiLogger.debug(commands.sandbox.subcommands.delete.debug.deleting(sandboxAccountId));
88
76
  if (isDefaultAccount) {
89
- logger.info(i18n(`commands.sandbox.subcommands.delete.defaultAccountWarning`, {
90
- account: uiAccountDescription(sandboxAccountId),
91
- }));
92
- logger.log('');
77
+ uiLogger.info(commands.sandbox.subcommands.delete.defaultAccountWarning(sandboxAccountId));
78
+ uiLogger.log('');
93
79
  }
94
80
  try {
95
81
  if (!force) {
@@ -97,9 +83,7 @@ async function handler(args) {
97
83
  {
98
84
  name: 'confirmSandboxDeletePrompt',
99
85
  type: 'confirm',
100
- message: i18n(`commands.sandbox.subcommands.delete.confirm`, {
101
- account: uiAccountDescription(sandboxAccountId),
102
- }),
86
+ message: commands.sandbox.subcommands.delete.confirm(sandboxAccountId),
103
87
  },
104
88
  ]);
105
89
  if (!confirmed) {
@@ -107,21 +91,17 @@ async function handler(args) {
107
91
  }
108
92
  }
109
93
  await deleteSandbox(parentAccountId, sandboxAccountId);
110
- const deleteKey = isDefaultAccount
111
- ? `commands.sandbox.subcommands.delete.success.deleteDefault`
112
- : `commands.sandbox.subcommands.delete.success.delete`;
113
- logger.log('');
114
- logger.success(i18n(deleteKey, {
115
- account: userProvidedAccount || accountPrompt.account,
116
- sandboxHubId: sandboxAccountId || '',
117
- }));
118
- logger.log('');
94
+ uiLogger.log('');
95
+ uiLogger.success(isDefaultAccount
96
+ ? commands.sandbox.subcommands.delete.success.deleteDefault(userProvidedAccount || accountPrompt.account, sandboxAccountId)
97
+ : commands.sandbox.subcommands.delete.success.delete(userProvidedAccount || accountPrompt.account, sandboxAccountId));
98
+ uiLogger.log('');
119
99
  const promptDefaultAccount = removeSandboxAccountFromConfig(sandboxAccountId);
120
100
  if (promptDefaultAccount && !force) {
121
101
  const newDefaultAccount = await selectAccountFromConfig();
122
102
  updateDefaultAccount(newDefaultAccount);
123
103
  }
124
- else {
104
+ else if (isDefaultAccount && force) {
125
105
  // If force is specified, skip prompt and set the parent account id as the default account
126
106
  updateDefaultAccount(parentAccountId);
127
107
  }
@@ -132,34 +112,26 @@ async function handler(args) {
132
112
  if (isSpecifiedError(err, { statusCode: 401 })) {
133
113
  // Intercept invalid key error
134
114
  // This command uses the parent portal PAK to delete a sandbox, so we must specify which account needs a new key
135
- logger.log('');
136
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.invalidKey`, {
137
- account: uiAccountDescription(parentAccountId),
138
- authCommand: uiCommandReference('hs auth'),
139
- }));
115
+ uiLogger.log('');
116
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.invalidKey(parentAccountId));
140
117
  }
141
118
  else if (isSpecifiedError(err, {
142
119
  statusCode: 403,
143
120
  category: 'BANNED',
144
121
  subCategory: 'SandboxErrors.USER_ACCESS_NOT_ALLOWED',
145
122
  })) {
146
- logger.log('');
147
- logger.error(i18n(`commands.sandbox.subcommands.delete.failure.invalidUser`, {
148
- accountName: uiAccountDescription(sandboxAccountId),
149
- parentAccountName: uiAccountDescription(parentAccountId),
150
- }));
151
- logger.log('');
123
+ uiLogger.log('');
124
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.invalidUser(sandboxAccountId, parentAccountId));
125
+ uiLogger.log('');
152
126
  }
153
127
  else if (isSpecifiedError(err, {
154
128
  statusCode: 404,
155
129
  category: 'OBJECT_NOT_FOUND',
156
130
  subCategory: 'SandboxErrors.SANDBOX_NOT_FOUND',
157
131
  })) {
158
- logger.log('');
159
- logger.warn(i18n(`commands.sandbox.subcommands.delete.failure.objectNotFound`, {
160
- account: uiAccountDescription(sandboxAccountId),
161
- }));
162
- logger.log('');
132
+ uiLogger.log('');
133
+ uiLogger.warn(commands.sandbox.subcommands.delete.failure.objectNotFound(sandboxAccountId));
134
+ uiLogger.log('');
163
135
  const promptDefaultAccount = removeSandboxAccountFromConfig(sandboxAccountId);
164
136
  if (promptDefaultAccount && !force) {
165
137
  const newDefaultAccount = await selectAccountFromConfig();
@@ -179,18 +151,18 @@ async function handler(args) {
179
151
  }
180
152
  function sandboxDeleteBuilder(yargs) {
181
153
  yargs.option('account', {
182
- describe: i18n(`commands.sandbox.subcommands.delete.options.account.describe`),
154
+ describe: commands.sandbox.subcommands.delete.options.account.describe,
183
155
  type: 'string',
184
156
  });
185
157
  yargs.option('force', {
186
158
  type: 'boolean',
187
159
  alias: 'f',
188
- describe: i18n(`commands.sandbox.subcommands.delete.options.force.describe`),
160
+ describe: commands.sandbox.subcommands.delete.options.force.describe,
189
161
  });
190
162
  yargs.example([
191
163
  [
192
164
  '$0 sandbox delete --account=MySandboxAccount',
193
- i18n(`commands.sandbox.subcommands.delete.examples.default`),
165
+ commands.sandbox.subcommands.delete.examples.default,
194
166
  ],
195
167
  ]);
196
168
  return yargs;
@@ -1,10 +1,10 @@
1
- import { i18n } from '../lib/lang.js';
1
+ import { commands } from '../lang/en.js';
2
2
  import { uiBetaTag } from '../lib/ui/index.js';
3
3
  import create from './sandbox/create.js';
4
4
  import del from './sandbox/delete.js';
5
5
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
6
6
  const command = ['sandbox', 'sandboxes'];
7
- const describe = uiBetaTag(i18n(`commands.sandbox.describe`), false);
7
+ const describe = uiBetaTag(commands.sandbox.describe, false);
8
8
  function sandboxBuilder(yargs) {
9
9
  yargs.command(create).command(del).demandCommand(1, '');
10
10
  return yargs;
@@ -1,15 +1,13 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
2
1
  import { addSecret, fetchSecrets } from '@hubspot/local-dev-lib/api/secrets';
3
2
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
4
3
  import { trackCommandUsage } from '../../lib/usageTracking.js';
5
- import { uiAccountDescription } from '../../lib/ui/index.js';
6
4
  import { secretValuePrompt, secretNamePrompt, } from '../../lib/prompts/secretPrompt.js';
7
- import { i18n } from '../../lib/lang.js';
5
+ import { commands } from '../../lang/en.js';
6
+ import { uiLogger } from '../../lib/ui/logger.js';
8
7
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
9
- import { uiCommandReference } from '../../lib/ui/index.js';
10
8
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
11
9
  const command = 'add [name]';
12
- const describe = i18n(`commands.secret.subcommands.add.describe`);
10
+ const describe = commands.secret.subcommands.add.describe;
13
11
  async function handler(args) {
14
12
  const { name, derivedAccountId } = args;
15
13
  let secretName = name;
@@ -21,23 +19,15 @@ async function handler(args) {
21
19
  }
22
20
  const { data: { results: secrets }, } = await fetchSecrets(derivedAccountId);
23
21
  if (secrets.includes(secretName)) {
24
- logger.error(i18n(`commands.secret.subcommands.add.errors.alreadyExists`, {
25
- secretName,
26
- command: uiCommandReference('hs secret update'),
27
- }));
22
+ uiLogger.error(commands.secret.subcommands.add.errors.alreadyExists(secretName));
28
23
  process.exit(EXIT_CODES.ERROR);
29
24
  }
30
25
  const { secretValue } = await secretValuePrompt();
31
26
  await addSecret(derivedAccountId, secretName, secretValue);
32
- logger.success(i18n(`commands.secret.subcommands.add.success.add`, {
33
- accountIdentifier: uiAccountDescription(derivedAccountId),
34
- secretName,
35
- }));
27
+ uiLogger.success(commands.secret.subcommands.add.success.add(secretName, derivedAccountId));
36
28
  }
37
29
  catch (err) {
38
- logger.error(i18n(`commands.secret.subcommands.add.errors.add`, {
39
- secretName: secretName || '',
40
- }));
30
+ uiLogger.error(commands.secret.subcommands.add.errors.add(secretName || ''));
41
31
  logError(err, new ApiErrorContext({
42
32
  request: 'add secret',
43
33
  accountId: derivedAccountId,
@@ -46,7 +36,7 @@ async function handler(args) {
46
36
  }
47
37
  function addSecretBuilder(yargs) {
48
38
  yargs.positional('name', {
49
- describe: i18n(`commands.secret.subcommands.add.positionals.name.describe`),
39
+ describe: commands.secret.subcommands.add.positionals.name.describe,
50
40
  type: 'string',
51
41
  });
52
42
  return yargs;