@hubspot/cli 7.7.34-experimental.0 → 7.8.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/bin/cli.js +31 -25
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/doctor.test.js +16 -16
  4. package/commands/__tests__/getStarted.test.js +2 -2
  5. package/commands/__tests__/mcp.test.js +1 -1
  6. package/commands/__tests__/project.test.js +0 -3
  7. package/commands/account/clean.js +18 -27
  8. package/commands/account/createOverride.js +13 -31
  9. package/commands/account/info.js +20 -31
  10. package/commands/account/list.js +16 -22
  11. package/commands/account/remove.js +12 -20
  12. package/commands/account/removeOverride.js +11 -21
  13. package/commands/account/rename.js +6 -9
  14. package/commands/account/use.js +12 -26
  15. package/commands/account.js +2 -2
  16. package/commands/app/__tests__/migrate.test.js +5 -6
  17. package/commands/app/migrate.js +13 -19
  18. package/commands/app/secret/add.js +2 -1
  19. package/commands/app/secret/delete.js +2 -1
  20. package/commands/app/secret/list.js +2 -1
  21. package/commands/app/secret/update.js +2 -1
  22. package/commands/app/secret.js +2 -1
  23. package/commands/app.js +3 -8
  24. package/commands/auth.d.ts +1 -0
  25. package/commands/auth.js +16 -7
  26. package/commands/cms/convertFields.js +7 -9
  27. package/commands/cms/getReactModule.js +9 -14
  28. package/commands/cms/lighthouseScore.js +33 -36
  29. package/commands/cms.js +2 -2
  30. package/commands/completion.js +3 -3
  31. package/commands/config/set.d.ts +1 -1
  32. package/commands/config/set.js +64 -37
  33. package/commands/config.js +2 -2
  34. package/commands/create.js +2 -2
  35. package/commands/customObject/create.js +10 -12
  36. package/commands/customObject/schema/create.js +9 -11
  37. package/commands/customObject/schema/delete.js +16 -16
  38. package/commands/customObject/schema/fetch-all.js +12 -11
  39. package/commands/customObject/schema/fetch.js +15 -15
  40. package/commands/customObject/schema/list.js +4 -4
  41. package/commands/customObject/schema/update.js +13 -13
  42. package/commands/customObject/schema.js +2 -2
  43. package/commands/customObject.js +6 -7
  44. package/commands/doctor.js +8 -11
  45. package/commands/feedback.js +7 -12
  46. package/commands/fetch.js +8 -8
  47. package/commands/filemanager/fetch.js +7 -7
  48. package/commands/filemanager/upload.js +15 -34
  49. package/commands/filemanager.js +2 -2
  50. package/commands/function/deploy.js +11 -29
  51. package/commands/function/list.js +8 -8
  52. package/commands/function/server.js +9 -11
  53. package/commands/function.d.ts +1 -1
  54. package/commands/function.js +2 -2
  55. package/commands/getStarted.d.ts +0 -2
  56. package/commands/getStarted.js +4 -4
  57. package/commands/hubdb/clear.js +7 -15
  58. package/commands/hubdb/create.js +9 -15
  59. package/commands/hubdb/delete.js +8 -15
  60. package/commands/hubdb/fetch.js +6 -9
  61. package/commands/hubdb.d.ts +1 -1
  62. package/commands/hubdb.js +2 -2
  63. package/commands/init.js +2 -3
  64. package/commands/lint.js +16 -16
  65. package/commands/list.js +8 -14
  66. package/commands/logs.js +14 -20
  67. package/commands/mcp/__tests__/setup.test.js +2 -2
  68. package/commands/mcp/setup.js +11 -2
  69. package/commands/mcp.js +3 -3
  70. package/commands/mv.js +6 -17
  71. package/commands/open.js +5 -5
  72. package/commands/project/__tests__/add.test.js +4 -2
  73. package/commands/project/__tests__/create.test.js +6 -6
  74. package/commands/project/__tests__/deploy.test.js +3 -7
  75. package/commands/project/__tests__/devUnifiedFlow.test.js +2 -4
  76. package/commands/project/__tests__/installDeps.test.js +8 -8
  77. package/commands/project/__tests__/logs.test.js +1 -4
  78. package/commands/project/__tests__/migrate.test.js +6 -7
  79. package/commands/project/__tests__/migrateApp.test.js +3 -7
  80. package/commands/project/__tests__/profile.test.js +1 -1
  81. package/commands/project/__tests__/validate.test.js +98 -0
  82. package/commands/project/add.js +4 -8
  83. package/commands/project/cloneApp.js +14 -19
  84. package/commands/project/create.js +3 -10
  85. package/commands/project/deploy.js +5 -5
  86. package/commands/project/dev/deprecatedFlow.js +7 -16
  87. package/commands/project/dev/index.js +16 -13
  88. package/commands/project/dev/unifiedFlow.js +8 -4
  89. package/commands/project/download.js +10 -14
  90. package/commands/project/installDeps.js +8 -9
  91. package/commands/project/listBuilds.js +12 -21
  92. package/commands/project/logs.js +21 -24
  93. package/commands/project/migrate.js +41 -13
  94. package/commands/project/migrateApp.js +10 -17
  95. package/commands/project/open.js +6 -14
  96. package/commands/project/profile/add.js +3 -3
  97. package/commands/project/profile/delete.js +1 -2
  98. package/commands/project/profile.js +2 -3
  99. package/commands/project/upload.d.ts +2 -2
  100. package/commands/project/upload.js +17 -26
  101. package/commands/project/validate.js +7 -7
  102. package/commands/project/watch.js +13 -22
  103. package/commands/project.js +2 -3
  104. package/commands/sandbox/__tests__/create.test.js +5 -5
  105. package/commands/sandbox/create.js +22 -32
  106. package/commands/sandbox/delete.js +35 -63
  107. package/commands/sandbox.js +2 -2
  108. package/commands/secret/addSecret.js +7 -17
  109. package/commands/secret/deleteSecret.js +10 -20
  110. package/commands/secret/listSecret.js +8 -10
  111. package/commands/secret/updateSecret.js +9 -17
  112. package/commands/secret.js +2 -2
  113. package/commands/testAccount/__tests__/delete.test.js +2 -4
  114. package/commands/testAccount/create.js +0 -3
  115. package/commands/testAccount/delete.d.ts +4 -3
  116. package/commands/testAccount/delete.js +155 -14
  117. package/commands/testAccount/importData.d.ts +1 -1
  118. package/commands/testAccount/importData.js +1 -1
  119. package/commands/testAccount.js +1 -1
  120. package/lang/en.d.ts +317 -120
  121. package/lang/en.js +312 -118
  122. package/lang/en.lyaml +2 -2
  123. package/lib/__tests__/buildAccount.test.js +2 -1
  124. package/lib/__tests__/commonOpts.test.js +1 -1
  125. package/lib/__tests__/dependencyManagement.test.js +1 -1
  126. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  127. package/lib/__tests__/npm.test.js +1 -1
  128. package/lib/__tests__/oauth.test.js +4 -4
  129. package/lib/__tests__/process.test.js +10 -5
  130. package/lib/__tests__/sandboxSync.test.js +8 -8
  131. package/lib/__tests__/sandboxes.test.js +8 -8
  132. package/lib/__tests__/serverlessLogs.test.js +1 -1
  133. package/lib/__tests__/usageTracking.test.js +5 -5
  134. package/lib/__tests__/validation.test.js +2 -1
  135. package/lib/__tests__/yargsUtils.test.js +83 -9
  136. package/lib/app/__tests__/migrate.test.js +19 -56
  137. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  138. package/lib/app/migrate.d.ts +2 -8
  139. package/lib/app/migrate.js +5 -80
  140. package/lib/app/migrate_legacy.js +20 -24
  141. package/lib/buildAccount.js +25 -57
  142. package/lib/commonOpts.d.ts +1 -1
  143. package/lib/commonOpts.js +25 -22
  144. package/lib/configOptions.js +7 -0
  145. package/lib/constants.d.ts +13 -0
  146. package/lib/constants.js +17 -0
  147. package/lib/dependencyManagement.js +9 -27
  148. package/lib/developerTestAccounts.js +9 -23
  149. package/lib/doctor/Diagnosis.js +11 -23
  150. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  151. package/lib/doctor/Doctor.js +42 -90
  152. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  153. package/lib/errorHandlers/index.js +12 -20
  154. package/lib/errorHandlers/suppressError.js +10 -17
  155. package/lib/lang.js +6 -5
  156. package/lib/links.d.ts +1 -0
  157. package/lib/links.js +14 -7
  158. package/lib/mcp/setup.js +1 -1
  159. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  160. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  161. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  162. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  163. package/lib/middleware/commandTargetingUtils.js +78 -0
  164. package/lib/middleware/configMiddleware.d.ts +1 -1
  165. package/lib/middleware/configMiddleware.js +21 -81
  166. package/lib/middleware/fireAlarmMiddleware.js +15 -5
  167. package/lib/middleware/gitMiddleware.js +5 -1
  168. package/lib/middleware/notificationsMiddleware.js +5 -11
  169. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  170. package/lib/npm.js +2 -2
  171. package/lib/oauth.js +5 -5
  172. package/lib/process.js +5 -4
  173. package/lib/projectProfiles.d.ts +1 -1
  174. package/lib/projectProfiles.js +2 -10
  175. package/lib/projects/__tests__/AppDevModeInterface.test.js +2 -0
  176. package/lib/projects/__tests__/LocalDevProcess.test.js +227 -16
  177. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +86 -60
  178. package/lib/projects/__tests__/deploy.test.js +71 -6
  179. package/lib/projects/__tests__/localDevProjectHelpers.test.js +6 -2
  180. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  181. package/lib/projects/__tests__/projects.test.js +12 -12
  182. package/lib/projects/__tests__/structure.test.js +3 -3
  183. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  184. package/lib/projects/__tests__/upload.test.js +82 -0
  185. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  186. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  187. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  188. package/lib/projects/create/__tests__/v3.test.js +80 -5
  189. package/lib/projects/create/index.js +2 -2
  190. package/lib/projects/create/legacy.js +2 -2
  191. package/lib/projects/create/v3.js +10 -8
  192. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  193. package/lib/projects/localDev/AppDevModeInterface.js +21 -12
  194. package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
  195. package/lib/projects/localDev/LocalDevLogger.js +27 -6
  196. package/lib/projects/localDev/LocalDevManager.js +4 -5
  197. package/lib/projects/localDev/LocalDevProcess.d.ts +7 -5
  198. package/lib/projects/localDev/LocalDevProcess.js +90 -19
  199. package/lib/projects/localDev/LocalDevState.d.ts +9 -8
  200. package/lib/projects/localDev/LocalDevState.js +18 -17
  201. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +2 -1
  202. package/lib/projects/localDev/LocalDevWebsocketServer.js +62 -33
  203. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  204. package/lib/projects/localDev/helpers/project.js +42 -1
  205. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +4 -0
  206. package/lib/projects/localDev/localDevWebsocketServerUtils.js +10 -0
  207. package/lib/projects/platformVersion.d.ts +1 -1
  208. package/lib/projects/platformVersion.js +1 -1
  209. package/lib/projects/pollProjectBuildAndDeploy.js +4 -4
  210. package/lib/projects/structure.d.ts +2 -2
  211. package/lib/projects/structure.js +6 -6
  212. package/lib/projects/upload.d.ts +2 -3
  213. package/lib/projects/upload.js +17 -9
  214. package/lib/prompts/accountNamePrompt.js +14 -19
  215. package/lib/prompts/accountsPrompt.js +2 -2
  216. package/lib/prompts/cmsFieldPrompt.js +2 -2
  217. package/lib/prompts/createApiSamplePrompt.js +5 -5
  218. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  219. package/lib/prompts/createFunctionPrompt.js +14 -14
  220. package/lib/prompts/createModulePrompt.js +9 -9
  221. package/lib/prompts/createTemplatePrompt.js +2 -2
  222. package/lib/prompts/downloadProjectPrompt.js +5 -8
  223. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  224. package/lib/prompts/previewPrompt.js +6 -6
  225. package/lib/prompts/projectAddPrompt.js +8 -1
  226. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  227. package/lib/prompts/projectNamePrompt.js +4 -8
  228. package/lib/prompts/projectsLogsPrompt.js +2 -4
  229. package/lib/prompts/promptUtils.js +30 -9
  230. package/lib/prompts/sandboxesPrompt.js +7 -7
  231. package/lib/prompts/secretPrompt.js +3 -3
  232. package/lib/prompts/selectAppPrompt.js +3 -3
  233. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  234. package/lib/prompts/selectProjectTemplatePrompt.js +2 -0
  235. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  236. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  237. package/lib/prompts/uploadPrompt.js +5 -5
  238. package/lib/sandboxSync.js +24 -41
  239. package/lib/sandboxes.js +19 -47
  240. package/lib/schema.js +3 -3
  241. package/lib/serverlessLogs.js +11 -13
  242. package/lib/theme/__tests__/migrate.test.d.ts +1 -0
  243. package/lib/theme/__tests__/migrate.test.js +233 -0
  244. package/lib/theme/migrate.d.ts +13 -0
  245. package/lib/theme/migrate.js +90 -0
  246. package/lib/ui/SpinniesManager.d.ts +2 -0
  247. package/lib/ui/SpinniesManager.js +7 -0
  248. package/lib/ui/boxen.js +1 -2
  249. package/lib/ui/git.js +13 -10
  250. package/lib/ui/index.js +38 -37
  251. package/lib/ui/serverlessFunctionLogs.js +9 -7
  252. package/lib/ui/uiMessages.d.ts +68 -0
  253. package/lib/ui/uiMessages.js +71 -0
  254. package/lib/usageTracking.js +8 -8
  255. package/lib/validation.js +20 -23
  256. package/lib/yargsUtils.d.ts +1 -1
  257. package/lib/yargsUtils.js +12 -5
  258. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  259. package/mcp-server/tools/index.js +4 -0
  260. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +2 -2
  261. package/mcp-server/tools/project/CreateProjectTool.d.ts +2 -2
  262. package/mcp-server/tools/project/DocsSearchTool.d.ts +4 -1
  263. package/mcp-server/tools/project/DocsSearchTool.js +5 -5
  264. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  265. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  266. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  267. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  268. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -1
  269. package/mcp-server/tools/project/GetConfigValuesTool.js +12 -6
  270. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  271. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +12 -10
  272. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  273. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  274. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  275. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  276. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -7
  277. package/mcp-server/utils/__tests__/cliConfig.test.d.ts +1 -0
  278. package/mcp-server/utils/__tests__/cliConfig.test.js +110 -0
  279. package/mcp-server/utils/cliConfig.d.ts +1 -0
  280. package/mcp-server/utils/cliConfig.js +12 -0
  281. package/mcp-server/utils/toolUsageTracking.js +2 -2
  282. package/package.json +4 -4
  283. package/types/LocalDev.d.ts +19 -3
  284. package/types/Yargs.d.ts +1 -1
  285. package/ui/index.js +1 -1
  286. package/commands/app/__tests__/install.test.js +0 -47
  287. package/commands/app/install.d.ts +0 -8
  288. package/commands/app/install.js +0 -122
  289. package/lib/middleware/__test__/utils.test.js +0 -51
  290. package/lib/middleware/utils.d.ts +0 -8
  291. package/lib/middleware/utils.js +0 -14
  292. /package/commands/{app/__tests__/install.test.d.ts → project/__tests__/validate.test.d.ts} +0 -0
  293. /package/lib/middleware/__test__/{utils.test.d.ts → commandTargetingUtils.test.d.ts} +0 -0
@@ -1,14 +1,14 @@
1
1
  import { promptUser } from './promptUtils.js';
2
- import { i18n } from '../lang.js';
2
+ import { lib } from '../../lang/en.js';
3
3
  import { uiLine } from '../ui/index.js';
4
4
  import { logError } from '../errorHandlers/index.js';
5
- import { logger } from '@hubspot/local-dev-lib/logger';
5
+ import { uiLogger } from '../ui/logger.js';
6
6
  import { fetchPublicAppsForPortal } from '@hubspot/local-dev-lib/api/appsDev';
7
7
  import { EXIT_CODES } from '../enums/exitCodes.js';
8
8
  async function fetchPublicAppOptions(accountId, accountName, isMigratingApp = false) {
9
9
  try {
10
10
  if (!accountId) {
11
- logger.error(i18n(`lib.prompts.selectPublicAppForMigrationPrompt.errors.noAccountId`));
11
+ uiLogger.error(lib.prompts.selectPublicAppForMigrationPrompt.errors.noAccountId);
12
12
  process.exit(EXIT_CODES.ERROR);
13
13
  }
14
14
  const { data: { results: publicApps }, } = await fetchPublicAppsForPortal(accountId);
@@ -16,15 +16,13 @@ async function fetchPublicAppOptions(accountId, accountName, isMigratingApp = fa
16
16
  if (!filteredPublicApps.length ||
17
17
  (isMigratingApp &&
18
18
  !filteredPublicApps.some(app => !app.preventProjectMigrations || !app.listingInfo))) {
19
- const headerTranslationKey = isMigratingApp
20
- ? 'noAppsMigration'
21
- : 'noAppsClone';
22
- const messageTranslationKey = isMigratingApp
23
- ? 'noAppsMigrationMessage'
24
- : 'noAppsCloneMessage';
25
19
  uiLine();
26
- logger.error(i18n(`lib.prompts.selectPublicAppForMigrationPrompt.errors.${headerTranslationKey}`));
27
- logger.log(i18n(`lib.prompts.selectPublicAppForMigrationPrompt.errors.${messageTranslationKey}`, { accountName }));
20
+ if (isMigratingApp) {
21
+ uiLogger.error(`${lib.prompts.selectPublicAppForMigrationPrompt.errors.noAppsMigration}\n${lib.prompts.selectPublicAppForMigrationPrompt.errors.noAppsMigrationMessage(accountName)}`);
22
+ }
23
+ else {
24
+ uiLogger.error(`${lib.prompts.selectPublicAppForMigrationPrompt.errors.noAppsClone}\n${lib.prompts.selectPublicAppForMigrationPrompt.errors.noAppsCloneMessage(accountName)}`);
25
+ }
28
26
  uiLine();
29
27
  process.exit(EXIT_CODES.SUCCESS);
30
28
  }
@@ -32,28 +30,26 @@ async function fetchPublicAppOptions(accountId, accountName, isMigratingApp = fa
32
30
  }
33
31
  catch (error) {
34
32
  logError(error, accountId ? { accountId } : undefined);
35
- logger.error(i18n(`lib.prompts.selectPublicAppForMigrationPrompt.errors.errorFetchingApps`));
33
+ uiLogger.error(lib.prompts.selectPublicAppForMigrationPrompt.errors.errorFetchingApps);
36
34
  process.exit(EXIT_CODES.ERROR);
37
35
  }
38
36
  }
39
37
  export async function selectPublicAppForMigrationPrompt({ accountId, accountName, isMigratingApp = false, }) {
40
38
  const publicApps = await fetchPublicAppOptions(accountId, accountName, isMigratingApp);
41
- const translationKey = isMigratingApp
42
- ? 'selectAppIdMigrate'
43
- : 'selectAppIdClone';
44
39
  return promptUser([
45
40
  {
46
41
  name: 'appId',
47
- message: i18n(`lib.prompts.selectPublicAppForMigrationPrompt.${translationKey}`, {
48
- accountName,
49
- }),
42
+ message: isMigratingApp
43
+ ? lib.prompts.selectPublicAppForMigrationPrompt.selectAppIdMigrate(accountName)
44
+ : lib.prompts.selectPublicAppForMigrationPrompt.selectAppIdClone(accountName),
50
45
  type: 'list',
51
46
  choices: publicApps.map(app => {
52
47
  const { preventProjectMigrations, listingInfo } = app;
53
48
  if (isMigratingApp && preventProjectMigrations && listingInfo) {
54
49
  return {
55
50
  name: `${app.name} (${app.id})`,
56
- disabled: i18n(`lib.prompts.selectPublicAppForMigrationPrompt.errors.cannotBeMigrated`),
51
+ disabled: lib.prompts.selectPublicAppForMigrationPrompt.errors
52
+ .cannotBeMigrated,
57
53
  };
58
54
  }
59
55
  return {
@@ -1,6 +1,6 @@
1
1
  import { updateDefaultAccount, getConfigDefaultAccount, } from '@hubspot/local-dev-lib/config';
2
2
  import { promptUser } from './promptUtils.js';
3
- import { i18n } from '../lang.js';
3
+ import { lib } from '../../lang/en.js';
4
4
  import { uiLogger } from '../ui/logger.js';
5
5
  export async function setAsDefaultAccountPrompt(accountName) {
6
6
  // Accounts for deprecated and new config
@@ -10,20 +10,16 @@ export async function setAsDefaultAccountPrompt(accountName) {
10
10
  name: 'setAsDefault',
11
11
  type: 'confirm',
12
12
  when: defaultAccount !== accountName,
13
- message: i18n(`lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccountMessage`),
13
+ message: lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccountMessage,
14
14
  },
15
15
  ]);
16
16
  uiLogger.log('');
17
17
  if (setAsDefault) {
18
18
  updateDefaultAccount(accountName);
19
- uiLogger.success(i18n('lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccount', {
20
- accountName,
21
- }));
19
+ uiLogger.success(lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccount(accountName));
22
20
  }
23
21
  else {
24
- uiLogger.log(i18n('lib.prompts.setAsDefaultAccountPrompt.keepingCurrentDefault', {
25
- accountName: getConfigDefaultAccount(),
26
- }));
22
+ uiLogger.log(lib.prompts.setAsDefaultAccountPrompt.keepingCurrentDefault(getConfigDefaultAccount()));
27
23
  }
28
24
  return setAsDefault;
29
25
  }
@@ -1,29 +1,29 @@
1
1
  import path from 'path';
2
2
  import { getCwd } from '@hubspot/local-dev-lib/path';
3
3
  import { promptUser } from './promptUtils.js';
4
- import { i18n } from '../lang.js';
4
+ import { lib } from '../../lang/en.js';
5
5
  export async function uploadPrompt(promptOptions = {}) {
6
6
  return promptUser([
7
7
  {
8
8
  name: 'src',
9
- message: i18n(`lib.prompts.uploadPrompt.enterSrc`),
9
+ message: lib.prompts.uploadPrompt.enterSrc,
10
10
  when: !promptOptions.src,
11
11
  default: '.',
12
12
  validate: (input) => {
13
13
  if (!input) {
14
- return i18n(`lib.prompts.uploadPrompt.errors.srcRequired`);
14
+ return lib.prompts.uploadPrompt.errors.srcRequired;
15
15
  }
16
16
  return true;
17
17
  },
18
18
  },
19
19
  {
20
20
  name: 'dest',
21
- message: i18n(`lib.prompts.uploadPrompt.enterDest`),
21
+ message: lib.prompts.uploadPrompt.enterDest,
22
22
  when: !promptOptions.dest,
23
23
  default: path.basename(getCwd()),
24
24
  validate: (input) => {
25
25
  if (!input) {
26
- return i18n(`lib.prompts.uploadPrompt.errors.destRequired`);
26
+ return lib.prompts.uploadPrompt.errors.destRequired;
27
27
  }
28
28
  return true;
29
29
  },
@@ -1,14 +1,14 @@
1
1
  import SpinniesManager from './ui/SpinniesManager.js';
2
2
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
3
+ import { uiLogger } from './ui/logger.js';
4
4
  import { initiateSync } from '@hubspot/local-dev-lib/api/sandboxSync';
5
5
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
6
6
  import { getAccountId } from '@hubspot/local-dev-lib/config';
7
7
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
8
- import { i18n } from './lang.js';
8
+ import { lib } from '../lang/en.js';
9
9
  import { getAvailableSyncTypes, getSandboxTypeAsString } from './sandboxes.js';
10
10
  import { debugError, logError, ApiErrorContext, } from './errorHandlers/index.js';
11
- import { uiAccountDescription, uiLine, uiLink, uiCommandDisabledBanner, } from './ui/index.js';
11
+ import { uiAccountDescription, uiLine, uiCommandDisabledBanner, } from './ui/index.js';
12
12
  import { isDevelopmentSandbox } from './accountTypes.js';
13
13
  export async function syncSandbox(accountConfig, parentAccountConfig, env, syncTasks, slimInfoMessage = false) {
14
14
  const id = getAccountIdentifier(accountConfig);
@@ -17,14 +17,9 @@ export async function syncSandbox(accountConfig, parentAccountConfig, env, syncT
17
17
  const parentAccountId = getAccountId(parentId);
18
18
  const isDevSandbox = isDevelopmentSandbox(accountConfig);
19
19
  if (!accountId || !parentAccountId) {
20
- throw new Error(i18n(`lib.sandbox.sync.failure.invalidUser`, {
21
- accountName: accountId
22
- ? uiAccountDescription(accountId)
23
- : id.toString(),
24
- parentAccountName: parentAccountId
25
- ? uiAccountDescription(parentAccountId)
26
- : parentId.toString(),
27
- }));
20
+ throw new Error(lib.sandbox.sync.failure.invalidUser(accountId ? uiAccountDescription(accountId) : id.toString(), parentAccountId
21
+ ? uiAccountDescription(parentAccountId)
22
+ : parentId.toString()));
28
23
  }
29
24
  SpinniesManager.init({
30
25
  succeedColor: 'white',
@@ -40,45 +35,37 @@ export async function syncSandbox(accountConfig, parentAccountConfig, env, syncT
40
35
  availableSyncTasks = await getAvailableSyncTypes(parentAccountConfig, accountConfig);
41
36
  }
42
37
  SpinniesManager.add('sandboxSync', {
43
- text: i18n(`lib.sandbox.sync.loading.startSync`),
38
+ text: lib.sandbox.sync.loading.startSync,
44
39
  });
45
40
  await initiateSync(parentAccountId, accountId, availableSyncTasks, accountId);
46
41
  const spinniesText = isDevSandbox
47
- ? `lib.sandbox.sync.loading.succeedDevSb`
48
- : `lib.sandbox.sync.loading.succeed`;
42
+ ? lib.sandbox.sync.loading.succeedDevSb(accountId)
43
+ : lib.sandbox.sync.loading.succeed(accountId);
49
44
  SpinniesManager.succeed('sandboxSync', {
50
- text: i18n(slimInfoMessage
51
- ? `lib.sandbox.sync.loading.successDevSbInfo`
52
- : spinniesText, {
53
- accountName: uiAccountDescription(accountId),
54
- url: uiLink(i18n(`lib.sandbox.sync.info.syncStatusDetailsLinkText`), syncStatusUrl),
55
- }),
45
+ text: slimInfoMessage
46
+ ? lib.sandbox.sync.loading.successDevSbInfo(accountId, syncStatusUrl)
47
+ : spinniesText,
56
48
  });
57
49
  }
58
50
  catch (err) {
59
51
  debugError(err);
60
52
  SpinniesManager.fail('sandboxSync', {
61
- text: i18n(`lib.sandbox.sync.loading.fail`),
53
+ text: lib.sandbox.sync.loading.fail(accountId),
62
54
  });
63
- logger.log('');
55
+ uiLogger.log('');
64
56
  if (isSpecifiedError(err, {
65
57
  statusCode: 403,
66
58
  category: 'BANNED',
67
59
  subCategory: 'sandboxes-sync-api.SYNC_NOT_ALLOWED_INVALID_USER',
68
60
  })) {
69
- logger.error(i18n(`lib.sandbox.sync.failure.invalidUser`, {
70
- accountName: uiAccountDescription(accountId),
71
- parentAccountName: uiAccountDescription(parentAccountId),
72
- }));
61
+ uiLogger.error(lib.sandbox.sync.failure.invalidUser(uiAccountDescription(accountId), uiAccountDescription(parentAccountId)));
73
62
  }
74
63
  else if (isSpecifiedError(err, {
75
64
  statusCode: 429,
76
65
  category: 'RATE_LIMITS',
77
66
  subCategory: 'sandboxes-sync-api.SYNC_IN_PROGRESS',
78
67
  })) {
79
- logger.error(i18n(`lib.sandbox.sync.failure.syncInProgress`, {
80
- url: `${baseUrl}/sandboxes-developer/${parentAccountId}/syncactivitylog`,
81
- }));
68
+ uiLogger.error(lib.sandbox.sync.failure.syncInProgress(`${baseUrl}/sandboxes-developer/${parentAccountId}/syncactivitylog`));
82
69
  }
83
70
  else if (isSpecifiedError(err, {
84
71
  statusCode: 403,
@@ -86,18 +73,14 @@ export async function syncSandbox(accountConfig, parentAccountConfig, env, syncT
86
73
  subCategory: 'sandboxes-sync-api.SYNC_NOT_ALLOWED_INVALID_USERID',
87
74
  })) {
88
75
  // This will only trigger if a user is not a super admin of the target account.
89
- logger.error(i18n(`lib.sandbox.sync.failure.notSuperAdmin`, {
90
- account: uiAccountDescription(accountId),
91
- }));
76
+ uiLogger.error(lib.sandbox.sync.failure.notSuperAdmin(accountId));
92
77
  }
93
78
  else if (isSpecifiedError(err, {
94
79
  statusCode: 404,
95
80
  category: 'OBJECT_NOT_FOUND',
96
81
  subCategory: 'SandboxErrors.SANDBOX_NOT_FOUND',
97
82
  })) {
98
- logger.error(i18n(`lib.sandbox.sync.failure.objectNotFound`, {
99
- account: uiAccountDescription(accountId),
100
- }));
83
+ uiLogger.error(lib.sandbox.sync.failure.objectNotFound(accountId));
101
84
  }
102
85
  else if (isSpecifiedError(err, {
103
86
  statusCode: 404,
@@ -110,16 +93,16 @@ export async function syncSandbox(accountConfig, parentAccountConfig, env, syncT
110
93
  request: 'sandbox sync',
111
94
  }));
112
95
  }
113
- logger.log('');
96
+ uiLogger.log('');
114
97
  throw err;
115
98
  }
116
99
  if (!slimInfoMessage) {
117
- logger.log();
100
+ uiLogger.log('');
118
101
  uiLine();
119
- logger.info(i18n(`lib.sandbox.sync.info.${isDevSandbox ? 'syncMessageDevSb' : 'syncMessage'}`, {
120
- url: uiLink(i18n(`lib.sandbox.sync.info.syncStatusDetailsLinkText`), syncStatusUrl),
121
- }));
102
+ uiLogger.info(isDevSandbox
103
+ ? lib.sandbox.sync.info.syncMessageDevSb(syncStatusUrl)
104
+ : lib.sandbox.sync.info.syncMessage(syncStatusUrl));
122
105
  uiLine();
123
- logger.log();
106
+ uiLogger.log('');
124
107
  }
125
108
  }
package/lib/sandboxes.js CHANGED
@@ -1,4 +1,3 @@
1
- import { logger } from '@hubspot/local-dev-lib/logger';
2
1
  import { getSandboxUsageLimits } from '@hubspot/local-dev-lib/api/sandboxHubs';
3
2
  import { fetchTypes } from '@hubspot/local-dev-lib/api/sandboxSync';
4
3
  import { getAccountId, getConfigAccounts } from '@hubspot/local-dev-lib/config';
@@ -6,9 +5,10 @@ import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
6
5
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
7
6
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
8
7
  import { isMissingScopeError, isSpecifiedError, } from '@hubspot/local-dev-lib/errors/index';
9
- import { i18n } from './lang.js';
10
- import { uiAccountDescription } from './ui/index.js';
8
+ import { uiLogger } from './ui/logger.js';
9
+ import { lib } from '../lang/en.js';
11
10
  import { logError } from './errorHandlers/index.js';
11
+ import { uiAccountDescription } from './ui/index.js';
12
12
  export const SYNC_TYPES = {
13
13
  OBJECT_RECORDS: 'object-records',
14
14
  };
@@ -54,11 +54,11 @@ export async function getAvailableSyncTypes(parentAccountConfig, config) {
54
54
  const id = getAccountIdentifier(config);
55
55
  const portalId = getAccountId(id);
56
56
  if (!parentPortalId || !portalId) {
57
- throw new Error(i18n(`lib.sandbox.sync.failure.syncTypeFetch`));
57
+ throw new Error(lib.sandbox.sync.failure.syncTypeFetch);
58
58
  }
59
59
  const { data: { results: syncTypes }, } = await fetchTypes(parentPortalId, portalId);
60
60
  if (!syncTypes) {
61
- throw new Error(i18n(`lib.sandbox.sync.failure.syncTypeFetch`));
61
+ throw new Error(lib.sandbox.sync.failure.syncTypeFetch);
62
62
  }
63
63
  return syncTypes.map(t => ({ type: t.name }));
64
64
  }
@@ -66,91 +66,63 @@ export async function validateSandboxUsageLimits(accountConfig, sandboxType, env
66
66
  const id = getAccountIdentifier(accountConfig);
67
67
  const accountId = getAccountId(id);
68
68
  if (!accountId) {
69
- throw new Error(i18n(`lib.sandbox.create.failure.usageLimitFetch`));
69
+ throw new Error(lib.sandbox.create.failure.usageLimitsFetch);
70
70
  }
71
71
  const { data: { usage }, } = await getSandboxUsageLimits(accountId);
72
72
  if (!usage) {
73
- throw new Error(i18n(`lib.sandbox.create.failure.usageLimitFetch`));
73
+ throw new Error(lib.sandbox.create.failure.usageLimitsFetch);
74
74
  }
75
75
  if (sandboxType === HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX) {
76
76
  if (usage['DEVELOPER'].available === 0) {
77
77
  const devSandboxLimit = usage['DEVELOPER'].limit;
78
- const plural = devSandboxLimit !== 1;
79
78
  const hasDevelopmentSandboxes = getHasSandboxesByType(accountConfig, HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX);
80
79
  if (hasDevelopmentSandboxes) {
81
- throw new Error(i18n(`lib.sandbox.create.failure.alreadyInConfig.developer.${plural ? 'other' : 'one'}`, {
82
- accountName: accountConfig.name || accountId,
83
- limit: devSandboxLimit,
84
- }));
80
+ throw new Error(lib.sandbox.create.developer.failure.alreadyInConfig(accountId, devSandboxLimit));
85
81
  }
86
82
  else {
87
83
  const baseUrl = getHubSpotWebsiteOrigin(env);
88
- throw new Error(i18n(`lib.sandbox.create.failure.limit.developer.${plural ? 'other' : 'one'}`, {
89
- accountName: accountConfig.name || accountId,
90
- limit: devSandboxLimit,
91
- link: `${baseUrl}/sandboxes-developer/${accountId}/development`,
92
- }));
84
+ throw new Error(lib.sandbox.create.developer.failure.limit(accountId, devSandboxLimit, `${baseUrl}/sandboxes-developer/${accountId}/development`));
93
85
  }
94
86
  }
95
87
  }
96
88
  if (sandboxType === HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX) {
97
89
  if (usage['STANDARD'].available === 0) {
98
90
  const standardSandboxLimit = usage['STANDARD'].limit;
99
- const plural = standardSandboxLimit !== 1;
100
91
  const hasStandardSandboxes = getHasSandboxesByType(accountConfig, HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX);
101
92
  if (hasStandardSandboxes) {
102
- throw new Error(i18n(`lib.sandbox.create.failure.alreadyInConfig.standard.${plural ? 'other' : 'one'}`, {
103
- accountName: accountConfig.name || accountId,
104
- limit: standardSandboxLimit,
105
- }));
93
+ throw new Error(lib.sandbox.create.standard.failure.alreadyInConfig(accountId, standardSandboxLimit));
106
94
  }
107
95
  else {
108
96
  const baseUrl = getHubSpotWebsiteOrigin(env);
109
- throw new Error(i18n(`lib.sandbox.create.failure.limit.standard.${plural ? 'other' : 'one'}`, {
110
- accountName: accountConfig.name || accountId,
111
- limit: standardSandboxLimit,
112
- link: `${baseUrl}/sandboxes-developer/${accountId}/standard`,
113
- }));
97
+ throw new Error(lib.sandbox.create.standard.failure.limit(accountId, standardSandboxLimit, `${baseUrl}/sandboxes-developer/${accountId}/standard`));
114
98
  }
115
99
  }
116
100
  }
117
101
  }
118
102
  export function handleSandboxCreateError(err, env, name, accountId) {
119
103
  if (isMissingScopeError(err)) {
120
- logger.error(i18n(`lib.sandbox.create.failure.scopes.message`, {
121
- accountName: uiAccountDescription(accountId),
122
- }));
104
+ uiLogger.error(lib.sandbox.create.failure.scopes.message);
123
105
  const websiteOrigin = getHubSpotWebsiteOrigin(env);
124
106
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
125
- logger.info(i18n(`lib.sandbox.create.failure.scopes.instructions`, {
126
- accountName: uiAccountDescription(accountId),
127
- url,
128
- }));
107
+ uiLogger.info(lib.sandbox.create.failure.scopes.instructions(uiAccountDescription(accountId), url));
129
108
  }
130
109
  else if (isSpecifiedError(err, {
131
110
  statusCode: 403,
132
111
  category: 'BANNED',
133
112
  subCategory: 'SandboxErrors.USER_ACCESS_NOT_ALLOWED',
134
113
  })) {
135
- logger.log('');
136
- logger.error(i18n(`lib.sandbox.create.failure.invalidUser`, {
137
- accountName: name,
138
- parentAccountName: uiAccountDescription(accountId),
139
- }));
140
- logger.log('');
114
+ uiLogger.log('');
115
+ uiLogger.error(lib.sandbox.create.failure.invalidUser(name, accountId));
116
+ uiLogger.log('');
141
117
  }
142
118
  else if (isSpecifiedError(err, {
143
119
  statusCode: 403,
144
120
  category: 'BANNED',
145
121
  subCategory: 'SandboxErrors.DEVELOPMENT_SANDBOX_ACCESS_NOT_ALLOWED',
146
122
  })) {
147
- logger.log('');
148
- logger.error(i18n(`lib.sandbox.create.failure.403Gating`, {
149
- accountName: name,
150
- parentAccountName: uiAccountDescription(accountId),
151
- accountId,
152
- }));
153
- logger.log('');
123
+ uiLogger.log('');
124
+ uiLogger.error(lib.sandbox.create.failure['403Gating'](name, accountId));
125
+ uiLogger.log('');
154
126
  }
155
127
  else {
156
128
  logError(err);
package/lib/schema.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import chalk from 'chalk';
2
2
  import { table, getBorderCharacters } from 'table';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
4
3
  import { fetchObjectSchemas } from '@hubspot/local-dev-lib/api/customObjects';
4
+ import { uiLogger } from './ui/logger.js';
5
5
  export function logSchemas(schemas) {
6
6
  const data = schemas
7
7
  .map(r => [r.labels.singular, r.name, r.objectTypeId || ''])
8
8
  .sort((a, b) => (a[1] > b[1] ? 1 : -1));
9
9
  if (data.length === 0) {
10
- logger.log('No Schemas were found');
10
+ uiLogger.log('No Schemas were found');
11
11
  return;
12
12
  }
13
13
  data.unshift([
@@ -19,7 +19,7 @@ export function logSchemas(schemas) {
19
19
  singleLine: true,
20
20
  border: getBorderCharacters('honeywell'),
21
21
  };
22
- logger.log(table(data, tableConfig));
22
+ uiLogger.log(table(data, tableConfig));
23
23
  }
24
24
  export async function listSchemas(accountId) {
25
25
  const { data } = await fetchObjectSchemas(accountId);
@@ -1,6 +1,6 @@
1
1
  import https from 'https';
2
2
  import chalk from 'chalk';
3
- import { logger } from '@hubspot/local-dev-lib/logger';
3
+ import { uiLogger } from './ui/logger.js';
4
4
  import { isHubSpotHttpError, isMissingScopeError, } from '@hubspot/local-dev-lib/errors/index';
5
5
  import { SCOPE_GROUPS, PERSONAL_ACCESS_KEY_AUTH_METHOD, } from '@hubspot/local-dev-lib/constants/auth';
6
6
  import { getAccountConfig } from '@hubspot/local-dev-lib/config';
@@ -10,7 +10,7 @@ import { logError, ApiErrorContext } from './errorHandlers/index.js';
10
10
  import SpinniesManager from './ui/SpinniesManager.js';
11
11
  import { handleExit, handleKeypress } from './process.js';
12
12
  import { EXIT_CODES } from './enums/exitCodes.js';
13
- import { i18n } from './lang.js';
13
+ import { lib } from '../lang/en.js';
14
14
  const TAIL_DELAY = 5000;
15
15
  function base64EncodeString(valueToEncode) {
16
16
  if (typeof valueToEncode !== 'string') {
@@ -47,22 +47,20 @@ async function verifyAccessKeyAndUserAccess(accountId, scopeGroup) {
47
47
  scopesData = resp.data;
48
48
  }
49
49
  catch (e) {
50
- logger.debug(i18n(`lib.serverless.verifyAccessKeyAndUserAccess.fetchScopeDataError`, {
51
- scopeGroup,
52
- }));
53
- logger.debug(e);
50
+ uiLogger.debug(lib.serverless.verifyAccessKeyAndUserAccess.fetchScopeDataError(scopeGroup));
51
+ uiLogger.debug(e);
54
52
  return;
55
53
  }
56
54
  const { portalScopesInGroup, userScopesInGroup } = scopesData;
57
55
  if (!portalScopesInGroup.length) {
58
- logger.error(i18n(`lib.serverless.verifyAccessKeyAndUserAccess.portalMissingScope`));
56
+ uiLogger.error(lib.serverless.verifyAccessKeyAndUserAccess.portalMissingScope);
59
57
  return;
60
58
  }
61
59
  if (!portalScopesInGroup.every(s => userScopesInGroup.includes(s))) {
62
- logger.error(i18n(`lib.serverless.verifyAccessKeyAndUserAccess.userMissingScope`));
60
+ uiLogger.error(lib.serverless.verifyAccessKeyAndUserAccess.userMissingScope);
63
61
  }
64
62
  else {
65
- logger.error(i18n(`lib.serverless.verifyAccessKeyAndUserAccess.genericMissingScope`));
63
+ uiLogger.error(lib.serverless.verifyAccessKeyAndUserAccess.genericMissingScope);
66
64
  }
67
65
  }
68
66
  export async function tailLogs(accountId, name, fetchLatest, tailCall, compact = false) {
@@ -120,7 +118,7 @@ export async function tailLogs(accountId, name, fetchLatest, tailCall, compact =
120
118
  }
121
119
  export async function outputBuildLog(buildLogUrl) {
122
120
  if (!buildLogUrl) {
123
- logger.debug('Unable to display build output. No build log URL was provided.');
121
+ uiLogger.debug('Unable to display build output. No build log URL was provided.');
124
122
  return '';
125
123
  }
126
124
  return new Promise(resolve => {
@@ -135,16 +133,16 @@ export async function outputBuildLog(buildLogUrl) {
135
133
  data += chunk;
136
134
  });
137
135
  response.on('end', () => {
138
- logger.log(data);
136
+ uiLogger.log(data);
139
137
  resolve(data);
140
138
  });
141
139
  })
142
140
  .on('error', () => {
143
- logger.error('The build log could not be retrieved.');
141
+ uiLogger.error('The build log could not be retrieved.');
144
142
  });
145
143
  }
146
144
  catch (e) {
147
- logger.error('The build log could not be retrieved.');
145
+ uiLogger.error('The build log could not be retrieved.');
148
146
  resolve('');
149
147
  }
150
148
  });
@@ -0,0 +1 @@
1
+ export {};