@hubspot/cli 7.8.12-experimental.0 → 7.8.12-experimental.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) 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/account/clean.js +18 -27
  5. package/commands/account/createOverride.js +13 -31
  6. package/commands/account/info.js +20 -31
  7. package/commands/account/list.js +16 -22
  8. package/commands/account/remove.js +12 -20
  9. package/commands/account/removeOverride.js +11 -21
  10. package/commands/account/rename.js +6 -9
  11. package/commands/account/use.js +12 -26
  12. package/commands/account.js +2 -2
  13. package/commands/app/__tests__/migrate.test.js +5 -5
  14. package/commands/app/migrate.js +13 -18
  15. package/commands/app.js +1 -6
  16. package/commands/auth.d.ts +1 -0
  17. package/commands/auth.js +16 -7
  18. package/commands/cms/convertFields.js +7 -9
  19. package/commands/cms/getReactModule.js +9 -14
  20. package/commands/cms/lighthouseScore.js +33 -36
  21. package/commands/cms.js +2 -2
  22. package/commands/completion.js +3 -3
  23. package/commands/config/set.d.ts +1 -1
  24. package/commands/config/set.js +64 -36
  25. package/commands/config.js +2 -2
  26. package/commands/create.js +2 -2
  27. package/commands/customObject/create.js +10 -12
  28. package/commands/customObject/schema/create.js +9 -11
  29. package/commands/customObject/schema/delete.js +16 -16
  30. package/commands/customObject/schema/fetch-all.js +12 -11
  31. package/commands/customObject/schema/fetch.js +15 -15
  32. package/commands/customObject/schema/list.js +4 -4
  33. package/commands/customObject/schema/update.js +13 -13
  34. package/commands/customObject/schema.js +2 -2
  35. package/commands/customObject.js +6 -7
  36. package/commands/doctor.js +8 -11
  37. package/commands/feedback.js +6 -11
  38. package/commands/fetch.js +8 -8
  39. package/commands/filemanager/fetch.js +7 -7
  40. package/commands/filemanager/upload.js +15 -34
  41. package/commands/filemanager.js +2 -2
  42. package/commands/function/deploy.js +11 -29
  43. package/commands/function/list.js +8 -8
  44. package/commands/function/server.js +9 -11
  45. package/commands/function.d.ts +1 -1
  46. package/commands/function.js +2 -2
  47. package/commands/getStarted.js +2 -2
  48. package/commands/hubdb/clear.js +7 -15
  49. package/commands/hubdb/create.js +9 -15
  50. package/commands/hubdb/delete.js +8 -15
  51. package/commands/hubdb/fetch.js +6 -9
  52. package/commands/hubdb.d.ts +1 -1
  53. package/commands/hubdb.js +2 -2
  54. package/commands/init.js +2 -3
  55. package/commands/lint.js +16 -16
  56. package/commands/list.js +8 -14
  57. package/commands/logs.js +14 -20
  58. package/commands/mv.js +6 -17
  59. package/commands/open.js +5 -5
  60. package/commands/project/__tests__/add.test.js +4 -2
  61. package/commands/project/__tests__/deploy.test.js +3 -4
  62. package/commands/project/__tests__/installDeps.test.js +8 -8
  63. package/commands/project/__tests__/logs.test.js +1 -1
  64. package/commands/project/__tests__/migrate.test.js +5 -5
  65. package/commands/project/__tests__/migrateApp.test.js +2 -5
  66. package/commands/project/__tests__/validate.test.js +98 -0
  67. package/commands/project/add.js +3 -3
  68. package/commands/project/cloneApp.js +14 -19
  69. package/commands/project/create.js +0 -1
  70. package/commands/project/deploy.js +3 -3
  71. package/commands/project/dev/deprecatedFlow.js +7 -16
  72. package/commands/project/dev/index.js +14 -12
  73. package/commands/project/dev/unifiedFlow.js +3 -1
  74. package/commands/project/download.js +10 -13
  75. package/commands/project/installDeps.js +8 -8
  76. package/commands/project/listBuilds.js +11 -20
  77. package/commands/project/logs.js +21 -24
  78. package/commands/project/migrateApp.js +9 -15
  79. package/commands/project/open.js +6 -13
  80. package/commands/project/upload.d.ts +2 -2
  81. package/commands/project/upload.js +17 -26
  82. package/commands/project/validate.js +6 -6
  83. package/commands/project/watch.js +13 -22
  84. package/commands/project.js +2 -2
  85. package/commands/sandbox/__tests__/create.test.js +5 -5
  86. package/commands/sandbox/create.js +22 -32
  87. package/commands/sandbox/delete.js +38 -63
  88. package/commands/sandbox.js +2 -2
  89. package/commands/secret/addSecret.js +7 -17
  90. package/commands/secret/deleteSecret.js +10 -20
  91. package/commands/secret/listSecret.js +8 -10
  92. package/commands/secret/updateSecret.js +9 -17
  93. package/commands/secret.js +2 -2
  94. package/commands/testAccount/__tests__/delete.test.js +2 -4
  95. package/commands/testAccount/create.js +0 -3
  96. package/commands/testAccount/delete.d.ts +4 -3
  97. package/commands/testAccount/delete.js +155 -14
  98. package/commands/theme/preview.js +1 -4
  99. package/lang/en.d.ts +310 -124
  100. package/lang/en.js +351 -169
  101. package/lang/en.lyaml +2 -2
  102. package/lib/__tests__/buildAccount.test.js +2 -1
  103. package/lib/__tests__/commonOpts.test.js +1 -1
  104. package/lib/__tests__/dependencyManagement.test.js +1 -1
  105. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  106. package/lib/__tests__/npm.test.js +1 -1
  107. package/lib/__tests__/oauth.test.js +4 -4
  108. package/lib/__tests__/process.test.js +10 -5
  109. package/lib/__tests__/sandboxSync.test.js +8 -8
  110. package/lib/__tests__/sandboxes.test.js +8 -8
  111. package/lib/__tests__/serverlessLogs.test.js +1 -1
  112. package/lib/__tests__/usageTracking.test.js +5 -5
  113. package/lib/__tests__/validation.test.js +2 -1
  114. package/lib/__tests__/yargsUtils.test.js +83 -9
  115. package/lib/app/__tests__/migrate.test.js +5 -5
  116. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  117. package/lib/app/migrate.js +1 -1
  118. package/lib/app/migrate_legacy.js +20 -24
  119. package/lib/buildAccount.js +25 -57
  120. package/lib/commonOpts.d.ts +1 -1
  121. package/lib/commonOpts.js +25 -22
  122. package/lib/configOptions.js +7 -0
  123. package/lib/constants.d.ts +6 -1
  124. package/lib/constants.js +10 -1
  125. package/lib/dependencyManagement.js +9 -27
  126. package/lib/developerTestAccounts.js +9 -23
  127. package/lib/doctor/Diagnosis.js +11 -23
  128. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  129. package/lib/doctor/Doctor.js +42 -90
  130. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  131. package/lib/errorHandlers/index.js +12 -20
  132. package/lib/errorHandlers/suppressError.js +11 -18
  133. package/lib/lang.js +6 -5
  134. package/lib/links.js +4 -4
  135. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  136. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  137. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  138. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  139. package/lib/middleware/commandTargetingUtils.js +78 -0
  140. package/lib/middleware/configMiddleware.d.ts +1 -1
  141. package/lib/middleware/configMiddleware.js +21 -81
  142. package/lib/middleware/gitMiddleware.js +5 -1
  143. package/lib/middleware/notificationsMiddleware.js +5 -11
  144. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  145. package/lib/npm.js +2 -2
  146. package/lib/oauth.js +5 -5
  147. package/lib/process.js +5 -4
  148. package/lib/projectProfiles.d.ts +1 -1
  149. package/lib/projectProfiles.js +2 -10
  150. package/lib/projects/__tests__/AppDevModeInterface.test.js +14 -34
  151. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +70 -39
  152. package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
  153. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  154. package/lib/projects/__tests__/projects.test.js +12 -12
  155. package/lib/projects/__tests__/structure.test.js +3 -3
  156. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  157. package/lib/projects/__tests__/upload.test.js +82 -0
  158. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  159. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  160. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  161. package/lib/projects/create/__tests__/v3.test.js +1 -1
  162. package/lib/projects/create/index.js +2 -2
  163. package/lib/projects/create/legacy.js +2 -2
  164. package/lib/projects/create/v3.js +2 -2
  165. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  166. package/lib/projects/localDev/AppDevModeInterface.js +22 -20
  167. package/lib/projects/localDev/LocalDevLogger.js +10 -11
  168. package/lib/projects/localDev/LocalDevManager.js +4 -5
  169. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +0 -1
  170. package/lib/projects/localDev/LocalDevWebsocketServer.js +7 -10
  171. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  172. package/lib/projects/localDev/helpers/project.js +37 -0
  173. package/lib/projects/platformVersion.d.ts +1 -1
  174. package/lib/projects/platformVersion.js +1 -1
  175. package/lib/projects/structure.d.ts +2 -2
  176. package/lib/projects/structure.js +6 -6
  177. package/lib/projects/upload.d.ts +2 -3
  178. package/lib/projects/upload.js +17 -9
  179. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  180. package/lib/prompts/accountNamePrompt.js +14 -19
  181. package/lib/prompts/accountsPrompt.js +2 -2
  182. package/lib/prompts/cmsFieldPrompt.js +2 -2
  183. package/lib/prompts/createApiSamplePrompt.js +5 -5
  184. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  185. package/lib/prompts/createFunctionPrompt.js +14 -14
  186. package/lib/prompts/createModulePrompt.js +9 -9
  187. package/lib/prompts/createTemplatePrompt.js +2 -2
  188. package/lib/prompts/downloadProjectPrompt.js +5 -8
  189. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  190. package/lib/prompts/previewPrompt.js +6 -6
  191. package/lib/prompts/projectAddPrompt.js +6 -0
  192. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  193. package/lib/prompts/projectNamePrompt.js +4 -8
  194. package/lib/prompts/projectsLogsPrompt.js +2 -4
  195. package/lib/prompts/promptUtils.js +27 -9
  196. package/lib/prompts/sandboxesPrompt.js +7 -7
  197. package/lib/prompts/secretPrompt.js +3 -3
  198. package/lib/prompts/selectAppPrompt.js +3 -3
  199. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  200. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  201. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  202. package/lib/prompts/uploadPrompt.js +5 -5
  203. package/lib/sandboxSync.js +24 -41
  204. package/lib/sandboxes.js +19 -47
  205. package/lib/schema.js +3 -3
  206. package/lib/serverlessLogs.js +11 -13
  207. package/lib/theme/__tests__/migrate.test.js +3 -3
  208. package/lib/theme/migrate.js +2 -2
  209. package/lib/ui/SpinniesManager.d.ts +2 -0
  210. package/lib/ui/SpinniesManager.js +7 -0
  211. package/lib/ui/boxen.js +1 -2
  212. package/lib/ui/git.js +13 -10
  213. package/lib/ui/index.d.ts +4 -0
  214. package/lib/ui/index.js +47 -38
  215. package/lib/ui/serverlessFunctionLogs.js +9 -7
  216. package/lib/ui/uiMessages.d.ts +68 -0
  217. package/lib/ui/uiMessages.js +71 -0
  218. package/lib/usageTracking.js +7 -7
  219. package/lib/validation.js +20 -23
  220. package/lib/yargsUtils.d.ts +1 -1
  221. package/lib/yargsUtils.js +12 -5
  222. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  223. package/mcp-server/tools/index.js +4 -0
  224. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  225. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  226. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  227. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  228. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
  229. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  230. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  231. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  232. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  233. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  234. package/mcp-server/utils/toolUsageTracking.js +2 -2
  235. package/package.json +6 -6
  236. package/types/Yargs.d.ts +1 -1
  237. package/commands/app/__tests__/install.test.js +0 -47
  238. package/commands/app/install.d.ts +0 -8
  239. package/commands/app/install.js +0 -122
  240. package/lib/middleware/__test__/utils.test.js +0 -51
  241. package/lib/middleware/utils.d.ts +0 -8
  242. package/lib/middleware/utils.js +0 -14
  243. /package/commands/{app/__tests__/install.test.d.ts → project/__tests__/validate.test.d.ts} +0 -0
  244. /package/lib/middleware/__test__/{utils.test.d.ts → commandTargetingUtils.test.d.ts} +0 -0
@@ -1,36 +1,34 @@
1
1
  import chalk from 'chalk';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
2
+ import { uiLogger } from '../../lib/ui/logger.js';
3
3
  import { getAccountConfig } from '@hubspot/local-dev-lib/config';
4
4
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
5
- import { useV3Api } from '../../lib/projects/platformVersion.js';
6
- import { uiCommandReference } from '../../lib/ui/index.js';
5
+ import { isV2Project } from '../../lib/projects/platformVersion.js';
7
6
  import { trackCommandUsage } from '../../lib/usageTracking.js';
8
7
  import { getProjectConfig, validateProjectConfig, } from '../../lib/projects/config.js';
9
8
  import { logFeedbackMessage } from '../../lib/projects/ui.js';
10
9
  import { handleProjectUpload } from '../../lib/projects/upload.js';
11
10
  import { loadAndValidateProfile } from '../../lib/projectProfiles.js';
12
11
  import { displayWarnLogs, pollProjectBuildAndDeploy, } from '../../lib/projects/pollProjectBuildAndDeploy.js';
13
- import { i18n } from '../../lib/lang.js';
12
+ import { commands } from '../../lang/en.js';
14
13
  import { PROJECT_ERROR_TYPES } from '../../lib/constants.js';
15
14
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
16
15
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
17
16
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
18
- import { uiLogger } from '../../lib/ui/logger.js';
19
17
  const command = 'upload';
20
- const describe = i18n(`commands.project.subcommands.upload.describe`);
18
+ const describe = commands.project.upload.describe;
21
19
  async function handler(args) {
22
20
  const { forceCreate, message, derivedAccountId, skipValidation, formatOutputAsJson, profile, } = args;
23
21
  const jsonOutput = {};
24
22
  const { projectConfig, projectDir } = await getProjectConfig();
25
23
  validateProjectConfig(projectConfig, projectDir);
26
24
  let targetAccountId;
27
- if (useV3Api(projectConfig.platformVersion)) {
28
- targetAccountId = await loadAndValidateProfile(projectConfig, projectDir, profile, args.useEnv);
25
+ if (isV2Project(projectConfig.platformVersion)) {
26
+ targetAccountId = await loadAndValidateProfile(projectConfig, projectDir, profile);
29
27
  }
30
28
  targetAccountId = targetAccountId || derivedAccountId;
31
29
  const accountConfig = getAccountConfig(targetAccountId);
32
30
  const accountType = accountConfig && accountConfig.accountType;
33
- trackCommandUsage('project-upload', { type: accountType }, targetAccountId);
31
+ trackCommandUsage('project-upload', { type: accountType, assetType: projectConfig.platformVersion }, targetAccountId);
34
32
  try {
35
33
  const { result, uploadError } = await handleProjectUpload({
36
34
  accountId: targetAccountId,
@@ -40,7 +38,7 @@ async function handler(args) {
40
38
  uploadMessage: message,
41
39
  forceCreate,
42
40
  isUploadCommand: true,
43
- sendIR: useV3Api(projectConfig.platformVersion),
41
+ sendIR: isV2Project(projectConfig.platformVersion),
44
42
  skipValidation,
45
43
  profile: args.profile,
46
44
  });
@@ -48,9 +46,9 @@ async function handler(args) {
48
46
  if (isSpecifiedError(uploadError, {
49
47
  subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
50
48
  })) {
51
- logger.log();
52
- logger.error(i18n(`commands.project.subcommands.upload.errors.projectLockedError`));
53
- logger.log();
49
+ uiLogger.log('');
50
+ uiLogger.error(commands.project.upload.errors.projectLockedError);
51
+ uiLogger.log('');
54
52
  }
55
53
  else {
56
54
  logError(uploadError, new ApiErrorContext({
@@ -61,12 +59,8 @@ async function handler(args) {
61
59
  process.exit(EXIT_CODES.ERROR);
62
60
  }
63
61
  if (result && result.succeeded && !result.buildResult.isAutoDeployEnabled) {
64
- logger.log(chalk.bold(i18n(`commands.project.subcommands.upload.logs.buildSucceeded`, {
65
- buildId: result.buildId,
66
- })));
67
- logger.log(i18n(`commands.project.subcommands.upload.logs.autoDeployDisabled`, {
68
- deployCommand: uiCommandReference(`hs project deploy --build=${result.buildId}`),
69
- }));
62
+ uiLogger.log(chalk.bold(commands.project.upload.logs.buildSucceeded(result.buildId)));
63
+ uiLogger.log(commands.project.upload.logs.autoDeployDisabled(`hs project deploy --build=${result.buildId}`));
70
64
  logFeedbackMessage(result.buildId);
71
65
  await displayWarnLogs(targetAccountId, projectConfig.name, result.buildId);
72
66
  }
@@ -92,13 +86,13 @@ async function handler(args) {
92
86
  function projectUploadBuilder(yargs) {
93
87
  yargs.options({
94
88
  'force-create': {
95
- describe: i18n(`commands.project.subcommands.upload.options.forceCreate.describe`),
89
+ describe: commands.project.upload.options.forceCreate.describe,
96
90
  type: 'boolean',
97
91
  default: false,
98
92
  },
99
93
  message: {
100
94
  alias: 'm',
101
- describe: i18n(`commands.project.subcommands.upload.options.message.describe`),
95
+ describe: commands.project.upload.options.message.describe,
102
96
  type: 'string',
103
97
  default: '',
104
98
  },
@@ -110,16 +104,13 @@ function projectUploadBuilder(yargs) {
110
104
  profile: {
111
105
  type: 'string',
112
106
  alias: 'p',
113
- describe: i18n(`commands.project.subcommands.upload.options.profile.describe`),
107
+ describe: commands.project.upload.options.profile.describe,
114
108
  hidden: true,
115
109
  },
116
110
  });
117
111
  yargs.conflicts('profile', 'account');
118
112
  yargs.example([
119
- [
120
- '$0 project upload',
121
- i18n(`commands.project.subcommands.upload.examples.default`),
122
- ],
113
+ ['$0 project upload', commands.project.upload.examples.default],
123
114
  ]);
124
115
  return yargs;
125
116
  }
@@ -1,12 +1,12 @@
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';
@@ -15,11 +15,11 @@ 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 } 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 = i18n(`commands.project.subcommands.watch.describe`);
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,4 +1,4 @@
1
- import { i18n } from '../lib/lang.js';
1
+ import { commands } from '../lang/en.js';
2
2
  import deploy from './project/deploy.js';
3
3
  import create from './project/create.js';
4
4
  import upload from './project/upload.js';
@@ -17,7 +17,7 @@ import profile from './project/profile.js';
17
17
  import projectValidate from './project/validate.js';
18
18
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
19
19
  const command = ['project', 'projects'];
20
- const describe = i18n(`commands.project.describe`);
20
+ const describe = commands.project.describe;
21
21
  function projectBuilder(yargs) {
22
22
  yargs
23
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 { uiAuthCommandReference, 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,41 +53,32 @@ 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
  }
72
66
  }
73
67
  const url = `${baseUrl}/sandboxes/${parentAccountId}`;
74
- const command = `hs auth ${getEnv(sandboxAccountId) === 'qa' ? '--qa' : ''} --account=${parentAccountId}`;
68
+ const command = uiAuthCommandReference({
69
+ accountId: parentAccountId || undefined,
70
+ qa: getEnv(sandboxAccountId) === 'qa',
71
+ });
75
72
  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('');
73
+ uiLogger.log('');
74
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.noParentPortalAvailable(command, url));
75
+ uiLogger.log('');
83
76
  process.exit(EXIT_CODES.ERROR);
84
77
  }
85
- logger.debug(i18n(`commands.sandbox.subcommands.delete.debug.deleting`, {
86
- account: uiAccountDescription(sandboxAccountId),
87
- }));
78
+ uiLogger.debug(commands.sandbox.subcommands.delete.debug.deleting(sandboxAccountId));
88
79
  if (isDefaultAccount) {
89
- logger.info(i18n(`commands.sandbox.subcommands.delete.defaultAccountWarning`, {
90
- account: uiAccountDescription(sandboxAccountId),
91
- }));
92
- logger.log('');
80
+ uiLogger.info(commands.sandbox.subcommands.delete.defaultAccountWarning(sandboxAccountId));
81
+ uiLogger.log('');
93
82
  }
94
83
  try {
95
84
  if (!force) {
@@ -97,9 +86,7 @@ async function handler(args) {
97
86
  {
98
87
  name: 'confirmSandboxDeletePrompt',
99
88
  type: 'confirm',
100
- message: i18n(`commands.sandbox.subcommands.delete.confirm`, {
101
- account: uiAccountDescription(sandboxAccountId),
102
- }),
89
+ message: commands.sandbox.subcommands.delete.confirm(sandboxAccountId),
103
90
  },
104
91
  ]);
105
92
  if (!confirmed) {
@@ -107,15 +94,11 @@ async function handler(args) {
107
94
  }
108
95
  }
109
96
  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('');
97
+ uiLogger.log('');
98
+ uiLogger.success(isDefaultAccount
99
+ ? commands.sandbox.subcommands.delete.success.deleteDefault(userProvidedAccount || accountPrompt.account, sandboxAccountId)
100
+ : commands.sandbox.subcommands.delete.success.delete(userProvidedAccount || accountPrompt.account, sandboxAccountId));
101
+ uiLogger.log('');
119
102
  const promptDefaultAccount = removeSandboxAccountFromConfig(sandboxAccountId);
120
103
  if (promptDefaultAccount && !force) {
121
104
  const newDefaultAccount = await selectAccountFromConfig();
@@ -132,34 +115,26 @@ async function handler(args) {
132
115
  if (isSpecifiedError(err, { statusCode: 401 })) {
133
116
  // Intercept invalid key error
134
117
  // 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
- }));
118
+ uiLogger.log('');
119
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.invalidKey(parentAccountId));
140
120
  }
141
121
  else if (isSpecifiedError(err, {
142
122
  statusCode: 403,
143
123
  category: 'BANNED',
144
124
  subCategory: 'SandboxErrors.USER_ACCESS_NOT_ALLOWED',
145
125
  })) {
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('');
126
+ uiLogger.log('');
127
+ uiLogger.error(commands.sandbox.subcommands.delete.failure.invalidUser(sandboxAccountId, parentAccountId));
128
+ uiLogger.log('');
152
129
  }
153
130
  else if (isSpecifiedError(err, {
154
131
  statusCode: 404,
155
132
  category: 'OBJECT_NOT_FOUND',
156
133
  subCategory: 'SandboxErrors.SANDBOX_NOT_FOUND',
157
134
  })) {
158
- logger.log('');
159
- logger.warn(i18n(`commands.sandbox.subcommands.delete.failure.objectNotFound`, {
160
- account: uiAccountDescription(sandboxAccountId),
161
- }));
162
- logger.log('');
135
+ uiLogger.log('');
136
+ uiLogger.warn(commands.sandbox.subcommands.delete.failure.objectNotFound(sandboxAccountId));
137
+ uiLogger.log('');
163
138
  const promptDefaultAccount = removeSandboxAccountFromConfig(sandboxAccountId);
164
139
  if (promptDefaultAccount && !force) {
165
140
  const newDefaultAccount = await selectAccountFromConfig();
@@ -179,18 +154,18 @@ async function handler(args) {
179
154
  }
180
155
  function sandboxDeleteBuilder(yargs) {
181
156
  yargs.option('account', {
182
- describe: i18n(`commands.sandbox.subcommands.delete.options.account.describe`),
157
+ describe: commands.sandbox.subcommands.delete.options.account.describe,
183
158
  type: 'string',
184
159
  });
185
160
  yargs.option('force', {
186
161
  type: 'boolean',
187
162
  alias: 'f',
188
- describe: i18n(`commands.sandbox.subcommands.delete.options.force.describe`),
163
+ describe: commands.sandbox.subcommands.delete.options.force.describe,
189
164
  });
190
165
  yargs.example([
191
166
  [
192
167
  '$0 sandbox delete --account=MySandboxAccount',
193
- i18n(`commands.sandbox.subcommands.delete.examples.default`),
168
+ commands.sandbox.subcommands.delete.examples.default,
194
169
  ],
195
170
  ]);
196
171
  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;