@hubspot/cli 7.8.11-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 (252) 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/auth.d.ts +1 -0
  16. package/commands/auth.js +16 -7
  17. package/commands/cms/convertFields.js +7 -9
  18. package/commands/cms/getReactModule.js +9 -14
  19. package/commands/cms/lighthouseScore.js +33 -36
  20. package/commands/cms.js +2 -2
  21. package/commands/completion.js +3 -3
  22. package/commands/config/set.d.ts +1 -1
  23. package/commands/config/set.js +64 -36
  24. package/commands/config.js +2 -2
  25. package/commands/create.js +2 -2
  26. package/commands/customObject/create.js +10 -12
  27. package/commands/customObject/schema/create.js +9 -11
  28. package/commands/customObject/schema/delete.js +16 -16
  29. package/commands/customObject/schema/fetch-all.js +12 -11
  30. package/commands/customObject/schema/fetch.js +15 -15
  31. package/commands/customObject/schema/list.js +4 -4
  32. package/commands/customObject/schema/update.js +13 -13
  33. package/commands/customObject/schema.js +2 -2
  34. package/commands/customObject.js +6 -7
  35. package/commands/doctor.js +8 -11
  36. package/commands/feedback.js +6 -11
  37. package/commands/fetch.js +8 -8
  38. package/commands/filemanager/fetch.js +7 -7
  39. package/commands/filemanager/upload.js +15 -34
  40. package/commands/filemanager.js +2 -2
  41. package/commands/function/deploy.js +11 -29
  42. package/commands/function/list.js +8 -8
  43. package/commands/function/server.js +9 -11
  44. package/commands/function.d.ts +1 -1
  45. package/commands/function.js +2 -2
  46. package/commands/getStarted.js +2 -2
  47. package/commands/hubdb/clear.js +7 -15
  48. package/commands/hubdb/create.js +9 -15
  49. package/commands/hubdb/delete.js +8 -15
  50. package/commands/hubdb/fetch.js +6 -9
  51. package/commands/hubdb.d.ts +1 -1
  52. package/commands/hubdb.js +2 -2
  53. package/commands/init.js +2 -3
  54. package/commands/lint.js +16 -16
  55. package/commands/list.js +8 -14
  56. package/commands/logs.js +14 -20
  57. package/commands/mv.js +6 -17
  58. package/commands/open.js +5 -5
  59. package/commands/project/__tests__/add.test.js +4 -2
  60. package/commands/project/__tests__/deploy.test.js +3 -4
  61. package/commands/project/__tests__/installDeps.test.js +8 -8
  62. package/commands/project/__tests__/logs.test.js +1 -1
  63. package/commands/project/__tests__/migrate.test.js +5 -5
  64. package/commands/project/__tests__/migrateApp.test.js +2 -5
  65. package/commands/project/__tests__/validate.test.js +98 -0
  66. package/commands/project/add.js +3 -3
  67. package/commands/project/cloneApp.js +14 -19
  68. package/commands/project/create.js +0 -1
  69. package/commands/project/deploy.js +3 -3
  70. package/commands/project/dev/deprecatedFlow.js +7 -16
  71. package/commands/project/dev/index.js +14 -12
  72. package/commands/project/dev/unifiedFlow.js +3 -1
  73. package/commands/project/download.js +10 -13
  74. package/commands/project/installDeps.js +8 -8
  75. package/commands/project/listBuilds.js +11 -20
  76. package/commands/project/logs.js +21 -24
  77. package/commands/project/migrate.js +14 -16
  78. package/commands/project/migrateApp.js +9 -15
  79. package/commands/project/open.js +6 -13
  80. package/commands/project/upload.js +16 -25
  81. package/commands/project/validate.js +6 -6
  82. package/commands/project/watch.js +13 -22
  83. package/commands/project.js +2 -2
  84. package/commands/sandbox/__tests__/create.test.js +5 -5
  85. package/commands/sandbox/create.js +22 -32
  86. package/commands/sandbox/delete.js +38 -63
  87. package/commands/sandbox.js +2 -2
  88. package/commands/secret/addSecret.js +7 -17
  89. package/commands/secret/deleteSecret.js +10 -20
  90. package/commands/secret/listSecret.js +8 -10
  91. package/commands/secret/updateSecret.js +9 -17
  92. package/commands/secret.js +2 -2
  93. package/commands/testAccount/__tests__/delete.test.js +2 -4
  94. package/commands/testAccount/delete.d.ts +4 -3
  95. package/commands/testAccount/delete.js +155 -14
  96. package/commands/theme/preview.js +1 -4
  97. package/lang/en.d.ts +310 -102
  98. package/lang/en.js +351 -147
  99. package/lang/en.lyaml +2 -2
  100. package/lib/__tests__/buildAccount.test.js +2 -1
  101. package/lib/__tests__/commonOpts.test.js +1 -1
  102. package/lib/__tests__/dependencyManagement.test.js +1 -1
  103. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  104. package/lib/__tests__/npm.test.js +1 -1
  105. package/lib/__tests__/oauth.test.js +4 -4
  106. package/lib/__tests__/process.test.js +10 -5
  107. package/lib/__tests__/sandboxSync.test.js +8 -8
  108. package/lib/__tests__/sandboxes.test.js +8 -8
  109. package/lib/__tests__/serverlessLogs.test.js +1 -1
  110. package/lib/__tests__/usageTracking.test.js +5 -5
  111. package/lib/__tests__/validation.test.js +2 -1
  112. package/lib/__tests__/yargsUtils.test.js +83 -9
  113. package/lib/app/__tests__/migrate.test.js +5 -5
  114. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  115. package/lib/app/migrate.js +1 -1
  116. package/lib/app/migrate_legacy.js +20 -24
  117. package/lib/buildAccount.js +25 -57
  118. package/lib/commonOpts.d.ts +1 -1
  119. package/lib/commonOpts.js +25 -22
  120. package/lib/configOptions.js +7 -0
  121. package/lib/constants.d.ts +6 -1
  122. package/lib/constants.js +10 -1
  123. package/lib/dependencyManagement.js +9 -27
  124. package/lib/developerTestAccounts.js +9 -23
  125. package/lib/doctor/Diagnosis.js +11 -23
  126. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  127. package/lib/doctor/Doctor.js +42 -90
  128. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  129. package/lib/errorHandlers/index.js +12 -20
  130. package/lib/errorHandlers/suppressError.js +11 -18
  131. package/lib/lang.js +6 -5
  132. package/lib/links.js +4 -4
  133. package/lib/middleware/__test__/commandTargetingUtils.test.d.ts +1 -0
  134. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  135. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  136. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  137. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  138. package/lib/middleware/commandTargetingUtils.js +78 -0
  139. package/lib/middleware/configMiddleware.d.ts +1 -1
  140. package/lib/middleware/configMiddleware.js +21 -81
  141. package/lib/middleware/fireAlarmMiddleware.js +15 -17
  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/projects/__tests__/AppDevModeInterface.test.js +14 -34
  149. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +70 -39
  150. package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
  151. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  152. package/lib/projects/__tests__/projects.test.js +12 -12
  153. package/lib/projects/__tests__/structure.test.js +3 -3
  154. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  155. package/lib/projects/__tests__/upload.test.js +82 -0
  156. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  157. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  158. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  159. package/lib/projects/create/__tests__/v3.test.js +1 -1
  160. package/lib/projects/create/index.js +2 -2
  161. package/lib/projects/create/legacy.js +2 -2
  162. package/lib/projects/create/v3.js +2 -2
  163. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  164. package/lib/projects/localDev/AppDevModeInterface.js +22 -20
  165. package/lib/projects/localDev/LocalDevLogger.js +10 -11
  166. package/lib/projects/localDev/LocalDevManager.js +4 -5
  167. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +0 -1
  168. package/lib/projects/localDev/LocalDevWebsocketServer.js +7 -10
  169. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  170. package/lib/projects/localDev/helpers/project.js +37 -0
  171. package/lib/projects/platformVersion.d.ts +1 -1
  172. package/lib/projects/platformVersion.js +1 -1
  173. package/lib/projects/structure.js +6 -6
  174. package/lib/projects/upload.d.ts +1 -1
  175. package/lib/projects/upload.js +17 -8
  176. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  177. package/lib/prompts/accountNamePrompt.js +14 -19
  178. package/lib/prompts/accountsPrompt.js +2 -2
  179. package/lib/prompts/cmsFieldPrompt.js +2 -2
  180. package/lib/prompts/createApiSamplePrompt.js +5 -5
  181. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  182. package/lib/prompts/createFunctionPrompt.js +14 -14
  183. package/lib/prompts/createModulePrompt.js +9 -9
  184. package/lib/prompts/createTemplatePrompt.js +2 -2
  185. package/lib/prompts/downloadProjectPrompt.js +5 -8
  186. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  187. package/lib/prompts/previewPrompt.js +6 -6
  188. package/lib/prompts/projectAddPrompt.js +6 -0
  189. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  190. package/lib/prompts/projectNamePrompt.js +4 -8
  191. package/lib/prompts/projectsLogsPrompt.js +2 -4
  192. package/lib/prompts/promptUtils.js +27 -9
  193. package/lib/prompts/sandboxesPrompt.js +7 -7
  194. package/lib/prompts/secretPrompt.js +3 -3
  195. package/lib/prompts/selectAppPrompt.js +3 -3
  196. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  197. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  198. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  199. package/lib/prompts/uploadPrompt.js +5 -5
  200. package/lib/sandboxSync.js +24 -41
  201. package/lib/sandboxes.js +19 -47
  202. package/lib/schema.js +3 -3
  203. package/lib/serverlessLogs.js +11 -13
  204. package/lib/theme/__tests__/migrate.test.js +3 -3
  205. package/lib/theme/migrate.js +2 -2
  206. package/lib/ui/SpinniesManager.d.ts +2 -0
  207. package/lib/ui/SpinniesManager.js +7 -0
  208. package/lib/ui/boxen.js +1 -2
  209. package/lib/ui/git.js +13 -10
  210. package/lib/ui/index.d.ts +4 -0
  211. package/lib/ui/index.js +47 -38
  212. package/lib/ui/serverlessFunctionLogs.js +9 -7
  213. package/lib/ui/uiMessages.d.ts +68 -0
  214. package/lib/ui/uiMessages.js +71 -0
  215. package/lib/usageTracking.js +7 -7
  216. package/lib/validation.js +20 -23
  217. package/lib/yargsUtils.d.ts +1 -1
  218. package/lib/yargsUtils.js +12 -5
  219. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  220. package/mcp-server/tools/index.js +4 -0
  221. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  222. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  223. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  224. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  225. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
  226. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  227. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  228. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  229. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  230. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  231. package/mcp-server/utils/toolUsageTracking.js +2 -2
  232. package/package.json +7 -7
  233. package/ui/components/BoxWithTitle.d.ts +8 -0
  234. package/ui/components/BoxWithTitle.js +9 -0
  235. package/ui/components/HorizontalSelectPrompt.d.ts +8 -0
  236. package/ui/components/HorizontalSelectPrompt.js +30 -0
  237. package/ui/components/StatusMessageBoxes.d.ts +12 -0
  238. package/ui/components/StatusMessageBoxes.js +31 -0
  239. package/ui/index.d.ts +1 -0
  240. package/ui/index.js +6 -0
  241. package/ui/lib/ui-testing-utils.d.ts +9 -0
  242. package/ui/lib/ui-testing-utils.js +47 -0
  243. package/ui/lib/useTerminalSize.d.ts +13 -0
  244. package/ui/lib/useTerminalSize.js +31 -0
  245. package/ui/styles.d.ts +18 -0
  246. package/ui/styles.js +18 -0
  247. package/ui/views/UiSandbox.d.ts +5 -0
  248. package/ui/views/UiSandbox.js +25 -0
  249. package/lib/middleware/__test__/utils.test.js +0 -51
  250. package/lib/middleware/utils.d.ts +0 -8
  251. package/lib/middleware/utils.js +0 -14
  252. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
package/commands/list.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import chalk from 'chalk';
2
2
  import { trackCommandUsage } from '../lib/usageTracking.js';
3
3
  import { isPathFolder } from '../lib/filesystem.js';
4
- import { logger } from '@hubspot/local-dev-lib/logger';
5
4
  import { logError } from '../lib/errorHandlers/index.js';
6
5
  import { getDirectoryContentsByPath } from '@hubspot/local-dev-lib/api/fileMapper';
7
6
  import { HUBSPOT_FOLDER, MARKETPLACE_FOLDER } from '../lib/constants.js';
8
- import { i18n } from '../lib/lang.js';
9
7
  import { EXIT_CODES } from '../lib/enums/exitCodes.js';
10
8
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
9
+ import { uiLogger } from '../lib/ui/logger.js';
10
+ import { commands } from '../lang/en.js';
11
11
  function addColorToContents(fileOrFolder) {
12
12
  if (!isPathFolder(fileOrFolder)) {
13
13
  return chalk.reset.cyan(fileOrFolder);
@@ -35,15 +35,13 @@ function sortContents(a, b) {
35
35
  return a.localeCompare(b);
36
36
  }
37
37
  const command = ['list [path]', 'ls [path]'];
38
- const describe = i18n(`commands.list.describe`);
38
+ const describe = commands.list.describe;
39
39
  async function handler(args) {
40
40
  const { path, derivedAccountId } = args;
41
41
  const directoryPath = path || '/';
42
42
  let contentsResp;
43
43
  trackCommandUsage('list', undefined, derivedAccountId);
44
- logger.debug(i18n(`commands.list.gettingPathContents`, {
45
- path: directoryPath,
46
- }));
44
+ uiLogger.debug(commands.list.gettingPathContents(directoryPath));
47
45
  try {
48
46
  const { data } = await getDirectoryContentsByPath(derivedAccountId, directoryPath);
49
47
  contentsResp = data;
@@ -53,9 +51,7 @@ async function handler(args) {
53
51
  process.exit(EXIT_CODES.ERROR);
54
52
  }
55
53
  if (!contentsResp.folder) {
56
- logger.info(i18n(`commands.list.noFilesFoundAtPath`, {
57
- path: directoryPath,
58
- }));
54
+ uiLogger.info(commands.list.noFilesFoundAtPath(directoryPath));
59
55
  return;
60
56
  }
61
57
  // getDirectoryContentsByPath omits @hubspot
@@ -63,21 +59,19 @@ async function handler(args) {
63
59
  ? ['@hubspot', ...contentsResp.children]
64
60
  : contentsResp.children;
65
61
  if (contents.length === 0) {
66
- logger.info(i18n(`commands.list.noFilesFoundAtPath`, {
67
- path: directoryPath,
68
- }));
62
+ uiLogger.info(commands.list.noFilesFoundAtPath(directoryPath));
69
63
  return;
70
64
  }
71
65
  const folderContentsOutput = contents
72
66
  .map(addColorToContents)
73
67
  .sort(sortContents)
74
68
  .join('\n');
75
- logger.log(folderContentsOutput);
69
+ uiLogger.log(folderContentsOutput);
76
70
  process.exit(EXIT_CODES.SUCCESS);
77
71
  }
78
72
  function cmsListBuilder(yargs) {
79
73
  yargs.positional('path', {
80
- describe: i18n(`commands.list.positionals.path.describe`),
74
+ describe: commands.list.positionals.path.describe,
81
75
  type: 'string',
82
76
  });
83
77
  yargs.example([['$0 list'], ['$0 list /'], ['$0 list my-modules']]);
package/commands/logs.js CHANGED
@@ -1,19 +1,16 @@
1
1
  import { trackCommandUsage } from '../lib/usageTracking.js';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
3
2
  import { outputLogs } from '../lib/ui/serverlessFunctionLogs.js';
4
3
  import { getFunctionLogs, getLatestFunctionLog, } from '@hubspot/local-dev-lib/api/functions';
5
4
  import { tailLogs } from '../lib/serverlessLogs.js';
6
- import { i18n } from '../lib/lang.js';
7
5
  import { promptUser } from '../lib/prompts/promptUtils.js';
8
6
  import { EXIT_CODES } from '../lib/enums/exitCodes.js';
9
7
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
10
8
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
9
+ import { uiLogger } from '../lib/ui/logger.js';
10
+ import { commands } from '../lang/en.js';
11
11
  const handleLogsError = (e, accountId, functionPath) => {
12
12
  if (isHubSpotHttpError(e) && (e.status === 404 || e.status == 400)) {
13
- logger.error(i18n(`commands.logs.errors.noLogsFound`, {
14
- accountId,
15
- functionPath,
16
- }));
13
+ uiLogger.error(commands.logs.errors.noLogsFound(functionPath, accountId));
17
14
  }
18
15
  };
19
16
  const endpointLog = async (accountId, functionPath, options) => {
@@ -24,10 +21,7 @@ const endpointLog = async (accountId, functionPath, options) => {
24
21
  follow,
25
22
  endpoint: functionPath,
26
23
  };
27
- logger.debug(i18n(`commands.logs.gettingLogs`, {
28
- latest,
29
- functionPath,
30
- }));
24
+ uiLogger.debug(commands.logs.gettingLogs(latest, functionPath));
31
25
  let logsResp;
32
26
  if (follow) {
33
27
  const tailCall = (after) => getFunctionLogs(accountId, functionPath, { after });
@@ -67,48 +61,48 @@ const endpointLog = async (accountId, functionPath, options) => {
67
61
  }
68
62
  };
69
63
  const command = 'logs [endpoint]';
70
- const describe = i18n(`commands.logs.describe`);
64
+ const describe = commands.logs.describe;
71
65
  const handler = async (options) => {
72
66
  const { endpoint: endpointArgValue, latest, derivedAccountId } = options;
73
67
  trackCommandUsage('logs', latest ? { action: 'latest' } : {}, derivedAccountId);
74
68
  const { endpointPromptValue } = await promptUser({
75
69
  name: 'endpointPromptValue',
76
- message: i18n(`commands.logs.endpointPrompt`),
70
+ message: commands.logs.endpointPrompt,
77
71
  when: !endpointArgValue,
78
72
  });
79
73
  await endpointLog(derivedAccountId, endpointArgValue || endpointPromptValue, options);
80
74
  };
81
75
  function logsBuilder(yargs) {
82
76
  yargs.positional('endpoint', {
83
- describe: i18n(`commands.logs.positionals.endpoint.describe`),
77
+ describe: commands.logs.positionals.endpoint.describe,
84
78
  type: 'string',
85
79
  });
86
80
  yargs
87
81
  .options({
88
82
  latest: {
89
83
  alias: 'l',
90
- describe: i18n(`commands.logs.options.latest.describe`),
84
+ describe: commands.logs.options.latest.describe,
91
85
  type: 'boolean',
92
86
  },
93
87
  compact: {
94
- describe: i18n(`commands.logs.options.compact.describe`),
88
+ describe: commands.logs.options.compact.describe,
95
89
  type: 'boolean',
96
90
  },
97
91
  follow: {
98
92
  alias: ['f'],
99
- describe: i18n(`commands.logs.options.follow.describe`),
93
+ describe: commands.logs.options.follow.describe,
100
94
  type: 'boolean',
101
95
  },
102
96
  limit: {
103
- describe: i18n(`commands.logs.options.limit.describe`),
97
+ describe: commands.logs.options.limit.describe,
104
98
  type: 'number',
105
99
  },
106
100
  })
107
101
  .conflicts('follow', 'limit');
108
102
  yargs.example([
109
- ['$0 logs my-endpoint', i18n(`commands.logs.examples.default`)],
110
- ['$0 logs my-endpoint --limit=10', i18n(`commands.logs.examples.limit`)],
111
- ['$0 logs my-endpoint --follow', i18n(`commands.logs.examples.follow`)],
103
+ ['$0 logs my-endpoint', commands.logs.examples.default],
104
+ ['$0 logs my-endpoint --limit=10', commands.logs.examples.limit],
105
+ ['$0 logs my-endpoint --follow', commands.logs.examples.follow],
112
106
  ]);
113
107
  return yargs;
114
108
  }
package/commands/mv.js CHANGED
@@ -1,12 +1,12 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
2
1
  import { moveFile } from '@hubspot/local-dev-lib/api/fileMapper';
3
2
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
4
3
  import { logError, ApiErrorContext } from '../lib/errorHandlers/index.js';
5
4
  import { trackCommandUsage } from '../lib/usageTracking.js';
6
5
  import { isPathFolder } from '../lib/filesystem.js';
7
- import { i18n } from '../lib/lang.js';
8
6
  import { uiBetaTag } from '../lib/ui/index.js';
9
7
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
8
+ import { uiLogger } from '../lib/ui/logger.js';
9
+ import { commands } from '../lang/en.js';
10
10
  function getCorrectedDestPath(srcPath, destPath) {
11
11
  if (!isPathFolder(srcPath)) {
12
12
  return destPath;
@@ -15,29 +15,18 @@ function getCorrectedDestPath(srcPath, destPath) {
15
15
  return `${destPath}/${srcPath.split('/').pop()}`;
16
16
  }
17
17
  const command = 'mv <srcPath> <destPath>';
18
- const describe = uiBetaTag(i18n(`commands.mv.describe`), false);
18
+ const describe = uiBetaTag(commands.mv.describe, false);
19
19
  async function handler(args) {
20
20
  const { srcPath, destPath, derivedAccountId } = args;
21
21
  trackCommandUsage('mv', undefined, derivedAccountId);
22
22
  try {
23
23
  await moveFile(derivedAccountId, srcPath, getCorrectedDestPath(srcPath, destPath));
24
- logger.success(i18n(`commands.mv.move`, {
25
- accountId: derivedAccountId,
26
- destPath,
27
- srcPath,
28
- }));
24
+ uiLogger.success(commands.mv.move(srcPath, destPath, derivedAccountId));
29
25
  }
30
26
  catch (error) {
31
- logger.error(i18n(`commands.mv.errors.moveFailed`, {
32
- accountId: derivedAccountId,
33
- destPath,
34
- srcPath,
35
- }));
27
+ uiLogger.error(commands.mv.errors.moveFailed(srcPath, destPath, derivedAccountId));
36
28
  if (isSpecifiedError(error, { statusCode: 409 })) {
37
- logger.error(i18n(`commands.mv.errors.sourcePathExists`, {
38
- destPath,
39
- srcPath,
40
- }));
29
+ uiLogger.error(commands.mv.errors.sourcePathExists(srcPath, destPath));
41
30
  }
42
31
  else {
43
32
  logError(error, new ApiErrorContext({
package/commands/open.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { trackCommandUsage } from '../lib/usageTracking.js';
2
2
  import { logSiteLinks, getSiteLinksAsArray, openLink } from '../lib/links.js';
3
3
  import { promptUser } from '../lib/prompts/promptUtils.js';
4
- import { i18n } from '../lib/lang.js';
4
+ import { commands } from '../lang/en.js';
5
5
  import { EXIT_CODES } from '../lib/enums/exitCodes.js';
6
6
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
7
7
  const separator = ' => ';
@@ -10,7 +10,7 @@ async function createListPrompt(accountId) {
10
10
  name: 'open',
11
11
  type: 'rawlist',
12
12
  pageSize: 20,
13
- message: i18n('commands.open.selectLink'),
13
+ message: commands.open.selectLink,
14
14
  choices: getSiteLinksAsArray(accountId)
15
15
  .filter(l => !!l.url)
16
16
  .map(l => ({
@@ -20,7 +20,7 @@ async function createListPrompt(accountId) {
20
20
  });
21
21
  }
22
22
  const command = 'open [shortcut]';
23
- const describe = i18n('commands.open.describe');
23
+ const describe = commands.open.describe;
24
24
  async function handler(args) {
25
25
  const { shortcut, list, derivedAccountId } = args;
26
26
  trackCommandUsage('open', undefined, derivedAccountId);
@@ -38,12 +38,12 @@ async function handler(args) {
38
38
  }
39
39
  function openBuilder(yargs) {
40
40
  yargs.positional('[shortcut]', {
41
- describe: i18n('commands.open.positionals.shortcut.describe'),
41
+ describe: commands.open.positionals.shortcut.describe,
42
42
  type: 'string',
43
43
  });
44
44
  yargs.option('list', {
45
45
  alias: 'l',
46
- describe: i18n('commands.open.options.list.describe'),
46
+ describe: commands.open.options.list.describe,
47
47
  type: 'boolean',
48
48
  });
49
49
  yargs.example([
@@ -4,9 +4,11 @@ import { marketplaceDistribution, oAuth, privateDistribution, staticAuth, } from
4
4
  import { v3AddComponent } from '../../../lib/projects/add/v3AddComponent.js';
5
5
  import { legacyAddComponent } from '../../../lib/projects/add/legacyAddComponent.js';
6
6
  import { getProjectConfig } from '../../../lib/projects/config.js';
7
- import { useV3Api } from '../../../lib/projects/platformVersion.js';
7
+ import { isV2Project } from '../../../lib/projects/platformVersion.js';
8
8
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
9
9
  vi.mock('../../../lib/commonOpts');
10
+ vi.mock('../../../lib/ui/logger.js');
11
+ vi.mock('../../../lib/errorHandlers/index.js');
10
12
  vi.mock('../../../lib/projects/add/v3AddComponent');
11
13
  vi.mock('../../../lib/projects/add/legacyAddComponent');
12
14
  vi.mock('../../../lib/projects/config');
@@ -15,7 +17,7 @@ vi.mock('../../../lib/usageTracking');
15
17
  const mockedV3AddComponent = vi.mocked(v3AddComponent);
16
18
  const mockedLegacyAddComponent = vi.mocked(legacyAddComponent);
17
19
  const mockedGetProjectConfig = vi.mocked(getProjectConfig);
18
- const mockedUseV3Api = vi.mocked(useV3Api);
20
+ const mockedUseV3Api = vi.mocked(isV2Project);
19
21
  const mockedTrackCommandUsage = vi.mocked(trackCommandUsage);
20
22
  describe('commands/project/add', () => {
21
23
  const yargsMock = yargs;
@@ -1,7 +1,6 @@
1
1
  import { HttpStatusCode } from 'axios';
2
2
  import yargs from 'yargs';
3
3
  import chalk from 'chalk';
4
- import { logger } from '@hubspot/local-dev-lib/logger';
5
4
  import * as configUtils from '@hubspot/local-dev-lib/config';
6
5
  import * as projectApiUtils from '@hubspot/local-dev-lib/api/projects';
7
6
  import * as ui from '../../../lib/ui/index.js';
@@ -29,7 +28,7 @@ vi.mock('../../../lib/prompts/projectNamePrompt');
29
28
  vi.mock('../../../lib/prompts/promptUtils');
30
29
  vi.mock('../../../lib/usageTracking');
31
30
  vi.mock('../../../lib/ui/logger');
32
- vi.mock('@hubspot/local-dev-lib/logger');
31
+ vi.mock('../../ui/logger.js');
33
32
  vi.spyOn(ui, 'uiLine');
34
33
  const uiCommandReferenceSpy = vi.spyOn(ui, 'uiCommandReference');
35
34
  const uiAccountDescriptionSpy = vi.spyOn(ui, 'uiAccountDescription');
@@ -297,8 +296,8 @@ describe('commands/project/deploy', () => {
297
296
  });
298
297
  });
299
298
  await projectDeployCommand.handler(args);
300
- expect(logger.error).toHaveBeenCalledTimes(1);
301
- expect(logger.error).toHaveBeenCalledWith(`The request for 'project deploy' in account ${args.derivedAccountId} failed due to a client error.`);
299
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
300
+ expect(uiLogger.error).toHaveBeenCalledWith(`The request for 'project deploy' in account ${args.derivedAccountId} failed due to a client error.`);
302
301
  expect(processExitSpy).toHaveBeenCalledTimes(1);
303
302
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
304
303
  });
@@ -1,13 +1,13 @@
1
1
  import yargs from 'yargs';
2
2
  import path from 'path';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
3
+ import { uiLogger } from '../../../lib/ui/logger.js';
4
4
  import * as projectUtils from '../../../lib/projects/config.js';
5
5
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
6
6
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
7
7
  import * as dependencyManagement from '../../../lib/dependencyManagement.js';
8
8
  import * as promptUtils from '../../../lib/prompts/promptUtils.js';
9
9
  import projectInstallDepsCommand from '../installDeps.js';
10
- vi.mock('@hubspot/local-dev-lib/logger');
10
+ vi.mock('../../../lib/ui/logger.js');
11
11
  vi.mock('../../../lib/projects/config');
12
12
  vi.mock('../../../lib/dependencyManagement');
13
13
  vi.mock('../../../lib/prompts/promptUtils');
@@ -56,8 +56,8 @@ describe('commands/project/installDeps', () => {
56
56
  throw error;
57
57
  });
58
58
  await projectInstallDepsCommand.handler(args);
59
- expect(logger.error).toHaveBeenCalledTimes(1);
60
- expect(logger.error).toHaveBeenCalledWith(error.message);
59
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
60
+ expect(uiLogger.error).toHaveBeenCalledWith(error.message);
61
61
  expect(processExitSpy).toHaveBeenCalledTimes(1);
62
62
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
63
63
  });
@@ -67,8 +67,8 @@ describe('commands/project/installDeps', () => {
67
67
  projectConfig: null,
68
68
  });
69
69
  await projectInstallDepsCommand.handler(args);
70
- expect(logger.error).toHaveBeenCalledTimes(1);
71
- expect(logger.error).toHaveBeenCalledWith('No project detected. Run this command from a project directory.');
70
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
71
+ expect(uiLogger.error).toHaveBeenCalledWith('No project detected. Run this command from a project directory.');
72
72
  expect(processExitSpy).toHaveBeenCalledTimes(1);
73
73
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
74
74
  });
@@ -78,8 +78,8 @@ describe('commands/project/installDeps', () => {
78
78
  projectConfig: null,
79
79
  });
80
80
  await projectInstallDepsCommand.handler(args);
81
- expect(logger.error).toHaveBeenCalledTimes(1);
82
- expect(logger.error).toHaveBeenCalledWith('No project detected. Run this command from a project directory.');
81
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
82
+ expect(uiLogger.error).toHaveBeenCalledWith('No project detected. Run this command from a project directory.');
83
83
  expect(processExitSpy).toHaveBeenCalledTimes(1);
84
84
  expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
85
85
  });
@@ -8,7 +8,7 @@ import * as ui from '../../../lib/ui/index.js';
8
8
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
9
9
  import { logError } from '../../../lib/errorHandlers/index.js';
10
10
  import projectLogsCommand from '../logs.js';
11
- vi.mock('@hubspot/local-dev-lib/logger');
11
+ vi.mock('../../ui/logger.js');
12
12
  vi.mock('../../../lib/commonOpts');
13
13
  vi.mock('../../../lib/usageTracking');
14
14
  vi.mock('../../../lib/validation');
@@ -1,12 +1,12 @@
1
1
  import yargs from 'yargs';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
2
+ import { uiLogger } from '../../../lib/ui/logger.js';
3
3
  import { PLATFORM_VERSIONS } from '@hubspot/local-dev-lib/constants/projects';
4
4
  import migrateCommand from '../migrate.js';
5
5
  import { migrateApp2025_2 } from '../../../lib/app/migrate.js';
6
6
  import { getProjectConfig } from '../../../lib/projects/config.js';
7
7
  import { commands } from '../../../lang/en.js';
8
8
  import { uiBetaTag, uiCommandReference } from '../../../lib/ui/index.js';
9
- vi.mock('@hubspot/local-dev-lib/logger');
9
+ vi.mock('../../../lib/ui/logger.js');
10
10
  vi.mock('../../../lib/app/migrate');
11
11
  vi.mock('../../../lib/projects/config');
12
12
  vi.mock('../../../lib/ui');
@@ -24,8 +24,8 @@ describe('commands/project/migrate', () => {
24
24
  .mockImplementation(() => undefined);
25
25
  beforeEach(() => {
26
26
  // Mock logger methods
27
- vi.spyOn(logger, 'log').mockImplementation(() => { });
28
- vi.spyOn(logger, 'error').mockImplementation(() => { });
27
+ vi.spyOn(uiLogger, 'log').mockImplementation(() => { });
28
+ vi.spyOn(uiLogger, 'error').mockImplementation(() => { });
29
29
  migrateApp2025_2Mock.mockResolvedValue(undefined);
30
30
  getProjectConfigMock.mockResolvedValue({
31
31
  projectConfig: { name: 'test-project' },
@@ -74,7 +74,7 @@ describe('commands/project/migrate', () => {
74
74
  it('should exit with error if no project config exists', async () => {
75
75
  getProjectConfigMock.mockResolvedValue({ projectConfig: null });
76
76
  await migrateCommand.handler(options);
77
- expect(logger.error).toHaveBeenCalledWith(commands.project.migrate.errors.noProjectConfig('command reference'));
77
+ expect(uiLogger.error).toHaveBeenCalledWith(commands.project.migrate.errors.noProjectConfig('command reference'));
78
78
  expect(mockExit).toHaveBeenCalledWith(1);
79
79
  expect(mockExit).toHaveBeenCalledTimes(1);
80
80
  });
@@ -1,11 +1,10 @@
1
1
  import yargs from 'yargs';
2
- import { i18n } from '../../../lib/lang.js';
3
2
  import { uiCommandReference, uiDeprecatedTag } from '../../../lib/ui/index.js';
4
3
  import { handlerGenerator } from '../../app/migrate.js';
5
4
  import { PLATFORM_VERSIONS } from '@hubspot/local-dev-lib/constants/projects';
6
5
  import migrateAppCommand from '../migrateApp.js';
7
- vi.mock('@hubspot/local-dev-lib/logger');
8
- vi.mock('../../../lib/lang');
6
+ vi.mock('../../ui/logger.js');
7
+ vi.mock('../../../lang/en.js');
9
8
  vi.mock('../../../lib/ui');
10
9
  vi.mock('../../app/migrate');
11
10
  const { v2023_2, v2025_2 } = PLATFORM_VERSIONS;
@@ -14,13 +13,11 @@ describe('commands/project/migrateApp', () => {
14
13
  const optionsSpy = vi.spyOn(yargsMock, 'options').mockReturnValue(yargsMock);
15
14
  const exampleSpy = vi.spyOn(yargsMock, 'example').mockReturnValue(yargsMock);
16
15
  // Mock the imported functions
17
- const i18nMock = i18n;
18
16
  const uiDeprecatedTagMock = uiDeprecatedTag;
19
17
  const uiCommandReferenceMock = uiCommandReference;
20
18
  const handlerGeneratorMock = handlerGenerator;
21
19
  beforeEach(() => {
22
20
  vi.clearAllMocks();
23
- i18nMock.mockReturnValue('test description');
24
21
  uiDeprecatedTagMock.mockReturnValue('deprecated test description');
25
22
  uiCommandReferenceMock.mockReturnValue('command reference');
26
23
  handlerGeneratorMock.mockReturnValue(vi.fn().mockResolvedValue(undefined));
@@ -0,0 +1,98 @@
1
+ import path from 'path';
2
+ import { vi } from 'vitest';
3
+ import { validateSourceDirectory } from '../../../lib/projects/upload.js';
4
+ import { getProjectConfig, validateProjectConfig, } from '../../../lib/projects/config.js';
5
+ import { uiLogger } from '../../../lib/ui/logger.js';
6
+ import { commands } from '../../../lang/en.js';
7
+ import { isV2Project } from '../../../lib/projects/platformVersion.js';
8
+ import { loadAndValidateProfile } from '../../../lib/projectProfiles.js';
9
+ import { trackCommandUsage } from '../../../lib/usageTracking.js';
10
+ import { getAccountConfig } from '@hubspot/local-dev-lib/config';
11
+ import { handleTranslate } from '../../../lib/projects/upload.js';
12
+ import projectValidateCommand from '../validate.js';
13
+ // Mock dependencies
14
+ vi.mock('../../../lib/projects/upload.js');
15
+ vi.mock('../../../lib/projects/config.js');
16
+ vi.mock('../../../lib/ui/logger.js');
17
+ vi.mock('../../../lib/usageTracking.js');
18
+ vi.mock('../../../lib/projectProfiles.js');
19
+ vi.mock('../../../lib/errorHandlers/index.js');
20
+ vi.mock('@hubspot/local-dev-lib/config');
21
+ vi.mock('../../../lib/projects/platformVersion.js');
22
+ describe('commands/project/validate', () => {
23
+ const projectDir = '/test/project';
24
+ let exitSpy;
25
+ beforeEach(() => {
26
+ // Mock process.exit to throw to stop execution
27
+ exitSpy = vi.spyOn(process, 'exit').mockImplementation(code => {
28
+ throw new Error(`Process exited with code ${code}`);
29
+ });
30
+ vi.clearAllMocks();
31
+ });
32
+ afterEach(() => {
33
+ exitSpy.mockRestore();
34
+ });
35
+ describe('project configuration validation', () => {
36
+ it('should exit with error when project config is null', async () => {
37
+ vi.mocked(getProjectConfig).mockResolvedValue({
38
+ projectConfig: null,
39
+ projectDir: null,
40
+ });
41
+ await expect(
42
+ // @ts-expect-error partial mock
43
+ projectValidateCommand.handler({
44
+ derivedAccountId: 123,
45
+ d: false,
46
+ debug: false,
47
+ })).rejects.toThrow('Process exited with code 1');
48
+ expect(uiLogger.error).toHaveBeenCalledWith(commands.project.validate.mustBeRanWithinAProject);
49
+ });
50
+ it('should exit with error when project directory is null', async () => {
51
+ vi.mocked(getProjectConfig).mockResolvedValue({
52
+ projectConfig: {
53
+ name: 'test',
54
+ srcDir: 'src',
55
+ platformVersion: '2025.2',
56
+ },
57
+ projectDir: null,
58
+ });
59
+ await expect(
60
+ // @ts-expect-error partial mock
61
+ projectValidateCommand.handler({
62
+ derivedAccountId: 123,
63
+ d: false,
64
+ debug: false,
65
+ })).rejects.toThrow('Process exited with code 1');
66
+ expect(uiLogger.error).toHaveBeenCalledWith(commands.project.validate.mustBeRanWithinAProject);
67
+ });
68
+ });
69
+ it('should call validateSourceDirectory with correct parameters', async () => {
70
+ const mockProjectConfig = {
71
+ name: 'test-project',
72
+ srcDir: 'src',
73
+ platformVersion: '2025.2',
74
+ };
75
+ vi.mocked(getProjectConfig).mockResolvedValue({
76
+ projectConfig: mockProjectConfig,
77
+ projectDir,
78
+ });
79
+ vi.mocked(isV2Project).mockReturnValue(true);
80
+ vi.mocked(validateProjectConfig).mockReturnValue(undefined);
81
+ vi.mocked(loadAndValidateProfile).mockResolvedValue(123);
82
+ vi.mocked(getAccountConfig).mockReturnValue({
83
+ accountType: 'STANDARD',
84
+ accountId: 123,
85
+ env: 'prod',
86
+ });
87
+ vi.mocked(trackCommandUsage);
88
+ vi.mocked(validateSourceDirectory).mockResolvedValue(undefined);
89
+ vi.mocked(handleTranslate).mockResolvedValue(undefined);
90
+ await expect(projectValidateCommand.handler({
91
+ derivedAccountId: 123,
92
+ d: false,
93
+ debug: false,
94
+ })).rejects.toThrow('Process exited with code 0');
95
+ const expectedSrcDir = path.resolve(projectDir, mockProjectConfig.srcDir);
96
+ expect(validateSourceDirectory).toHaveBeenCalledWith(expectedSrcDir, mockProjectConfig, projectDir);
97
+ });
98
+ });
@@ -3,7 +3,7 @@ import { getProjectConfig } from '../../lib/projects/config.js';
3
3
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
4
4
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
5
5
  import { commands } from '../../lang/en.js';
6
- import { useV3Api } from '../../lib/projects/platformVersion.js';
6
+ import { isV2Project } from '../../lib/projects/platformVersion.js';
7
7
  import { legacyAddComponent } from '../../lib/projects/add/legacyAddComponent.js';
8
8
  import { v3AddComponent } from '../../lib/projects/add/v3AddComponent.js';
9
9
  import { marketplaceDistribution, oAuth, privateDistribution, staticAuth, } from '../../lib/constants.js';
@@ -18,8 +18,8 @@ async function handler(args) {
18
18
  uiLogger.error(commands.project.add.error.locationInProject);
19
19
  process.exit(EXIT_CODES.ERROR);
20
20
  }
21
- const isV3ProjectCreate = useV3Api(projectConfig.platformVersion);
22
- if (isV3ProjectCreate) {
21
+ const isV2ProjectCreate = isV2Project(projectConfig.platformVersion);
22
+ if (isV2ProjectCreate) {
23
23
  await v3AddComponent(args, projectDir, projectConfig, derivedAccountId);
24
24
  }
25
25
  else {
@@ -1,7 +1,7 @@
1
1
  import path from 'path';
2
2
  import fs from 'fs';
3
3
  import { trackCommandUsage, trackCommandMetadataUsage, } from '../../lib/usageTracking.js';
4
- import { i18n } from '../../lib/lang.js';
4
+ import { commands } from '../../lang/en.js';
5
5
  import { selectPublicAppForMigrationPrompt } from '../../lib/prompts/selectPublicAppForMigrationPrompt.js';
6
6
  import { projectNameAndDestPrompt } from '../../lib/prompts/projectNameAndDestPrompt.js';
7
7
  import { poll } from '../../lib/polling.js';
@@ -12,7 +12,7 @@ import { writeProjectConfig } from '../../lib/projects/config.js';
12
12
  import { PROJECT_CONFIG_FILE } from '../../lib/constants.js';
13
13
  import { cloneApp, checkCloneStatus, downloadClonedProject, } from '@hubspot/local-dev-lib/api/projects';
14
14
  import { getCwd, sanitizeFileName } from '@hubspot/local-dev-lib/path';
15
- import { logger } from '@hubspot/local-dev-lib/logger';
15
+ import { uiLogger } from '../../lib/ui/logger.js';
16
16
  import { extractZipArchive } from '@hubspot/local-dev-lib/archive';
17
17
  import { getAccountConfig } from '@hubspot/local-dev-lib/config';
18
18
  import SpinniesManager from '../../lib/ui/SpinniesManager.js';
@@ -20,7 +20,7 @@ import { logInvalidAccountError } from '../../lib/app/migrate.js';
20
20
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
21
21
  import { uiDeprecatedTag, uiLine, uiAccountDescription, } from '../../lib/ui/index.js';
22
22
  const command = 'clone-app';
23
- const describe = uiDeprecatedTag(i18n(`commands.project.subcommands.cloneApp.describe`), false);
23
+ const describe = uiDeprecatedTag(commands.project.cloneApp.describe, false);
24
24
  const deprecated = true;
25
25
  async function handler(args) {
26
26
  const { derivedAccountId } = args;
@@ -28,7 +28,7 @@ async function handler(args) {
28
28
  const accountConfig = getAccountConfig(derivedAccountId);
29
29
  const accountName = uiAccountDescription(derivedAccountId);
30
30
  if (!accountConfig) {
31
- throw new Error(i18n(`commands.projects.subcommands.cloneApp.errors.noAccountConfig`));
31
+ throw new Error(commands.project.cloneApp.errors.noAccountConfig(derivedAccountId));
32
32
  }
33
33
  const defaultAccountIsUnified = await isUnifiedAccount(accountConfig);
34
34
  if (!isAppDeveloperAccount(accountConfig) && !defaultAccountIsUnified) {
@@ -60,7 +60,7 @@ async function handler(args) {
60
60
  try {
61
61
  SpinniesManager.init();
62
62
  SpinniesManager.add('cloneApp', {
63
- text: i18n(`commands.project.subcommands.cloneApp.cloneStatus.inProgress`),
63
+ text: commands.project.cloneApp.cloneStatus.inProgress,
64
64
  });
65
65
  const { data: { exportId }, } = await cloneApp(derivedAccountId, appId);
66
66
  const { status } = await poll(() => checkCloneStatus(derivedAccountId, exportId));
@@ -84,25 +84,23 @@ async function handler(args) {
84
84
  };
85
85
  const success = writeProjectConfig(configPath, configContent);
86
86
  SpinniesManager.succeed('cloneApp', {
87
- text: i18n(`commands.project.subcommands.cloneApp.cloneStatus.done`),
87
+ text: commands.project.cloneApp.cloneStatus.done,
88
88
  succeedColor: 'white',
89
89
  });
90
90
  if (!success) {
91
- logger.error(i18n(`commands.project.subcommands.cloneApp.errors.couldNotWriteConfigPath`), configPath);
91
+ uiLogger.error(commands.project.cloneApp.errors.couldNotWriteConfigPath(configPath));
92
92
  }
93
- logger.log('');
93
+ uiLogger.log('');
94
94
  uiLine();
95
- logger.success(i18n(`commands.project.subcommands.cloneApp.cloneStatus.success`, {
96
- dest: projectDest,
97
- }));
98
- logger.log('');
95
+ uiLogger.success(commands.project.cloneApp.cloneStatus.success(projectDest));
96
+ uiLogger.log('');
99
97
  process.exit(EXIT_CODES.SUCCESS);
100
98
  }
101
99
  }
102
100
  catch (error) {
103
101
  await trackCommandMetadataUsage('clone-app', { successful: false }, derivedAccountId);
104
102
  SpinniesManager.fail('cloneApp', {
105
- text: i18n(`commands.project.subcommands.cloneApp.cloneStatus.failure`),
103
+ text: commands.project.cloneApp.cloneStatus.failure,
106
104
  failColor: 'white',
107
105
  });
108
106
  // Migrations endpoints return a response object with an errors property. The errors property contains an array of errors.
@@ -122,19 +120,16 @@ async function handler(args) {
122
120
  function cloneAppBuilder(yargs) {
123
121
  yargs.options({
124
122
  dest: {
125
- describe: i18n(`commands.project.subcommands.cloneApp.options.dest.describe`),
123
+ describe: commands.project.cloneApp.options.dest.describe,
126
124
  type: 'string',
127
125
  },
128
126
  'app-id': {
129
- describe: i18n(`commands.project.subcommands.cloneApp.options.appId.describe`),
127
+ describe: commands.project.cloneApp.options.appId.describe,
130
128
  type: 'number',
131
129
  },
132
130
  });
133
131
  yargs.example([
134
- [
135
- '$0 project clone-app',
136
- i18n(`commands.project.subcommands.cloneApp.examples.default`),
137
- ],
132
+ ['$0 project clone-app', commands.project.cloneApp.examples.default],
138
133
  ]);
139
134
  return yargs;
140
135
  }