@hubspot/cli 7.9.0 → 7.9.1-experimental.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 (214) hide show
  1. package/bin/cli.js +5 -4
  2. package/commands/__tests__/getStarted.test.js +10 -0
  3. package/commands/__tests__/project.test.js +2 -0
  4. package/commands/account/__tests__/rename.test.js +42 -0
  5. package/commands/account/auth.js +10 -14
  6. package/commands/account/clean.js +11 -19
  7. package/commands/account/createOverride.js +17 -23
  8. package/commands/account/info.js +8 -5
  9. package/commands/account/list.js +13 -18
  10. package/commands/account/remove.js +23 -22
  11. package/commands/account/removeOverride.js +8 -16
  12. package/commands/account/rename.d.ts +1 -1
  13. package/commands/account/rename.js +6 -3
  14. package/commands/account/use.js +19 -8
  15. package/commands/app/__tests__/migrate.test.js +8 -4
  16. package/commands/app/migrate.js +2 -2
  17. package/commands/auth.js +18 -14
  18. package/commands/cms/theme/preview.js +1 -4
  19. package/commands/config/migrate.js +5 -5
  20. package/commands/config/set.js +1 -2
  21. package/commands/customObject/createSchema.js +2 -3
  22. package/commands/customObject/updateSchema.js +2 -3
  23. package/commands/getStarted.js +15 -22
  24. package/commands/hubdb/__tests__/list.test.js +1 -0
  25. package/commands/hubdb/list.js +2 -2
  26. package/commands/hubdb.d.ts +1 -1
  27. package/commands/init.js +36 -32
  28. package/commands/project/__tests__/deploy.test.js +10 -5
  29. package/commands/project/__tests__/devUnifiedFlow.test.js +6 -4
  30. package/commands/project/__tests__/logs.test.js +4 -0
  31. package/commands/project/__tests__/updateDeps.test.js +142 -0
  32. package/commands/project/__tests__/validate.test.js +2 -2
  33. package/commands/project/cloneApp.js +2 -2
  34. package/commands/project/create.js +0 -1
  35. package/commands/project/deploy.js +2 -2
  36. package/commands/project/dev/deprecatedFlow.js +4 -5
  37. package/commands/project/dev/index.js +14 -4
  38. package/commands/project/dev/unifiedFlow.js +4 -5
  39. package/commands/project/listBuilds.js +7 -1
  40. package/commands/project/logs.js +2 -3
  41. package/commands/project/profile/add.js +6 -7
  42. package/commands/project/profile/delete.js +2 -2
  43. package/commands/project/updateDeps.d.ts +6 -0
  44. package/commands/project/updateDeps.js +80 -0
  45. package/commands/project/upload.js +9 -3
  46. package/commands/project/validate.js +9 -3
  47. package/commands/project/watch.js +7 -2
  48. package/commands/project.js +2 -0
  49. package/commands/sandbox/__tests__/create.test.js +14 -5
  50. package/commands/sandbox/create.js +4 -5
  51. package/commands/sandbox/delete.js +23 -20
  52. package/commands/testAccount/__tests__/create.test.js +68 -0
  53. package/commands/testAccount/create.d.ts +8 -0
  54. package/commands/testAccount/create.js +135 -45
  55. package/commands/testAccount/delete.js +9 -8
  56. package/commands/testAccount/importData.d.ts +1 -1
  57. package/lang/en.d.ts +3199 -3185
  58. package/lang/en.js +52 -14
  59. package/lib/__tests__/buildAccount.test.js +22 -30
  60. package/lib/__tests__/commonOpts.test.js +9 -13
  61. package/lib/__tests__/dependencyManagement.test.js +273 -1
  62. package/lib/__tests__/developerTestAccounts.test.js +29 -17
  63. package/lib/__tests__/importData.test.js +20 -10
  64. package/lib/__tests__/oauth.test.js +19 -8
  65. package/lib/__tests__/sandboxSync.test.js +33 -11
  66. package/lib/__tests__/sandboxes.test.js +30 -19
  67. package/lib/__tests__/usageTracking.test.js +10 -10
  68. package/lib/__tests__/validation.test.js +32 -32
  69. package/lib/accountTypes.d.ts +9 -9
  70. package/lib/accountTypes.js +2 -4
  71. package/lib/app/__tests__/migrate.test.js +15 -0
  72. package/lib/app/__tests__/migrate_legacy.test.js +9 -0
  73. package/lib/app/migrate_legacy.d.ts +2 -2
  74. package/lib/buildAccount.d.ts +4 -4
  75. package/lib/buildAccount.js +7 -14
  76. package/lib/commonOpts.js +5 -8
  77. package/lib/configMigrate.d.ts +2 -2
  78. package/lib/configMigrate.js +42 -18
  79. package/lib/configOptions.js +3 -2
  80. package/lib/constants.d.ts +1 -0
  81. package/lib/constants.js +6 -0
  82. package/lib/dependencyManagement.d.ts +8 -2
  83. package/lib/dependencyManagement.js +75 -12
  84. package/lib/developerTestAccounts.d.ts +3 -3
  85. package/lib/developerTestAccounts.js +4 -7
  86. package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
  87. package/lib/doctor/DiagnosticInfoBuilder.js +9 -6
  88. package/lib/doctor/Doctor.js +4 -3
  89. package/lib/doctor/__tests__/Diagnosis.test.js +4 -3
  90. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +17 -9
  91. package/lib/doctor/__tests__/Doctor.test.js +14 -0
  92. package/lib/importData.js +8 -7
  93. package/lib/links.js +5 -5
  94. package/lib/mcp/__tests__/setup.test.d.ts +1 -0
  95. package/lib/mcp/__tests__/setup.test.js +127 -0
  96. package/lib/mcp/setup.d.ts +4 -12
  97. package/lib/mcp/setup.js +34 -1
  98. package/lib/middleware/__test__/commandTargetingUtils.test.js +3 -3
  99. package/lib/middleware/__test__/configMiddleware.test.js +23 -22
  100. package/lib/middleware/__test__/gitMiddleware.test.js +9 -7
  101. package/lib/middleware/autoUpdateMiddleware.d.ts +3 -1
  102. package/lib/middleware/autoUpdateMiddleware.js +10 -2
  103. package/lib/middleware/commandTargetingUtils.js +2 -2
  104. package/lib/middleware/configMiddleware.d.ts +6 -1
  105. package/lib/middleware/configMiddleware.js +36 -15
  106. package/lib/middleware/gitMiddleware.js +8 -4
  107. package/lib/npm.d.ts +3 -0
  108. package/lib/npm.js +6 -0
  109. package/lib/oauth.d.ts +2 -2
  110. package/lib/oauth.js +8 -10
  111. package/lib/projects/__tests__/AppDevModeInterface.test.js +17 -6
  112. package/lib/projects/__tests__/DevServerManager.test.js +1 -0
  113. package/lib/projects/__tests__/LocalDevProcess.test.js +1 -0
  114. package/lib/projects/__tests__/components.test.js +148 -24
  115. package/lib/projects/__tests__/deploy.test.js +1 -0
  116. package/lib/projects/__tests__/platformVersion.test.js +5 -1
  117. package/lib/projects/__tests__/projects.test.js +13 -42
  118. package/lib/projects/components.js +76 -20
  119. package/lib/projects/config.js +5 -9
  120. package/lib/projects/create/__tests__/v2.test.js +11 -0
  121. package/lib/projects/localDev/AppDevModeInterface.js +2 -2
  122. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
  123. package/lib/projects/localDev/LocalDevLogger.js +4 -4
  124. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +3 -3
  125. package/lib/projects/localDev/helpers/account.d.ts +10 -10
  126. package/lib/projects/localDev/helpers/account.js +6 -11
  127. package/lib/projects/platformVersion.js +1 -1
  128. package/lib/projects/urls.js +5 -6
  129. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.d.ts +1 -0
  130. package/lib/prompts/__tests__/createDeveloperTestAccountConfigPrompt.test.js +153 -0
  131. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +7 -5
  132. package/lib/prompts/accountNamePrompt.js +3 -3
  133. package/lib/prompts/accountsPrompt.d.ts +1 -1
  134. package/lib/prompts/accountsPrompt.js +6 -7
  135. package/lib/prompts/confirmImportDataPrompt.js +2 -2
  136. package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +5 -0
  137. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +76 -66
  138. package/lib/prompts/downloadProjectPrompt.d.ts +1 -0
  139. package/lib/prompts/downloadProjectPrompt.js +5 -2
  140. package/lib/prompts/importDataTestAccountSelectPrompt.js +4 -5
  141. package/lib/prompts/personalAccessKeyPrompt.js +2 -2
  142. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -3
  143. package/lib/prompts/projectDevTargetAccountPrompt.js +5 -7
  144. package/lib/prompts/sandboxesPrompt.js +7 -8
  145. package/lib/prompts/setAsDefaultAccountPrompt.js +7 -6
  146. package/lib/sandboxSync.d.ts +2 -2
  147. package/lib/sandboxSync.js +3 -9
  148. package/lib/sandboxes.d.ts +4 -4
  149. package/lib/sandboxes.js +6 -11
  150. package/lib/serverlessLogs.js +2 -2
  151. package/lib/theme/__tests__/migrate.test.js +15 -0
  152. package/lib/ui/index.js +6 -3
  153. package/lib/usageTracking.js +15 -8
  154. package/lib/validation.js +13 -11
  155. package/mcp-server/tools/cms/HsCreateFunctionTool.js +8 -2
  156. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +4 -4
  157. package/mcp-server/tools/cms/HsCreateModuleTool.js +8 -2
  158. package/mcp-server/tools/cms/HsCreateTemplateTool.js +8 -2
  159. package/mcp-server/tools/cms/HsFunctionLogsTool.d.ts +4 -4
  160. package/mcp-server/tools/cms/HsFunctionLogsTool.js +6 -2
  161. package/mcp-server/tools/cms/HsListFunctionsTool.js +5 -1
  162. package/mcp-server/tools/cms/HsListTool.js +5 -1
  163. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +1 -0
  164. package/mcp-server/tools/index.js +4 -0
  165. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +1 -1
  166. package/mcp-server/tools/project/AddFeatureToProjectTool.js +9 -3
  167. package/mcp-server/tools/project/CreateProjectTool.js +8 -2
  168. package/mcp-server/tools/project/CreateTestAccountTool.d.ts +41 -0
  169. package/mcp-server/tools/project/CreateTestAccountTool.js +150 -0
  170. package/mcp-server/tools/project/DeployProjectTool.d.ts +1 -1
  171. package/mcp-server/tools/project/DeployProjectTool.js +8 -2
  172. package/mcp-server/tools/project/DocFetchTool.d.ts +1 -1
  173. package/mcp-server/tools/project/DocFetchTool.js +9 -5
  174. package/mcp-server/tools/project/DocsSearchTool.d.ts +1 -1
  175. package/mcp-server/tools/project/DocsSearchTool.js +12 -8
  176. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +1 -1
  177. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +11 -7
  178. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +1 -1
  179. package/mcp-server/tools/project/GetApplicationInfoTool.js +11 -7
  180. package/mcp-server/tools/project/GetBuildStatusTool.d.ts +26 -0
  181. package/mcp-server/tools/project/GetBuildStatusTool.js +164 -0
  182. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +1 -1
  183. package/mcp-server/tools/project/GetConfigValuesTool.js +11 -7
  184. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
  185. package/mcp-server/tools/project/GuidedWalkthroughTool.js +7 -3
  186. package/mcp-server/tools/project/UploadProjectTools.d.ts +9 -3
  187. package/mcp-server/tools/project/UploadProjectTools.js +51 -5
  188. package/mcp-server/tools/project/ValidateProjectTool.d.ts +1 -1
  189. package/mcp-server/tools/project/ValidateProjectTool.js +7 -3
  190. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.d.ts +1 -0
  191. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +454 -0
  192. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +5 -1
  193. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +25 -13
  194. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +7 -5
  195. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +7 -5
  196. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +1 -0
  197. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +240 -0
  198. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -6
  199. package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +56 -4
  200. package/mcp-server/utils/__tests__/content.test.js +21 -20
  201. package/mcp-server/utils/__tests__/feedbackTracking.test.js +33 -28
  202. package/mcp-server/utils/content.d.ts +1 -1
  203. package/mcp-server/utils/content.js +2 -2
  204. package/mcp-server/utils/feedbackTracking.d.ts +1 -1
  205. package/mcp-server/utils/feedbackTracking.js +3 -3
  206. package/mcp-server/utils/toolUsageTracking.js +4 -3
  207. package/package.json +8 -7
  208. package/lang/en.lyaml +0 -1508
  209. package/lib/lang.d.ts +0 -8
  210. package/lib/lang.js +0 -72
  211. package/mcp-server/utils/__tests__/cliConfig.test.js +0 -110
  212. package/mcp-server/utils/cliConfig.d.ts +0 -1
  213. package/mcp-server/utils/cliConfig.js +0 -12
  214. /package/{mcp-server/utils/__tests__/cliConfig.test.d.ts → commands/project/__tests__/updateDeps.test.d.ts} +0 -0
package/bin/cli.js CHANGED
@@ -4,7 +4,7 @@ import { logError } from '../lib/errorHandlers/index.js';
4
4
  import { setCLILogLevel, getCommandName } from '../lib/commonOpts.js';
5
5
  import { trackHelpUsage, trackConvertFieldsUsage, } from '../lib/usageTracking.js';
6
6
  import { EXIT_CODES } from '../lib/enums/exitCodes.js';
7
- import { loadAndValidateConfigMiddleware, injectAccountIdMiddleware, validateAccountOptions, handleDeprecatedEnvVariables, } from '../lib/middleware/configMiddleware.js';
7
+ import { validateConfigMiddleware, injectAccountIdMiddleware, validateAccountOptions, handleDeprecatedEnvVariables, handleCustomConfigLocationMiddleware, } from '../lib/middleware/configMiddleware.js';
8
8
  import { autoUpdateCLI } from '../lib/middleware/autoUpdateMiddleware.js';
9
9
  import { checkAndWarnGitInclusionMiddleware } from '../lib/middleware/gitMiddleware.js';
10
10
  import { performChecks } from '../lib/middleware/yargsChecksMiddleware.js';
@@ -55,7 +55,8 @@ function handleFailure(msg, err, yargs) {
55
55
  else if (err) {
56
56
  logError(err);
57
57
  }
58
- if (msg === null) {
58
+ if (msg === null && !err) {
59
+ // Required so running `hs` without a command shows the help
59
60
  yargs.showHelp('log');
60
61
  process.exit(EXIT_CODES.SUCCESS);
61
62
  }
@@ -65,13 +66,13 @@ function handleFailure(msg, err, yargs) {
65
66
  }
66
67
  const argv = yargs(process.argv.slice(2))
67
68
  .usage('The command line interface to interact with HubSpot.')
68
- // loadConfigMiddleware loads the new hidden config for all commands
69
69
  .middleware([
70
70
  setCLILogLevel,
71
71
  setRequestHeaders,
72
72
  handleDeprecatedEnvVariables,
73
- loadAndValidateConfigMiddleware,
73
+ handleCustomConfigLocationMiddleware,
74
74
  injectAccountIdMiddleware,
75
+ validateConfigMiddleware,
75
76
  autoUpdateCLI,
76
77
  checkAndWarnGitInclusionMiddleware,
77
78
  validateAccountOptions,
@@ -1,6 +1,7 @@
1
1
  import getStartedCommand from '../getStarted.js';
2
2
  import { trackCommandUsage } from '../../lib/usageTracking.js';
3
3
  import { promptUser } from '../../lib/prompts/promptUtils.js';
4
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
4
5
  import { projectNameAndDestPrompt } from '../../lib/prompts/projectNameAndDestPrompt.js';
5
6
  import { cloneGithubRepo } from '@hubspot/local-dev-lib/github';
6
7
  import { getProjectConfig, writeProjectConfig, } from '../../lib/projects/config.js';
@@ -16,6 +17,7 @@ vi.mock('../../lib/ui/logger');
16
17
  vi.mock('../../lib/errorHandlers');
17
18
  vi.mock('@hubspot/local-dev-lib/github');
18
19
  vi.mock('../../lib/dependencyManagement');
20
+ vi.mock('@hubspot/local-dev-lib/config');
19
21
  vi.mock('open');
20
22
  vi.mock('fs-extra', () => ({
21
23
  default: {
@@ -27,6 +29,14 @@ vi.mock('fs-extra', () => ({
27
29
  describe('commands/get-started', () => {
28
30
  beforeEach(() => {
29
31
  vi.clearAllMocks();
32
+ // @TODO Revisit config mocking in tests
33
+ getConfigAccountById.mockReturnValue({
34
+ accountId: 12345,
35
+ name: 'Test Account',
36
+ authType: 'personalaccesskey',
37
+ personalAccessKey: 'test-key',
38
+ env: 'prod',
39
+ });
30
40
  });
31
41
  describe('command', () => {
32
42
  it('should have the correct command structure', () => {
@@ -13,6 +13,7 @@ import migrateApp from '../project/migrateApp.js';
13
13
  import migrate from '../project/migrate.js';
14
14
  import cloneApp from '../project/cloneApp.js';
15
15
  import installDeps from '../project/installDeps.js';
16
+ import updateDeps from '../project/updateDeps.js';
16
17
  import validate from '../project/validate.js';
17
18
  import profileCommands from '../project/profile.js';
18
19
  import list from '../project/list.js';
@@ -72,6 +73,7 @@ describe('commands/project', () => {
72
73
  migrate,
73
74
  cloneApp,
74
75
  installDeps,
76
+ updateDeps,
75
77
  profileCommands,
76
78
  validate,
77
79
  list,
@@ -1,13 +1,23 @@
1
1
  import yargs from 'yargs';
2
2
  import { addConfigOptions, addAccountOptions, } from '../../../lib/commonOpts.js';
3
3
  import accountRenameCommand from '../rename.js';
4
+ import * as config from '@hubspot/local-dev-lib/config';
5
+ import { logError } from '../../../lib/errorHandlers/index.js';
6
+ import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
7
+ import * as usageTracking from '../../../lib/usageTracking.js';
4
8
  vi.mock('../../../lib/commonOpts');
9
+ vi.mock('@hubspot/local-dev-lib/config');
10
+ vi.mock('../../../lib/errorHandlers/index.js');
11
+ vi.mock('../../../lib/usageTracking.js');
5
12
  const positionalSpy = vi
6
13
  .spyOn(yargs, 'positional')
7
14
  .mockReturnValue(yargs);
8
15
  const exampleSpy = vi
9
16
  .spyOn(yargs, 'example')
10
17
  .mockReturnValue(yargs);
18
+ const renameAccountSpy = vi.spyOn(config, 'renameConfigAccount');
19
+ const processExitSpy = vi.spyOn(process, 'exit');
20
+ const trackCommandUsageSpy = vi.spyOn(usageTracking, 'trackCommandUsage');
11
21
  describe('commands/account/rename', () => {
12
22
  const yargsMock = yargs;
13
23
  describe('command', () => {
@@ -20,6 +30,38 @@ describe('commands/account/rename', () => {
20
30
  expect(accountRenameCommand.describe).toBeDefined();
21
31
  });
22
32
  });
33
+ describe('handler', () => {
34
+ let args;
35
+ beforeEach(() => {
36
+ vi.clearAllMocks();
37
+ renameAccountSpy.mockReturnValue(undefined);
38
+ processExitSpy.mockImplementation(() => {
39
+ throw new Error('process.exit called');
40
+ });
41
+ args = {
42
+ accountName: 'myExistingAccountName',
43
+ newName: 'myNewAccountName',
44
+ };
45
+ });
46
+ it('should rename the account', async () => {
47
+ await expect(accountRenameCommand.handler(args)).rejects.toThrow('process.exit called');
48
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('accounts-rename', undefined, undefined);
49
+ expect(renameAccountSpy).toHaveBeenCalledWith('myExistingAccountName', 'my-new-account-name');
50
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.SUCCESS);
51
+ });
52
+ it('should handle errors when renameAccount throws', async () => {
53
+ const error = new Error('Failed to rename account');
54
+ renameAccountSpy.mockImplementation(() => {
55
+ throw error;
56
+ });
57
+ await expect(accountRenameCommand.handler(args)).rejects.toThrow('process.exit called');
58
+ expect(trackCommandUsageSpy).toHaveBeenCalledWith('accounts-rename', undefined, undefined);
59
+ expect(renameAccountSpy).toHaveBeenCalledWith('myExistingAccountName', 'my-new-account-name');
60
+ expect(logError).toHaveBeenCalledTimes(1);
61
+ expect(logError).toHaveBeenCalledWith(error);
62
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
63
+ });
64
+ });
23
65
  describe('builder', () => {
24
66
  it('should support the correct options', () => {
25
67
  accountRenameCommand.builder(yargsMock);
@@ -1,6 +1,4 @@
1
- import { loadConfig, updateAccountConfig, writeConfig, createEmptyConfigFile, deleteEmptyConfigFile, } from '@hubspot/local-dev-lib/config';
2
- import { configFileExists, getConfigPath, } from '@hubspot/local-dev-lib/config/migrate';
3
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
1
+ import { updateConfigAccount, createEmptyConfigFile, deleteConfigFileIfEmpty, getConfigFilePath, localConfigFileExists, globalConfigFileExists, } from '@hubspot/local-dev-lib/config';
4
2
  import { getAccessToken, updateConfigWithAccessToken, } from '@hubspot/local-dev-lib/personalAccessKey';
5
3
  import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
6
4
  import { toKebabCase } from '@hubspot/local-dev-lib/text';
@@ -46,10 +44,9 @@ async function updateConfigWithNewAccount(env, configAlreadyExists, providedPers
46
44
  // Can happen if the user is re-authenticating an account with no name
47
45
  if (configAlreadyExists && !updatedConfig.name) {
48
46
  updatedConfig.name = (await cliAccountNamePrompt(defaultAccountName)).name;
49
- updateAccountConfig({
47
+ updateConfigAccount({
50
48
  ...updatedConfig,
51
49
  });
52
- writeConfig();
53
50
  }
54
51
  return updatedConfig;
55
52
  }
@@ -59,8 +56,8 @@ async function updateConfigWithNewAccount(env, configAlreadyExists, providedPers
59
56
  }
60
57
  }
61
58
  async function handleConfigMigration() {
62
- const deprecatedConfigExists = configFileExists(false);
63
- const globalConfigExists = configFileExists(true);
59
+ const deprecatedConfigExists = localConfigFileExists();
60
+ const globalConfigExists = globalConfigFileExists();
64
61
  // No deprecated config exists, so no migration is needed
65
62
  if (!deprecatedConfigExists) {
66
63
  return true;
@@ -117,12 +114,11 @@ async function handler(args) {
117
114
  await trackAuthAction('account-auth', authType, TRACKING_STATUS.ERROR);
118
115
  process.exit(EXIT_CODES.ERROR);
119
116
  }
120
- const configAlreadyExists = configFileExists(true);
117
+ const configAlreadyExists = globalConfigFileExists();
121
118
  if (!configAlreadyExists) {
122
- createEmptyConfigFile({}, true);
119
+ createEmptyConfigFile(true);
123
120
  }
124
- loadConfig('');
125
- handleExit(deleteEmptyConfigFile);
121
+ handleExit(deleteConfigFileIfEmpty);
126
122
  const updatedConfig = await updateConfigWithNewAccount(args.qa ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD, configAlreadyExists, providedPersonalAccessKey, parsedUserProvidedAccountId);
127
123
  if (!updatedConfig) {
128
124
  if (!disableTracking) {
@@ -131,14 +127,14 @@ async function handler(args) {
131
127
  uiLogger.error(commands.account.subcommands.auth.errors.failedToUpdateConfig);
132
128
  process.exit(EXIT_CODES.ERROR);
133
129
  }
134
- const accountId = getAccountIdentifier(updatedConfig);
130
+ const { accountId, name } = updatedConfig;
135
131
  if (!configAlreadyExists) {
136
132
  uiLogger.log('');
137
- uiLogger.success(commands.account.subcommands.auth.success.configFileCreated(getConfigPath('', true)));
133
+ uiLogger.success(commands.account.subcommands.auth.success.configFileCreated(getConfigFilePath()));
138
134
  uiLogger.success(commands.account.subcommands.auth.success.configFileUpdated(accountId));
139
135
  }
140
136
  else {
141
- await setAsDefaultAccountPrompt(updatedConfig.name);
137
+ await setAsDefaultAccountPrompt(name);
142
138
  }
143
139
  uiFeatureHighlight([
144
140
  'getStartedCommand',
@@ -1,9 +1,8 @@
1
1
  import fs from 'fs';
2
2
  import { accessTokenForPersonalAccessKey } from '@hubspot/local-dev-lib/personalAccessKey';
3
- import { loadConfig, getConfigPath, deleteAccount, getConfigAccounts, getConfigDefaultAccount, updateDefaultAccount, } from '@hubspot/local-dev-lib/config';
4
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
3
+ import { removeAccountFromConfig, getAllConfigAccounts, getConfigDefaultAccountIfExists, setConfigAccountAsDefault, } from '@hubspot/local-dev-lib/config';
4
+ import { getDefaultAccountOverrideAccountId, getDefaultAccountOverrideFilePath, } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
5
5
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
6
- import { getCWDAccountOverride, getDefaultAccountOverrideFilePath, } from '@hubspot/local-dev-lib/config';
7
6
  import { trackCommandUsage } from '../../lib/usageTracking.js';
8
7
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
9
8
  import { promptUser } from '../../lib/prompts/promptUtils.js';
@@ -20,7 +19,7 @@ const describe = commands.account.subcommands.clean.describe;
20
19
  async function handler(args) {
21
20
  const { qa } = args;
22
21
  trackCommandUsage('accounts-clean');
23
- const accountsList = getConfigAccounts() || [];
22
+ const accountsList = getAllConfigAccounts();
24
23
  const filteredTestAccounts = accountsList.filter(p => qa ? p.env === 'qa' : p.env !== 'qa');
25
24
  if (filteredTestAccounts && filteredTestAccounts.length === 0) {
26
25
  uiLogger.log(commands.account.subcommands.clean.noResults);
@@ -35,8 +34,7 @@ async function handler(args) {
35
34
  });
36
35
  for (const account of filteredTestAccounts) {
37
36
  try {
38
- const accountId = getAccountIdentifier(account);
39
- await accessTokenForPersonalAccessKey(accountId, true);
37
+ await accessTokenForPersonalAccessKey(account.accountId, true);
40
38
  }
41
39
  catch (error) {
42
40
  if (isSpecifiedError(error, {
@@ -60,17 +58,13 @@ async function handler(args) {
60
58
  ? commands.account.subcommands.clean.inactiveAccountsFound.one
61
59
  : commands.account.subcommands.clean.inactiveAccountsFound.other(accountsToRemove.length),
62
60
  });
63
- uiLogger.log(getTableContents(accountsToRemove.map(p => [
64
- uiAccountDescription(getAccountIdentifier(p)),
65
- ]), { border: { bodyLeft: ' ' } }));
61
+ uiLogger.log(getTableContents(accountsToRemove.map(p => [uiAccountDescription(p.accountId)]), { border: { bodyLeft: ' ' } }));
66
62
  let promptMessage = oneAccountFound
67
63
  ? commands.account.subcommands.clean.confirm.one
68
64
  : commands.account.subcommands.clean.confirm.other(accountsToRemove.length);
69
- const accountOverride = getCWDAccountOverride();
65
+ const accountOverride = getDefaultAccountOverrideAccountId();
70
66
  const overrideFilePath = getDefaultAccountOverrideFilePath();
71
- const accountOverrideMatches = accountsToRemove.some(account => account.name === accountOverride ||
72
- // @ts-expect-error: Default account override files can only exist with global config
73
- account.accountId === accountOverride);
67
+ const accountOverrideMatches = accountsToRemove.some(account => account.accountId === accountOverride);
74
68
  if (overrideFilePath && accountOverride && accountOverrideMatches) {
75
69
  promptMessage = `${promptMessage}${commands.account.subcommands.clean.defaultAccountOverride(overrideFilePath)}`;
76
70
  }
@@ -92,17 +86,15 @@ async function handler(args) {
92
86
  logError(error);
93
87
  }
94
88
  for (const accountToRemove of accountsToRemove) {
95
- await deleteAccount(accountToRemove.name);
89
+ removeAccountFromConfig(accountToRemove.accountId);
96
90
  uiLogger.log(commands.account.subcommands.clean.removeSuccess(accountToRemove.name));
97
91
  }
98
- // Get updated version of the config
99
- loadConfig(getConfigPath());
100
- const defaultAccount = getConfigDefaultAccount();
92
+ const defaultAccount = getConfigDefaultAccountIfExists();
101
93
  if (defaultAccount &&
102
- accountsToRemove.some(p => p.name === defaultAccount)) {
94
+ accountsToRemove.some(p => p.name === defaultAccount.name)) {
103
95
  uiLogger.log(commands.account.subcommands.clean.replaceDefaultAccount);
104
96
  const newDefaultAccount = await selectAccountFromConfig();
105
- updateDefaultAccount(newDefaultAccount);
97
+ setConfigAccountAsDefault(newDefaultAccount);
106
98
  }
107
99
  }
108
100
  }
@@ -2,11 +2,11 @@ import fs from 'fs-extra';
2
2
  import path from 'path';
3
3
  import { getCwd } from '@hubspot/local-dev-lib/path';
4
4
  import { DEFAULT_ACCOUNT_OVERRIDE_FILE_NAME } from '@hubspot/local-dev-lib/constants/config';
5
- import { getCWDAccountOverride, getDefaultAccountOverrideFilePath, getConfigPath, getAccountId, } from '@hubspot/local-dev-lib/config';
6
- import { getGlobalConfig } from '@hubspot/local-dev-lib/config/migrate';
5
+ import { getConfigFilePath, getConfigAccountIfExists, globalConfigFileExists, } from '@hubspot/local-dev-lib/config';
6
+ import { getDefaultAccountOverrideAccountId, getDefaultAccountOverrideFilePath, } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
7
7
  import { promptUser } from '../../lib/prompts/promptUtils.js';
8
8
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
9
- import { trackCommandMetadataUsage } from '../../lib/usageTracking.js';
9
+ import { trackCommandUsage } from '../../lib/usageTracking.js';
10
10
  import { selectAccountFromConfig } from '../../lib/prompts/accountsPrompt.js';
11
11
  import { logError } from '../../lib/errorHandlers/index.js';
12
12
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
@@ -16,15 +16,15 @@ const command = 'create-override [account]';
16
16
  const describe = commands.account.subcommands.createOverride.describe(DEFAULT_ACCOUNT_OVERRIDE_FILE_NAME);
17
17
  async function handler(args) {
18
18
  let overrideDefaultAccount = args.account;
19
- const globalConfig = getGlobalConfig();
20
- if (!globalConfig) {
19
+ const globalConfigExists = globalConfigFileExists();
20
+ if (!globalConfigExists) {
21
21
  uiLogger.error(commands.account.subcommands.createOverride.errors.globalConfigNotFound);
22
22
  process.exit(EXIT_CODES.ERROR);
23
23
  }
24
- const accountOverride = getCWDAccountOverride();
24
+ const accountOverrideId = getDefaultAccountOverrideAccountId();
25
25
  const overrideFilePath = getDefaultAccountOverrideFilePath();
26
- if (accountOverride && overrideFilePath) {
27
- uiLogger.log(commands.account.subcommands.createOverride.accountOverride(overrideFilePath, accountOverride.toString()));
26
+ if (accountOverrideId && overrideFilePath) {
27
+ uiLogger.log(commands.account.subcommands.createOverride.accountOverride(overrideFilePath, accountOverrideId.toString()));
28
28
  const { replaceOverrideFile } = await promptUser({
29
29
  type: 'confirm',
30
30
  name: 'replaceOverrideFile',
@@ -32,32 +32,26 @@ async function handler(args) {
32
32
  });
33
33
  uiLogger.log('');
34
34
  if (!replaceOverrideFile) {
35
- const accountId = getAccountId(accountOverride) || undefined;
36
- trackCommandMetadataUsage('account-createOverride', {
37
- command: 'hs account create-override',
38
- step: 'Reject overwriting an override via prompt',
39
- }, accountId);
40
35
  process.exit(EXIT_CODES.SUCCESS);
41
36
  }
42
37
  }
43
38
  if (!overrideDefaultAccount) {
44
39
  overrideDefaultAccount = await selectAccountFromConfig();
45
40
  }
46
- else if (!getAccountId(overrideDefaultAccount)) {
47
- uiLogger.error(commands.account.subcommands.createOverride.errors.accountNotFound(getConfigPath() || ''));
48
- overrideDefaultAccount = await selectAccountFromConfig();
41
+ else {
42
+ const account = getConfigAccountIfExists(overrideDefaultAccount);
43
+ if (!account) {
44
+ uiLogger.error(commands.account.subcommands.createOverride.errors.accountNotFound(getConfigFilePath() || ''));
45
+ overrideDefaultAccount = await selectAccountFromConfig();
46
+ }
49
47
  }
50
- const accountId = getAccountId(overrideDefaultAccount);
48
+ const account = getConfigAccountIfExists(overrideDefaultAccount);
49
+ const accountId = account?.accountId;
50
+ trackCommandUsage('account-createOverride', undefined, accountId);
51
51
  try {
52
52
  const overrideFilePath = path.join(getCwd(), DEFAULT_ACCOUNT_OVERRIDE_FILE_NAME);
53
53
  await fs.writeFile(overrideFilePath, accountId.toString(), 'utf8');
54
54
  uiLogger.success(commands.account.subcommands.createOverride.success(overrideFilePath));
55
- const trackingId = accountId || undefined;
56
- trackCommandMetadataUsage('config-migrate', {
57
- command: 'hs config migrate',
58
- step: 'Confirm overwriting an override via prompt',
59
- successful: true,
60
- }, trackingId);
61
55
  process.exit(EXIT_CODES.SUCCESS);
62
56
  }
63
57
  catch (e) {
@@ -1,4 +1,5 @@
1
- import { getAccountConfig, getDisplayDefaultAccount, getConfigDefaultAccount, getDefaultAccountOverrideFilePath, getConfigPath, } from '@hubspot/local-dev-lib/config';
1
+ import { getConfigAccountById, getConfigDefaultAccount, getConfigFilePath, } from '@hubspot/local-dev-lib/config';
2
+ import { getDefaultAccountOverrideFilePath } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
2
3
  import { getAccessToken } from '@hubspot/local-dev-lib/personalAccessKey';
3
4
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
4
5
  import { indent } from '../../lib/ui/index.js';
@@ -9,7 +10,7 @@ const describe = commands.account.subcommands.info.describe;
9
10
  const command = 'info [account]';
10
11
  async function handler(args) {
11
12
  const { derivedAccountId } = args;
12
- const config = getAccountConfig(derivedAccountId);
13
+ const config = getConfigAccountById(derivedAccountId);
13
14
  // check if the provided account is using a personal access key, if not, show an error
14
15
  if (config && config.authType === 'personalaccesskey') {
15
16
  const { name, personalAccessKey, env } = config;
@@ -17,11 +18,12 @@ async function handler(args) {
17
18
  const response = await getAccessToken(personalAccessKey, env, derivedAccountId);
18
19
  scopeGroups = response.scopeGroups.map(s => [s]);
19
20
  // If a default account is present in the config, display it
20
- const configPath = getConfigPath();
21
+ const configPath = getConfigFilePath();
21
22
  if (configPath) {
22
23
  uiLogger.log(commands.account.subcommands.info.defaultAccountTitle);
23
24
  uiLogger.log(`${indent(1)}${commands.account.subcommands.info.configPath(configPath)}`);
24
- uiLogger.log(`${indent(1)}${commands.account.subcommands.info.defaultAccount(getDisplayDefaultAccount().toString())}`);
25
+ const defaultAccount = getConfigDefaultAccount();
26
+ uiLogger.log(`${indent(1)}${commands.account.subcommands.info.defaultAccount(defaultAccount.name)}`);
25
27
  }
26
28
  // If a default account override is present, display it
27
29
  const overrideFilePath = getDefaultAccountOverrideFilePath();
@@ -29,7 +31,8 @@ async function handler(args) {
29
31
  uiLogger.log('');
30
32
  uiLogger.log(commands.account.subcommands.info.overrideFilePathTitle);
31
33
  uiLogger.log(`${indent(1)}${commands.account.subcommands.info.overrideFilePath(overrideFilePath)}`);
32
- uiLogger.log(`${indent(1)}${commands.account.subcommands.info.overrideAccount(getConfigDefaultAccount().toString())}`);
34
+ const defaultAccount = getConfigDefaultAccount();
35
+ uiLogger.log(`${indent(1)}${commands.account.subcommands.info.overrideAccount(defaultAccount.name)}`);
33
36
  }
34
37
  uiLogger.log('');
35
38
  uiLogger.log(commands.account.subcommands.info.name(name));
@@ -1,5 +1,5 @@
1
- import { getConfigPath, getConfigAccounts, getDefaultAccountOverrideFilePath, getDisplayDefaultAccount, getConfigDefaultAccount, } from '@hubspot/local-dev-lib/config';
2
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
1
+ import { getConfigFilePath, getAllConfigAccounts, getConfigDefaultAccountIfExists, } from '@hubspot/local-dev-lib/config';
2
+ import { getDefaultAccountOverrideFilePath } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
3
3
  import { indent } from '../../lib/ui/index.js';
4
4
  import { getTableContents, getTableHeader } from '../../lib/ui/table.js';
5
5
  import { trackCommandUsage } from '../../lib/usageTracking.js';
@@ -18,10 +18,7 @@ function sortAndMapAccounts(accounts) {
18
18
  (p.accountType === HUBSPOT_ACCOUNT_TYPES.STANDARD ||
19
19
  p.accountType === HUBSPOT_ACCOUNT_TYPES.APP_DEVELOPER))
20
20
  .forEach(account => {
21
- const accountId = getAccountIdentifier(account);
22
- if (accountId) {
23
- mappedAccountData[accountId] = [account];
24
- }
21
+ mappedAccountData[account.accountId] = [account];
25
22
  });
26
23
  // Non-standard accounts (sandbox, developer test account)
27
24
  accounts
@@ -34,10 +31,7 @@ function sortAndMapAccounts(accounts) {
34
31
  ];
35
32
  }
36
33
  else {
37
- const accountId = getAccountIdentifier(p);
38
- if (accountId) {
39
- mappedAccountData[accountId] = [p];
40
- }
34
+ mappedAccountData[p.accountId] = [p];
41
35
  }
42
36
  });
43
37
  return mappedAccountData;
@@ -46,7 +40,7 @@ function getAccountData(mappedAccountData) {
46
40
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
41
  const accountData = [];
48
42
  Object.entries(mappedAccountData).forEach(([key, set]) => {
49
- const hasParentAccount = set.filter(p => getAccountIdentifier(p) === parseInt(key, 10))[0];
43
+ const hasParentAccount = set.filter(p => p.accountId === parseInt(key, 10))[0];
50
44
  set.forEach(account => {
51
45
  let name = `${account.name} [${HUBSPOT_ACCOUNT_TYPE_STRINGS[account.accountType]}]`;
52
46
  if (isSandbox(account)) {
@@ -59,7 +53,7 @@ function getAccountData(mappedAccountData) {
59
53
  name = `↳ ${name}`;
60
54
  }
61
55
  }
62
- accountData.push([name, getAccountIdentifier(account), account.authType]);
56
+ accountData.push([name, account.accountId, account.authType]);
63
57
  });
64
58
  });
65
59
  return accountData;
@@ -67,8 +61,8 @@ function getAccountData(mappedAccountData) {
67
61
  async function handler(args) {
68
62
  const { derivedAccountId } = args;
69
63
  trackCommandUsage('accounts-list', undefined, derivedAccountId);
70
- const configPath = getConfigPath();
71
- const accountsList = getConfigAccounts() || [];
64
+ const configPath = getConfigFilePath();
65
+ const accountsList = getAllConfigAccounts();
72
66
  const mappedAccountData = sortAndMapAccounts(accountsList);
73
67
  const accountData = getAccountData(mappedAccountData);
74
68
  accountData.unshift(getTableHeader([
@@ -76,19 +70,20 @@ async function handler(args) {
76
70
  commands.account.subcommands.list.labels.accountId,
77
71
  commands.account.subcommands.list.labels.authType,
78
72
  ]));
73
+ const defaultAccount = getConfigDefaultAccountIfExists();
79
74
  // If a default account is present in the config, display it
80
- if (configPath) {
75
+ if (configPath && defaultAccount) {
81
76
  uiLogger.log(commands.account.subcommands.list.defaultAccountTitle);
82
77
  uiLogger.log(`${indent(1)}${commands.account.subcommands.list.configPath(configPath)}`);
83
- uiLogger.log(`${indent(1)}${commands.account.subcommands.list.defaultAccount(getDisplayDefaultAccount().toString())}`);
78
+ uiLogger.log(`${indent(1)}${commands.account.subcommands.list.defaultAccount(defaultAccount.name)}`);
84
79
  uiLogger.log('');
85
80
  }
86
81
  // If a default account override is present, display it
87
82
  const overrideFilePath = getDefaultAccountOverrideFilePath();
88
- if (overrideFilePath) {
83
+ if (overrideFilePath && defaultAccount) {
89
84
  uiLogger.log(commands.account.subcommands.list.overrideFilePathTitle);
90
85
  uiLogger.log(`${indent(1)}${commands.account.subcommands.list.overrideFilePath(overrideFilePath)}`);
91
- uiLogger.log(`${indent(1)}${commands.account.subcommands.list.overrideAccount(getConfigDefaultAccount().toString())}`);
86
+ uiLogger.log(`${indent(1)}${commands.account.subcommands.list.overrideAccount(defaultAccount.name)}`);
92
87
  uiLogger.log('');
93
88
  }
94
89
  uiLogger.log(commands.account.subcommands.list.accounts);
@@ -1,5 +1,6 @@
1
1
  import fs from 'fs';
2
- import { loadConfig, getConfigPath, deleteAccount, getConfigDefaultAccount, getAccountId, updateDefaultAccount, getCWDAccountOverride, getDefaultAccountOverrideFilePath, } from '@hubspot/local-dev-lib/config';
2
+ import { getConfigFilePath, removeAccountFromConfig, getConfigDefaultAccountIfExists, getConfigAccountIfExists, getConfigAccountById, setConfigAccountAsDefault, } from '@hubspot/local-dev-lib/config';
3
+ import { getDefaultAccountOverrideAccountId, getDefaultAccountOverrideFilePath, } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
3
4
  import { trackCommandUsage } from '../../lib/usageTracking.js';
4
5
  import { promptUser } from '../../lib/prompts/promptUtils.js';
5
6
  import { logError } from '../../lib/errorHandlers/index.js';
@@ -10,25 +11,29 @@ import { commands } from '../../lang/en.js';
10
11
  const command = 'remove [account]';
11
12
  const describe = commands.account.subcommands.remove.describe;
12
13
  async function handler(args) {
13
- const { account } = args;
14
- let accountToRemove = account;
15
- if (accountToRemove && !getAccountId(accountToRemove)) {
16
- uiLogger.error(commands.account.subcommands.remove.errors.accountNotFound(accountToRemove, getConfigPath()));
14
+ const { account: accountFlag } = args;
15
+ let accountToRemoveConfig = accountFlag
16
+ ? getConfigAccountIfExists(accountFlag)
17
+ : undefined;
18
+ let accountToRemoveId = accountToRemoveConfig?.accountId;
19
+ if (accountFlag && !accountToRemoveConfig) {
20
+ uiLogger.error(commands.account.subcommands.remove.errors.accountNotFound(accountFlag, getConfigFilePath()));
17
21
  }
18
- if (!accountToRemove || !getAccountId(accountToRemove)) {
19
- accountToRemove = await selectAccountFromConfig(commands.account.subcommands.remove.prompts.selectAccountToRemove);
22
+ if (!accountToRemoveId) {
23
+ accountToRemoveId = await selectAccountFromConfig(commands.account.subcommands.remove.prompts.selectAccountToRemove);
20
24
  }
21
- trackCommandUsage('accounts-remove', undefined, getAccountId(accountToRemove));
22
- const currentDefaultAccount = getConfigDefaultAccount();
23
- const accountOverride = getCWDAccountOverride();
25
+ accountToRemoveConfig = getConfigAccountById(accountToRemoveId);
26
+ trackCommandUsage('accounts-remove', undefined, accountToRemoveId);
27
+ const currentDefaultAccount = getConfigDefaultAccountIfExists();
28
+ const accountOverride = getDefaultAccountOverrideAccountId();
24
29
  const overrideFilePath = getDefaultAccountOverrideFilePath();
25
30
  if (overrideFilePath &&
26
31
  accountOverride &&
27
- accountOverride === accountToRemove) {
32
+ accountOverride === accountToRemoveConfig?.accountId) {
28
33
  const { deleteOverrideFile } = await promptUser({
29
34
  type: 'confirm',
30
35
  name: 'deleteOverrideFile',
31
- message: commands.account.subcommands.remove.prompts.deleteOverrideFile(overrideFilePath, accountToRemove),
36
+ message: commands.account.subcommands.remove.prompts.deleteOverrideFile(overrideFilePath, accountToRemoveConfig.name),
32
37
  });
33
38
  try {
34
39
  if (deleteOverrideFile) {
@@ -39,20 +44,16 @@ async function handler(args) {
39
44
  logError(error);
40
45
  }
41
46
  }
42
- await deleteAccount(accountToRemove);
43
- uiLogger.success(commands.account.subcommands.remove.success.accountRemoved(accountToRemove));
44
- // Get updated version of the config
45
- loadConfig(getConfigPath());
46
- const accountToRemoveId = getAccountId(accountToRemove);
47
- let defaultAccountId;
48
- if (currentDefaultAccount) {
49
- defaultAccountId = getAccountId(currentDefaultAccount);
47
+ if (accountToRemoveConfig) {
48
+ removeAccountFromConfig(accountToRemoveConfig.accountId);
50
49
  }
51
- if (accountToRemoveId === defaultAccountId) {
50
+ uiLogger.success(commands.account.subcommands.remove.success.accountRemoved(accountToRemoveConfig.name));
51
+ if (currentDefaultAccount &&
52
+ accountToRemoveConfig?.accountId === currentDefaultAccount.accountId) {
52
53
  uiLogger.log('');
53
54
  uiLogger.log(commands.account.subcommands.remove.logs.replaceDefaultAccount);
54
55
  const newDefaultAccount = await selectAccountFromConfig();
55
- updateDefaultAccount(newDefaultAccount);
56
+ setConfigAccountAsDefault(newDefaultAccount);
56
57
  }
57
58
  }
58
59
  function accountRemoveBuilder(yargs) {
@@ -1,9 +1,9 @@
1
1
  import fs from 'fs-extra';
2
- import { getCWDAccountOverride, getDefaultAccountOverrideFilePath, getAccountId, } from '@hubspot/local-dev-lib/config';
2
+ import { globalConfigFileExists } from '@hubspot/local-dev-lib/config';
3
+ import { getDefaultAccountOverrideAccountId, getDefaultAccountOverrideFilePath, } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
3
4
  import { DEFAULT_ACCOUNT_OVERRIDE_FILE_NAME } from '@hubspot/local-dev-lib/constants/config';
4
- import { getGlobalConfig } from '@hubspot/local-dev-lib/config/migrate';
5
5
  import { promptUser } from '../../lib/prompts/promptUtils.js';
6
- import { trackCommandMetadataUsage } from '../../lib/usageTracking.js';
6
+ import { trackCommandUsage } from '../../lib/usageTracking.js';
7
7
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
8
8
  import { logError } from '../../lib/errorHandlers/index.js';
9
9
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
@@ -13,15 +13,16 @@ const command = 'remove-override';
13
13
  const describe = commands.account.subcommands.removeOverride.describe(DEFAULT_ACCOUNT_OVERRIDE_FILE_NAME);
14
14
  async function handler(args) {
15
15
  const { force } = args;
16
- const globalConfig = getGlobalConfig();
17
- if (!globalConfig) {
16
+ const globalConfigExists = globalConfigFileExists();
17
+ if (!globalConfigExists) {
18
18
  uiLogger.error(commands.account.subcommands.removeOverride.errors.globalConfigNotFound);
19
19
  process.exit(EXIT_CODES.ERROR);
20
20
  }
21
- const accountOverride = getCWDAccountOverride();
21
+ const accountOverride = getDefaultAccountOverrideAccountId();
22
22
  const overrideFilePath = getDefaultAccountOverrideFilePath();
23
23
  if (accountOverride && overrideFilePath) {
24
- const accountId = getAccountId(accountOverride) || undefined;
24
+ const accountId = accountOverride;
25
+ trackCommandUsage('account-removeOverride', undefined, accountId);
25
26
  if (!force) {
26
27
  uiLogger.log(commands.account.subcommands.removeOverride.accountOverride(overrideFilePath, accountOverride.toString()));
27
28
  const { deleteOverrideFile } = await promptUser({
@@ -32,21 +33,12 @@ async function handler(args) {
32
33
  });
33
34
  uiLogger.log('');
34
35
  if (!deleteOverrideFile) {
35
- trackCommandMetadataUsage('account-removeOverride', {
36
- command: 'hs account remove-override',
37
- step: 'Reject removing override via prompt',
38
- }, accountId);
39
36
  process.exit(EXIT_CODES.SUCCESS);
40
37
  }
41
38
  }
42
39
  try {
43
40
  fs.unlinkSync(overrideFilePath);
44
41
  uiLogger.success(commands.account.subcommands.removeOverride.success);
45
- trackCommandMetadataUsage('account-removeOverride', {
46
- command: 'hs account remove-override',
47
- step: 'Confirm removing override file (via prompt/force)',
48
- successful: true,
49
- }, accountId);
50
42
  process.exit(EXIT_CODES.SUCCESS);
51
43
  }
52
44
  catch (error) {
@@ -1,5 +1,5 @@
1
1
  import { CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
2
- type AccountRenameArgs = CommonArgs & ConfigArgs & {
2
+ export type AccountRenameArgs = CommonArgs & ConfigArgs & {
3
3
  accountName: string;
4
4
  newName: string;
5
5
  };