@hubspot/cli 7.10.0 → 7.10.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 (199) 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 +3 -0
  4. package/commands/account/__tests__/rename.test.js +10 -3
  5. package/commands/account/auth.js +10 -14
  6. package/commands/account/clean.js +11 -19
  7. package/commands/account/createOverride.js +15 -11
  8. package/commands/account/info.js +8 -5
  9. package/commands/account/list.js +15 -19
  10. package/commands/account/remove.js +23 -22
  11. package/commands/account/removeOverride.js +6 -6
  12. package/commands/account/rename.js +2 -2
  13. package/commands/account/use.js +19 -8
  14. package/commands/app/__tests__/migrate.test.js +8 -4
  15. package/commands/app/migrate.js +2 -2
  16. package/commands/auth.js +18 -14
  17. package/commands/config/migrate.js +5 -5
  18. package/commands/customObject/createSchema.js +2 -3
  19. package/commands/customObject/updateSchema.js +2 -3
  20. package/commands/getStarted.js +2 -3
  21. package/commands/hubdb/__tests__/list.test.js +1 -0
  22. package/commands/hubdb/list.js +2 -2
  23. package/commands/init.js +36 -32
  24. package/commands/project/__tests__/deploy.test.js +10 -5
  25. package/commands/project/__tests__/devUnifiedFlow.test.js +6 -4
  26. package/commands/project/__tests__/lint.test.js +709 -0
  27. package/commands/project/__tests__/logs.test.js +4 -0
  28. package/commands/project/__tests__/validate.test.js +286 -28
  29. package/commands/project/cloneApp.js +2 -2
  30. package/commands/project/deploy.js +16 -8
  31. package/commands/project/dev/deprecatedFlow.js +4 -5
  32. package/commands/project/dev/index.js +19 -7
  33. package/commands/project/dev/unifiedFlow.js +4 -5
  34. package/commands/project/lint.d.ts +6 -0
  35. package/commands/project/lint.js +178 -0
  36. package/commands/project/logs.js +2 -3
  37. package/commands/project/migrate.js +4 -13
  38. package/commands/project/profile/add.js +6 -7
  39. package/commands/project/profile/delete.js +2 -2
  40. package/commands/project/upload.js +10 -4
  41. package/commands/project/validate.js +73 -13
  42. package/commands/project.js +2 -0
  43. package/commands/sandbox/__tests__/create.test.js +14 -5
  44. package/commands/sandbox/create.js +4 -5
  45. package/commands/sandbox/delete.js +23 -20
  46. package/commands/testAccount/create.js +2 -2
  47. package/commands/testAccount/delete.js +9 -8
  48. package/lang/en.d.ts +48 -11
  49. package/lang/en.js +58 -15
  50. package/lib/__tests__/buildAccount.test.js +22 -30
  51. package/lib/__tests__/commonOpts.test.js +9 -13
  52. package/lib/__tests__/developerTestAccounts.test.js +29 -17
  53. package/lib/__tests__/importData.test.js +20 -10
  54. package/lib/__tests__/oauth.test.js +19 -8
  55. package/lib/__tests__/projectProfiles.test.js +273 -32
  56. package/lib/__tests__/sandboxSync.test.js +33 -11
  57. package/lib/__tests__/sandboxes.test.js +30 -19
  58. package/lib/__tests__/usageTracking.test.js +10 -10
  59. package/lib/__tests__/validation.test.js +32 -32
  60. package/lib/accountTypes.d.ts +9 -9
  61. package/lib/accountTypes.js +2 -4
  62. package/lib/app/__tests__/migrate.test.js +15 -0
  63. package/lib/app/__tests__/migrate_legacy.test.js +9 -0
  64. package/lib/app/migrate_legacy.d.ts +2 -2
  65. package/lib/buildAccount.d.ts +4 -4
  66. package/lib/buildAccount.js +7 -14
  67. package/lib/commonOpts.js +3 -3
  68. package/lib/configMigrate.d.ts +2 -2
  69. package/lib/configMigrate.js +42 -18
  70. package/lib/configOptions.js +3 -2
  71. package/lib/developerTestAccounts.d.ts +3 -3
  72. package/lib/developerTestAccounts.js +4 -7
  73. package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
  74. package/lib/doctor/DiagnosticInfoBuilder.js +9 -6
  75. package/lib/doctor/Doctor.js +4 -3
  76. package/lib/doctor/__tests__/Diagnosis.test.js +4 -3
  77. package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +17 -9
  78. package/lib/doctor/__tests__/Doctor.test.js +14 -0
  79. package/lib/importData.js +8 -7
  80. package/lib/links.js +5 -5
  81. package/lib/middleware/{__test__ → __tests__}/commandTargetingUtils.test.js +3 -3
  82. package/lib/middleware/{__test__ → __tests__}/configMiddleware.test.js +23 -22
  83. package/lib/middleware/{__test__ → __tests__}/gitMiddleware.test.js +9 -7
  84. package/lib/middleware/autoUpdateMiddleware.js +34 -23
  85. package/lib/middleware/commandTargetingUtils.js +3 -2
  86. package/lib/middleware/configMiddleware.d.ts +6 -1
  87. package/lib/middleware/configMiddleware.js +36 -15
  88. package/lib/middleware/fireAlarmMiddleware.js +4 -15
  89. package/lib/middleware/gitMiddleware.js +8 -4
  90. package/lib/oauth.d.ts +2 -2
  91. package/lib/oauth.js +8 -10
  92. package/lib/projectProfiles.d.ts +4 -3
  93. package/lib/projectProfiles.js +78 -32
  94. package/lib/projects/__tests__/AppDevModeInterface.test.js +17 -6
  95. package/lib/projects/__tests__/DevServerManager.test.js +1 -0
  96. package/lib/projects/__tests__/LocalDevProcess.test.js +1 -0
  97. package/lib/projects/__tests__/deploy.test.js +1 -0
  98. package/lib/projects/__tests__/uieLinting.test.js +640 -0
  99. package/lib/projects/create/__tests__/v2.test.js +11 -0
  100. package/lib/projects/localDev/AppDevModeInterface.js +2 -2
  101. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
  102. package/lib/projects/localDev/LocalDevLogger.js +4 -4
  103. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +3 -3
  104. package/lib/projects/localDev/helpers/account.d.ts +10 -10
  105. package/lib/projects/localDev/helpers/account.js +6 -11
  106. package/lib/projects/uieLinting.d.ts +33 -0
  107. package/lib/projects/uieLinting.js +222 -0
  108. package/lib/projects/urls.js +5 -6
  109. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +7 -5
  110. package/lib/prompts/accountNamePrompt.js +3 -3
  111. package/lib/prompts/accountsPrompt.d.ts +1 -1
  112. package/lib/prompts/accountsPrompt.js +6 -7
  113. package/lib/prompts/confirmImportDataPrompt.js +2 -2
  114. package/lib/prompts/downloadProjectPrompt.d.ts +1 -0
  115. package/lib/prompts/downloadProjectPrompt.js +5 -2
  116. package/lib/prompts/importDataTestAccountSelectPrompt.js +4 -5
  117. package/lib/prompts/personalAccessKeyPrompt.js +2 -2
  118. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -3
  119. package/lib/prompts/projectDevTargetAccountPrompt.js +5 -7
  120. package/lib/prompts/sandboxesPrompt.js +7 -8
  121. package/lib/prompts/setAsDefaultAccountPrompt.js +7 -6
  122. package/lib/sandboxSync.d.ts +2 -2
  123. package/lib/sandboxSync.js +3 -9
  124. package/lib/sandboxes.d.ts +4 -4
  125. package/lib/sandboxes.js +6 -11
  126. package/lib/serverlessLogs.js +2 -2
  127. package/lib/theme/__tests__/migrate.test.js +15 -0
  128. package/lib/ui/index.js +6 -3
  129. package/lib/usageTracking.js +15 -8
  130. package/lib/validation.js +13 -11
  131. package/mcp-server/tools/cms/HsCreateFunctionTool.js +4 -2
  132. package/mcp-server/tools/cms/HsCreateModuleTool.js +4 -2
  133. package/mcp-server/tools/cms/HsCreateTemplateTool.js +4 -2
  134. package/mcp-server/tools/cms/HsFunctionLogsTool.js +4 -2
  135. package/mcp-server/tools/cms/HsListFunctionsTool.js +3 -1
  136. package/mcp-server/tools/cms/HsListTool.js +3 -1
  137. package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +1 -0
  138. package/mcp-server/tools/index.js +4 -0
  139. package/mcp-server/tools/project/AddFeatureToProjectTool.js +4 -2
  140. package/mcp-server/tools/project/CreateProjectTool.js +4 -2
  141. package/mcp-server/tools/project/CreateTestAccountTool.js +17 -7
  142. package/mcp-server/tools/project/DeployProjectTool.js +3 -1
  143. package/mcp-server/tools/project/DocFetchTool.js +6 -4
  144. package/mcp-server/tools/project/DocsSearchTool.d.ts +1 -1
  145. package/mcp-server/tools/project/DocsSearchTool.js +10 -8
  146. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +1 -1
  147. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +9 -7
  148. package/mcp-server/tools/project/GetApplicationInfoTool.js +8 -6
  149. package/mcp-server/tools/project/GetBuildLogsTool.d.ts +26 -0
  150. package/mcp-server/tools/project/GetBuildLogsTool.js +125 -0
  151. package/mcp-server/tools/project/GetBuildStatusTool.d.ts +26 -0
  152. package/mcp-server/tools/project/GetBuildStatusTool.js +166 -0
  153. package/mcp-server/tools/project/GetConfigValuesTool.d.ts +1 -1
  154. package/mcp-server/tools/project/GetConfigValuesTool.js +9 -7
  155. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
  156. package/mcp-server/tools/project/GuidedWalkthroughTool.js +5 -3
  157. package/mcp-server/tools/project/UploadProjectTools.js +3 -1
  158. package/mcp-server/tools/project/ValidateProjectTool.js +4 -2
  159. package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +12 -2
  160. package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +5 -1
  161. package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +23 -11
  162. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +7 -5
  163. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +7 -5
  164. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.d.ts +1 -0
  165. package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +305 -0
  166. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +1 -0
  167. package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +240 -0
  168. package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -6
  169. package/mcp-server/utils/__tests__/content.test.js +21 -20
  170. package/mcp-server/utils/__tests__/feedbackTracking.test.js +34 -28
  171. package/mcp-server/utils/config.d.ts +1 -0
  172. package/mcp-server/utils/config.js +10 -0
  173. package/mcp-server/utils/content.d.ts +1 -1
  174. package/mcp-server/utils/content.js +2 -2
  175. package/mcp-server/utils/feedbackTracking.d.ts +1 -1
  176. package/mcp-server/utils/feedbackTracking.js +3 -3
  177. package/mcp-server/utils/toolUsageTracking.js +4 -3
  178. package/package.json +9 -9
  179. package/ui/components/BoxWithTitle.d.ts +2 -1
  180. package/ui/components/BoxWithTitle.js +2 -2
  181. package/ui/components/StatusMessageBoxes.d.ts +5 -4
  182. package/ui/components/StatusMessageBoxes.js +8 -8
  183. package/lib/middleware/__test__/notificationsMiddleware.test.js +0 -8
  184. package/lib/middleware/notificationsMiddleware.d.ts +0 -1
  185. package/lib/middleware/notificationsMiddleware.js +0 -28
  186. package/lib/ui/boxen.d.ts +0 -5
  187. package/lib/ui/boxen.js +0 -26
  188. package/mcp-server/utils/__tests__/cliConfig.test.js +0 -110
  189. package/mcp-server/utils/cliConfig.d.ts +0 -1
  190. package/mcp-server/utils/cliConfig.js +0 -12
  191. /package/{lib/middleware/__test__/commandTargetingUtils.test.d.ts → commands/project/__tests__/lint.test.d.ts} +0 -0
  192. /package/lib/middleware/{__test__/configMiddleware.test.d.ts → __tests__/commandTargetingUtils.test.d.ts} +0 -0
  193. /package/lib/middleware/{__test__/gitMiddleware.test.d.ts → __tests__/configMiddleware.test.d.ts} +0 -0
  194. /package/lib/middleware/{__test__/notificationsMiddleware.test.d.ts → __tests__/gitMiddleware.test.d.ts} +0 -0
  195. /package/lib/middleware/{__test__ → __tests__}/requestMiddleware.test.d.ts +0 -0
  196. /package/lib/middleware/{__test__ → __tests__}/requestMiddleware.test.js +0 -0
  197. /package/lib/middleware/{__test__ → __tests__}/yargsChecksMiddleware.test.d.ts +0 -0
  198. /package/lib/middleware/{__test__ → __tests__}/yargsChecksMiddleware.test.js +0 -0
  199. /package/{mcp-server/utils/__tests__/cliConfig.test.d.ts → lib/projects/__tests__/uieLinting.test.d.ts} +0 -0
@@ -1,9 +1,8 @@
1
1
  import { CMS_PUBLISH_MODE, DEFAULT_CMS_PUBLISH_MODE, } from '@hubspot/local-dev-lib/constants/files';
2
- import { getAndLoadConfigIfNeeded, getAccountConfig, loadConfigFromEnvironment, } from '@hubspot/local-dev-lib/config';
2
+ import { getConfig, getConfigAccountById } from '@hubspot/local-dev-lib/config';
3
3
  import { getCmsPublishMode } from '../commonOpts.js';
4
- const mockedGetAccountConfig = getAccountConfig;
5
- const mockedGetAndLoadConfigIfNeeded = getAndLoadConfigIfNeeded;
6
- const mockedLoadConfigFromEnvironment = loadConfigFromEnvironment;
4
+ const mockedGetConfigAccountById = getConfigAccountById;
5
+ const mockedGetConfig = getConfig;
7
6
  function buildArguments(args) {
8
7
  return {
9
8
  _: [],
@@ -42,8 +41,8 @@ describe('lib/commonOpts', () => {
42
41
  describe('cms publish mode option precedence', () => {
43
42
  describe('1. --cmsPublishMode', () => {
44
43
  it('should return the cms publish mode specified by the command option if present.', () => {
45
- mockedGetAndLoadConfigIfNeeded.mockReturnValue(configWithDefaultCmsPublishMode);
46
- mockedGetAccountConfig.mockReturnValue(devAccountConfig);
44
+ mockedGetConfig.mockReturnValue(configWithDefaultCmsPublishMode);
45
+ mockedGetConfigAccountById.mockReturnValue(devAccountConfig);
47
46
  expect(getCmsPublishMode(buildArguments({
48
47
  cmsPublishMode: CMS_PUBLISH_MODE.draft,
49
48
  }))).toBe(CMS_PUBLISH_MODE.draft);
@@ -54,9 +53,8 @@ describe('lib/commonOpts', () => {
54
53
  });
55
54
  describe('2. hubspot.config.yml -> config.accounts[x].defaultCmsPublishMode', () => {
56
55
  it('should return the defaultCmsPublishMode specified by the account specific config if present.', () => {
57
- mockedGetAndLoadConfigIfNeeded.mockReturnValue(configWithDefaultCmsPublishMode);
58
- mockedGetAccountConfig.mockReturnValue(devAccountConfig);
59
- mockedLoadConfigFromEnvironment.mockReturnValue(undefined);
56
+ mockedGetConfig.mockReturnValue(configWithDefaultCmsPublishMode);
57
+ mockedGetConfigAccountById.mockReturnValue(devAccountConfig);
60
58
  expect(getCmsPublishMode(buildArguments({
61
59
  account: accounts.DEV,
62
60
  }))).toBe(CMS_PUBLISH_MODE.draft);
@@ -64,9 +62,8 @@ describe('lib/commonOpts', () => {
64
62
  });
65
63
  describe('3. hubspot.config.yml -> config.defaultCmsPublishMode', () => {
66
64
  it('should return the defaultCmsPublishMode specified by the config if present.', () => {
67
- mockedGetAndLoadConfigIfNeeded.mockReturnValue(configWithDefaultCmsPublishMode);
68
- mockedGetAccountConfig.mockReturnValue(prodAccountConfig);
69
- mockedLoadConfigFromEnvironment.mockReturnValue(undefined);
65
+ mockedGetConfig.mockReturnValue(configWithDefaultCmsPublishMode);
66
+ mockedGetConfigAccountById.mockReturnValue(prodAccountConfig);
70
67
  expect(getCmsPublishMode(buildArguments({
71
68
  account: accounts.PROD,
72
69
  }))).toBe(CMS_PUBLISH_MODE.draft);
@@ -74,7 +71,6 @@ describe('lib/commonOpts', () => {
74
71
  });
75
72
  describe('4. DEFAULT_CMS_PUBLISH_MODE', () => {
76
73
  it('should return the defaultCmsPubishMode specified by the config if present.', () => {
77
- mockedLoadConfigFromEnvironment.mockReturnValue(undefined);
78
74
  expect(getCmsPublishMode(buildArguments({
79
75
  account: 'xxxxx',
80
76
  }))).toBe(DEFAULT_CMS_PUBLISH_MODE);
@@ -1,16 +1,18 @@
1
- import { getAccountId, getConfigAccounts } from '@hubspot/local-dev-lib/config';
1
+ import { getAllConfigAccounts, getConfigAccountIfExists, getConfigAccountById, } from '@hubspot/local-dev-lib/config';
2
2
  import { uiLogger } from '../ui/logger.js';
3
3
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
4
4
  import { fetchDeveloperTestAccounts } from '@hubspot/local-dev-lib/api/developerTestAccounts';
5
5
  import { mockHubSpotHttpError } from '../testUtils.js';
6
6
  import * as errorHandlers from '../errorHandlers/index.js';
7
7
  import { getHasDevTestAccounts, handleDeveloperTestAccountCreateError, validateDevTestAccountUsageLimits, } from '../developerTestAccounts.js';
8
+ import { logError } from '../errorHandlers/index.js';
8
9
  vi.mock('@hubspot/local-dev-lib/config');
9
10
  vi.mock('../ui/logger.js');
10
11
  vi.mock('@hubspot/local-dev-lib/api/developerTestAccounts');
11
12
  vi.mock('../errorHandlers');
12
- const mockedGetAccountId = getAccountId;
13
- const mockedGetConfigAccounts = getConfigAccounts;
13
+ const mockedGetConfigAccountIfExists = getConfigAccountIfExists;
14
+ const mockedGetAllConfigAccounts = getAllConfigAccounts;
15
+ const mockedGetConfigAccountById = getConfigAccountById;
14
16
  const mockedFetchDeveloperTestAccounts = fetchDeveloperTestAccounts;
15
17
  const APP_DEVELOPER_ACCOUNT_1 = {
16
18
  name: 'app-developer-1',
@@ -33,41 +35,43 @@ const accounts = [
33
35
  parentAccountId: APP_DEVELOPER_ACCOUNT_1.accountId,
34
36
  accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
35
37
  env: 'prod',
38
+ authType: 'personalaccesskey',
36
39
  },
37
40
  ];
38
41
  describe('lib/developerTestAccounts', () => {
39
42
  describe('getHasDevTestAccounts()', () => {
40
43
  it('should return true if there are developer test accounts associated with the account', () => {
41
- mockedGetAccountId.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1.accountId);
42
- mockedGetConfigAccounts.mockReturnValueOnce(accounts);
44
+ mockedGetAllConfigAccounts.mockReturnValueOnce(accounts);
43
45
  const result = getHasDevTestAccounts(APP_DEVELOPER_ACCOUNT_1);
44
46
  expect(result).toBe(true);
45
47
  });
46
48
  it('should return false if there are no developer test accounts associated with the account', () => {
47
- mockedGetAccountId.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_2.accountId);
48
- mockedGetConfigAccounts.mockReturnValueOnce(accounts);
49
+ mockedGetConfigAccountIfExists.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_2);
50
+ mockedGetAllConfigAccounts.mockReturnValueOnce(accounts);
49
51
  const result = getHasDevTestAccounts(APP_DEVELOPER_ACCOUNT_2);
50
52
  expect(result).toBe(false);
51
53
  });
52
54
  it('should return false if there are no accounts configured', () => {
53
- mockedGetAccountId.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1.accountId);
54
- mockedGetConfigAccounts.mockReturnValueOnce(undefined);
55
+ mockedGetConfigAccountIfExists.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1);
56
+ mockedGetAllConfigAccounts.mockReturnValueOnce(undefined);
55
57
  const result = getHasDevTestAccounts(APP_DEVELOPER_ACCOUNT_1);
56
58
  expect(result).toBe(false);
57
59
  });
58
60
  });
59
61
  describe('validateDevTestAccountUsageLimits()', () => {
60
62
  afterEach(() => {
61
- mockedGetAccountId.mockRestore();
63
+ mockedGetConfigAccountIfExists.mockRestore();
62
64
  mockedFetchDeveloperTestAccounts.mockRestore();
63
65
  });
64
66
  it('should return null if the account id is not found', async () => {
65
- mockedGetAccountId.mockReturnValueOnce(undefined);
67
+ mockedFetchDeveloperTestAccounts.mockResolvedValueOnce({
68
+ data: null,
69
+ });
66
70
  const result = await validateDevTestAccountUsageLimits(APP_DEVELOPER_ACCOUNT_1);
67
71
  expect(result).toBe(null);
68
72
  });
69
73
  it('should return null if there is no developer test account data', async () => {
70
- mockedGetAccountId.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1.accountId);
74
+ mockedGetConfigAccountIfExists.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1);
71
75
  mockedFetchDeveloperTestAccounts.mockResolvedValueOnce({
72
76
  data: null,
73
77
  });
@@ -75,7 +79,7 @@ describe('lib/developerTestAccounts', () => {
75
79
  expect(result).toBe(null);
76
80
  });
77
81
  it('should return the test account data if the account has not reached the limit', async () => {
78
- mockedGetAccountId.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1.accountId);
82
+ mockedGetConfigAccountIfExists.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1);
79
83
  const testAccountData = {
80
84
  maxTestPortals: 10,
81
85
  results: [],
@@ -87,7 +91,7 @@ describe('lib/developerTestAccounts', () => {
87
91
  expect(result).toEqual(expect.objectContaining(testAccountData));
88
92
  });
89
93
  it('should throw an error if the account has reached the limit', async () => {
90
- mockedGetAccountId.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1.accountId);
94
+ mockedGetConfigAccountIfExists.mockReturnValueOnce(APP_DEVELOPER_ACCOUNT_1);
91
95
  mockedFetchDeveloperTestAccounts.mockResolvedValueOnce({
92
96
  data: {
93
97
  maxTestPortals: 0,
@@ -103,6 +107,14 @@ describe('lib/developerTestAccounts', () => {
103
107
  beforeEach(() => {
104
108
  loggerErrorSpy = vi.spyOn(uiLogger, 'error');
105
109
  logErrorSpy = vi.spyOn(errorHandlers, 'logError');
110
+ // Mock account config for uiAccountDescription calls
111
+ mockedGetConfigAccountById.mockReturnValue({
112
+ accountId: APP_DEVELOPER_ACCOUNT_1.accountId,
113
+ name: 'Test Account',
114
+ authType: 'personalaccesskey',
115
+ personalAccessKey: 'test-key',
116
+ env: 'prod',
117
+ });
106
118
  });
107
119
  afterEach(() => {
108
120
  loggerErrorSpy.mockRestore();
@@ -117,7 +129,7 @@ describe('lib/developerTestAccounts', () => {
117
129
  },
118
130
  });
119
131
  expect(() => handleDeveloperTestAccountCreateError(missingScopesError, APP_DEVELOPER_ACCOUNT_1.accountId, 'prod', 10)).toThrow('Missing scopes error');
120
- expect(loggerErrorSpy).toHaveBeenCalled();
132
+ expect(uiLogger.error).toHaveBeenCalled();
121
133
  });
122
134
  it('should log and throw an error if the account is missing the required scopes', () => {
123
135
  const portalLimitReachedError = mockHubSpotHttpError('Portal limit reached error', {
@@ -128,7 +140,7 @@ describe('lib/developerTestAccounts', () => {
128
140
  },
129
141
  });
130
142
  expect(() => handleDeveloperTestAccountCreateError(portalLimitReachedError, APP_DEVELOPER_ACCOUNT_1.accountId, 'prod', 10)).toThrow('Portal limit reached error');
131
- expect(loggerErrorSpy).toHaveBeenCalled();
143
+ expect(uiLogger.error).toHaveBeenCalled();
132
144
  });
133
145
  it('should log a generic error message for an unknown error type', () => {
134
146
  const someUnknownError = mockHubSpotHttpError('Some unknown error', {
@@ -139,7 +151,7 @@ describe('lib/developerTestAccounts', () => {
139
151
  },
140
152
  });
141
153
  expect(() => handleDeveloperTestAccountCreateError(someUnknownError, APP_DEVELOPER_ACCOUNT_1.accountId, 'prod', 10)).toThrow('Some unknown error');
142
- expect(logErrorSpy).toHaveBeenCalled();
154
+ expect(logError).toHaveBeenCalled();
143
155
  });
144
156
  });
145
157
  });
@@ -1,6 +1,6 @@
1
1
  import { uiLogger } from '../ui/logger.js';
2
2
  import { createImport } from '@hubspot/local-dev-lib/api/crm';
3
- import { getAccountConfig, getAccountId } from '@hubspot/local-dev-lib/config';
3
+ import { getConfigAccountById, getConfigAccountIfExists, } from '@hubspot/local-dev-lib/config';
4
4
  import { handleImportData, handleTargetTestAccountSelectionFlow, } from '../importData.js';
5
5
  import { lib } from '../../lang/en.js';
6
6
  import { isDeveloperTestAccount, isStandardAccount, isAppDeveloperAccount, } from '../accountTypes.js';
@@ -13,8 +13,8 @@ vi.mock('../prompts/importDataTestAccountSelectPrompt');
13
13
  describe('lib/importData', () => {
14
14
  const mockUiLogger = vi.mocked(uiLogger);
15
15
  const mockCreateImport = vi.mocked(createImport);
16
- const mockGetAccountConfig = vi.mocked(getAccountConfig);
17
- const mockGetAccountId = vi.mocked(getAccountId);
16
+ const mockGetConfigAccountById = vi.mocked(getConfigAccountById);
17
+ const mockGetConfigAccountIfExists = vi.mocked(getConfigAccountIfExists);
18
18
  const mockIsDeveloperTestAccount = vi.mocked(isDeveloperTestAccount);
19
19
  const mockIsStandardAccount = vi.mocked(isStandardAccount);
20
20
  const mockIsAppDeveloperAccount = vi.mocked(isAppDeveloperAccount);
@@ -24,8 +24,8 @@ describe('lib/importData', () => {
24
24
  mockUiLogger.success.mockReset();
25
25
  mockUiLogger.error.mockReset();
26
26
  mockCreateImport.mockReset();
27
- mockGetAccountConfig.mockReset();
28
- mockGetAccountId.mockReset();
27
+ mockGetConfigAccountById.mockReset();
28
+ mockGetConfigAccountIfExists.mockReset();
29
29
  mockIsDeveloperTestAccount.mockReset();
30
30
  mockIsStandardAccount.mockReset();
31
31
  mockIsAppDeveloperAccount.mockReset();
@@ -56,32 +56,42 @@ describe('lib/importData', () => {
56
56
  const userProvidedAccountId = '1234';
57
57
  const derivedAccountId = 123456789;
58
58
  it('should error if the userProvidedAccountId is not the right account type', async () => {
59
- mockGetAccountConfig.mockReturnValue({});
60
- mockGetAccountId.mockReturnValue(1234);
59
+ mockGetConfigAccountIfExists.mockReturnValue({
60
+ accountId: 1234,
61
+ });
61
62
  mockIsDeveloperTestAccount.mockReturnValue(false);
62
63
  await expect(handleTargetTestAccountSelectionFlow(derivedAccountId, userProvidedAccountId)).rejects.toThrow(lib.importData.errors.notDeveloperTestAccount);
63
64
  });
64
65
  it('should error if the derivedAccountId belongs to the wrong account type', async () => {
65
- mockGetAccountConfig.mockReturnValue({});
66
+ mockGetConfigAccountIfExists.mockReturnValue({
67
+ accountId: derivedAccountId,
68
+ });
69
+ mockGetConfigAccountById.mockReturnValue({
70
+ accountId: derivedAccountId,
71
+ });
66
72
  mockIsDeveloperTestAccount.mockReturnValue(false);
67
73
  mockIsStandardAccount.mockReturnValue(false);
68
74
  mockIsAppDeveloperAccount.mockReturnValue(false);
69
75
  await expect(handleTargetTestAccountSelectionFlow(derivedAccountId, undefined)).rejects.toThrow(lib.importData.errors.incorrectAccountType(derivedAccountId));
70
76
  });
71
77
  it('should return the derivedAccountId if it is a developer test account', async () => {
72
- mockGetAccountConfig.mockReturnValue({});
73
78
  mockIsDeveloperTestAccount.mockReturnValue(true);
79
+ mockGetConfigAccountById.mockReturnValue({
80
+ accountId: derivedAccountId,
81
+ });
74
82
  const result = await handleTargetTestAccountSelectionFlow(derivedAccountId, undefined);
75
83
  expect(result).toBe(derivedAccountId);
76
84
  });
77
85
  it('should return the result of the importDataTestAccountSelectPrompt if the derivedAccountId is a standard or app developer account', async () => {
78
- mockGetAccountConfig.mockReturnValue({});
79
86
  mockIsDeveloperTestAccount.mockReturnValue(false);
80
87
  mockIsStandardAccount.mockReturnValue(true);
81
88
  mockIsAppDeveloperAccount.mockReturnValue(true);
82
89
  mockImportDataTestAccountSelectPrompt.mockResolvedValue({
83
90
  selectedAccountId: 890223,
84
91
  });
92
+ mockGetConfigAccountById.mockReturnValue({
93
+ accountId: derivedAccountId,
94
+ });
85
95
  const result = await handleTargetTestAccountSelectionFlow(derivedAccountId, undefined);
86
96
  expect(result).toBe(890223);
87
97
  });
@@ -1,7 +1,7 @@
1
1
  import express from 'express';
2
2
  import open from 'open';
3
3
  import { OAuth2Manager } from '@hubspot/local-dev-lib/models/OAuth2Manager';
4
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
4
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
5
5
  import { addOauthToAccountConfig } from '@hubspot/local-dev-lib/oauth';
6
6
  import { uiLogger } from '../ui/logger.js';
7
7
  import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
@@ -15,18 +15,22 @@ vi.mock('@hubspot/local-dev-lib/oauth');
15
15
  vi.mock('../ui/logger.js');
16
16
  const mockedExpress = express;
17
17
  const mockedOAuth2Manager = OAuth2Manager;
18
- const mockedGetAccountConfig = getAccountConfig;
18
+ const mockedGetConfigAccountById = getConfigAccountById;
19
19
  describe('lib/oauth', () => {
20
20
  const mockExpressReq = {
21
21
  query: { code: 'test-auth-code' },
22
22
  };
23
23
  const mockExpressResp = { send: vi.fn() };
24
24
  const mockAccountConfig = {
25
+ name: 'test-account',
25
26
  accountId: 123,
26
- clientId: 'test-client-id',
27
- clientSecret: 'test-client-secret',
28
- scopes: ['test-scope'],
27
+ authType: 'oauth2',
29
28
  env: ENVIRONMENTS.PROD,
29
+ auth: {
30
+ clientId: 'test-client-id',
31
+ clientSecret: 'test-client-secret',
32
+ scopes: ['test-scope'],
33
+ },
30
34
  };
31
35
  beforeEach(() => {
32
36
  mockedExpress.mockReturnValue({
@@ -49,7 +53,7 @@ describe('lib/oauth', () => {
49
53
  exchangeForTokens: vi.fn().mockResolvedValue({}),
50
54
  };
51
55
  mockedOAuth2Manager.mockImplementation(() => mockOAuth2Manager);
52
- mockedGetAccountConfig.mockReturnValue({
56
+ mockedGetConfigAccountById.mockReturnValue({
53
57
  env: ENVIRONMENTS.PROD,
54
58
  });
55
59
  await authenticateWithOauth(mockAccountConfig);
@@ -66,7 +70,10 @@ describe('lib/oauth', () => {
66
70
  it('should handle missing clientId', async () => {
67
71
  const invalidConfig = {
68
72
  ...mockAccountConfig,
69
- clientId: undefined,
73
+ auth: {
74
+ ...mockAccountConfig.auth,
75
+ clientId: undefined,
76
+ },
70
77
  };
71
78
  mockedOAuth2Manager.mockImplementation(() => ({
72
79
  account: invalidConfig,
@@ -74,6 +81,7 @@ describe('lib/oauth', () => {
74
81
  const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => {
75
82
  throw new Error('exit');
76
83
  });
84
+ // @ts-expect-error Testing invalid config
77
85
  await expect(authenticateWithOauth(invalidConfig)).rejects.toThrow('exit');
78
86
  expect(uiLogger.error).toHaveBeenCalled();
79
87
  expect(exitSpy).toHaveBeenCalled();
@@ -82,7 +90,10 @@ describe('lib/oauth', () => {
82
90
  it('should use default scopes when none provided', async () => {
83
91
  const configWithoutScopes = {
84
92
  ...mockAccountConfig,
85
- scopes: undefined,
93
+ auth: {
94
+ ...mockAccountConfig.auth,
95
+ scopes: [],
96
+ },
86
97
  };
87
98
  const mockOAuth2Manager = {
88
99
  account: configWithoutScopes,