@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,8 +1,8 @@
1
1
  import SpinniesManager from '../../lib/ui/SpinniesManager.js';
2
- import { logger } from '@hubspot/local-dev-lib/logger';
3
2
  import { getTableContents, getTableHeader } from '../../lib/ui/table.js';
4
3
  import { promptUser } from '../../lib/prompts/promptUtils.js';
5
- import { i18n } from '../../lib/lang.js';
4
+ import { commands } from '../../lang/en.js';
5
+ import { uiLogger } from '../../lib/ui/logger.js';
6
6
  import { fetchThemes } from '@hubspot/local-dev-lib/api/designManager';
7
7
  import { requestLighthouseScore, getLighthouseScoreStatus, getLighthouseScore, } from '@hubspot/local-dev-lib/api/lighthouseScore';
8
8
  import { HUBSPOT_FOLDER, MARKETPLACE_FOLDER } from '../../lib/constants.js';
@@ -45,14 +45,14 @@ async function selectTheme(accountId) {
45
45
  }
46
46
  }
47
47
  catch (err) {
48
- logger.error(i18n(`commands.cms.subcommands.lighthouseScore.errors.failedToFetchThemes`));
48
+ uiLogger.error(commands.cms.subcommands.lighthouseScore.errors.failedToFetchThemes);
49
49
  process.exit(EXIT_CODES.ERROR);
50
50
  }
51
51
  const { theme: selectedTheme } = await promptUser([
52
52
  {
53
53
  type: 'list',
54
54
  name: 'theme',
55
- message: i18n(`commands.cms.subcommands.lighthouseScore.info.promptMessage`),
55
+ message: commands.cms.subcommands.lighthouseScore.info.promptMessage,
56
56
  choices: themes,
57
57
  },
58
58
  ]);
@@ -75,15 +75,13 @@ async function handler(args) {
75
75
  isValidTheme = false;
76
76
  }
77
77
  if (!isValidTheme) {
78
- logger.error(i18n(`commands.cms.subcommands.lighthouseScore.errors.themeNotFound`, {
79
- theme: themeToCheck,
80
- }));
78
+ uiLogger.error(commands.cms.subcommands.lighthouseScore.errors.themeNotFound(themeToCheck));
81
79
  process.exit(EXIT_CODES.ERROR);
82
80
  }
83
81
  }
84
82
  else {
85
83
  themeToCheck = await selectTheme(derivedAccountId);
86
- logger.log();
84
+ uiLogger.log('');
87
85
  }
88
86
  // Kick off the scoring
89
87
  let requestResult;
@@ -94,17 +92,17 @@ async function handler(args) {
94
92
  requestResult = data;
95
93
  }
96
94
  catch (err) {
97
- logger.debug(err);
95
+ uiLogger.debug(err);
98
96
  }
99
97
  if (!requestResult || !requestResult.mobileId || !requestResult.desktopId) {
100
- logger.error(i18n(`commands.cms.subcommands.lighthouseScore.errors.failedToGetLighthouseScore`));
98
+ uiLogger.error(commands.cms.subcommands.lighthouseScore.errors.failedToGetLighthouseScore);
101
99
  process.exit(EXIT_CODES.ERROR);
102
100
  }
103
101
  // Poll till scoring is finished
104
102
  try {
105
103
  SpinniesManager.init();
106
104
  SpinniesManager.add('lighthouseScore', {
107
- text: i18n(`commands.cms.subcommands.lighthouseScore.info.generatingScore`, { theme: themeToCheck }),
105
+ text: commands.cms.subcommands.lighthouseScore.info.generatingScore(themeToCheck),
108
106
  });
109
107
  async function checkScoreStatus() {
110
108
  let desktopScoreStatus = 'COMPLETED';
@@ -131,7 +129,7 @@ async function handler(args) {
131
129
  SpinniesManager.remove('lighthouseScore');
132
130
  }
133
131
  catch (err) {
134
- logger.debug(err);
132
+ uiLogger.debug(err);
135
133
  process.exit(EXIT_CODES.ERROR);
136
134
  }
137
135
  // Fetch the scoring results
@@ -166,16 +164,17 @@ async function handler(args) {
166
164
  }
167
165
  }
168
166
  catch (err) {
169
- logger.error(i18n(`commands.cms.subcommands.lighthouseScore.errors.failedToGetLighthouseScore`));
167
+ uiLogger.error(commands.cms.subcommands.lighthouseScore.errors.failedToGetLighthouseScore);
170
168
  process.exit(EXIT_CODES.ERROR);
171
169
  }
172
170
  if (verbose) {
173
171
  const scoreResult = target === 'desktop' ? desktopScoreResult : mobileScoreResult;
174
172
  if (!verboseViewAverageScoreResult || !scoreResult) {
175
- logger.error(i18n(`commands.cms.subcommands.lighthouseScore.errors.failedToGetLighthouseScore`));
173
+ uiLogger.error(commands.cms.subcommands.lighthouseScore.errors
174
+ .failedToGetLighthouseScore);
176
175
  process.exit(EXIT_CODES.ERROR);
177
176
  }
178
- logger.log(`${themeToCheck} ${target} scores`);
177
+ uiLogger.log(commands.cms.subcommands.lighthouseScore.info.themeToCheckTitle(themeToCheck, target));
179
178
  const tableHeader = getTableHeader(DEFAULT_TABLE_HEADER);
180
179
  const scores = verboseViewAverageScoreResult.scores
181
180
  ? verboseViewAverageScoreResult.scores[0]
@@ -187,10 +186,10 @@ async function handler(args) {
187
186
  scores.pwaScore,
188
187
  scores.seoScore,
189
188
  ];
190
- logger.log(getTableContents([tableHeader, averageTableData], {
189
+ uiLogger.log(getTableContents([tableHeader, averageTableData], {
191
190
  border: { bodyLeft: ' ' },
192
191
  }));
193
- logger.log(i18n(`commands.cms.subcommands.lighthouseScore.info.pageTemplateScoreTitle`));
192
+ uiLogger.log(commands.cms.subcommands.lighthouseScore.info.pageTemplateScoreTitle);
194
193
  const table2Header = getTableHeader([
195
194
  'Template path',
196
195
  ...DEFAULT_TABLE_HEADER,
@@ -205,29 +204,27 @@ async function handler(args) {
205
204
  score.seoScore,
206
205
  ];
207
206
  });
208
- logger.log(getTableContents([table2Header, ...templateTableData], {
207
+ uiLogger.log(getTableContents([table2Header, ...templateTableData], {
209
208
  border: { bodyLeft: ' ' },
210
209
  }));
211
- logger.log(i18n(`commands.cms.subcommands.lighthouseScore.info.lighthouseLinksTitle`));
210
+ uiLogger.log(commands.cms.subcommands.lighthouseScore.info.lighthouseLinksTitle);
212
211
  scoreResult.scores.forEach(score => {
213
212
  if (score.templatePath && score.link) {
214
- logger.log(' ', uiLink(score.templatePath, score.link));
213
+ uiLogger.log(` ${uiLink(score.templatePath, score.link)}`);
215
214
  }
216
215
  });
217
216
  if (scoreResult.failedTemplatePaths.length) {
218
- logger.log();
219
- logger.error(i18n(`commands.cms.subcommands.lighthouseScore.info.failedTemplatePathsTitle`));
217
+ uiLogger.log('');
218
+ uiLogger.error(commands.cms.subcommands.lighthouseScore.info.failedTemplatePathsTitle);
220
219
  scoreResult.failedTemplatePaths.forEach(failedTemplatePath => {
221
- logger.log(' ', failedTemplatePath);
220
+ uiLogger.log(` ${failedTemplatePath}`);
222
221
  });
223
222
  }
224
- logger.log();
225
- logger.info(i18n(`commands.cms.subcommands.lighthouseScore.info.targetDeviceNote`, {
226
- target,
227
- }));
223
+ uiLogger.log('');
224
+ uiLogger.info(commands.cms.subcommands.lighthouseScore.info.targetDeviceNote(target));
228
225
  }
229
226
  else {
230
- logger.log(`Theme: ${themeToCheck}`);
227
+ uiLogger.log(commands.cms.subcommands.lighthouseScore.info.themeTitle(themeToCheck));
231
228
  const tableHeader = getTableHeader(['Target', ...DEFAULT_TABLE_HEADER]);
232
229
  const getTableData = (target, scoreResult) => {
233
230
  const scores = scoreResult?.scores ? scoreResult.scores[0] : EMPTY_SCORE;
@@ -244,35 +241,35 @@ async function handler(args) {
244
241
  getTableData('desktop', desktopScoreResult),
245
242
  getTableData('mobile', mobileScoreResult),
246
243
  ];
247
- logger.log(getTableContents([tableHeader, ...tableData], {
244
+ uiLogger.log(getTableContents([tableHeader, ...tableData], {
248
245
  border: { bodyLeft: ' ' },
249
246
  }));
250
- logger.info(i18n(`commands.cms.subcommands.lighthouseScore.info.verboseOptionNote`));
247
+ uiLogger.info(commands.cms.subcommands.lighthouseScore.info.verboseOptionNote);
251
248
  }
252
- logger.log();
253
- logger.log(`Powered by ${uiLink('Google Lighthouse', 'https://developer.chrome.com/docs/lighthouse/overview/')}.`);
249
+ uiLogger.log('');
250
+ uiLogger.log(commands.cms.subcommands.lighthouseScore.info.poweredByLink);
254
251
  process.exit(EXIT_CODES.SUCCESS);
255
252
  }
256
253
  function cmslighthouseScoreBuilder(yargs) {
257
254
  yargs.option('theme', {
258
- describe: i18n(`commands.cms.subcommands.lighthouseScore.options.theme.describe`),
255
+ describe: commands.cms.subcommands.lighthouseScore.options.theme.describe,
259
256
  type: 'string',
260
257
  });
261
258
  yargs.option('target', {
262
- describe: i18n(`commands.cms.subcommands.lighthouseScore.options.target.describe`),
259
+ describe: commands.cms.subcommands.lighthouseScore.options.target.describe,
263
260
  type: 'string',
264
261
  choices: ['desktop', 'mobile'],
265
262
  default: 'desktop',
266
263
  });
267
264
  yargs.option('verbose', {
268
- describe: i18n(`commands.cms.subcommands.lighthouseScore.options.verbose.describe`),
265
+ describe: commands.cms.subcommands.lighthouseScore.options.verbose.describe,
269
266
  boolean: true,
270
267
  default: false,
271
268
  });
272
269
  yargs.example([
273
270
  [
274
271
  '$0 cms lighthouse-score --theme=my-theme',
275
- i18n(`commands.cms.subcommands.lighthouseScore.examples.default`),
272
+ commands.cms.subcommands.lighthouseScore.examples.default,
276
273
  ],
277
274
  ]);
278
275
  return yargs;
package/commands/cms.js CHANGED
@@ -1,10 +1,10 @@
1
- import { i18n } from '../lib/lang.js';
1
+ import { commands } from '../lang/en.js';
2
2
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
3
3
  import lighthouseScore from './cms/lighthouseScore.js';
4
4
  import convertFields from './cms/convertFields.js';
5
5
  import getReactModule from './cms/getReactModule.js';
6
6
  const command = 'cms';
7
- const describe = i18n(`commands.cms.describe`);
7
+ const describe = commands.cms.describe;
8
8
  function cmsBuilder(yargs) {
9
9
  yargs
10
10
  .command(lighthouseScore)
@@ -1,9 +1,9 @@
1
1
  import yargsParser from 'yargs-parser';
2
- import { i18n } from '../lib/lang.js';
2
+ import { commands } from '../lang/en.js';
3
3
  import { trackCommandUsage } from '../lib/usageTracking.js';
4
4
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
5
5
  const command = 'completion';
6
- const describe = i18n('commands.completion.describe');
6
+ const describe = commands.completion.describe;
7
7
  async function handler() {
8
8
  await trackCommandUsage('completion');
9
9
  }
@@ -13,7 +13,7 @@ function completionBuilder(yargs) {
13
13
  yargs.completion();
14
14
  }
15
15
  yargs.example([
16
- ['$0 completion >> ~/.zshrc', i18n('commands.completion.examples.default')],
16
+ ['$0 completion >> ~/.zshrc', commands.completion.examples.default],
17
17
  ]);
18
18
  return yargs;
19
19
  }
@@ -1,7 +1,7 @@
1
1
  import { CmsPublishMode } from '@hubspot/local-dev-lib/types/Files';
2
2
  import { CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
3
3
  type ConfigSetArgs = CommonArgs & ConfigArgs & {
4
- defaultCmsPublishMode: CmsPublishMode;
4
+ defaultCmsPublishMode?: CmsPublishMode;
5
5
  allowUsageTracking?: boolean;
6
6
  httpTimeout?: string;
7
7
  allowAutoUpdates?: boolean;
@@ -1,10 +1,11 @@
1
- import { i18n } from '../../lib/lang.js';
2
1
  import { trackCommandUsage } from '../../lib/usageTracking.js';
3
2
  import { promptUser } from '../../lib/prompts/promptUtils.js';
4
3
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
5
4
  import { setDefaultCmsPublishMode, setHttpTimeout, setAllowUsageTracking, setAllowAutoUpdates, setAutoOpenBrowser, } from '../../lib/configOptions.js';
6
5
  import { commands } from '../../lang/en.js';
7
- import { makeYargsBuilder, getExclusiveConflicts, } from '../../lib/yargsUtils.js';
6
+ import { makeYargsBuilder, strictEnforceBoolean, } from '../../lib/yargsUtils.js';
7
+ import { logError } from '../../lib/errorHandlers/index.js';
8
+ import { uiLogger } from '../../lib/ui/logger.js';
8
9
  const command = 'set';
9
10
  const describe = commands.config.subcommands.set.describe;
10
11
  async function selectOptions() {
@@ -29,35 +30,41 @@ async function selectOptions() {
29
30
  }
30
31
  async function handleConfigUpdate(accountId, args) {
31
32
  const { allowAutoUpdates, allowUsageTracking, defaultCmsPublishMode, httpTimeout, autoOpenBrowser, } = args;
32
- if (typeof defaultCmsPublishMode !== 'undefined') {
33
- await setDefaultCmsPublishMode({ defaultCmsPublishMode, accountId });
34
- return true;
35
- }
36
- else if (typeof httpTimeout !== 'undefined') {
37
- await setHttpTimeout({ httpTimeout, accountId });
38
- return true;
33
+ if (allowAutoUpdates !== undefined) {
34
+ await setAllowAutoUpdates({ allowAutoUpdates, accountId });
39
35
  }
40
- else if (typeof allowUsageTracking !== 'undefined') {
36
+ if (allowUsageTracking !== undefined) {
41
37
  await setAllowUsageTracking({ allowUsageTracking, accountId });
42
- return true;
43
- }
44
- else if (typeof allowAutoUpdates !== 'undefined') {
45
- await setAllowAutoUpdates({ allowAutoUpdates, accountId });
46
- return true;
47
38
  }
48
- else if (typeof autoOpenBrowser !== 'undefined') {
39
+ if (autoOpenBrowser !== undefined) {
49
40
  await setAutoOpenBrowser({ autoOpenBrowser, accountId });
50
- return true;
51
41
  }
52
- return false;
42
+ if (defaultCmsPublishMode !== undefined) {
43
+ await setDefaultCmsPublishMode({ defaultCmsPublishMode, accountId });
44
+ }
45
+ if (httpTimeout !== undefined) {
46
+ await setHttpTimeout({ httpTimeout, accountId });
47
+ }
53
48
  }
54
49
  async function handler(args) {
55
- const { derivedAccountId } = args;
50
+ const { derivedAccountId, allowAutoUpdates, allowUsageTracking, defaultCmsPublishMode, httpTimeout, autoOpenBrowser, } = args;
56
51
  trackCommandUsage('config-set', {}, derivedAccountId);
57
- const configUpdated = await handleConfigUpdate(derivedAccountId, args);
58
- if (!configUpdated) {
59
- const selectedOptions = await selectOptions();
60
- await handleConfigUpdate(derivedAccountId, selectedOptions);
52
+ try {
53
+ if (allowAutoUpdates !== undefined ||
54
+ allowUsageTracking !== undefined ||
55
+ autoOpenBrowser !== undefined ||
56
+ defaultCmsPublishMode !== undefined ||
57
+ httpTimeout !== undefined) {
58
+ await handleConfigUpdate(derivedAccountId, args);
59
+ }
60
+ else {
61
+ const selectedOptions = await selectOptions();
62
+ await handleConfigUpdate(derivedAccountId, selectedOptions);
63
+ }
64
+ }
65
+ catch (err) {
66
+ logError(err);
67
+ process.exit(EXIT_CODES.ERROR);
61
68
  }
62
69
  process.exit(EXIT_CODES.SUCCESS);
63
70
  }
@@ -67,15 +74,23 @@ function configSetBuilder(yargs) {
67
74
  'default-cms-publish-mode': {
68
75
  describe: commands.config.subcommands.set.options.defaultMode.describe,
69
76
  type: 'string',
77
+ choices: ['draft', 'publish'],
78
+ },
79
+ 'http-timeout': {
80
+ describe: commands.config.subcommands.set.options.httpTimeout.describe,
81
+ type: 'number',
82
+ coerce: (value) => {
83
+ if (isNaN(value) || value < 3000) {
84
+ uiLogger.error(commands.config.subcommands.set.errors.invalidHTTPTimeout);
85
+ process.exit(EXIT_CODES.ERROR);
86
+ }
87
+ return value;
88
+ },
70
89
  },
71
90
  'allow-usage-tracking': {
72
91
  describe: commands.config.subcommands.set.options.allowUsageTracking.describe,
73
92
  type: 'boolean',
74
93
  },
75
- 'http-timeout': {
76
- describe: commands.config.subcommands.set.options.httpTimeout.describe,
77
- type: 'string',
78
- },
79
94
  'allow-auto-updates': {
80
95
  describe: commands.config.subcommands.set.options.allowAutoUpdates.describe,
81
96
  type: 'boolean',
@@ -86,17 +101,30 @@ function configSetBuilder(yargs) {
86
101
  type: 'boolean',
87
102
  },
88
103
  })
89
- .conflicts(getExclusiveConflicts([
90
- 'default-cms-publish-mode',
91
- 'allow-usage-tracking',
92
- 'http-timeout',
93
- 'allow-auto-updates',
94
- 'auto-open-browser',
95
- ]))
104
+ .check(() => {
105
+ // Use process.argv directly because yargs argv has already been parsed/coerced,
106
+ // but we need to validate the exact format the user provided (e.g., --flag=true vs --flag)
107
+ return strictEnforceBoolean(process.argv, [
108
+ 'allow-usage-tracking',
109
+ 'allow-auto-updates',
110
+ 'auto-open-browser',
111
+ ]);
112
+ })
96
113
  .example([
114
+ ['$0 config set', commands.config.subcommands.set.examples.default],
115
+ ['$0 config set --allow-usage-tracking=false', 'Disable usage tracking'],
116
+ ['$0 config set --http-timeout=5000', 'Set HTTP timeout to 5000ms'],
117
+ [
118
+ '$0 config set --default-cms-publish-mode=draft',
119
+ 'Set default CMS publish mode to draft',
120
+ ],
121
+ [
122
+ '$0 config set --http-timeout=3000 --allow-usage-tracking=false',
123
+ 'Set HTTP timeout and disable usage tracking',
124
+ ],
97
125
  [
98
- '$0 config set',
99
- i18n(`commands.config.subcommands.set.examples.default`),
126
+ '$0 config set --default-cms-publish-mode=draft --http-timeout=4000 --allow-usage-tracking=true',
127
+ 'Configure multiple settings at once',
100
128
  ],
101
129
  ]);
102
130
  return yargs;
@@ -1,9 +1,9 @@
1
- import { i18n } from '../lib/lang.js';
1
+ import { commands } from '../lang/en.js';
2
2
  import set from './config/set.js';
3
3
  import migrate from './config/migrate.js';
4
4
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
5
5
  const command = 'config';
6
- const describe = i18n('commands.config.describe');
6
+ const describe = commands.config.describe;
7
7
  function configBuilder(yargs) {
8
8
  yargs.command(set).command(migrate).demandCommand(1, '');
9
9
  return yargs;
@@ -1,6 +1,6 @@
1
1
  import fs from 'fs-extra';
2
2
  import { logError } from '../lib/errorHandlers/index.js';
3
- import { setLogLevel } from '../lib/commonOpts.js';
3
+ import { setCLILogLevel } from '../lib/commonOpts.js';
4
4
  import { resolveLocalPath } from '../lib/filesystem.js';
5
5
  import { trackCommandUsage } from '../lib/usageTracking.js';
6
6
  import assets from './create/index.js';
@@ -17,7 +17,7 @@ const describe = commands.create.describe(SUPPORTED_ASSET_TYPES);
17
17
  async function handler(args) {
18
18
  const { name, internal: getInternalVersion, type } = args;
19
19
  let { dest } = args;
20
- setLogLevel(args);
20
+ setCLILogLevel(args);
21
21
  const assetType = type.toLowerCase();
22
22
  if (assetType === 'global-partial') {
23
23
  uiLogger.error(commands.create.errors.deprecatedAssetType(assetType, 'hs create template', 'global partial'));
@@ -1,52 +1,50 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
1
+ import { uiLogger } from '../../lib/ui/logger.js';
2
2
  import { batchCreateObjects } from '@hubspot/local-dev-lib/api/customObjects';
3
3
  import { inputPrompt } from '../../lib/prompts/promptUtils.js';
4
4
  import { logError } from '../../lib/errorHandlers/index.js';
5
5
  import { getAbsoluteFilePath } from '@hubspot/local-dev-lib/path';
6
6
  import { checkAndConvertToJson } from '../../lib/validation.js';
7
7
  import { trackCommandUsage } from '../../lib/usageTracking.js';
8
- import { i18n } from '../../lib/lang.js';
8
+ import { commands } from '../../lang/en.js';
9
9
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
10
10
  import { isObjectDefinition } from '../../lib/customObject.js';
11
11
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
12
12
  const command = 'create [name]';
13
- const describe = i18n(`commands.customObject.subcommands.create.describe`);
13
+ const describe = commands.customObject.subcommands.create.describe;
14
14
  async function handler(args) {
15
15
  const { path, name: providedName, derivedAccountId } = args;
16
16
  let definitionPath = path;
17
17
  let name = providedName;
18
18
  trackCommandUsage('custom-object-batch-create', {}, derivedAccountId);
19
19
  if (!name) {
20
- name = await inputPrompt(i18n(`commands.customObject.subcommands.create.inputName`));
20
+ name = await inputPrompt(commands.customObject.subcommands.create.inputName);
21
21
  }
22
22
  if (!definitionPath) {
23
- definitionPath = await inputPrompt(i18n(`commands.customObject.subcommands.create.inputPath`));
23
+ definitionPath = await inputPrompt(commands.customObject.subcommands.create.inputPath);
24
24
  }
25
25
  const filePath = getAbsoluteFilePath(definitionPath);
26
26
  const objectJson = checkAndConvertToJson(filePath);
27
27
  if (!isObjectDefinition(objectJson)) {
28
- logger.error(i18n(`commands.customObject.subcommands.create.errors.invalidObjectDefinition`));
28
+ uiLogger.error(commands.customObject.subcommands.create.errors.invalidObjectDefinition);
29
29
  process.exit(EXIT_CODES.ERROR);
30
30
  }
31
31
  try {
32
32
  await batchCreateObjects(derivedAccountId, name, objectJson);
33
- logger.success(i18n(`commands.customObject.subcommands.create.success.objectsCreated`));
33
+ uiLogger.success(commands.customObject.subcommands.create.success.objectsCreated);
34
34
  }
35
35
  catch (e) {
36
36
  logError(e, { accountId: derivedAccountId });
37
- logger.error(i18n(`commands.customObject.subcommands.create.errors.creationFailed`, {
38
- definition: definitionPath,
39
- }));
37
+ uiLogger.error(commands.customObject.subcommands.create.errors.creationFailed(definitionPath));
40
38
  }
41
39
  }
42
40
  function customObjectCreateBuilder(yargs) {
43
41
  yargs
44
42
  .positional('name', {
45
- describe: i18n(`commands.customObject.subcommands.create.positionals.name.describe`),
43
+ describe: commands.customObject.subcommands.create.positionals.name.describe,
46
44
  type: 'string',
47
45
  })
48
46
  .option('path', {
49
- describe: i18n(`commands.customObject.subcommands.create.options.path.describe`),
47
+ describe: commands.customObject.subcommands.create.options.path.describe,
50
48
  type: 'string',
51
49
  });
52
50
  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 { getEnv } from '@hubspot/local-dev-lib/config';
3
3
  import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
4
4
  import { getAbsoluteFilePath } from '@hubspot/local-dev-lib/path';
@@ -7,37 +7,35 @@ import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
7
7
  import { logError } from '../../../lib/errorHandlers/index.js';
8
8
  import { checkAndConvertToJson } from '../../../lib/validation.js';
9
9
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
10
- import { i18n } from '../../../lib/lang.js';
10
+ import { commands } from '../../../lang/en.js';
11
11
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
12
12
  import { isSchemaDefinition } from '../../../lib/customObject.js';
13
13
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
14
14
  const command = 'create';
15
- const describe = i18n(`commands.customObject.subcommands.schema.subcommands.create.describe`);
15
+ const describe = commands.customObject.subcommands.schema.subcommands.create.describe;
16
16
  async function handler(args) {
17
17
  const { path, derivedAccountId } = args;
18
18
  trackCommandUsage('custom-object-schema-create', {}, derivedAccountId);
19
19
  const filePath = getAbsoluteFilePath(path);
20
20
  const schemaJson = checkAndConvertToJson(filePath);
21
21
  if (!isSchemaDefinition(schemaJson)) {
22
- logger.error(i18n(`commands.customObject.subcommands.schema.subcommands.create.errors.invalidSchema`));
22
+ uiLogger.error(commands.customObject.subcommands.schema.subcommands.create.errors
23
+ .invalidSchema);
23
24
  process.exit(EXIT_CODES.ERROR);
24
25
  }
25
26
  try {
26
27
  const { data } = await createObjectSchema(derivedAccountId, schemaJson);
27
- logger.success(i18n(`commands.customObject.subcommands.schema.subcommands.create.success.schemaViewable`, {
28
- url: `${getHubSpotWebsiteOrigin(getEnv() === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD)}/contacts/${derivedAccountId}/objects/${data.objectTypeId}`,
29
- }));
28
+ uiLogger.success(commands.customObject.subcommands.schema.subcommands.create.success.schemaViewable(`${getHubSpotWebsiteOrigin(getEnv() === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD)}/contacts/${derivedAccountId}/objects/${data.objectTypeId}`));
30
29
  }
31
30
  catch (e) {
32
31
  logError(e, { accountId: derivedAccountId });
33
- logger.error(i18n(`commands.customObject.subcommands.schema.subcommands.create.errors.creationFailed`, {
34
- definition: path,
35
- }));
32
+ uiLogger.error(commands.customObject.subcommands.schema.subcommands.create.errors.creationFailed(path));
36
33
  }
37
34
  }
38
35
  function schemaCreateBuilder(yargs) {
39
36
  yargs.option('path', {
40
- describe: i18n(`commands.customObject.subcommands.schema.subcommands.create.options.definition.describe`),
37
+ describe: commands.customObject.subcommands.schema.subcommands.create.options
38
+ .definition.describe,
41
39
  type: 'string',
42
40
  required: true,
43
41
  });
@@ -1,13 +1,13 @@
1
1
  import { fetchObjectSchemas, deleteObjectSchema, } from '@hubspot/local-dev-lib/api/customObjects';
2
2
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
3
3
  import { confirmPrompt, listPrompt } from '../../../lib/prompts/promptUtils.js';
4
- import { logger } from '@hubspot/local-dev-lib/logger';
4
+ import { uiLogger } from '../../../lib/ui/logger.js';
5
5
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
6
- import { i18n } from '../../../lib/lang.js';
6
+ import { commands } from '../../../lang/en.js';
7
7
  import { logError } from '../../../lib/errorHandlers/index.js';
8
8
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
9
9
  const command = 'delete [name]';
10
- const describe = i18n(`commands.customObject.subcommands.schema.subcommands.delete.describe`);
10
+ const describe = commands.customObject.subcommands.schema.subcommands.delete.describe;
11
11
  async function handler(args) {
12
12
  const { name: providedName, force, derivedAccountId } = args;
13
13
  trackCommandUsage('custom-object-schema-delete', {}, derivedAccountId);
@@ -18,41 +18,41 @@ async function handler(args) {
18
18
  name =
19
19
  providedName && typeof providedName === 'string'
20
20
  ? providedName
21
- : await listPrompt(i18n(`commands.customObject.subcommands.schema.subcommands.delete.selectSchema`), {
21
+ : await listPrompt(commands.customObject.subcommands.schema.subcommands.delete
22
+ .selectSchema, {
22
23
  choices: schemaNames,
23
24
  });
24
25
  const shouldDelete = force ||
25
- (await confirmPrompt(i18n(`commands.customObject.subcommands.schema.subcommands.delete.confirmDelete`, { name })));
26
+ (await confirmPrompt(commands.customObject.subcommands.schema.subcommands.delete.confirmDelete(name)));
26
27
  if (!shouldDelete) {
27
- logger.info(i18n(`commands.customObject.subcommands.schema.subcommands.delete.deleteCancelled`, { name }));
28
+ uiLogger.info(commands.customObject.subcommands.schema.subcommands.delete.deleteCancelled(name));
28
29
  return process.exit(EXIT_CODES.SUCCESS);
29
30
  }
30
31
  await deleteObjectSchema(derivedAccountId, name);
31
- logger.success(i18n(`commands.customObject.subcommands.schema.subcommands.delete.success.delete`, {
32
- name,
33
- }));
32
+ uiLogger.success(commands.customObject.subcommands.schema.subcommands.delete.success.delete(name));
34
33
  }
35
34
  catch (e) {
36
35
  logError(e);
37
- logger.error(i18n(`commands.customObject.subcommands.schema.subcommands.delete.errors.delete`, {
38
- name: name || '',
39
- }));
36
+ uiLogger.error(commands.customObject.subcommands.schema.subcommands.delete.errors.delete(name || ''));
40
37
  }
41
38
  }
42
39
  function schemaDeleteBuilder(yargs) {
43
40
  yargs
44
41
  .example([
45
42
  [
46
- '$0 schema delete schemaName',
47
- i18n(`commands.customObject.subcommands.schema.subcommands.delete.examples.default`),
43
+ '$0 custom-object schema delete schemaName',
44
+ commands.customObject.subcommands.schema.subcommands.delete.examples
45
+ .default,
48
46
  ],
49
47
  ])
50
48
  .positional('name', {
51
- describe: i18n(`commands.customObject.subcommands.schema.subcommands.delete.positionals.name.describe`),
49
+ describe: commands.customObject.subcommands.schema.subcommands.delete.positionals
50
+ .name.describe,
52
51
  type: 'string',
53
52
  })
54
53
  .option('force', {
55
- describe: i18n(`commands.customObject.subcommands.schema.subcommands.delete.options.force.describe`),
54
+ describe: commands.customObject.subcommands.schema.subcommands.delete.options
55
+ .force.describe,
56
56
  type: 'boolean',
57
57
  });
58
58
  return yargs;