@hubspot/cli 8.0.10-experimental.7 → 8.0.11-experimental.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/bin/cli.js +2 -0
  2. package/commands/account/auth.js +12 -22
  3. package/commands/account/clean.js +5 -6
  4. package/commands/account/createOverride.js +7 -7
  5. package/commands/account/info.js +2 -1
  6. package/commands/account/list.js +3 -5
  7. package/commands/account/remove.js +2 -3
  8. package/commands/account/removeOverride.js +8 -10
  9. package/commands/account/rename.js +5 -6
  10. package/commands/account/use.js +8 -19
  11. package/commands/api.d.ts +10 -0
  12. package/commands/api.js +164 -0
  13. package/commands/app/migrate.js +8 -8
  14. package/commands/app/secret/add.js +6 -7
  15. package/commands/app/secret/delete.js +9 -10
  16. package/commands/app/secret/list.js +6 -7
  17. package/commands/app/secret/update.js +8 -9
  18. package/commands/auth.js +12 -12
  19. package/commands/cms/app/create.js +9 -5
  20. package/commands/cms/convertFields.js +8 -8
  21. package/commands/cms/delete.js +2 -3
  22. package/commands/cms/fetch.js +7 -7
  23. package/commands/cms/function/create.js +9 -5
  24. package/commands/cms/function/deploy.js +2 -3
  25. package/commands/cms/function/list.js +11 -7
  26. package/commands/cms/function/logs.js +17 -23
  27. package/commands/cms/function/server.js +2 -3
  28. package/commands/cms/getReactModule.js +7 -8
  29. package/commands/cms/lighthouseScore.js +25 -24
  30. package/commands/cms/lint.js +4 -5
  31. package/commands/cms/list.js +5 -6
  32. package/commands/cms/module/create.js +9 -5
  33. package/commands/cms/module/marketplace-validate.js +7 -8
  34. package/commands/cms/mv.js +2 -3
  35. package/commands/cms/template/create.js +10 -6
  36. package/commands/cms/theme/create.js +5 -5
  37. package/commands/cms/theme/generate-selectors.js +5 -4
  38. package/commands/cms/theme/marketplace-validate.js +8 -9
  39. package/commands/cms/theme/preview.js +16 -8
  40. package/commands/cms/upload.js +15 -12
  41. package/commands/cms/watch.js +5 -5
  42. package/commands/cms/webpack/create.js +5 -5
  43. package/commands/completion.js +3 -5
  44. package/commands/config/migrate.js +6 -7
  45. package/commands/config/set.js +5 -6
  46. package/commands/customObject/create.js +4 -5
  47. package/commands/customObject/createSchema.js +4 -5
  48. package/commands/customObject/deleteSchema.js +4 -5
  49. package/commands/customObject/fetchAllSchemas.js +2 -3
  50. package/commands/customObject/fetchSchema.js +2 -3
  51. package/commands/customObject/listSchemas.js +2 -3
  52. package/commands/customObject/updateSchema.js +4 -5
  53. package/commands/doctor.js +8 -8
  54. package/commands/feedback.js +6 -4
  55. package/commands/filemanager/fetch.js +5 -6
  56. package/commands/filemanager/upload.js +5 -5
  57. package/commands/getStarted.js +14 -16
  58. package/commands/hubdb/clear.js +5 -6
  59. package/commands/hubdb/create.js +4 -5
  60. package/commands/hubdb/delete.js +8 -9
  61. package/commands/hubdb/fetch.js +5 -6
  62. package/commands/hubdb/list.js +16 -14
  63. package/commands/init.js +14 -17
  64. package/commands/mcp/setup.js +5 -6
  65. package/commands/mcp/start.js +2 -3
  66. package/commands/open.js +4 -5
  67. package/commands/project/add.js +10 -5
  68. package/commands/project/create.js +10 -10
  69. package/commands/project/delete.d.ts +7 -0
  70. package/commands/project/delete.js +74 -0
  71. package/commands/project/deploy.js +36 -34
  72. package/commands/project/dev/deprecatedFlow.js +42 -15
  73. package/commands/project/dev/index.d.ts +3 -3
  74. package/commands/project/dev/index.js +24 -30
  75. package/commands/project/dev/unifiedFlow.js +37 -14
  76. package/commands/project/download.js +10 -11
  77. package/commands/project/info.d.ts +4 -0
  78. package/commands/project/info.js +67 -0
  79. package/commands/project/installDeps.js +9 -6
  80. package/commands/project/lint.js +11 -8
  81. package/commands/project/list.js +14 -14
  82. package/commands/project/listBuilds.js +8 -6
  83. package/commands/project/logs.js +5 -6
  84. package/commands/project/migrate.js +8 -8
  85. package/commands/project/open.js +5 -6
  86. package/commands/project/profile/add.js +12 -8
  87. package/commands/project/profile/delete.js +15 -11
  88. package/commands/project/updateDeps.js +9 -6
  89. package/commands/project/upload.js +31 -17
  90. package/commands/project/validate.js +11 -11
  91. package/commands/project/watch.js +20 -20
  92. package/commands/project.js +4 -0
  93. package/commands/sandbox/create.js +15 -15
  94. package/commands/sandbox/delete.js +13 -14
  95. package/commands/secret/addSecret.js +6 -7
  96. package/commands/secret/deleteSecret.js +5 -6
  97. package/commands/secret/listSecret.js +2 -3
  98. package/commands/secret/updateSecret.js +4 -5
  99. package/commands/testAccount/create.d.ts +1 -1
  100. package/commands/testAccount/create.js +20 -16
  101. package/commands/testAccount/createConfig.js +7 -8
  102. package/commands/testAccount/delete.js +27 -18
  103. package/commands/testAccount/importData.js +6 -7
  104. package/commands/upgrade.js +9 -10
  105. package/lang/en.d.ts +123 -5
  106. package/lang/en.js +121 -6
  107. package/lib/accountAuth.js +2 -2
  108. package/lib/buildAccount.js +3 -3
  109. package/lib/constants.d.ts +0 -1
  110. package/lib/constants.js +0 -1
  111. package/lib/doctor/Diagnosis.js +5 -5
  112. package/lib/errorHandlers/index.js +4 -3
  113. package/lib/errorHandlers/suppressError.js +4 -0
  114. package/lib/errors/PromptExitError.d.ts +4 -2
  115. package/lib/errors/PromptExitError.js +3 -0
  116. package/lib/hasFeature.js +1 -2
  117. package/lib/middleware/autoUpdateMiddleware.js +6 -3
  118. package/lib/process.d.ts +1 -1
  119. package/lib/process.js +10 -3
  120. package/lib/projects/create/v2.js +1 -2
  121. package/lib/projects/delete.d.ts +13 -0
  122. package/lib/projects/delete.js +193 -0
  123. package/lib/projects/localDev/AppDevModeInterface.js +11 -11
  124. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +3 -1
  125. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
  126. package/lib/projects/localDev/DevSessionManager.d.ts +6 -3
  127. package/lib/projects/localDev/DevSessionManager.js +31 -19
  128. package/lib/projects/localDev/LocalDevManager_DEPRECATED.d.ts +3 -0
  129. package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +16 -12
  130. package/lib/projects/localDev/LocalDevProcess.js +6 -5
  131. package/lib/projects/localDev/LocalDevState.d.ts +3 -2
  132. package/lib/projects/localDev/LocalDevState.js +3 -1
  133. package/lib/projects/localDev/helpers/account.d.ts +4 -3
  134. package/lib/projects/localDev/helpers/account.js +16 -19
  135. package/lib/projects/localDev/helpers/process.d.ts +1 -1
  136. package/lib/projects/localDev/helpers/process.js +4 -10
  137. package/lib/projects/localDev/helpers/project.d.ts +4 -3
  138. package/lib/projects/localDev/helpers/project.js +31 -15
  139. package/lib/projects/projectInfo.d.ts +5 -0
  140. package/lib/projects/projectInfo.js +82 -0
  141. package/lib/projects/projectProfiles.d.ts +1 -2
  142. package/lib/projects/projectProfiles.js +5 -17
  143. package/lib/projects/upload.js +19 -0
  144. package/lib/projects/workspaces.d.ts +42 -0
  145. package/lib/projects/workspaces.js +350 -0
  146. package/lib/prompts/createApiSamplePrompt.js +4 -0
  147. package/lib/prompts/projectProfilePrompt.d.ts +2 -0
  148. package/lib/prompts/projectProfilePrompt.js +46 -0
  149. package/lib/prompts/promptUtils.js +3 -2
  150. package/lib/prompts/selectHubDBTablePrompt.js +2 -2
  151. package/lib/prompts/selectPublicAppForMigrationPrompt.js +2 -2
  152. package/lib/theme/cmsDevServerProcess.d.ts +2 -0
  153. package/lib/theme/cmsDevServerProcess.js +7 -6
  154. package/lib/ui/SpinniesManager.d.ts +1 -0
  155. package/lib/ui/SpinniesManager.js +20 -6
  156. package/lib/ui/spinniesUtils.d.ts +0 -1
  157. package/lib/ui/spinniesUtils.js +6 -16
  158. package/lib/usageTracking.d.ts +3 -4
  159. package/lib/yargs/makeYargsBuilder.d.ts +13 -0
  160. package/lib/yargs/makeYargsBuilder.js +33 -0
  161. package/lib/yargs/makeYargsHandlerWithUsageTracking.d.ts +3 -0
  162. package/lib/yargs/makeYargsHandlerWithUsageTracking.js +95 -0
  163. package/lib/yargs/strictEnforceBoolean.d.ts +1 -0
  164. package/lib/yargs/strictEnforceBoolean.js +13 -0
  165. package/lib/yargsUtils.d.ts +3 -16
  166. package/lib/yargsUtils.js +3 -48
  167. package/package.json +5 -4
  168. package/types/LocalDev.d.ts +5 -0
  169. package/types/Projects.d.ts +19 -0
  170. package/types/Yargs.d.ts +18 -1
@@ -1,6 +1,7 @@
1
1
  import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
2
2
  import { PLATFORM_VERSIONS } from '@hubspot/local-dev-lib/constants/projects';
3
- import { trackCommandMetadataUsage, trackCommandUsage, } from '../../lib/usageTracking.js';
3
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
4
+ import { trackCommandMetadataUsage } from '../../lib/usageTracking.js';
4
5
  import { commands } from '../../lang/en.js';
5
6
  import { uiLogger } from '../../lib/ui/logger.js';
6
7
  import { ApiErrorContext, logError } from '../../lib/errorHandlers/index.js';
@@ -13,12 +14,11 @@ const command = 'migrate';
13
14
  const describe = commands.project.migrateApp.describe;
14
15
  export function handlerGenerator(commandTrackingName) {
15
16
  return async function handler(args) {
16
- const { derivedAccountId, platformVersion, unstable } = args;
17
- await trackCommandUsage(commandTrackingName, {}, derivedAccountId);
17
+ const { derivedAccountId, platformVersion, unstable, exit } = args;
18
18
  const accountConfig = getConfigAccountById(derivedAccountId);
19
19
  if (!accountConfig) {
20
20
  uiLogger.error(commands.project.migrateApp.errors.noAccountConfig);
21
- return process.exit(EXIT_CODES.ERROR);
21
+ return exit(EXIT_CODES.ERROR);
22
22
  }
23
23
  uiLogger.log('');
24
24
  uiLogger.log(commands.project.migrateApp.header);
@@ -26,7 +26,7 @@ export function handlerGenerator(commandTrackingName) {
26
26
  try {
27
27
  if (getIsInProject()) {
28
28
  uiLogger.error(commands.project.migrateApp.errors.notAllowedWithinProject);
29
- return process.exit(EXIT_CODES.ERROR);
29
+ return exit(EXIT_CODES.ERROR);
30
30
  }
31
31
  args.platformVersion = unstable
32
32
  ? PLATFORM_VERSIONS.unstable
@@ -44,10 +44,10 @@ export function handlerGenerator(commandTrackingName) {
44
44
  logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
45
45
  }
46
46
  await trackCommandMetadataUsage(commandTrackingName, { successful: false }, derivedAccountId);
47
- return process.exit(EXIT_CODES.ERROR);
47
+ return exit(EXIT_CODES.ERROR);
48
48
  }
49
49
  await trackCommandMetadataUsage(commandTrackingName, { successful: true }, derivedAccountId);
50
- return process.exit(EXIT_CODES.SUCCESS);
50
+ return exit(EXIT_CODES.SUCCESS);
51
51
  };
52
52
  }
53
53
  const handler = handlerGenerator('app-migrate');
@@ -90,7 +90,7 @@ const builder = makeYargsBuilder(appMigrateBuilder, command, commands.project.mi
90
90
  const migrateCommand = {
91
91
  command,
92
92
  describe,
93
- handler,
93
+ handler: makeYargsHandlerWithUsageTracking('app-migrate', handler),
94
94
  builder,
95
95
  };
96
96
  export default migrateCommand;
@@ -1,24 +1,23 @@
1
1
  import { addAppSecret } from '@hubspot/local-dev-lib/api/devSecrets';
2
2
  import { logError } from '../../../lib/errorHandlers/index.js';
3
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
4
3
  import { secretValuePrompt, secretNamePrompt, } from '../../../lib/prompts/secretPrompt.js';
5
4
  import { selectAppPrompt } from '../../../lib/prompts/selectAppPrompt.js';
6
5
  import { commands } from '../../../lang/en.js';
7
6
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
7
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
8
8
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
9
9
  import { uiLogger } from '../../../lib/ui/logger.js';
10
10
  import { uiBetaTag } from '../../../lib/ui/index.js';
11
11
  const command = 'add [name]';
12
12
  const describe = uiBetaTag(commands.app.subcommands.secret.subcommands.add.describe, false);
13
13
  async function handler(args) {
14
- const { derivedAccountId } = args;
15
- trackCommandUsage('app-secret-add', {}, derivedAccountId);
14
+ const { derivedAccountId, exit } = args;
16
15
  try {
17
16
  const appSecretApp = await selectAppPrompt(derivedAccountId, args.app);
18
17
  if (!appSecretApp) {
19
18
  uiLogger.log('');
20
19
  uiLogger.log(commands.app.subcommands.secret.subcommands.add.errors.noApps);
21
- return process.exit(EXIT_CODES.ERROR);
20
+ return exit(EXIT_CODES.ERROR);
22
21
  }
23
22
  let appSecretName = args.name;
24
23
  if (!appSecretName) {
@@ -32,9 +31,9 @@ async function handler(args) {
32
31
  }
33
32
  catch (err) {
34
33
  logError(err);
35
- return process.exit(EXIT_CODES.ERROR);
34
+ return exit(EXIT_CODES.ERROR);
36
35
  }
37
- process.exit(EXIT_CODES.SUCCESS);
36
+ return exit(EXIT_CODES.SUCCESS);
38
37
  }
39
38
  function addAppSecretBuilder(yargs) {
40
39
  yargs.positional('name', {
@@ -57,7 +56,7 @@ const builder = makeYargsBuilder(addAppSecretBuilder, command, describe, {
57
56
  const addAppSecretCommand = {
58
57
  command,
59
58
  describe,
60
- handler,
59
+ handler: makeYargsHandlerWithUsageTracking('app-secret-add', handler),
61
60
  builder,
62
61
  };
63
62
  export default addAppSecretCommand;
@@ -1,21 +1,20 @@
1
1
  import { deleteAppSecret, fetchAppSecrets, } from '@hubspot/local-dev-lib/api/devSecrets';
2
2
  import { logError } from '../../../lib/errorHandlers/index.js';
3
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
4
3
  import { confirmPrompt, listPrompt } from '../../../lib/prompts/promptUtils.js';
5
4
  import { selectAppPrompt } from '../../../lib/prompts/selectAppPrompt.js';
6
5
  import { commands } from '../../../lang/en.js';
7
6
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
7
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
8
8
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
9
9
  import { uiLogger } from '../../../lib/ui/logger.js';
10
10
  import { uiBetaTag } from '../../../lib/ui/index.js';
11
11
  const command = 'delete [name]';
12
12
  const describe = uiBetaTag(commands.app.subcommands.secret.subcommands.delete.describe, false);
13
13
  async function handler(args) {
14
- const { derivedAccountId, force } = args;
15
- trackCommandUsage('app-secret-delete', {}, derivedAccountId);
14
+ const { derivedAccountId, force, exit } = args;
16
15
  const appSecretApp = await selectAppPrompt(derivedAccountId, args.app);
17
16
  if (!appSecretApp) {
18
- process.exit(EXIT_CODES.ERROR);
17
+ return exit(EXIT_CODES.ERROR);
19
18
  }
20
19
  let appSecretToDelete = args.name;
21
20
  if (!appSecretToDelete) {
@@ -28,11 +27,11 @@ async function handler(args) {
28
27
  }
29
28
  catch (err) {
30
29
  logError(err);
31
- process.exit(EXIT_CODES.ERROR);
30
+ return exit(EXIT_CODES.ERROR);
32
31
  }
33
32
  if (appSecrets.length === 0) {
34
33
  uiLogger.error(commands.app.subcommands.secret.subcommands.delete.errors.noSecrets);
35
- process.exit(EXIT_CODES.ERROR);
34
+ return exit(EXIT_CODES.ERROR);
36
35
  }
37
36
  appSecretToDelete = await listPrompt(commands.app.subcommands.secret.subcommands.delete.selectSecret, { choices: appSecrets });
38
37
  }
@@ -42,7 +41,7 @@ async function handler(args) {
42
41
  }));
43
42
  if (!confirmDelete) {
44
43
  uiLogger.log(commands.app.subcommands.secret.subcommands.delete.deleteCanceled);
45
- process.exit(EXIT_CODES.SUCCESS);
44
+ return exit(EXIT_CODES.SUCCESS);
46
45
  }
47
46
  try {
48
47
  await deleteAppSecret(derivedAccountId, appSecretApp.id, appSecretToDelete);
@@ -51,9 +50,9 @@ async function handler(args) {
51
50
  }
52
51
  catch (err) {
53
52
  logError(err);
54
- process.exit(EXIT_CODES.ERROR);
53
+ return exit(EXIT_CODES.ERROR);
55
54
  }
56
- process.exit(EXIT_CODES.SUCCESS);
55
+ return exit(EXIT_CODES.SUCCESS);
57
56
  }
58
57
  function deleteAppSecretBuilder(yargs) {
59
58
  yargs.positional('name', {
@@ -80,7 +79,7 @@ const builder = makeYargsBuilder(deleteAppSecretBuilder, command, describe, {
80
79
  const deleteAppSecretCommand = {
81
80
  command,
82
81
  describe,
83
- handler,
82
+ handler: makeYargsHandlerWithUsageTracking('app-secret-delete', handler),
84
83
  builder,
85
84
  };
86
85
  export default deleteAppSecretCommand;
@@ -1,8 +1,8 @@
1
1
  import { fetchAppSecrets } from '@hubspot/local-dev-lib/api/devSecrets';
2
2
  import { logError } from '../../../lib/errorHandlers/index.js';
3
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
4
3
  import { commands } from '../../../lang/en.js';
5
4
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
5
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
6
6
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
7
7
  import { selectAppPrompt } from '../../../lib/prompts/selectAppPrompt.js';
8
8
  import { uiLogger } from '../../../lib/ui/logger.js';
@@ -10,11 +10,10 @@ import { uiBetaTag } from '../../../lib/ui/index.js';
10
10
  const command = 'list';
11
11
  const describe = uiBetaTag(commands.app.subcommands.secret.subcommands.list.describe, false);
12
12
  async function handler(args) {
13
- const { derivedAccountId } = args;
14
- trackCommandUsage('app-secret-list', {}, derivedAccountId);
13
+ const { derivedAccountId, exit } = args;
15
14
  const appSecretApp = await selectAppPrompt(derivedAccountId, args.app);
16
15
  if (!appSecretApp) {
17
- process.exit(EXIT_CODES.ERROR);
16
+ return exit(EXIT_CODES.ERROR);
18
17
  }
19
18
  let appSecrets = [];
20
19
  try {
@@ -25,7 +24,7 @@ async function handler(args) {
25
24
  }
26
25
  catch (err) {
27
26
  logError(err);
28
- process.exit(EXIT_CODES.ERROR);
27
+ return exit(EXIT_CODES.ERROR);
29
28
  }
30
29
  if (appSecrets.length === 0) {
31
30
  uiLogger.log('');
@@ -38,7 +37,7 @@ async function handler(args) {
38
37
  uiLogger.log(`- ${secret}`);
39
38
  });
40
39
  }
41
- process.exit(EXIT_CODES.SUCCESS);
40
+ return exit(EXIT_CODES.SUCCESS);
42
41
  }
43
42
  function listAppSecretBuilder(yargs) {
44
43
  yargs.option('app', {
@@ -57,7 +56,7 @@ const builder = makeYargsBuilder(listAppSecretBuilder, command, describe, {
57
56
  const listAppSecretCommand = {
58
57
  command,
59
58
  describe,
60
- handler,
59
+ handler: makeYargsHandlerWithUsageTracking('app-secret-list', handler),
61
60
  builder,
62
61
  };
63
62
  export default listAppSecretCommand;
@@ -1,22 +1,21 @@
1
1
  import { fetchAppSecrets, updateAppSecret, } from '@hubspot/local-dev-lib/api/devSecrets';
2
2
  import { logError } from '../../../lib/errorHandlers/index.js';
3
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
4
3
  import { secretValuePrompt } from '../../../lib/prompts/secretPrompt.js';
5
4
  import { selectAppPrompt } from '../../../lib/prompts/selectAppPrompt.js';
6
5
  import { listPrompt } from '../../../lib/prompts/promptUtils.js';
7
6
  import { commands } from '../../../lang/en.js';
8
7
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
8
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
9
9
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
10
10
  import { uiLogger } from '../../../lib/ui/logger.js';
11
11
  import { uiBetaTag } from '../../../lib/ui/index.js';
12
12
  const command = 'update [name]';
13
13
  const describe = uiBetaTag(commands.app.subcommands.secret.subcommands.update.describe, false);
14
14
  async function handler(args) {
15
- const { derivedAccountId } = args;
16
- trackCommandUsage('app-secret-update', {}, derivedAccountId);
15
+ const { derivedAccountId, exit } = args;
17
16
  const appSecretApp = await selectAppPrompt(derivedAccountId, args.app);
18
17
  if (!appSecretApp) {
19
- process.exit(EXIT_CODES.ERROR);
18
+ return exit(EXIT_CODES.ERROR);
20
19
  }
21
20
  let appSecretToUpdate = args.name;
22
21
  if (!appSecretToUpdate) {
@@ -29,11 +28,11 @@ async function handler(args) {
29
28
  }
30
29
  catch (err) {
31
30
  logError(err);
32
- process.exit(EXIT_CODES.ERROR);
31
+ return exit(EXIT_CODES.ERROR);
33
32
  }
34
33
  if (appSecrets.length === 0) {
35
34
  uiLogger.error(commands.app.subcommands.secret.subcommands.update.errors.noSecrets);
36
- process.exit(EXIT_CODES.ERROR);
35
+ return exit(EXIT_CODES.ERROR);
37
36
  }
38
37
  appSecretToUpdate = await listPrompt(commands.app.subcommands.secret.subcommands.update.selectSecret, { choices: appSecrets });
39
38
  }
@@ -45,9 +44,9 @@ async function handler(args) {
45
44
  }
46
45
  catch (err) {
47
46
  logError(err);
48
- process.exit(EXIT_CODES.ERROR);
47
+ return exit(EXIT_CODES.ERROR);
49
48
  }
50
- process.exit(EXIT_CODES.SUCCESS);
49
+ return exit(EXIT_CODES.SUCCESS);
51
50
  }
52
51
  function updateAppSecretBuilder(yargs) {
53
52
  yargs.positional('name', {
@@ -70,7 +69,7 @@ const builder = makeYargsBuilder(updateAppSecretBuilder, command, describe, {
70
69
  const updateAppSecretCommand = {
71
70
  command,
72
71
  describe,
73
- handler,
72
+ handler: makeYargsHandlerWithUsageTracking('app-secret-update', handler),
74
73
  builder,
75
74
  };
76
75
  export default updateAppSecretCommand;
package/commands/auth.js CHANGED
@@ -11,12 +11,13 @@ import { cliAccountNamePrompt } from '../lib/prompts/accountNamePrompt.js';
11
11
  import { setAsDefaultAccountPrompt } from '../lib/prompts/setAsDefaultAccountPrompt.js';
12
12
  import { setCLILogLevel } from '../lib/commonOpts.js';
13
13
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
14
- import { trackAuthAction, trackCommandUsage } from '../lib/usageTracking.js';
14
+ import { trackAuthAction } from '../lib/usageTracking.js';
15
15
  import { authenticateWithOauth } from '../lib/oauth.js';
16
16
  import { EXIT_CODES } from '../lib/enums/exitCodes.js';
17
17
  import { uiFeatureHighlight } from '../lib/ui/index.js';
18
18
  import { logError } from '../lib/errorHandlers/index.js';
19
- import { PromptExitError } from '../lib/errors/PromptExitError.js';
19
+ import { isPromptExitError } from '../lib/errors/PromptExitError.js';
20
+ import { makeYargsHandlerWithUsageTracking } from '../lib/yargs/makeYargsHandlerWithUsageTracking.js';
20
21
  import { commands } from '../lang/en.js';
21
22
  import { uiLogger } from '../lib/ui/logger.js';
22
23
  import { parseStringToNumber } from '../lib/parsing.js';
@@ -33,7 +34,7 @@ const SUPPORTED_AUTHENTICATION_PROTOCOLS_TEXT = commaSeparatedValues(ALLOWED_AUT
33
34
  const command = 'auth';
34
35
  const describe = commands.auth.describe;
35
36
  async function handler(args) {
36
- const { authType: authTypeFlagValue, config: configFlagValue, qa, personalAccessKey: providedPersonalAccessKey, userProvidedAccount, disableTracking, } = args;
37
+ const { authType: authTypeFlagValue, config: configFlagValue, qa, personalAccessKey: providedPersonalAccessKey, userProvidedAccount, disableTracking, exit, } = args;
37
38
  let parsedUserProvidedAccountId;
38
39
  try {
39
40
  if (userProvidedAccount) {
@@ -42,7 +43,7 @@ async function handler(args) {
42
43
  }
43
44
  catch (err) {
44
45
  uiLogger.error(commands.auth.errors.invalidAccountIdProvided);
45
- process.exit(EXIT_CODES.ERROR);
46
+ return exit(EXIT_CODES.ERROR);
46
47
  }
47
48
  const authType = (authTypeFlagValue && authTypeFlagValue.toLowerCase()) ||
48
49
  PERSONAL_ACCESS_KEY_AUTH_METHOD.value;
@@ -54,10 +55,9 @@ async function handler(args) {
54
55
  }
55
56
  if (!configFlagValue && globalConfigFileExists()) {
56
57
  uiLogger.error(commands.auth.errors.globalConfigFileExists('hs account auth'));
57
- process.exit(EXIT_CODES.ERROR);
58
+ return exit(EXIT_CODES.ERROR);
58
59
  }
59
60
  if (!disableTracking) {
60
- trackCommandUsage('auth');
61
61
  trackAuthAction('auth', authType, TRACKING_STATUS.STARTED, parsedUserProvidedAccountId);
62
62
  }
63
63
  let configData;
@@ -87,7 +87,7 @@ async function handler(args) {
87
87
  }
88
88
  catch (e) {
89
89
  logError(e);
90
- process.exit(EXIT_CODES.ERROR);
90
+ return exit(EXIT_CODES.ERROR);
91
91
  }
92
92
  break;
93
93
  case PERSONAL_ACCESS_KEY_AUTH_METHOD.value:
@@ -103,8 +103,8 @@ async function handler(args) {
103
103
  updatedConfig = await updateConfigWithAccessToken(token, personalAccessKey, env);
104
104
  }
105
105
  catch (e) {
106
- if (e instanceof PromptExitError) {
107
- process.exit(e.exitCode);
106
+ if (isPromptExitError(e)) {
107
+ throw e;
108
108
  }
109
109
  logError(e);
110
110
  }
@@ -128,7 +128,7 @@ async function handler(args) {
128
128
  }
129
129
  if (!successAuthMethod && !disableTracking) {
130
130
  await trackAuthAction('auth', authType, TRACKING_STATUS.ERROR, parsedUserProvidedAccountId);
131
- process.exit(EXIT_CODES.ERROR);
131
+ return exit(EXIT_CODES.ERROR);
132
132
  }
133
133
  const nameFromConfigData = configData && 'name' in configData ? configData.name : undefined;
134
134
  const accountName = (updatedConfig && updatedConfig.name) || validName || nameFromConfigData;
@@ -144,7 +144,7 @@ async function handler(args) {
144
144
  if (!disableTracking) {
145
145
  await trackAuthAction('auth', authType, TRACKING_STATUS.COMPLETE, accountId);
146
146
  }
147
- process.exit(EXIT_CODES.SUCCESS);
147
+ return exit(EXIT_CODES.SUCCESS);
148
148
  }
149
149
  function authBuilder(yargs) {
150
150
  yargs.options({
@@ -184,7 +184,7 @@ const builder = makeYargsBuilder(authBuilder, command, commands.auth.verboseDesc
184
184
  const authCommand = {
185
185
  command,
186
186
  describe,
187
- handler,
187
+ handler: makeYargsHandlerWithUsageTracking('auth', handler),
188
188
  builder,
189
189
  };
190
190
  export default authCommand;
@@ -1,23 +1,24 @@
1
1
  import fs from 'fs-extra';
2
2
  import { logError } from '../../../lib/errorHandlers/index.js';
3
3
  import { resolveLocalPath } from '../../../lib/filesystem.js';
4
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
5
4
  import { commands } from '../../../lang/en.js';
6
5
  import { uiLogger } from '../../../lib/ui/logger.js';
7
6
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
7
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
8
8
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
9
+ import { isPromptExitError } from '../../../lib/errors/PromptExitError.js';
9
10
  import assets from '../../../lib/cmsAssets/index.js';
10
11
  const APP_ASSET_TYPES = ['api-sample', 'app', 'react-app', 'vue-app'];
11
12
  const command = 'create <type> [name] [dest]';
12
13
  const describe = commands.cms.subcommands.app.subcommands.create.describe;
13
14
  async function handler(args) {
14
- const { derivedAccountId, name, internal: getInternalVersion, type, dest, } = args;
15
+ const { name, internal: getInternalVersion, type, dest, exit, addUsageMetadata, } = args;
15
16
  const assetType = type.toLowerCase();
16
17
  if (!assetType || !APP_ASSET_TYPES.includes(assetType)) {
17
18
  uiLogger.error(commands.cms.subcommands.app.subcommands.create.errors.unsupportedAssetType(assetType, APP_ASSET_TYPES.filter(t => !assets[t].hidden).join(', ')));
18
19
  return;
19
20
  }
20
- trackCommandUsage('create', { assetType }, derivedAccountId);
21
+ addUsageMetadata({ assetType });
21
22
  const asset = assets[assetType];
22
23
  const argsToPass = {
23
24
  commandArgs: args,
@@ -43,8 +44,11 @@ async function handler(args) {
43
44
  await asset.execute(argsToPass);
44
45
  }
45
46
  catch (e) {
47
+ if (isPromptExitError(e)) {
48
+ throw e;
49
+ }
46
50
  logError(e);
47
- process.exit(EXIT_CODES.ERROR);
51
+ return exit(EXIT_CODES.ERROR);
48
52
  }
49
53
  }
50
54
  function appCreateBuilder(yargs) {
@@ -76,6 +80,6 @@ const appCreateCommand = {
76
80
  command,
77
81
  describe,
78
82
  builder,
79
- handler,
83
+ handler: makeYargsHandlerWithUsageTracking('create', handler),
80
84
  };
81
85
  export default appCreateCommand;
@@ -10,14 +10,16 @@ import { FieldsJs, isConvertableFieldJs, } from '@hubspot/local-dev-lib/cms/hand
10
10
  import { trackConvertFieldsUsage } from '../../lib/usageTracking.js';
11
11
  import { logError } from '../../lib/errorHandlers/index.js';
12
12
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
13
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
13
14
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
14
15
  const command = 'convert-fields';
15
16
  const describe = commands.convertFields.describe;
16
- function invalidPath(src) {
17
+ function invalidPath(src, exit) {
17
18
  uiLogger.error(commands.convertFields.errors.invalidPath(src));
18
- process.exit(EXIT_CODES.ERROR);
19
+ return exit(EXIT_CODES.ERROR);
19
20
  }
20
21
  async function handler(args) {
22
+ const { exit } = args;
21
23
  let stats;
22
24
  let projectRoot;
23
25
  let src;
@@ -29,17 +31,15 @@ async function handler(args) {
29
31
  : path.dirname(getCwd());
30
32
  stats = fs.statSync(src);
31
33
  if (!stats.isFile() && !stats.isDirectory()) {
32
- invalidPath(args.src);
33
- return;
34
+ return invalidPath(args.src, exit);
34
35
  }
35
36
  }
36
37
  catch (e) {
37
- invalidPath(args.src);
38
+ return invalidPath(args.src, exit);
38
39
  }
39
40
  trackConvertFieldsUsage('process');
40
41
  if (!src || !stats || !projectRoot) {
41
- invalidPath(args.src);
42
- return;
42
+ return invalidPath(args.src, exit);
43
43
  }
44
44
  if (stats.isFile()) {
45
45
  const fieldsJs = await new FieldsJs(projectRoot, src, undefined, args.fieldOptions).init();
@@ -91,7 +91,7 @@ const builder = makeYargsBuilder(convertFieldsBuilder, command, describe);
91
91
  const convertFieldsCommand = {
92
92
  command,
93
93
  describe,
94
- handler,
94
+ handler: makeYargsHandlerWithUsageTracking('convert-fields', handler),
95
95
  builder,
96
96
  };
97
97
  export default convertFieldsCommand;
@@ -1,14 +1,13 @@
1
1
  import { deleteFile } from '@hubspot/local-dev-lib/api/fileMapper';
2
2
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
3
- import { trackCommandUsage } from '../../lib/usageTracking.js';
4
3
  import { commands } from '../../lang/en.js';
4
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
5
5
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
6
6
  import { uiLogger } from '../../lib/ui/logger.js';
7
7
  const command = 'delete <path>';
8
8
  const describe = commands.cms.subcommands.delete.describe;
9
9
  async function handler(args) {
10
10
  const { path: hsPath, derivedAccountId } = args;
11
- trackCommandUsage('delete', undefined, derivedAccountId);
12
11
  try {
13
12
  await deleteFile(derivedAccountId, hsPath);
14
13
  uiLogger.log(commands.cms.subcommands.delete.deleted(hsPath, derivedAccountId));
@@ -37,7 +36,7 @@ const builder = makeYargsBuilder(cmsDeleteBuilder, command, describe, {
37
36
  const cmsDeleteCommand = {
38
37
  command,
39
38
  describe,
40
- handler,
39
+ handler: makeYargsHandlerWithUsageTracking('delete', handler),
41
40
  builder,
42
41
  };
43
42
  export default cmsDeleteCommand;
@@ -2,8 +2,8 @@ import { downloadFileOrFolder } from '@hubspot/local-dev-lib/fileMapper';
2
2
  import { addCmsPublishModeOptions, addOverwriteOptions, getCmsPublishMode, } from '../../lib/commonOpts.js';
3
3
  import { resolveLocalPath } from '../../lib/filesystem.js';
4
4
  import { validateCmsPublishMode } from '../../lib/validation.js';
5
- import { trackCommandUsage } from '../../lib/usageTracking.js';
6
5
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
6
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
7
7
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
8
8
  import { logError } from '../../lib/errorHandlers/index.js';
9
9
  import { commands } from '../../lang/en.js';
@@ -12,16 +12,16 @@ const command = 'fetch <src> [dest]';
12
12
  const describe = commands.cms.subcommands.fetch.describe;
13
13
  async function handler(options) {
14
14
  const { src, dest } = options;
15
+ const { derivedAccountId, exit, addUsageMetadata } = options;
15
16
  if (!validateCmsPublishMode(options)) {
16
- process.exit(EXIT_CODES.ERROR);
17
+ return exit(EXIT_CODES.ERROR);
17
18
  }
18
19
  if (typeof src !== 'string') {
19
20
  uiLogger.error(commands.cms.subcommands.fetch.errors.sourceRequired);
20
- process.exit(EXIT_CODES.ERROR);
21
+ return exit(EXIT_CODES.ERROR);
21
22
  }
22
- const { derivedAccountId } = options;
23
23
  const cmsPublishMode = getCmsPublishMode(options);
24
- trackCommandUsage('fetch', { mode: cmsPublishMode }, derivedAccountId);
24
+ addUsageMetadata({ mode: cmsPublishMode });
25
25
  const { assetVersion, staging, overwrite } = options;
26
26
  try {
27
27
  // Fetch and write file/folder with increased timeout for large themes.
@@ -34,7 +34,7 @@ async function handler(options) {
34
34
  }
35
35
  catch (err) {
36
36
  logError(err);
37
- process.exit(EXIT_CODES.ERROR);
37
+ return exit(EXIT_CODES.ERROR);
38
38
  }
39
39
  }
40
40
  const fetchBuilder = (yargs) => {
@@ -74,7 +74,7 @@ const builder = makeYargsBuilder(fetchBuilder, command, describe, {
74
74
  const fetchCommand = {
75
75
  command,
76
76
  describe,
77
- handler,
77
+ handler: makeYargsHandlerWithUsageTracking('fetch', handler),
78
78
  builder,
79
79
  };
80
80
  export default fetchCommand;
@@ -1,19 +1,20 @@
1
1
  import fs from 'fs-extra';
2
2
  import { logError } from '../../../lib/errorHandlers/index.js';
3
3
  import { resolveLocalPath } from '../../../lib/filesystem.js';
4
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
5
4
  import { commands } from '../../../lang/en.js';
6
5
  import { uiLogger } from '../../../lib/ui/logger.js';
7
6
  import { HTTP_METHODS } from '../../../types/Cms.js';
8
7
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
8
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
9
9
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
10
+ import { isPromptExitError } from '../../../lib/errors/PromptExitError.js';
10
11
  import assets from '../../../lib/cmsAssets/index.js';
11
12
  const command = 'create [name] [dest]';
12
13
  const describe = commands.cms.subcommands.function.subcommands.create.describe;
13
14
  async function handler(args) {
14
- const { derivedAccountId, name, dest } = args;
15
+ const { name, dest, exit, addUsageMetadata } = args;
15
16
  const assetType = 'function';
16
- trackCommandUsage('create', { assetType }, derivedAccountId);
17
+ addUsageMetadata({ assetType });
17
18
  const asset = assets[assetType];
18
19
  const argsToPass = {
19
20
  commandArgs: args,
@@ -36,8 +37,11 @@ async function handler(args) {
36
37
  await asset.execute(argsToPass);
37
38
  }
38
39
  catch (e) {
40
+ if (isPromptExitError(e)) {
41
+ throw e;
42
+ }
39
43
  logError(e);
40
- process.exit(EXIT_CODES.ERROR);
44
+ return exit(EXIT_CODES.ERROR);
41
45
  }
42
46
  }
43
47
  function functionCreateBuilder(yargs) {
@@ -79,6 +83,6 @@ const functionCreateCommand = {
79
83
  command,
80
84
  describe,
81
85
  builder,
82
- handler,
86
+ handler: makeYargsHandlerWithUsageTracking('create', handler),
83
87
  };
84
88
  export default functionCreateCommand;
@@ -2,12 +2,12 @@ import { uiLogger } from '../../../lib/ui/logger.js';
2
2
  import { buildPackage, getBuildStatus, } from '@hubspot/local-dev-lib/api/functions';
3
3
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
4
4
  import SpinniesManager from '../../../lib/ui/SpinniesManager.js';
5
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
6
5
  import { logError, ApiErrorContext } from '../../../lib/errorHandlers/index.js';
7
6
  import { uiAccountDescription } from '../../../lib/ui/index.js';
8
7
  import { poll } from '../../../lib/polling.js';
9
8
  import { outputBuildLog } from '../../../lib/serverlessLogs.js';
10
9
  import { commands } from '../../../lang/en.js';
10
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
11
11
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
12
12
  function isFunctionBuildError(e) {
13
13
  return (typeof e === 'object' && e !== null && 'status' in e && e.status === 'ERROR');
@@ -17,7 +17,6 @@ const describe = undefined; // Hidden command
17
17
  async function handler(args) {
18
18
  const { path: functionPath, derivedAccountId } = args;
19
19
  const splitFunctionPath = functionPath.split('.');
20
- trackCommandUsage('function-deploy', undefined, derivedAccountId);
21
20
  if (!splitFunctionPath.length ||
22
21
  splitFunctionPath[splitFunctionPath.length - 1] !== 'functions') {
23
22
  uiLogger.error(commands.cms.subcommands.function.subcommands.deploy.errors.notFunctionsFolder(functionPath));
@@ -83,7 +82,7 @@ const builder = makeYargsBuilder(functionDeployBuilder, command, describe, {
83
82
  const functionDeployCommand = {
84
83
  command,
85
84
  describe,
86
- handler,
85
+ handler: makeYargsHandlerWithUsageTracking('function-deploy', handler),
87
86
  builder,
88
87
  };
89
88
  export default functionDeployCommand;