@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
@@ -2,6 +2,7 @@ import fs from 'fs';
2
2
  import { commands } from '../../../lang/en.js';
3
3
  import { findFieldsJsonPath, combineThemeCss, setPreviewSelectors, generateInheritedSelectors, generateSelectorsMap, getMaxFieldsDepth, } from '../../../lib/generateSelectors.js';
4
4
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
5
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
5
6
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
6
7
  import { uiLogger } from '../../../lib/ui/logger.js';
7
8
  const HUBL_EXPRESSION_REGEX = new RegExp(/{%\s*(.*)\s*%}/, 'g');
@@ -16,12 +17,12 @@ const THEME_PATH_REGEX = new RegExp(/=\s*.*(theme\.(\w|\.)*)/, 'i');
16
17
  const command = 'generate-selectors <path>';
17
18
  const describe = commands.cms.subcommands.theme.subcommands.generateSelectors.describe;
18
19
  async function handler(args) {
19
- const { path } = args;
20
+ const { path, exit } = args;
20
21
  const fieldsJsonPath = findFieldsJsonPath(path);
21
22
  if (!fieldsJsonPath) {
22
23
  uiLogger.error(commands.cms.subcommands.theme.subcommands.generateSelectors.errors
23
24
  .fieldsNotFound);
24
- process.exit(EXIT_CODES.ERROR);
25
+ return exit(EXIT_CODES.ERROR);
25
26
  }
26
27
  let fieldsJson = JSON.parse(fs.readFileSync(fieldsJsonPath, 'utf-8'));
27
28
  let cssString = combineThemeCss(path) ?? '';
@@ -132,7 +133,7 @@ async function handler(args) {
132
133
  if (!Object.keys(finalMap).length) {
133
134
  uiLogger.error(commands.cms.subcommands.theme.subcommands.generateSelectors.errors
134
135
  .noSelectorsFound);
135
- process.exit(EXIT_CODES.ERROR);
136
+ return exit(EXIT_CODES.ERROR);
136
137
  }
137
138
  Object.keys(finalMap).forEach(themeFieldKey => {
138
139
  const fieldKey = themeFieldKey.split('.');
@@ -165,7 +166,7 @@ const builder = makeYargsBuilder(themeSelectorBuilder, command, describe, {
165
166
  const themeSelectorsCommand = {
166
167
  command,
167
168
  describe,
168
- handler,
169
+ handler: makeYargsHandlerWithUsageTracking('generate-selectors', handler),
169
170
  builder,
170
171
  };
171
172
  export default themeSelectorsCommand;
@@ -1,15 +1,14 @@
1
1
  import SpinniesManager from '../../../lib/ui/SpinniesManager.js';
2
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
3
2
  import { kickOffValidation, pollForValidationFinish, fetchValidationResults, hasProcessValidationErrors, displayValidationResults, } from '../../../lib/marketplaceValidate.js';
4
3
  import { commands } from '../../../lang/en.js';
5
- import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
6
4
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
5
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
6
+ import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
7
7
  import { logError } from '../../../lib/errorHandlers/index.js';
8
8
  const command = 'marketplace-validate <path>';
9
9
  const describe = commands.cms.subcommands.theme.subcommands.marketplaceValidate.describe;
10
10
  async function handler(args) {
11
- const { path, derivedAccountId } = args;
12
- trackCommandUsage('validate', {}, derivedAccountId);
11
+ const { path, derivedAccountId, exit } = args;
13
12
  SpinniesManager.add('marketplaceValidation', {
14
13
  text: commands.cms.subcommands.theme.subcommands.marketplaceValidate.logs.validatingTheme(path),
15
14
  });
@@ -21,7 +20,7 @@ async function handler(args) {
21
20
  }
22
21
  catch (e) {
23
22
  logError(e);
24
- process.exit(EXIT_CODES.ERROR);
23
+ return exit(EXIT_CODES.ERROR);
25
24
  }
26
25
  SpinniesManager.remove('marketplaceValidation');
27
26
  let validationResults;
@@ -30,15 +29,15 @@ async function handler(args) {
30
29
  }
31
30
  catch (e) {
32
31
  logError(e);
33
- process.exit(EXIT_CODES.ERROR);
32
+ return exit(EXIT_CODES.ERROR);
34
33
  }
35
34
  const hasErrors = hasProcessValidationErrors(commands.cms.subcommands.theme.subcommands.marketplaceValidate.errors
36
35
  .invalidPath, validationResults);
37
36
  if (hasErrors) {
38
- process.exit(EXIT_CODES.ERROR);
37
+ return exit(EXIT_CODES.ERROR);
39
38
  }
40
39
  displayValidationResults(commands.cms.subcommands.theme.subcommands.marketplaceValidate.results, validationResults);
41
- process.exit(EXIT_CODES.SUCCESS);
40
+ return exit(EXIT_CODES.SUCCESS);
42
41
  }
43
42
  function themeValidateBuilder(yargs) {
44
43
  yargs.positional('path', {
@@ -58,7 +57,7 @@ const builder = makeYargsBuilder(themeValidateBuilder, command, describe, {
58
57
  const themeValidateCommand = {
59
58
  command,
60
59
  describe,
61
- handler,
60
+ handler: makeYargsHandlerWithUsageTracking('validate', handler),
62
61
  builder,
63
62
  };
64
63
  export default themeValidateCommand;
@@ -4,12 +4,13 @@ import { commands } from '../../../lang/en.js';
4
4
  import { getCwd } from '@hubspot/local-dev-lib/path';
5
5
  import { getThemeJSONPath } from '@hubspot/local-dev-lib/cms/themes';
6
6
  import { spawnDevServer } from '../../../lib/theme/cmsDevServerProcess.js';
7
- import { trackCommandUsage } from '../../../lib/usageTracking.js';
7
+ import { logError } from '../../../lib/errorHandlers/index.js';
8
8
  import { previewPrompt, previewProjectPrompt, } from '../../../lib/prompts/previewPrompt.js';
9
9
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
10
10
  import { getProjectConfig } from '../../../lib/projects/config.js';
11
11
  import { findProjectComponents } from '../../../lib/projects/structure.js';
12
12
  import { ComponentTypes } from '../../../types/Projects.js';
13
+ import { makeYargsHandlerWithUsageTracking } from '../../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
13
14
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
14
15
  import { uiLogger } from '../../../lib/ui/logger.js';
15
16
  const command = 'preview [--src] [--dest]';
@@ -42,7 +43,7 @@ async function determineSrcAndDest(args) {
42
43
  dest = args.dest || previewPromptAnswers.dest;
43
44
  absoluteSrc = path.resolve(getCwd(), src);
44
45
  if (!dest || !validateSrcPath(absoluteSrc)) {
45
- process.exit(EXIT_CODES.ERROR);
46
+ throw new Error(commands.cms.subcommands.theme.subcommands.preview.errors.invalidPath(src));
46
47
  }
47
48
  }
48
49
  else {
@@ -52,9 +53,8 @@ async function determineSrcAndDest(args) {
52
53
  const projectComponents = await findProjectComponents(projectDir);
53
54
  const themeComponents = projectComponents.filter(c => c.type === ComponentTypes.HublTheme);
54
55
  if (themeComponents.length === 0) {
55
- uiLogger.error(commands.cms.subcommands.theme.subcommands.preview.errors
56
+ throw new Error(commands.cms.subcommands.theme.subcommands.preview.errors
56
57
  .noThemeComponents);
57
- process.exit(EXIT_CODES.ERROR);
58
58
  }
59
59
  const answer = await previewProjectPrompt(themeComponents);
60
60
  themeJsonPath = `${answer.themeComponentPath}/theme.json`;
@@ -67,9 +67,16 @@ async function determineSrcAndDest(args) {
67
67
  return { absoluteSrc, dest };
68
68
  }
69
69
  async function handler(args) {
70
- const { derivedAccountId, noSsl, resetSession, port, generateFieldsTypes } = args;
71
- const { absoluteSrc, dest } = await determineSrcAndDest(args);
72
- trackCommandUsage('preview', {}, derivedAccountId);
70
+ const { derivedAccountId, noSsl, resetSession, port, generateFieldsTypes, exit, } = args;
71
+ let absoluteSrc;
72
+ let dest;
73
+ try {
74
+ ({ absoluteSrc, dest } = await determineSrcAndDest(args));
75
+ }
76
+ catch (error) {
77
+ logError(error);
78
+ return exit(EXIT_CODES.ERROR);
79
+ }
73
80
  // Spawn dev server in isolated subprocess to avoid React version conflicts
74
81
  // File listing and progress bars are handled within the subprocess
75
82
  await spawnDevServer({
@@ -80,6 +87,7 @@ async function handler(args) {
80
87
  generateFieldsTypes,
81
88
  resetSession: resetSession || false,
82
89
  dest,
90
+ exit,
83
91
  });
84
92
  }
85
93
  function themePreviewBuilder(yargs) {
@@ -120,7 +128,7 @@ const builder = makeYargsBuilder(themePreviewBuilder, command, describe, {
120
128
  const themePreviewCommand = {
121
129
  command,
122
130
  describe,
123
- handler,
131
+ handler: makeYargsHandlerWithUsageTracking('preview', handler),
124
132
  builder,
125
133
  };
126
134
  export default themePreviewCommand;
@@ -13,10 +13,10 @@ import { getCmsPublishMode } from '../../lib/commonOpts.js';
13
13
  import { uploadPrompt } from '../../lib/prompts/uploadPrompt.js';
14
14
  import { confirmPrompt } from '../../lib/prompts/promptUtils.js';
15
15
  import { validateCmsPublishMode } from '../../lib/validation.js';
16
- import { trackCommandUsage } from '../../lib/usageTracking.js';
17
16
  import { getUploadableFileList } from '../../lib/upload.js';
18
17
  import { commands } from '../../lang/en.js';
19
18
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
19
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
20
20
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
21
21
  import { uiLogger } from '../../lib/ui/logger.js';
22
22
  const command = 'upload [src] [dest]';
@@ -29,10 +29,10 @@ function logThemePreview(filePath, accountId) {
29
29
  }
30
30
  }
31
31
  async function handler(args) {
32
+ const { derivedAccountId, exit, addUsageMetadata } = args;
32
33
  if (!validateCmsPublishMode(args)) {
33
- process.exit(EXIT_CODES.WARNING);
34
+ return exit(EXIT_CODES.WARNING);
34
35
  }
35
- const { derivedAccountId } = args;
36
36
  const cmsPublishMode = getCmsPublishMode(args);
37
37
  const uploadPromptAnswers = await uploadPrompt(args);
38
38
  const src = args.src || uploadPromptAnswers.src;
@@ -74,11 +74,14 @@ async function handler(args) {
74
74
  return;
75
75
  }
76
76
  const normalizedDest = convertToUnixPath(dest);
77
- trackCommandUsage('upload', { mode: cmsPublishMode, type: stats.isFile() ? 'file' : 'folder' }, derivedAccountId);
77
+ addUsageMetadata({
78
+ mode: cmsPublishMode,
79
+ type: stats.isFile() ? 'file' : 'folder',
80
+ });
78
81
  const srcDestIssues = await validateSrcAndDestPaths({ isLocal: true, path: src }, { isHubSpot: true, path: dest });
79
82
  if (srcDestIssues.length) {
80
83
  srcDestIssues.forEach(({ message }) => uiLogger.error(message));
81
- process.exit(EXIT_CODES.WARNING);
84
+ return exit(EXIT_CODES.WARNING);
82
85
  }
83
86
  if (stats.isFile()) {
84
87
  if (!isAllowedExtension(src) && !convertFields) {
@@ -94,14 +97,14 @@ async function handler(args) {
94
97
  uiLogger.success(commands.cms.subcommands.upload.success.fileUploaded(src, normalizedDest, derivedAccountId));
95
98
  logThemePreview(src, derivedAccountId);
96
99
  })
97
- .catch(error => {
100
+ .catch(async (error) => {
98
101
  uiLogger.error(commands.cms.subcommands.upload.errors.uploadFailed(src, normalizedDest));
99
102
  logError(error, new ApiErrorContext({
100
103
  accountId: derivedAccountId,
101
104
  request: normalizedDest,
102
105
  payload: src,
103
106
  }));
104
- process.exit(EXIT_CODES.WARNING);
107
+ return exit(EXIT_CODES.WARNING);
105
108
  })
106
109
  .finally(() => {
107
110
  if (!convertFields)
@@ -140,22 +143,22 @@ async function handler(args) {
140
143
  fieldOptions: args.fieldOptions ?? undefined,
141
144
  saveOutput: args.saveOutput,
142
145
  }, filePaths)
143
- .then(results => {
146
+ .then(async (results) => {
144
147
  if (!hasUploadErrors(results)) {
145
148
  uiLogger.success(commands.cms.subcommands.upload.success.uploadComplete(dest));
146
149
  logThemePreview(src, derivedAccountId);
147
150
  }
148
151
  else {
149
152
  uiLogger.error(commands.cms.subcommands.upload.errors.someFilesFailed(dest));
150
- process.exit(EXIT_CODES.WARNING);
153
+ return exit(EXIT_CODES.WARNING);
151
154
  }
152
155
  })
153
- .catch(error => {
156
+ .catch(async (error) => {
154
157
  uiLogger.error(commands.cms.subcommands.upload.errors.uploadFailed(src, dest));
155
158
  logError(error, {
156
159
  accountId: derivedAccountId,
157
160
  });
158
- process.exit(EXIT_CODES.WARNING);
161
+ return exit(EXIT_CODES.WARNING);
159
162
  });
160
163
  }
161
164
  }
@@ -206,7 +209,7 @@ const builder = makeYargsBuilder(uploadBuilder, command, describe, {
206
209
  const uploadCommand = {
207
210
  command,
208
211
  describe,
209
- handler,
212
+ handler: makeYargsHandlerWithUsageTracking('upload', handler),
210
213
  builder,
211
214
  };
212
215
  export default uploadCommand;
@@ -5,19 +5,19 @@ import { getCwd } from '@hubspot/local-dev-lib/path';
5
5
  import { getCmsPublishMode } from '../../lib/commonOpts.js';
6
6
  import { uploadPrompt } from '../../lib/prompts/uploadPrompt.js';
7
7
  import { validateCmsPublishMode } from '../../lib/validation.js';
8
- import { trackCommandUsage } from '../../lib/usageTracking.js';
9
8
  import { commands } from '../../lang/en.js';
10
9
  import { getUploadableFileList } from '../../lib/upload.js';
11
10
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
12
11
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
13
12
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
13
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
14
14
  import { uiLogger } from '../../lib/ui/logger.js';
15
15
  const command = 'watch [src] [dest]';
16
16
  const describe = commands.cms.subcommands.watch.describe;
17
17
  const handler = async (args) => {
18
- const { remove, initialUpload, notify, derivedAccountId } = args;
18
+ const { remove, initialUpload, notify, derivedAccountId, exit, addUsageMetadata, } = args;
19
19
  if (!validateCmsPublishMode(args)) {
20
- process.exit(EXIT_CODES.ERROR);
20
+ return exit(EXIT_CODES.ERROR);
21
21
  }
22
22
  const cmsPublishMode = getCmsPublishMode(args);
23
23
  const uploadPromptAnswers = await uploadPrompt(args);
@@ -43,7 +43,7 @@ const handler = async (args) => {
43
43
  if (initialUpload) {
44
44
  filesToUpload = await getUploadableFileList(absoluteSrcPath, args.convertFields);
45
45
  }
46
- trackCommandUsage('watch', { mode: cmsPublishMode }, derivedAccountId);
46
+ addUsageMetadata({ mode: cmsPublishMode });
47
47
  const onUploadFolderError = (error) => {
48
48
  uiLogger.error(commands.cms.subcommands.watch.errors.folderFailed(src, dest, derivedAccountId));
49
49
  logError(error, {
@@ -126,7 +126,7 @@ const builder = makeYargsBuilder(watchBuilder, command, describe, {
126
126
  const watchCommand = {
127
127
  command,
128
128
  describe,
129
- handler,
129
+ handler: makeYargsHandlerWithUsageTracking('watch', handler),
130
130
  builder,
131
131
  };
132
132
  export default watchCommand;
@@ -1,18 +1,18 @@
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
9
  import assets from '../../../lib/cmsAssets/index.js';
10
10
  const command = 'create [dest]';
11
11
  const describe = commands.cms.subcommands.webpack.subcommands.create.describe;
12
12
  async function handler(args) {
13
- const { dest, derivedAccountId } = args;
13
+ const { dest, exit, addUsageMetadata } = args;
14
14
  const assetType = 'webpack-serverless';
15
- trackCommandUsage('create', { assetType }, derivedAccountId);
15
+ addUsageMetadata({ assetType });
16
16
  const asset = assets[assetType];
17
17
  const argsToPass = {
18
18
  commandArgs: args,
@@ -35,7 +35,7 @@ async function handler(args) {
35
35
  }
36
36
  catch (e) {
37
37
  logError(e);
38
- process.exit(EXIT_CODES.ERROR);
38
+ return exit(EXIT_CODES.ERROR);
39
39
  }
40
40
  }
41
41
  function webpackCreateBuilder(yargs) {
@@ -53,6 +53,6 @@ const webpackCreateCommand = {
53
53
  command,
54
54
  describe,
55
55
  builder,
56
- handler,
56
+ handler: makeYargsHandlerWithUsageTracking('create', handler),
57
57
  };
58
58
  export default webpackCreateCommand;
@@ -1,12 +1,10 @@
1
1
  import yargsParser from 'yargs-parser';
2
2
  import { commands } from '../lang/en.js';
3
- import { trackCommandUsage } from '../lib/usageTracking.js';
4
3
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
4
+ import { makeYargsHandlerWithUsageTracking } from '../lib/yargs/makeYargsHandlerWithUsageTracking.js';
5
5
  const command = 'completion';
6
6
  const describe = commands.completion.describe;
7
- async function handler() {
8
- await trackCommandUsage('completion');
9
- }
7
+ async function handler() { }
10
8
  function completionBuilder(yargs) {
11
9
  const { help } = yargsParser(process.argv.slice(2));
12
10
  if (!help) {
@@ -21,7 +19,7 @@ const builder = makeYargsBuilder(completionBuilder, command, describe);
21
19
  const completionCommand = {
22
20
  command,
23
21
  describe,
24
- handler,
22
+ handler: makeYargsHandlerWithUsageTracking('completion', handler),
25
23
  builder,
26
24
  };
27
25
  export default completionCommand;
@@ -1,26 +1,25 @@
1
1
  import fs from 'fs';
2
2
  import { localConfigFileExists, globalConfigFileExists, } from '@hubspot/local-dev-lib/config';
3
3
  import { handleMigration, handleMerge } from '../../lib/configMigrate.js';
4
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
4
5
  import { logError } from '../../lib/errorHandlers/index.js';
5
6
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
6
7
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
7
- import { trackCommandUsage } from '../../lib/usageTracking.js';
8
8
  import { uiLogger } from '../../lib/ui/logger.js';
9
9
  import { commands } from '../../lang/en.js';
10
10
  const describe = commands.config.subcommands.migrate.describe;
11
11
  const command = 'migrate';
12
12
  async function handler(args) {
13
- const { derivedAccountId, config: configPath, force } = args;
14
- trackCommandUsage('config-migrate', {}, derivedAccountId);
13
+ const { config: configPath, force, exit } = args;
15
14
  if (configPath && !fs.existsSync(configPath)) {
16
15
  uiLogger.error(commands.config.subcommands.migrate.errors.configNotFound(configPath));
17
- process.exit(EXIT_CODES.ERROR);
16
+ return exit(EXIT_CODES.ERROR);
18
17
  }
19
18
  const deprecatedConfigExists = localConfigFileExists();
20
19
  const globalConfigExists = globalConfigFileExists();
21
20
  if (!deprecatedConfigExists) {
22
21
  uiLogger.error(commands.config.subcommands.migrate.errors.noConfigToMigrate);
23
- process.exit(EXIT_CODES.ERROR);
22
+ return exit(EXIT_CODES.ERROR);
24
23
  }
25
24
  let success = false;
26
25
  try {
@@ -34,7 +33,7 @@ async function handler(args) {
34
33
  catch (error) {
35
34
  logError(error);
36
35
  }
37
- process.exit(success ? EXIT_CODES.SUCCESS : EXIT_CODES.ERROR);
36
+ return exit(success ? EXIT_CODES.SUCCESS : EXIT_CODES.ERROR);
38
37
  }
39
38
  function configMigrateBuilder(yargs) {
40
39
  return yargs
@@ -64,7 +63,7 @@ const builder = makeYargsBuilder(configMigrateBuilder, command, commands.config.
64
63
  const configMigrateCommand = {
65
64
  command,
66
65
  describe,
67
- handler,
66
+ handler: makeYargsHandlerWithUsageTracking('config-migrate', handler),
68
67
  builder,
69
68
  };
70
69
  export default configMigrateCommand;
@@ -1,7 +1,7 @@
1
- import { trackCommandUsage } from '../../lib/usageTracking.js';
2
1
  import { promptUser } from '../../lib/prompts/promptUtils.js';
3
2
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
4
3
  import { setDefaultCmsPublishMode, setHttpTimeout, setAllowUsageTracking, setAllowAutoUpdates, setAutoOpenBrowser, } from '../../lib/configOptions.js';
4
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
5
5
  import { commands } from '../../lang/en.js';
6
6
  import { makeYargsBuilder, strictEnforceBoolean, } from '../../lib/yargsUtils.js';
7
7
  import { logError } from '../../lib/errorHandlers/index.js';
@@ -47,8 +47,7 @@ async function handleConfigUpdate(accountId, args) {
47
47
  }
48
48
  }
49
49
  async function handler(args) {
50
- const { derivedAccountId, allowAutoUpdates, allowUsageTracking, defaultCmsPublishMode, httpTimeout, autoOpenBrowser, } = args;
51
- trackCommandUsage('config-set', {}, derivedAccountId);
50
+ const { derivedAccountId, allowAutoUpdates, allowUsageTracking, defaultCmsPublishMode, httpTimeout, autoOpenBrowser, exit, } = args;
52
51
  try {
53
52
  if (allowAutoUpdates !== undefined ||
54
53
  allowUsageTracking !== undefined ||
@@ -64,9 +63,9 @@ async function handler(args) {
64
63
  }
65
64
  catch (err) {
66
65
  logError(err);
67
- process.exit(EXIT_CODES.ERROR);
66
+ return exit(EXIT_CODES.ERROR);
68
67
  }
69
- process.exit(EXIT_CODES.SUCCESS);
68
+ return exit(EXIT_CODES.SUCCESS);
70
69
  }
71
70
  function configSetBuilder(yargs) {
72
71
  yargs
@@ -135,7 +134,7 @@ const builder = makeYargsBuilder(configSetBuilder, command, describe, {
135
134
  const configSetCommand = {
136
135
  command,
137
136
  describe,
138
- handler,
137
+ handler: makeYargsHandlerWithUsageTracking('config-set', handler),
139
138
  builder,
140
139
  };
141
140
  export default configSetCommand;
@@ -4,18 +4,17 @@ import { inputPrompt } from '../../lib/prompts/promptUtils.js';
4
4
  import { logError } from '../../lib/errorHandlers/index.js';
5
5
  import { getAbsoluteFilePath } from '@hubspot/local-dev-lib/path';
6
6
  import { checkAndConvertToJson } from '../../lib/validation.js';
7
- import { trackCommandUsage } from '../../lib/usageTracking.js';
8
7
  import { commands } from '../../lang/en.js';
9
8
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
10
9
  import { isObjectDefinition } from '../../lib/customObject.js';
10
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
11
11
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
12
12
  const command = 'create [name]';
13
13
  const describe = commands.customObject.subcommands.create.describe;
14
14
  async function handler(args) {
15
- const { path, name: providedName, derivedAccountId } = args;
15
+ const { path, name: providedName, derivedAccountId, exit } = args;
16
16
  let definitionPath = path;
17
17
  let name = providedName;
18
- trackCommandUsage('custom-object-batch-create', {}, derivedAccountId);
19
18
  if (!name) {
20
19
  name = await inputPrompt(commands.customObject.subcommands.create.inputName);
21
20
  }
@@ -26,7 +25,7 @@ async function handler(args) {
26
25
  const objectJson = checkAndConvertToJson(filePath);
27
26
  if (!isObjectDefinition(objectJson)) {
28
27
  uiLogger.error(commands.customObject.subcommands.create.errors.invalidObjectDefinition);
29
- process.exit(EXIT_CODES.ERROR);
28
+ return exit(EXIT_CODES.ERROR);
30
29
  }
31
30
  try {
32
31
  await batchCreateObjects(derivedAccountId, name, objectJson);
@@ -58,7 +57,7 @@ const builder = makeYargsBuilder(customObjectCreateBuilder, command, describe, {
58
57
  const customObjectCreateCommand = {
59
58
  command,
60
59
  describe,
61
- handler,
60
+ handler: makeYargsHandlerWithUsageTracking('custom-object-batch-create', handler),
62
61
  builder,
63
62
  };
64
63
  export default customObjectCreateCommand;
@@ -5,21 +5,20 @@ import { createObjectSchema } from '@hubspot/local-dev-lib/api/customObjects';
5
5
  import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
6
6
  import { logError } from '../../lib/errorHandlers/index.js';
7
7
  import { checkAndConvertToJson } from '../../lib/validation.js';
8
- import { trackCommandUsage } from '../../lib/usageTracking.js';
9
8
  import { commands } from '../../lang/en.js';
10
9
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
11
10
  import { isSchemaDefinition } from '../../lib/customObject.js';
11
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
12
12
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
13
13
  const command = 'create-schema';
14
14
  const describe = commands.customObject.subcommands.createSchema.describe;
15
15
  async function handler(args) {
16
- const { path, derivedAccountId } = args;
17
- trackCommandUsage('custom-object-schema-create', {}, derivedAccountId);
16
+ const { path, derivedAccountId, exit } = args;
18
17
  const filePath = getAbsoluteFilePath(path);
19
18
  const schemaJson = checkAndConvertToJson(filePath);
20
19
  if (!isSchemaDefinition(schemaJson)) {
21
20
  uiLogger.error(commands.customObject.subcommands.createSchema.errors.invalidSchema);
22
- process.exit(EXIT_CODES.ERROR);
21
+ return exit(EXIT_CODES.ERROR);
23
22
  }
24
23
  try {
25
24
  const { data } = await createObjectSchema(derivedAccountId, schemaJson);
@@ -49,7 +48,7 @@ const builder = makeYargsBuilder(schemaCreateBuilder, command, describe, {
49
48
  const createSchemaCommand = {
50
49
  command,
51
50
  describe,
52
- handler,
51
+ handler: makeYargsHandlerWithUsageTracking('custom-object-schema-create', handler),
53
52
  builder,
54
53
  };
55
54
  export default createSchemaCommand;
@@ -2,15 +2,14 @@ import { fetchObjectSchemas, deleteObjectSchema, } from '@hubspot/local-dev-lib/
2
2
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
3
3
  import { confirmPrompt, listPrompt } from '../../lib/prompts/promptUtils.js';
4
4
  import { uiLogger } from '../../lib/ui/logger.js';
5
- import { trackCommandUsage } from '../../lib/usageTracking.js';
6
5
  import { commands } from '../../lang/en.js';
7
6
  import { logError } from '../../lib/errorHandlers/index.js';
7
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
8
8
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
9
9
  const command = 'delete-schema [name]';
10
10
  const describe = commands.customObject.subcommands.deleteSchema.describe;
11
11
  async function handler(args) {
12
- const { name: providedName, force, derivedAccountId } = args;
13
- trackCommandUsage('custom-object-schema-delete', {}, derivedAccountId);
12
+ const { name: providedName, force, derivedAccountId, exit } = args;
14
13
  let name;
15
14
  try {
16
15
  const { data: { results }, } = await fetchObjectSchemas(derivedAccountId);
@@ -25,7 +24,7 @@ async function handler(args) {
25
24
  (await confirmPrompt(commands.customObject.subcommands.deleteSchema.confirmDelete(name)));
26
25
  if (!shouldDelete) {
27
26
  uiLogger.info(commands.customObject.subcommands.deleteSchema.deleteCancelled(name));
28
- return process.exit(EXIT_CODES.SUCCESS);
27
+ return exit(EXIT_CODES.SUCCESS);
29
28
  }
30
29
  await deleteObjectSchema(derivedAccountId, name);
31
30
  uiLogger.success(commands.customObject.subcommands.deleteSchema.success.delete(name));
@@ -63,7 +62,7 @@ const builder = makeYargsBuilder(schemaDeleteBuilder, command, describe, {
63
62
  const deleteSchemaCommand = {
64
63
  command,
65
64
  describe,
66
- handler,
65
+ handler: makeYargsHandlerWithUsageTracking('custom-object-schema-delete', handler),
67
66
  builder,
68
67
  };
69
68
  export default deleteSchemaCommand;
@@ -1,16 +1,15 @@
1
1
  import { uiLogger } from '../../lib/ui/logger.js';
2
2
  import { downloadSchemas, getResolvedPath, } from '@hubspot/local-dev-lib/customObjects';
3
3
  import { inputPrompt } from '../../lib/prompts/promptUtils.js';
4
- import { trackCommandUsage } from '../../lib/usageTracking.js';
5
4
  import { commands } from '../../lang/en.js';
6
5
  import { logSchemas } from '../../lib/schema.js';
7
6
  import { logError } from '../../lib/errorHandlers/index.js';
7
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
8
8
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
9
9
  const command = 'fetch-all-schemas [dest]';
10
10
  const describe = commands.customObject.subcommands.fetchAllSchemas.describe;
11
11
  async function handler(args) {
12
12
  const { derivedAccountId, dest: providedDest } = args;
13
- trackCommandUsage('custom-object-schema-fetch-all', {}, derivedAccountId);
14
13
  try {
15
14
  const dest = providedDest ||
16
15
  (await inputPrompt(commands.customObject.subcommands.fetchAllSchemas.inputDest));
@@ -51,7 +50,7 @@ const builder = makeYargsBuilder(schemaFetchAllBuilder, command, describe, {
51
50
  const fetchAllSchemasCommand = {
52
51
  command,
53
52
  describe,
54
- handler,
53
+ handler: makeYargsHandlerWithUsageTracking('custom-object-schema-fetch-all', handler),
55
54
  builder,
56
55
  };
57
56
  export default fetchAllSchemasCommand;
@@ -2,15 +2,14 @@ import { fetchObjectSchemas } from '@hubspot/local-dev-lib/api/customObjects';
2
2
  import { uiLogger } from '../../lib/ui/logger.js';
3
3
  import { downloadSchema, getResolvedPath, } from '@hubspot/local-dev-lib/customObjects';
4
4
  import { inputPrompt, listPrompt } from '../../lib/prompts/promptUtils.js';
5
- import { trackCommandUsage } from '../../lib/usageTracking.js';
6
5
  import { commands } from '../../lang/en.js';
7
6
  import { logError } from '../../lib/errorHandlers/index.js';
7
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
8
8
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
9
9
  const command = 'fetch-schema [name] [dest]';
10
10
  const describe = commands.customObject.subcommands.fetchSchema.describe;
11
11
  async function handler(args) {
12
12
  const { name: providedName, dest: providedDest, derivedAccountId } = args;
13
- trackCommandUsage('custom-object-schema-fetch', {}, derivedAccountId);
14
13
  let name;
15
14
  try {
16
15
  const { data: { results }, } = await fetchObjectSchemas(derivedAccountId);
@@ -61,7 +60,7 @@ const builder = makeYargsBuilder(schemaFetchBuilder, command, describe, {
61
60
  const fetchSchemaCommand = {
62
61
  command,
63
62
  describe,
64
- handler,
63
+ handler: makeYargsHandlerWithUsageTracking('custom-object-schema-fetch', handler),
65
64
  builder,
66
65
  };
67
66
  export default fetchSchemaCommand;
@@ -1,14 +1,13 @@
1
1
  import { uiLogger } from '../../lib/ui/logger.js';
2
2
  import { logError } from '../../lib/errorHandlers/index.js';
3
- import { trackCommandUsage } from '../../lib/usageTracking.js';
4
3
  import { listSchemas } from '../../lib/schema.js';
5
4
  import { commands } from '../../lang/en.js';
5
+ import { makeYargsHandlerWithUsageTracking } from '../../lib/yargs/makeYargsHandlerWithUsageTracking.js';
6
6
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
7
7
  const command = 'list-schemas';
8
8
  const describe = commands.customObject.subcommands.listSchemas.describe;
9
9
  async function handler(args) {
10
10
  const { derivedAccountId } = args;
11
- trackCommandUsage('custom-object-schema-list', {}, derivedAccountId);
12
11
  try {
13
12
  await listSchemas(derivedAccountId);
14
13
  }
@@ -29,7 +28,7 @@ const builder = makeYargsBuilder(schemaListBuilder, command, describe, {
29
28
  const listSchemasCommand = {
30
29
  command,
31
30
  describe,
32
- handler,
31
+ handler: makeYargsHandlerWithUsageTracking('custom-object-schema-list', handler),
33
32
  builder,
34
33
  };
35
34
  export default listSchemasCommand;