@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
@@ -8,6 +8,8 @@ import * as ui from '../../../lib/ui/index.js';
8
8
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
9
9
  import { logError } from '../../../lib/errorHandlers/index.js';
10
10
  import projectLogsCommand from '../logs.js';
11
+ import * as config from '@hubspot/local-dev-lib/config';
12
+ import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
11
13
  vi.mock('../../ui/logger.js');
12
14
  vi.mock('../../../lib/commonOpts');
13
15
  vi.mock('../../../lib/usageTracking');
@@ -25,6 +27,7 @@ const projectLogsManagerGetFunctionNamesSpy = vi.spyOn(ProjectLogsManager, 'getF
25
27
  const projectLogsManagerInitSpy = vi.spyOn(ProjectLogsManager, 'init');
26
28
  const getTableHeaderSpy = vi.spyOn(table, 'getTableHeader');
27
29
  const getTableContentsSpy = vi.spyOn(table, 'getTableContents');
30
+ const getConfigAccountEnvironmentSpy = vi.spyOn(config, 'getConfigAccountEnvironment');
28
31
  const optionsSpy = vi
29
32
  .spyOn(yargs, 'options')
30
33
  .mockReturnValue(yargs);
@@ -34,6 +37,7 @@ const conflictsSpy = vi
34
37
  const exampleSpy = vi
35
38
  .spyOn(yargs, 'example')
36
39
  .mockReturnValue(yargs);
40
+ getConfigAccountEnvironmentSpy.mockReturnValue(ENVIRONMENTS.PROD);
37
41
  describe('commands/project/logs', () => {
38
42
  beforeEach(() => {
39
43
  // @ts-expect-error Doesn't match the actual signature because then the linter complains about unused variables
@@ -0,0 +1,142 @@
1
+ import yargs from 'yargs';
2
+ import path from 'path';
3
+ import { uiLogger } from '../../../lib/ui/logger.js';
4
+ import * as projectUtils from '../../../lib/projects/config.js';
5
+ import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
6
+ import { trackCommandUsage } from '../../../lib/usageTracking.js';
7
+ import * as dependencyManagement from '../../../lib/dependencyManagement.js';
8
+ import * as promptUtils from '../../../lib/prompts/promptUtils.js';
9
+ import projectUpdateDepsCommand from '../updateDeps.js';
10
+ vi.mock('../../../lib/ui/logger.js');
11
+ vi.mock('../../../lib/projects/config');
12
+ vi.mock('../../../lib/dependencyManagement');
13
+ vi.mock('../../../lib/prompts/promptUtils');
14
+ vi.mock('../../../lib/usageTracking');
15
+ vi.mock('../../../lib/commonOpts');
16
+ const exampleSpy = vi.spyOn(yargs, 'example');
17
+ const processExitSpy = vi.spyOn(process, 'exit');
18
+ const getProjectConfigSpy = vi.spyOn(projectUtils, 'getProjectConfig');
19
+ const promptUserSpy = vi.spyOn(promptUtils, 'promptUser');
20
+ const getProjectPackageJsonLocationsSpy = vi.spyOn(dependencyManagement, 'getProjectPackageJsonLocations');
21
+ const updatePackagesSpy = vi.spyOn(dependencyManagement, 'updatePackages');
22
+ describe('commands/project/updateDeps', () => {
23
+ describe('command', () => {
24
+ it('should have the correct command structure', () => {
25
+ expect(projectUpdateDepsCommand.command).toEqual('update-deps [packages..]');
26
+ });
27
+ });
28
+ describe('describe', () => {
29
+ it('should not provide a description', () => {
30
+ expect(projectUpdateDepsCommand.describe).toEqual(expect.stringMatching(/Update the npm dependencies for your project, or update specific dependencies in a subcomponent of a project/));
31
+ });
32
+ });
33
+ describe('builder', () => {
34
+ it('should provide examples', () => {
35
+ projectUpdateDepsCommand.builder(yargs);
36
+ expect(exampleSpy).toHaveBeenCalledTimes(1);
37
+ });
38
+ });
39
+ describe('handler', () => {
40
+ let args;
41
+ beforeEach(() => {
42
+ args = {
43
+ derivedAccountId: 999999,
44
+ };
45
+ // @ts-expect-error Doesn't match the actual signature because then the linter complains about unused variables
46
+ processExitSpy.mockImplementation(() => { });
47
+ });
48
+ it('should track the command usage', async () => {
49
+ await projectUpdateDepsCommand.handler(args);
50
+ expect(trackCommandUsage).toHaveBeenCalledTimes(1);
51
+ expect(trackCommandUsage).toHaveBeenCalledWith('project-update-deps', undefined, args.derivedAccountId);
52
+ });
53
+ it('should handle exceptions', async () => {
54
+ const error = new Error('Something went super wrong');
55
+ getProjectConfigSpy.mockImplementationOnce(() => {
56
+ throw error;
57
+ });
58
+ await projectUpdateDepsCommand.handler(args);
59
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
60
+ expect(uiLogger.error).toHaveBeenCalledWith(error.message);
61
+ expect(processExitSpy).toHaveBeenCalledTimes(1);
62
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
63
+ });
64
+ it('should log an error and exit when the project config is not defined', async () => {
65
+ getProjectConfigSpy.mockResolvedValueOnce({
66
+ projectDir: null,
67
+ projectConfig: null,
68
+ });
69
+ await projectUpdateDepsCommand.handler(args);
70
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
71
+ expect(uiLogger.error).toHaveBeenCalledWith('No project detected. Run this command from a project directory.');
72
+ expect(processExitSpy).toHaveBeenCalledTimes(1);
73
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
74
+ });
75
+ it('should log an error and exit when the project config has no projectDir', async () => {
76
+ getProjectConfigSpy.mockResolvedValueOnce({
77
+ projectDir: null,
78
+ projectConfig: null,
79
+ });
80
+ await projectUpdateDepsCommand.handler(args);
81
+ expect(uiLogger.error).toHaveBeenCalledTimes(1);
82
+ expect(uiLogger.error).toHaveBeenCalledWith('No project detected. Run this command from a project directory.');
83
+ expect(processExitSpy).toHaveBeenCalledTimes(1);
84
+ expect(processExitSpy).toHaveBeenCalledWith(EXIT_CODES.ERROR);
85
+ });
86
+ it('should prompt for input when packages is defined', async () => {
87
+ const projectDir = 'src';
88
+ getProjectConfigSpy.mockResolvedValue({
89
+ projectDir,
90
+ projectConfig: null,
91
+ });
92
+ const packageJsonLocation = path.join(projectDir, 'directory1');
93
+ promptUserSpy.mockResolvedValueOnce({
94
+ selectedInstallLocations: packageJsonLocation,
95
+ });
96
+ getProjectPackageJsonLocationsSpy.mockResolvedValue([
97
+ packageJsonLocation,
98
+ ]);
99
+ await projectUpdateDepsCommand.handler({
100
+ ...args,
101
+ packages: ['@hubspot/local-dev-lib'],
102
+ });
103
+ expect(getProjectPackageJsonLocationsSpy).toHaveBeenCalledTimes(1);
104
+ expect(promptUserSpy).toHaveBeenCalledTimes(1);
105
+ expect(promptUserSpy).toHaveBeenCalledWith([
106
+ {
107
+ name: 'selectedInstallLocations',
108
+ type: 'checkbox',
109
+ when: expect.any(Function),
110
+ choices: [
111
+ {
112
+ name: 'directory1',
113
+ value: packageJsonLocation,
114
+ },
115
+ ],
116
+ message: 'Choose which project components you would like to update the dependencies for:',
117
+ validate: expect.any(Function),
118
+ },
119
+ ]);
120
+ });
121
+ it('should call updatePackages correctly', async () => {
122
+ const projectDir = 'src';
123
+ const packageJsonLocation = path.join(projectDir, 'directory1');
124
+ const installLocations = [packageJsonLocation];
125
+ const packages = ['@hubspot/local-dev-lib'];
126
+ getProjectConfigSpy.mockResolvedValue({
127
+ projectDir,
128
+ projectConfig: null,
129
+ });
130
+ promptUserSpy.mockResolvedValueOnce({
131
+ selectedInstallLocations: packageJsonLocation,
132
+ });
133
+ getProjectPackageJsonLocationsSpy.mockResolvedValue(installLocations);
134
+ await projectUpdateDepsCommand.handler({ ...args, packages });
135
+ expect(updatePackagesSpy).toHaveBeenCalledTimes(1);
136
+ expect(updatePackagesSpy).toHaveBeenCalledWith({
137
+ packages,
138
+ installLocations: packageJsonLocation,
139
+ });
140
+ });
141
+ });
142
+ });
@@ -7,7 +7,7 @@ import { commands } from '../../../lang/en.js';
7
7
  import { isV2Project } from '../../../lib/projects/platformVersion.js';
8
8
  import { loadAndValidateProfile } from '../../../lib/projectProfiles.js';
9
9
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
10
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
10
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
11
11
  import { handleTranslate } from '../../../lib/projects/upload.js';
12
12
  import projectValidateCommand from '../validate.js';
13
13
  // Mock dependencies
@@ -79,7 +79,7 @@ describe('commands/project/validate', () => {
79
79
  vi.mocked(isV2Project).mockReturnValue(true);
80
80
  vi.mocked(validateProjectConfig).mockReturnValue(undefined);
81
81
  vi.mocked(loadAndValidateProfile).mockResolvedValue(123);
82
- vi.mocked(getAccountConfig).mockReturnValue({
82
+ vi.mocked(getConfigAccountById).mockReturnValue({
83
83
  accountType: 'STANDARD',
84
84
  accountId: 123,
85
85
  env: 'prod',
@@ -14,7 +14,7 @@ import { cloneApp, checkCloneStatus, downloadClonedProject, } from '@hubspot/loc
14
14
  import { getCwd, sanitizeFileName } from '@hubspot/local-dev-lib/path';
15
15
  import { uiLogger } from '../../lib/ui/logger.js';
16
16
  import { extractZipArchive } from '@hubspot/local-dev-lib/archive';
17
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
17
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
18
18
  import SpinniesManager from '../../lib/ui/SpinniesManager.js';
19
19
  import { logInvalidAccountError } from '../../lib/app/migrate.js';
20
20
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
@@ -25,7 +25,7 @@ const deprecated = true;
25
25
  async function handler(args) {
26
26
  const { derivedAccountId } = args;
27
27
  await trackCommandUsage('clone-app', {}, derivedAccountId);
28
- const accountConfig = getAccountConfig(derivedAccountId);
28
+ const accountConfig = getConfigAccountById(derivedAccountId);
29
29
  const accountName = uiAccountDescription(derivedAccountId);
30
30
  if (!accountConfig) {
31
31
  throw new Error(commands.project.cloneApp.errors.noAccountConfig(derivedAccountId));
@@ -94,7 +94,6 @@ async function handler(args) {
94
94
  'projectCommandTip',
95
95
  'projectUploadCommand',
96
96
  'projectDevCommand',
97
- 'projectInstallDepsCommand',
98
97
  'projectHelpCommand',
99
98
  'feedbackCommand',
100
99
  ]);
@@ -1,5 +1,5 @@
1
1
  import { fetchProject } from '@hubspot/local-dev-lib/api/projects';
2
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
2
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
3
3
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
4
4
  import { isV2Project } from '../../lib/projects/platformVersion.js';
5
5
  import { trackCommandUsage } from '../../lib/usageTracking.js';
@@ -19,7 +19,7 @@ const command = 'deploy';
19
19
  const describe = commands.project.deploy.describe;
20
20
  async function handler(args) {
21
21
  const { derivedAccountId, project: projectOption, buildId: buildIdOption, force: forceOption, deployLatestBuild: deployLatestBuildOption, json: formatOutputAsJson, } = args;
22
- const accountConfig = getAccountConfig(derivedAccountId);
22
+ const accountConfig = getConfigAccountById(derivedAccountId);
23
23
  const accountType = accountConfig && accountConfig.accountType;
24
24
  let targetAccountId;
25
25
  const jsonOutput = {};
@@ -1,5 +1,4 @@
1
- import { getAccountConfig, getConfigAccounts, getEnv, } from '@hubspot/local-dev-lib/config';
2
- import { getValidEnv } from '@hubspot/local-dev-lib/environment';
1
+ import { getConfigAccountById, getAllConfigAccounts, getConfigAccountEnvironment, } from '@hubspot/local-dev-lib/config';
3
2
  import { findProjectComponents, getProjectComponentTypes, } from '../../../lib/projects/structure.js';
4
3
  import { ComponentTypes } from '../../../types/Projects.js';
5
4
  import { commands } from '../../../lang/en.js';
@@ -14,13 +13,13 @@ import { isSandbox, isDeveloperTestAccount, } from '../../../lib/accountTypes.js
14
13
  import { ensureProjectExists } from '../../../lib/projects/ensureProjectExists.js';
15
14
  export async function deprecatedProjectDevFlow({ args, accountId, projectConfig, projectDir, }) {
16
15
  const { userProvidedAccount, derivedAccountId } = args;
17
- const env = getValidEnv(getEnv(derivedAccountId));
16
+ const env = getConfigAccountEnvironment(derivedAccountId);
18
17
  const components = await findProjectComponents(projectDir);
19
18
  const runnableComponents = components.filter(component => component.runnable);
20
19
  const componentTypes = getProjectComponentTypes(runnableComponents);
21
20
  const hasPrivateApps = !!componentTypes[ComponentTypes.PrivateApp];
22
21
  const hasPublicApps = !!componentTypes[ComponentTypes.PublicApp];
23
- const accountConfig = getAccountConfig(accountId);
22
+ const accountConfig = getConfigAccountById(accountId);
24
23
  if (!accountConfig) {
25
24
  uiLogger.error(commands.project.dev.errors.noAccount(accountId));
26
25
  process.exit(EXIT_CODES.ERROR);
@@ -33,7 +32,7 @@ export async function deprecatedProjectDevFlow({ args, accountId, projectConfig,
33
32
  uiLogger.error(commands.project.dev.errors.invalidProjectComponents);
34
33
  process.exit(EXIT_CODES.SUCCESS);
35
34
  }
36
- const accounts = getConfigAccounts();
35
+ const accounts = getAllConfigAccounts();
37
36
  if (!accounts) {
38
37
  uiLogger.error(commands.project.dev.errors.noAccountsInConfig);
39
38
  process.exit(EXIT_CODES.ERROR);
@@ -1,5 +1,5 @@
1
1
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
2
- import { getAccountId } from '@hubspot/local-dev-lib/config';
2
+ import { getConfigAccountIfExists } from '@hubspot/local-dev-lib/config';
3
3
  import { getProjectConfig, validateProjectConfig, } from '../../../lib/projects/config.js';
4
4
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
5
5
  import { uiLine } from '../../../lib/ui/index.js';
@@ -10,6 +10,7 @@ import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
10
10
  import { loadProfile, exitIfUsingProfiles, } from '../../../lib/projectProfiles.js';
11
11
  import { commands } from '../../../lang/en.js';
12
12
  import { uiLogger } from '../../../lib/ui/logger.js';
13
+ import { logError } from '../../../lib/errorHandlers/index.js';
13
14
  const command = 'dev';
14
15
  const describe = commands.project.dev.describe;
15
16
  function validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV2) {
@@ -26,7 +27,13 @@ function validateAccountFlags(testingAccount, projectAccount, userProvidedAccoun
26
27
  async function handler(args) {
27
28
  const { derivedAccountId, userProvidedAccount, testingAccount, projectAccount, } = args;
28
29
  const { projectConfig, projectDir } = await getProjectConfig();
29
- validateProjectConfig(projectConfig, projectDir);
30
+ try {
31
+ validateProjectConfig(projectConfig, projectDir);
32
+ }
33
+ catch (error) {
34
+ logError(error);
35
+ process.exit(EXIT_CODES.ERROR);
36
+ }
30
37
  const useV2Projects = isV2Project(projectConfig.platformVersion);
31
38
  if (!projectDir) {
32
39
  uiLogger.error(commands.project.dev.errors.noProjectConfig);
@@ -44,7 +51,8 @@ async function handler(args) {
44
51
  let profile;
45
52
  // Using the new --projectAccount flag
46
53
  if (projectAccount) {
47
- targetProjectAccountId = getAccountId(projectAccount);
54
+ targetProjectAccountId =
55
+ getConfigAccountIfExists(projectAccount)?.accountId;
48
56
  if (targetProjectAccountId) {
49
57
  uiLogger.log('');
50
58
  uiLogger.log(commands.project.dev.logs.projectAccountFlagExplanation(targetProjectAccountId));
@@ -80,7 +88,9 @@ async function handler(args) {
80
88
  }
81
89
  trackCommandUsage('project-dev', {}, targetProjectAccountId);
82
90
  if (isV2Project(projectConfig.platformVersion)) {
83
- const targetTestingAccountId = (testingAccount && getAccountId(testingAccount)) || undefined;
91
+ const targetTestingAccountId = testingAccount
92
+ ? getConfigAccountIfExists(testingAccount)?.accountId
93
+ : undefined;
84
94
  await unifiedProjectDevFlow({
85
95
  args,
86
96
  targetProjectAccountId,
@@ -4,8 +4,7 @@ import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
4
4
  import { startPortManagerServer, stopPortManagerServer, } from '@hubspot/local-dev-lib/portManager';
5
5
  import { isTranslationError } from '@hubspot/project-parsing-lib/src/lib/errors.js';
6
6
  import { translateForLocalDev } from '@hubspot/project-parsing-lib';
7
- import { getEnv, getConfigAccounts, getAccountConfig, } from '@hubspot/local-dev-lib/config';
8
- import { getValidEnv } from '@hubspot/local-dev-lib/environment';
7
+ import { getConfigAccountEnvironment, getAllConfigAccounts, getConfigAccountById, } from '@hubspot/local-dev-lib/config';
9
8
  import { logError } from '../../../lib/errorHandlers/index.js';
10
9
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
11
10
  import { ensureProjectExists } from '../../../lib/projects/ensureProjectExists.js';
@@ -23,7 +22,7 @@ import LocalDevWebsocketServer from '../../../lib/projects/localDev/LocalDevWebs
23
22
  import { confirmLocalDevIsNotRunning } from '../../../lib/projects/localDev/helpers/process.js';
24
23
  export async function unifiedProjectDevFlow({ args, targetProjectAccountId, providedTargetTestingAccountId, projectConfig, projectDir, }) {
25
24
  await confirmLocalDevIsNotRunning();
26
- const env = getValidEnv(getEnv(targetProjectAccountId));
25
+ const env = getConfigAccountEnvironment(targetProjectAccountId);
27
26
  let projectNodes;
28
27
  let projectProfileData;
29
28
  // Get IR
@@ -50,12 +49,12 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
50
49
  uiLogger.error(commands.project.dev.errors.noRunnableComponents);
51
50
  process.exit(EXIT_CODES.SUCCESS);
52
51
  }
53
- const targetProjectAccountConfig = getAccountConfig(targetProjectAccountId);
52
+ const targetProjectAccountConfig = getConfigAccountById(targetProjectAccountId);
54
53
  if (!targetProjectAccountConfig) {
55
54
  uiLogger.error(commands.project.dev.errors.noAccount(targetProjectAccountId));
56
55
  process.exit(EXIT_CODES.ERROR);
57
56
  }
58
- const accounts = getConfigAccounts();
57
+ const accounts = getAllConfigAccounts();
59
58
  const accountIsCombined = await isUnifiedAccount(targetProjectAccountConfig);
60
59
  const targetProjectAccountIsTestAccountOrSandbox = isTestAccountOrSandbox(targetProjectAccountConfig);
61
60
  if (!accountIsCombined) {
@@ -68,7 +68,13 @@ async function handler(args) {
68
68
  let projectName = projectFlagValue;
69
69
  if (!projectName) {
70
70
  const { projectConfig, projectDir } = await getProjectConfig();
71
- validateProjectConfig(projectConfig, projectDir);
71
+ try {
72
+ validateProjectConfig(projectConfig, projectDir);
73
+ }
74
+ catch (error) {
75
+ logError(error);
76
+ process.exit(EXIT_CODES.ERROR);
77
+ }
72
78
  projectName = projectConfig.name;
73
79
  }
74
80
  try {
@@ -1,6 +1,5 @@
1
- import { getEnv } from '@hubspot/local-dev-lib/config';
1
+ import { getConfigAccountEnvironment } from '@hubspot/local-dev-lib/config';
2
2
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
3
- import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
4
3
  import { trackCommandUsage } from '../../lib/usageTracking.js';
5
4
  import { getTableContents, getTableHeader } from '../../lib/ui/table.js';
6
5
  import { logError } from '../../lib/errorHandlers/index.js';
@@ -12,7 +11,7 @@ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
12
11
  import { ProjectLogsManager } from '../../lib/projects/ProjectLogsManager.js';
13
12
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
14
13
  function getPrivateAppsUrl(accountId) {
15
- const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
14
+ const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
16
15
  return `${baseUrl}/private-apps/${accountId}`;
17
16
  }
18
17
  function logTable(tableHeader, logsInfo) {
@@ -1,7 +1,6 @@
1
1
  import path from 'path';
2
2
  import fs from 'fs';
3
- import { getAccountId, getConfigAccounts } from '@hubspot/local-dev-lib/config';
4
- import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
3
+ import { getConfigAccountIfExists, getAllConfigAccounts, } from '@hubspot/local-dev-lib/config';
5
4
  import { getAllHsProfiles, getHsProfileFilename, loadHsProfileFile, } from '@hubspot/project-parsing-lib';
6
5
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
7
6
  import { getProjectConfig } from '../../../lib/projects/config.js';
@@ -102,9 +101,9 @@ async function handler(args) {
102
101
  profileName = promptResponse.name;
103
102
  }
104
103
  if (targetAccountId) {
105
- const accountId = getAccountId(targetAccountId);
106
- if (accountId) {
107
- targetAccountId = accountId;
104
+ const account = getConfigAccountIfExists(targetAccountId);
105
+ if (account) {
106
+ targetAccountId = account.accountId;
108
107
  }
109
108
  else {
110
109
  uiLogger.error(commands.project.profile.add.errors.invalidTargetAccount);
@@ -113,14 +112,14 @@ async function handler(args) {
113
112
  }
114
113
  }
115
114
  if (!targetAccountId) {
116
- const configuredAccounts = getConfigAccounts();
115
+ const configuredAccounts = getAllConfigAccounts();
117
116
  if (!configuredAccounts || !configuredAccounts.length) {
118
117
  uiLogger.error(commands.project.profile.add.errors.noAccountsConfigured);
119
118
  process.exit(EXIT_CODES.ERROR);
120
119
  }
121
120
  const promptResponse = await listPrompt(commands.project.profile.add.prompts.targetAccountPrompt, {
122
121
  choices: configuredAccounts.map(account => {
123
- const accountId = getAccountIdentifier(account);
122
+ const accountId = account.accountId;
124
123
  return {
125
124
  name: uiAccountDescription(accountId),
126
125
  value: accountId,
@@ -2,7 +2,7 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { getAllHsProfiles, getHsProfileFilename, loadHsProfileFile, } from '@hubspot/project-parsing-lib';
4
4
  import { fetchProject, deleteProject, } from '@hubspot/local-dev-lib/api/projects';
5
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
5
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
6
6
  import { trackCommandUsage } from '../../../lib/usageTracking.js';
7
7
  import { getProjectConfig } from '../../../lib/projects/config.js';
8
8
  import { uiLogger } from '../../../lib/ui/logger.js';
@@ -80,7 +80,7 @@ async function handler(args) {
80
80
  catch (err) {
81
81
  debugError(err);
82
82
  }
83
- const targetAccountConfig = getAccountConfig(targetAccountId);
83
+ const targetAccountConfig = getConfigAccountById(targetAccountId);
84
84
  if (projectExists &&
85
85
  targetAccountConfig &&
86
86
  (isDeveloperTestAccount(targetAccountConfig) ||
@@ -0,0 +1,6 @@
1
+ import { CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
2
+ export type ProjectUpdateDepsArgs = CommonArgs & ConfigArgs & {
3
+ packages?: string[];
4
+ };
5
+ declare const projectUpdateDepsCommand: YargsCommandModule<unknown, ProjectUpdateDepsArgs>;
6
+ export default projectUpdateDepsCommand;
@@ -0,0 +1,80 @@
1
+ import { updatePackages, getProjectPackageJsonLocations, } from '../../lib/dependencyManagement.js';
2
+ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
3
+ import { getProjectConfig } from '../../lib/projects/config.js';
4
+ import { promptUser } from '../../lib/prompts/promptUtils.js';
5
+ import path from 'path';
6
+ import { commands } from '../../lang/en.js';
7
+ import { uiLogger } from '../../lib/ui/logger.js';
8
+ import { trackCommandUsage } from '../../lib/usageTracking.js';
9
+ import { logError } from '../../lib/errorHandlers/index.js';
10
+ import { makeYargsBuilder } from '../../lib/yargsUtils.js';
11
+ const command = 'update-deps [packages..]';
12
+ const describe = commands.project.updateDeps.help.describe;
13
+ async function handler(args) {
14
+ const { derivedAccountId, packages } = args;
15
+ try {
16
+ trackCommandUsage('project-update-deps', undefined, derivedAccountId);
17
+ const projectConfig = await getProjectConfig();
18
+ if (!projectConfig || !projectConfig.projectDir) {
19
+ uiLogger.error(commands.project.updateDeps.noProjectConfig);
20
+ return process.exit(EXIT_CODES.ERROR);
21
+ }
22
+ const { projectDir } = projectConfig;
23
+ let installLocations = await getProjectPackageJsonLocations();
24
+ if (packages) {
25
+ const { selectedInstallLocations } = await promptUser([
26
+ {
27
+ name: 'selectedInstallLocations',
28
+ type: 'checkbox',
29
+ when: () => packages && packages.length > 0,
30
+ message: commands.project.updateDeps.installLocationPrompt,
31
+ choices: installLocations.map(dir => ({
32
+ name: path.relative(projectDir, dir),
33
+ value: dir,
34
+ })),
35
+ validate: (choices) => {
36
+ if (choices === undefined || choices.length === 0) {
37
+ return commands.project.updateDeps.installLocationPromptRequired;
38
+ }
39
+ return true;
40
+ },
41
+ },
42
+ ]);
43
+ if (selectedInstallLocations) {
44
+ installLocations = selectedInstallLocations;
45
+ }
46
+ }
47
+ await updatePackages({
48
+ packages,
49
+ installLocations,
50
+ });
51
+ }
52
+ catch (e) {
53
+ logError(e);
54
+ return process.exit(EXIT_CODES.ERROR);
55
+ }
56
+ }
57
+ function projectUpdateDepsBuilder(yargs) {
58
+ yargs.example([
59
+ [
60
+ '$0 project update-deps',
61
+ commands.project.updateDeps.help.updateAppDepsExample,
62
+ ],
63
+ [
64
+ '$0 project update-deps dependency1 dependency2',
65
+ commands.project.updateDeps.help.updateDepToSubComponentExample,
66
+ ],
67
+ ]);
68
+ return yargs;
69
+ }
70
+ const builder = makeYargsBuilder(projectUpdateDepsBuilder, command, describe, {
71
+ useGlobalOptions: true,
72
+ useConfigOptions: true,
73
+ });
74
+ const projectUpdateDepsCommand = {
75
+ command,
76
+ describe,
77
+ handler,
78
+ builder,
79
+ };
80
+ export default projectUpdateDepsCommand;
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import { uiLogger } from '../../lib/ui/logger.js';
3
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
3
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
4
4
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
5
5
  import { isV2Project } from '../../lib/projects/platformVersion.js';
6
6
  import { trackCommandUsage } from '../../lib/usageTracking.js';
@@ -20,13 +20,19 @@ async function handler(args) {
20
20
  const { forceCreate, message, derivedAccountId, skipValidation, formatOutputAsJson, profile, } = args;
21
21
  const jsonOutput = {};
22
22
  const { projectConfig, projectDir } = await getProjectConfig();
23
- validateProjectConfig(projectConfig, projectDir);
23
+ try {
24
+ validateProjectConfig(projectConfig, projectDir);
25
+ }
26
+ catch (error) {
27
+ logError(error);
28
+ process.exit(EXIT_CODES.ERROR);
29
+ }
24
30
  let targetAccountId;
25
31
  if (isV2Project(projectConfig.platformVersion)) {
26
32
  targetAccountId = await loadAndValidateProfile(projectConfig, projectDir, profile);
27
33
  }
28
34
  targetAccountId = targetAccountId || derivedAccountId;
29
- const accountConfig = getAccountConfig(targetAccountId);
35
+ const accountConfig = getConfigAccountById(targetAccountId);
30
36
  const accountType = accountConfig && accountConfig.accountType;
31
37
  trackCommandUsage('project-upload', { type: accountType, assetType: projectConfig.platformVersion }, targetAccountId);
32
38
  try {
@@ -1,5 +1,5 @@
1
1
  import path from 'path';
2
- import { getAccountConfig } from '@hubspot/local-dev-lib/config';
2
+ import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
3
3
  import { isV2Project } from '../../lib/projects/platformVersion.js';
4
4
  import { trackCommandUsage } from '../../lib/usageTracking.js';
5
5
  import { uiLogger } from '../../lib/ui/logger.js';
@@ -23,10 +23,16 @@ async function handler(args) {
23
23
  uiLogger.error(commands.project.validate.badVersion);
24
24
  process.exit(EXIT_CODES.ERROR);
25
25
  }
26
- validateProjectConfig(projectConfig, projectDir);
26
+ try {
27
+ validateProjectConfig(projectConfig, projectDir);
28
+ }
29
+ catch (error) {
30
+ logError(error);
31
+ process.exit(EXIT_CODES.ERROR);
32
+ }
27
33
  let targetAccountId = await loadAndValidateProfile(projectConfig, projectDir, profile);
28
34
  targetAccountId = targetAccountId || derivedAccountId;
29
- const accountConfig = getAccountConfig(targetAccountId);
35
+ const accountConfig = getConfigAccountById(targetAccountId);
30
36
  const accountType = accountConfig && accountConfig.accountType;
31
37
  trackCommandUsage('project-validate', { type: accountType }, targetAccountId);
32
38
  const srcDir = path.resolve(projectDir, projectConfig.srcDir);
@@ -58,7 +58,13 @@ async function handler(args) {
58
58
  const { initialUpload, derivedAccountId } = args;
59
59
  trackCommandUsage('project-watch', undefined, derivedAccountId);
60
60
  const { projectConfig, projectDir } = await getProjectConfig();
61
- validateProjectConfig(projectConfig, projectDir);
61
+ try {
62
+ validateProjectConfig(projectConfig, projectDir);
63
+ }
64
+ catch (error) {
65
+ logError(error);
66
+ process.exit(EXIT_CODES.ERROR);
67
+ }
62
68
  if (!projectConfig || !projectDir) {
63
69
  uiLogger.error(commands.project.watch.errors.projectConfigNotFound);
64
70
  return process.exit(EXIT_CODES.ERROR);
@@ -67,7 +73,6 @@ async function handler(args) {
67
73
  uiLogger.error(projectConfig.platformVersion);
68
74
  return process.exit(EXIT_CODES.ERROR);
69
75
  }
70
- validateProjectConfig(projectConfig, projectDir);
71
76
  try {
72
77
  const { data: { results: builds }, } = await fetchProjectBuilds(derivedAccountId, projectConfig.name);
73
78
  const hasNoBuilds = !builds || !builds.length;
@@ -13,6 +13,7 @@ import migrate from './project/migrate.js';
13
13
  import migrateApp from './project/migrateApp.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 profile from './project/profile.js';
17
18
  import projectValidate from './project/validate.js';
18
19
  import list from './project/list.js';
@@ -36,6 +37,7 @@ function projectBuilder(yargs) {
36
37
  .command(migrate)
37
38
  .command(cloneApp)
38
39
  .command(installDeps)
40
+ .command(updateDeps)
39
41
  .command(profile)
40
42
  .command(projectValidate)
41
43
  .demandCommand(1, '');