@hubspot/cli 6.4.0 → 7.0.0-beta.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 (205) hide show
  1. package/bin/cli.js +110 -16
  2. package/bin/hs +2 -0
  3. package/bin/hscms +2 -0
  4. package/bin/silenceErrors.d.ts +2 -0
  5. package/bin/silenceErrors.js +12 -0
  6. package/commands/{accounts → account}/clean.js +10 -11
  7. package/commands/{accounts → account}/info.js +10 -16
  8. package/commands/{accounts → account}/list.js +16 -16
  9. package/commands/{accounts → account}/remove.js +12 -15
  10. package/commands/{accounts → account}/rename.js +4 -7
  11. package/commands/{accounts → account}/use.js +8 -14
  12. package/commands/account.js +26 -0
  13. package/commands/auth.js +30 -24
  14. package/commands/cms/getReactModule.js +70 -0
  15. package/commands/cms/lighthouseScore.js +19 -21
  16. package/commands/cms.js +4 -3
  17. package/commands/completion.js +22 -0
  18. package/commands/config/set.js +22 -24
  19. package/commands/config.js +2 -2
  20. package/commands/create.js +6 -3
  21. package/commands/customObject/create.js +19 -15
  22. package/commands/customObject/schema/create.js +15 -16
  23. package/commands/customObject/schema/delete.js +29 -11
  24. package/commands/customObject/schema/fetch-all.js +14 -11
  25. package/commands/customObject/schema/fetch.js +22 -14
  26. package/commands/customObject/schema/list.js +3 -6
  27. package/commands/customObject/schema/update.js +28 -18
  28. package/commands/customObject/schema.js +1 -1
  29. package/commands/customObject.js +3 -4
  30. package/commands/doctor.js +4 -2
  31. package/commands/feedback.js +2 -0
  32. package/commands/fetch.js +13 -13
  33. package/commands/filemanager/fetch.js +6 -7
  34. package/commands/filemanager/upload.js +10 -12
  35. package/commands/filemanager.js +1 -8
  36. package/commands/{functions → function}/deploy.js +13 -13
  37. package/commands/{functions → function}/list.js +7 -9
  38. package/commands/{functions → function}/server.js +5 -8
  39. package/commands/function.js +16 -0
  40. package/commands/hubdb/clear.js +14 -10
  41. package/commands/hubdb/create.js +37 -13
  42. package/commands/hubdb/delete.js +31 -10
  43. package/commands/hubdb/fetch.js +14 -9
  44. package/commands/hubdb.js +2 -3
  45. package/commands/init.js +37 -14
  46. package/commands/lint.js +6 -7
  47. package/commands/list.js +5 -7
  48. package/commands/logs.js +24 -15
  49. package/commands/module/marketplace-validate.js +6 -9
  50. package/commands/module.js +2 -1
  51. package/commands/mv.js +11 -13
  52. package/commands/open.js +11 -10
  53. package/commands/project/add.js +2 -5
  54. package/commands/project/cloneApp.js +28 -32
  55. package/commands/project/create.js +8 -10
  56. package/commands/project/deploy.js +19 -16
  57. package/commands/project/dev.js +17 -18
  58. package/commands/project/download.js +18 -15
  59. package/commands/project/listBuilds.js +36 -32
  60. package/commands/project/logs.js +6 -8
  61. package/commands/project/migrateApp.js +27 -27
  62. package/commands/project/open.js +9 -11
  63. package/commands/project/upload.js +30 -32
  64. package/commands/project/watch.js +17 -24
  65. package/commands/project.js +3 -4
  66. package/commands/remove.js +14 -13
  67. package/commands/sandbox/create.js +12 -15
  68. package/commands/sandbox/delete.js +19 -20
  69. package/commands/sandbox.js +4 -8
  70. package/commands/{secrets → secret}/addSecret.js +25 -12
  71. package/commands/secret/deleteSecret.js +71 -0
  72. package/commands/{secrets → secret}/listSecrets.js +7 -9
  73. package/commands/{secrets → secret}/updateSecret.js +21 -13
  74. package/commands/secret.js +22 -0
  75. package/commands/theme/generate-selectors.js +8 -8
  76. package/commands/theme/marketplace-validate.js +10 -13
  77. package/commands/theme/preview.js +7 -10
  78. package/commands/theme.js +3 -1
  79. package/commands/upload.js +32 -26
  80. package/commands/watch.js +19 -20
  81. package/lang/en.lyaml +200 -126
  82. package/lib/DevServerManager.js +1 -1
  83. package/lib/LocalDevManager.js +4 -4
  84. package/lib/buildAccount.js +5 -11
  85. package/lib/commonOpts.d.ts +15 -6
  86. package/lib/commonOpts.js +53 -39
  87. package/lib/configOptions.d.ts +13 -1
  88. package/lib/configOptions.js +54 -57
  89. package/lib/constants.d.ts +1 -4
  90. package/lib/dependencyManagement.d.ts +4 -1
  91. package/lib/dependencyManagement.js +2 -2
  92. package/lib/developerTestAccounts.d.ts +5 -1
  93. package/lib/developerTestAccounts.js +45 -39
  94. package/lib/doctor/DiagnosticInfoBuilder.js +8 -4
  95. package/lib/doctor/Doctor.js +11 -6
  96. package/lib/generateSelectors.d.ts +19 -0
  97. package/lib/generateSelectors.js +23 -23
  98. package/lib/localDev.js +3 -2
  99. package/lib/marketplaceValidate.d.ts +6 -1
  100. package/lib/marketplaceValidate.js +76 -77
  101. package/lib/oauth.d.ts +2 -1
  102. package/lib/oauth.js +49 -37
  103. package/lib/polling.d.ts +8 -0
  104. package/lib/polling.js +9 -12
  105. package/lib/projects/ProjectLogsManager.d.ts +20 -0
  106. package/lib/projects/ProjectLogsManager.js +105 -0
  107. package/lib/projects/buildAndDeploy.d.ts +16 -0
  108. package/lib/projects/buildAndDeploy.js +342 -0
  109. package/lib/projects/index.d.ts +24 -0
  110. package/lib/projects/index.js +256 -0
  111. package/lib/projects/structure.d.ts +78 -0
  112. package/lib/projects/structure.js +151 -0
  113. package/lib/projects/upload.d.ts +8 -0
  114. package/lib/projects/upload.js +107 -0
  115. package/lib/projects/urls.d.ts +4 -0
  116. package/lib/projects/urls.js +27 -0
  117. package/lib/{projectsWatch.js → projects/watch.js} +3 -3
  118. package/lib/prompts/accountNamePrompt.d.ts +11 -0
  119. package/lib/prompts/accountNamePrompt.js +45 -46
  120. package/lib/prompts/accountsPrompt.d.ts +1 -1
  121. package/lib/prompts/accountsPrompt.js +21 -19
  122. package/lib/prompts/cmsFieldPrompt.d.ts +1 -1
  123. package/lib/prompts/cmsFieldPrompt.js +23 -24
  124. package/lib/prompts/createApiSamplePrompt.d.ts +17 -0
  125. package/lib/prompts/createApiSamplePrompt.js +47 -44
  126. package/lib/prompts/createFunctionPrompt.d.ts +7 -0
  127. package/lib/prompts/createFunctionPrompt.js +17 -20
  128. package/lib/prompts/createModulePrompt.d.ts +8 -0
  129. package/lib/prompts/createModulePrompt.js +29 -17
  130. package/lib/prompts/createProjectPrompt.d.ts +13 -0
  131. package/lib/prompts/createProjectPrompt.js +48 -49
  132. package/lib/prompts/createTemplatePrompt.d.ts +8 -0
  133. package/lib/prompts/createTemplatePrompt.js +15 -17
  134. package/lib/prompts/downloadProjectPrompt.d.ts +8 -0
  135. package/lib/prompts/downloadProjectPrompt.js +25 -23
  136. package/lib/prompts/installPublicAppPrompt.d.ts +1 -1
  137. package/lib/prompts/installPublicAppPrompt.js +21 -19
  138. package/lib/prompts/personalAccessKeyPrompt.d.ts +28 -0
  139. package/lib/prompts/personalAccessKeyPrompt.js +46 -52
  140. package/lib/prompts/previewPrompt.d.ts +14 -0
  141. package/lib/prompts/previewPrompt.js +24 -24
  142. package/lib/prompts/projectAddPrompt.d.ts +9 -0
  143. package/lib/prompts/projectAddPrompt.js +11 -14
  144. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
  145. package/lib/prompts/projectDevTargetAccountPrompt.js +87 -69
  146. package/lib/prompts/projectsLogsPrompt.d.ts +11 -0
  147. package/lib/prompts/projectsLogsPrompt.js +8 -11
  148. package/lib/prompts/promptUtils.d.ts +7 -6
  149. package/lib/prompts/promptUtils.js +21 -8
  150. package/lib/prompts/sandboxesPrompt.d.ts +8 -0
  151. package/lib/prompts/sandboxesPrompt.js +43 -45
  152. package/lib/prompts/secretPrompt.d.ts +12 -0
  153. package/lib/prompts/secretPrompt.js +32 -19
  154. package/lib/prompts/selectHubDBTablePrompt.d.ts +12 -0
  155. package/lib/prompts/selectHubDBTablePrompt.js +69 -0
  156. package/lib/prompts/selectPublicAppPrompt.d.ts +8 -0
  157. package/lib/prompts/selectPublicAppPrompt.js +28 -27
  158. package/lib/prompts/setAsDefaultAccountPrompt.d.ts +1 -1
  159. package/lib/prompts/setAsDefaultAccountPrompt.js +12 -14
  160. package/lib/prompts/uploadPrompt.d.ts +8 -0
  161. package/lib/prompts/uploadPrompt.js +18 -18
  162. package/lib/sandboxSync.js +5 -2
  163. package/lib/sandboxes.js +12 -7
  164. package/lib/ui/index.d.ts +1 -1
  165. package/lib/ui/index.js +1 -1
  166. package/lib/usageTracking.d.ts +21 -2
  167. package/lib/usageTracking.js +53 -81
  168. package/lib/validation.d.ts +11 -1
  169. package/lib/validation.js +98 -91
  170. package/package.json +12 -6
  171. package/types/Projects.d.ts +43 -0
  172. package/types/Projects.js +2 -0
  173. package/types/Prompts.d.ts +25 -0
  174. package/types/Prompts.js +2 -0
  175. package/commands/accounts.js +0 -30
  176. package/commands/cms/reactModules.js +0 -60
  177. package/commands/functions.js +0 -24
  178. package/commands/secrets/deleteSecret.js +0 -46
  179. package/commands/secrets.js +0 -23
  180. package/lib/ProjectLogsManager.js +0 -91
  181. package/lib/projectStructure.js +0 -116
  182. package/lib/projects.d.ts +0 -4
  183. package/lib/projects.js +0 -681
  184. package/lib/projectsWatch.d.ts +0 -1
  185. package/lib/prompts/cleanUploadPrompt.d.ts +0 -1
  186. package/lib/prompts/cleanUploadPrompt.js +0 -20
  187. /package/commands/{accounts → account}/clean.d.ts +0 -0
  188. /package/commands/{accounts → account}/info.d.ts +0 -0
  189. /package/commands/{accounts → account}/list.d.ts +0 -0
  190. /package/commands/{accounts → account}/remove.d.ts +0 -0
  191. /package/commands/{accounts → account}/rename.d.ts +0 -0
  192. /package/commands/{accounts → account}/use.d.ts +0 -0
  193. /package/commands/{accounts.d.ts → account.d.ts} +0 -0
  194. /package/commands/cms/{reactModules.d.ts → getReactModule.d.ts} +0 -0
  195. /package/commands/{functions.d.ts → completion.d.ts} +0 -0
  196. /package/commands/{functions/list.d.ts → function/deploy.d.ts} +0 -0
  197. /package/commands/{functions/server.d.ts → function/list.d.ts} +0 -0
  198. /package/commands/{secrets.d.ts → function/server.d.ts} +0 -0
  199. /package/commands/{functions/deploy.d.ts → function.d.ts} +0 -0
  200. /package/commands/{secrets/deleteSecret.d.ts → secret/addSecret.d.ts} +0 -0
  201. /package/commands/{secrets/listSecrets.d.ts → secret/deleteSecret.d.ts} +0 -0
  202. /package/commands/{secrets/updateSecret.d.ts → secret/listSecrets.d.ts} +0 -0
  203. /package/{lib/ProjectLogsManager.d.ts → commands/secret/updateSecret.d.ts} +0 -0
  204. /package/commands/{secrets/addSecret.d.ts → secret.d.ts} +0 -0
  205. /package/lib/{projectStructure.d.ts → projects/watch.d.ts} +0 -0
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
4
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
5
5
  const chalk = require('chalk');
6
6
  const { logger } = require('@hubspot/local-dev-lib/logger');
7
7
  const { uiBetaTag, uiCommandReference } = require('../../lib/ui');
8
8
  const { trackCommandUsage } = require('../../lib/usageTracking');
9
- const { loadAndValidateOptions } = require('../../lib/validation');
10
- const { ensureProjectExists, getProjectConfig, handleProjectUpload, logFeedbackMessage, validateProjectConfig, pollProjectBuildAndDeploy, displayWarnLogs, } = require('../../lib/projects');
9
+ const { ensureProjectExists, getProjectConfig, logFeedbackMessage, validateProjectConfig, } = require('../../lib/projects');
10
+ const { handleProjectUpload } = require('../../lib/projects/upload');
11
+ const { displayWarnLogs, pollProjectBuildAndDeploy, } = require('../../lib/projects/buildAndDeploy');
11
12
  const { i18n } = require('../../lib/lang');
12
13
  const { getAccountConfig } = require('@hubspot/local-dev-lib/config');
13
14
  const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
@@ -15,23 +16,21 @@ const { PROJECT_ERROR_TYPES } = require('../../lib/constants');
15
16
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
16
17
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
17
18
  const i18nKey = 'commands.project.subcommands.upload';
18
- exports.command = 'upload [path] [--forceCreate] [--message]';
19
+ exports.command = 'upload';
19
20
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
20
21
  exports.handler = async (options) => {
21
- await loadAndValidateOptions(options);
22
- const { forceCreate, path: projectPath, message } = options;
23
- const accountId = getAccountId(options);
24
- const accountConfig = getAccountConfig(accountId);
22
+ const { forceCreate, message, derivedAccountId } = options;
23
+ const accountConfig = getAccountConfig(derivedAccountId);
25
24
  const accountType = accountConfig && accountConfig.accountType;
26
- trackCommandUsage('project-upload', { type: accountType }, accountId);
27
- const { projectConfig, projectDir } = await getProjectConfig(projectPath);
25
+ trackCommandUsage('project-upload', { type: accountType }, derivedAccountId);
26
+ const { projectConfig, projectDir } = await getProjectConfig();
28
27
  validateProjectConfig(projectConfig, projectDir);
29
- await ensureProjectExists(accountId, projectConfig.name, {
28
+ await ensureProjectExists(derivedAccountId, projectConfig.name, {
30
29
  forceCreate,
31
30
  uploadCommand: true,
32
31
  });
33
32
  try {
34
- const result = await handleProjectUpload(accountId, projectConfig, projectDir, pollProjectBuildAndDeploy, message);
33
+ const result = await handleProjectUpload(derivedAccountId, projectConfig, projectDir, pollProjectBuildAndDeploy, message);
35
34
  if (result.uploadError) {
36
35
  if (isSpecifiedError(result.uploadError, {
37
36
  subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
@@ -42,7 +41,7 @@ exports.handler = async (options) => {
42
41
  }
43
42
  else {
44
43
  logError(result.uploadError, new ApiErrorContext({
45
- accountId,
44
+ accountId: derivedAccountId,
46
45
  request: 'project upload',
47
46
  }));
48
47
  }
@@ -56,34 +55,33 @@ exports.handler = async (options) => {
56
55
  deployCommand: uiCommandReference(`hs project deploy --build=${result.buildId}`),
57
56
  }));
58
57
  logFeedbackMessage(result.buildId);
59
- await displayWarnLogs(accountId, projectConfig.name, result.buildId);
58
+ await displayWarnLogs(derivedAccountId, projectConfig.name, result.buildId);
60
59
  process.exit(EXIT_CODES.SUCCESS);
61
60
  }
62
61
  }
63
62
  catch (e) {
64
- logError(e, new ApiErrorContext({ accountId, request: 'project upload' }));
63
+ logError(e, new ApiErrorContext({
64
+ accountId: derivedAccountId,
65
+ request: 'project upload',
66
+ }));
65
67
  process.exit(EXIT_CODES.ERROR);
66
68
  }
67
69
  };
68
70
  exports.builder = yargs => {
69
- yargs.positional('path', {
70
- describe: i18n(`${i18nKey}.positionals.path.describe`),
71
- type: 'string',
71
+ yargs.options({
72
+ 'force-create': {
73
+ describe: i18n(`${i18nKey}.options.forceCreate.describe`),
74
+ type: 'boolean',
75
+ default: false,
76
+ },
77
+ message: {
78
+ alias: 'm',
79
+ describe: i18n(`${i18nKey}.options.message.describe`),
80
+ type: 'string',
81
+ default: '',
82
+ },
72
83
  });
73
- yargs.option('forceCreate', {
74
- describe: i18n(`${i18nKey}.options.forceCreate.describe`),
75
- type: 'boolean',
76
- default: false,
77
- });
78
- yargs.option('message', {
79
- alias: 'm',
80
- describe: i18n(`${i18nKey}.options.message.describe`),
81
- type: 'string',
82
- default: '',
83
- });
84
- yargs.example([
85
- ['$0 project upload myProjectFolder', i18n(`${i18nKey}.examples.default`)],
86
- ]);
84
+ yargs.example([['$0 project upload', i18n(`${i18nKey}.examples.default`)]]);
87
85
  addConfigOptions(yargs);
88
86
  addAccountOptions(yargs);
89
87
  addUseEnvironmentOptions(yargs);
@@ -2,24 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const { i18n } = require('../../lib/lang');
5
- const { createWatcher } = require('../../lib/projectsWatch');
5
+ const { createWatcher } = require('../../lib/projects/watch');
6
6
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
7
7
  const { logger } = require('@hubspot/local-dev-lib/logger');
8
8
  const { PROJECT_ERROR_TYPES } = require('../../lib/constants');
9
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
9
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
10
10
  const { trackCommandUsage } = require('../../lib/usageTracking');
11
11
  const { uiBetaTag } = require('../../lib/ui');
12
- const { ensureProjectExists, getProjectConfig, handleProjectUpload, pollBuildStatus, pollDeployStatus, validateProjectConfig, logFeedbackMessage, } = require('../../lib/projects');
12
+ const { ensureProjectExists, getProjectConfig, validateProjectConfig, logFeedbackMessage, } = require('../../lib/projects');
13
+ const { handleProjectUpload } = require('../../lib/projects/upload');
14
+ const { pollBuildStatus, pollDeployStatus, } = require('../../lib/projects/buildAndDeploy');
13
15
  const { cancelStagedBuild, fetchProjectBuilds, } = require('@hubspot/local-dev-lib/api/projects');
14
16
  const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
15
- const { loadAndValidateOptions } = require('../../lib/validation');
16
17
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
17
18
  const { handleKeypress, handleExit } = require('../../lib/process');
18
19
  const i18nKey = 'commands.project.subcommands.watch';
19
- exports.command = 'watch [path]';
20
+ exports.command = 'watch';
20
21
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
21
22
  const handleBuildStatus = async (accountId, projectName, buildId) => {
22
- const { isAutoDeployEnabled, deployStatusTaskLocator, } = await pollBuildStatus(accountId, projectName, buildId);
23
+ const { isAutoDeployEnabled, deployStatusTaskLocator } = await pollBuildStatus(accountId, projectName, buildId);
23
24
  if (isAutoDeployEnabled && deployStatusTaskLocator) {
24
25
  await pollDeployStatus(accountId, projectName, deployStatusTaskLocator.id, buildId);
25
26
  }
@@ -57,22 +58,20 @@ const handleUserInput = (accountId, projectName, currentBuildId) => {
57
58
  });
58
59
  };
59
60
  exports.handler = async (options) => {
60
- await loadAndValidateOptions(options);
61
- const { initialUpload, path: projectPath } = options;
62
- const accountId = getAccountId(options);
63
- trackCommandUsage('project-watch', null, accountId);
64
- const { projectConfig, projectDir } = await getProjectConfig(projectPath);
61
+ const { initialUpload, derivedAccountId } = options;
62
+ trackCommandUsage('project-watch', null, derivedAccountId);
63
+ const { projectConfig, projectDir } = await getProjectConfig();
65
64
  validateProjectConfig(projectConfig, projectDir);
66
- await ensureProjectExists(accountId, projectConfig.name);
65
+ await ensureProjectExists(derivedAccountId, projectConfig.name);
67
66
  try {
68
- const { data: { results: builds }, } = await fetchProjectBuilds(accountId, projectConfig.name, options);
67
+ const { data: { results: builds }, } = await fetchProjectBuilds(derivedAccountId, projectConfig.name, options);
69
68
  const hasNoBuilds = !builds || !builds.length;
70
69
  const startWatching = async () => {
71
- await createWatcher(accountId, projectConfig, projectDir, handleBuildStatus, handleUserInput);
70
+ await createWatcher(derivedAccountId, projectConfig, projectDir, handleBuildStatus, handleUserInput);
72
71
  };
73
72
  // Upload all files if no build exists for this project yet
74
73
  if (initialUpload || hasNoBuilds) {
75
- const result = await handleProjectUpload(accountId, projectConfig, projectDir, startWatching);
74
+ const result = await handleProjectUpload(derivedAccountId, projectConfig, projectDir, startWatching);
76
75
  if (result.uploadError) {
77
76
  if (isSpecifiedError(result.uploadError, {
78
77
  subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
@@ -83,7 +82,7 @@ exports.handler = async (options) => {
83
82
  }
84
83
  else {
85
84
  logError(result.uploadError, new ApiErrorContext({
86
- accountId,
85
+ accountId: derivedAccountId,
87
86
  request: 'project upload',
88
87
  }));
89
88
  }
@@ -95,22 +94,16 @@ exports.handler = async (options) => {
95
94
  }
96
95
  }
97
96
  catch (e) {
98
- logError(e, new ApiErrorContext({ accountId }));
97
+ logError(e, new ApiErrorContext({ accountId: derivedAccountId }));
99
98
  }
100
99
  };
101
100
  exports.builder = yargs => {
102
- yargs.positional('path', {
103
- describe: i18n(`${i18nKey}.positionals.path.describe`),
104
- type: 'string',
105
- });
106
101
  yargs.option('initial-upload', {
107
102
  alias: 'i',
108
103
  describe: i18n(`${i18nKey}.options.initialUpload.describe`),
109
104
  type: 'boolean',
110
105
  });
111
- yargs.example([
112
- ['$0 project watch myProjectFolder', i18n(`${i18nKey}.examples.default`)],
113
- ]);
106
+ yargs.example([['$0 project watch', i18n(`${i18nKey}.examples.default`)]]);
114
107
  addConfigOptions(yargs);
115
108
  addAccountOptions(yargs);
116
109
  addUseEnvironmentOptions(yargs);
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addConfigOptions, addAccountOptions } = require('../lib/commonOpts');
4
+ const { addGlobalOptions } = require('../lib/commonOpts');
5
5
  const { i18n } = require('../lib/lang');
6
6
  const { uiBetaTag } = require('../lib/ui');
7
7
  const deploy = require('./project/deploy');
@@ -18,11 +18,10 @@ const migrateApp = require('./project/migrateApp');
18
18
  const cloneApp = require('./project/cloneApp');
19
19
  const installDeps = require('./project/installDeps');
20
20
  const i18nKey = 'commands.project';
21
- exports.command = 'project';
21
+ exports.command = ['project', 'projects'];
22
22
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
23
23
  exports.builder = yargs => {
24
- addConfigOptions(yargs);
25
- addAccountOptions(yargs);
24
+ addGlobalOptions(yargs);
26
25
  yargs
27
26
  .command(create)
28
27
  .command(add)
@@ -4,37 +4,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const { deleteFile } = require('@hubspot/local-dev-lib/api/fileMapper');
5
5
  const { logger } = require('@hubspot/local-dev-lib/logger');
6
6
  const { logError, ApiErrorContext } = require('../lib/errorHandlers/index');
7
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, getAccountId, } = require('../lib/commonOpts');
8
- const { loadAndValidateOptions } = require('../lib/validation');
7
+ const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, addGlobalOptions, } = require('../lib/commonOpts');
9
8
  const { trackCommandUsage } = require('../lib/usageTracking');
10
9
  const { i18n } = require('../lib/lang');
11
10
  const i18nKey = 'commands.remove';
12
11
  exports.command = 'remove <path>';
13
12
  exports.describe = i18n(`${i18nKey}.describe`);
14
13
  exports.handler = async (options) => {
15
- const { path: hsPath } = options;
16
- await loadAndValidateOptions(options);
17
- const accountId = getAccountId(options);
18
- trackCommandUsage('remove', null, accountId);
14
+ const { path: hsPath, derivedAccountId } = options;
15
+ trackCommandUsage('remove', null, derivedAccountId);
19
16
  try {
20
- await deleteFile(accountId, hsPath);
21
- logger.log(i18n(`${i18nKey}.deleted`, { accountId, path: hsPath }));
17
+ await deleteFile(derivedAccountId, hsPath);
18
+ logger.log(i18n(`${i18nKey}.deleted`, { accountId: derivedAccountId, path: hsPath }));
22
19
  }
23
20
  catch (error) {
24
- logger.error(i18n(`${i18nKey}.errors.deleteFailed`, { accountId, path: hsPath }));
21
+ logger.error(i18n(`${i18nKey}.errors.deleteFailed`, {
22
+ accountId: derivedAccountId,
23
+ path: hsPath,
24
+ }));
25
25
  logError(error, new ApiErrorContext({
26
- accountId,
26
+ accountId: derivedAccountId,
27
27
  request: hsPath,
28
28
  }));
29
29
  }
30
30
  };
31
31
  exports.builder = yargs => {
32
- addConfigOptions(yargs);
33
- addAccountOptions(yargs);
34
- addUseEnvironmentOptions(yargs);
35
32
  yargs.positional('path', {
36
33
  describe: i18n(`${i18nKey}.positionals.path.describe`),
37
34
  type: 'string',
38
35
  });
36
+ addConfigOptions(yargs);
37
+ addAccountOptions(yargs);
38
+ addUseEnvironmentOptions(yargs);
39
+ addGlobalOptions(yargs);
39
40
  return yargs;
40
41
  };
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
5
- const { loadAndValidateOptions } = require('../../lib/validation');
4
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
6
5
  const { i18n } = require('../../lib/lang');
7
6
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
8
7
  const { getAccountConfig, getEnv } = require('@hubspot/local-dev-lib/config');
@@ -21,15 +20,13 @@ const { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } = require('@hubsp
21
20
  const { buildNewAccount } = require('../../lib/buildAccount');
22
21
  const { hubspotAccountNamePrompt, } = require('../../lib/prompts/accountNamePrompt');
23
22
  const i18nKey = 'commands.sandbox.subcommands.create';
24
- exports.command = 'create [--name] [--type]';
23
+ exports.command = 'create';
25
24
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
26
25
  exports.handler = async (options) => {
27
- await loadAndValidateOptions(options);
28
- const { name, type, force } = options;
29
- const accountId = getAccountId(options);
30
- const accountConfig = getAccountConfig(accountId);
31
- const env = getValidEnv(getEnv(accountId));
32
- trackCommandUsage('sandbox-create', null, accountId);
26
+ const { name, type, force, derivedAccountId } = options;
27
+ const accountConfig = getAccountConfig(derivedAccountId);
28
+ const env = getValidEnv(getEnv(derivedAccountId));
29
+ trackCommandUsage('sandbox-create', null, derivedAccountId);
33
30
  // Default account is not a production portal
34
31
  if (accountConfig.accountType &&
35
32
  accountConfig.accountType !== HUBSPOT_ACCOUNT_TYPES.STANDARD) {
@@ -60,12 +57,12 @@ exports.handler = async (options) => {
60
57
  catch (err) {
61
58
  if (isMissingScopeError(err)) {
62
59
  logger.error(i18n('lib.sandbox.create.failure.scopes.message', {
63
- accountName: accountConfig.name || accountId,
60
+ accountName: accountConfig.name || derivedAccountId,
64
61
  }));
65
62
  const websiteOrigin = getHubSpotWebsiteOrigin(env);
66
- const url = `${websiteOrigin}/personal-access-key/${accountId}`;
63
+ const url = `${websiteOrigin}/personal-access-key/${derivedAccountId}`;
67
64
  logger.info(i18n('lib.sandbox.create.failure.scopes.instructions', {
68
- accountName: accountConfig.name || accountId,
65
+ accountName: accountConfig.name || derivedAccountId,
69
66
  url,
70
67
  }));
71
68
  }
@@ -144,10 +141,10 @@ exports.handler = async (options) => {
144
141
  }
145
142
  };
146
143
  exports.builder = yargs => {
147
- yargs.option('f', {
144
+ yargs.option('force', {
148
145
  type: 'boolean',
149
- alias: 'force',
150
- describe: i18n(`${i18nKey}.examples.force`),
146
+ alias: 'f',
147
+ describe: i18n(`${i18nKey}.options.force.describe`),
151
148
  });
152
149
  yargs.option('name', {
153
150
  describe: i18n(`${i18nKey}.options.name.describe`),
@@ -4,31 +4,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, getAccountId, addTestingOptions, } = require('../../lib/commonOpts');
5
5
  const { logger } = require('@hubspot/local-dev-lib/logger');
6
6
  const { trackCommandUsage } = require('../../lib/usageTracking');
7
- const { loadAndValidateOptions } = require('../../lib/validation');
8
7
  const { logError, debugError } = require('../../lib/errorHandlers/index');
9
8
  const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
10
9
  const { deleteSandbox } = require('@hubspot/local-dev-lib/api/sandboxHubs');
11
10
  const { i18n } = require('../../lib/lang');
12
11
  const { deleteSandboxPrompt } = require('../../lib/prompts/sandboxesPrompt');
13
- const { getConfig, getEnv, removeSandboxAccountFromConfig, updateDefaultAccount, } = require('@hubspot/local-dev-lib/config');
12
+ const { getEnv, removeSandboxAccountFromConfig, updateDefaultAccount, getConfigDefaultAccount, getConfigAccounts, } = require('@hubspot/local-dev-lib/config');
13
+ const { getAccountIdentifier, } = require('@hubspot/local-dev-lib/config/getAccountIdentifier');
14
14
  const { selectAccountFromConfig } = require('../../lib/prompts/accountsPrompt');
15
15
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
16
16
  const { promptUser } = require('../../lib/prompts/promptUtils');
17
+ const { uiAccountDescription, uiBetaTag } = require('../../lib/ui');
17
18
  const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
18
19
  const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
19
- const { uiAccountDescription, uiBetaTag } = require('../../lib/ui');
20
20
  const i18nKey = 'commands.sandbox.subcommands.delete';
21
- exports.command = 'delete [--account]';
21
+ exports.command = 'delete';
22
22
  exports.describe = exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
23
23
  exports.handler = async (options) => {
24
- await loadAndValidateOptions(options, false);
25
- const { account, force } = options;
26
- const config = getConfig();
24
+ const { providedAccountId, force } = options;
27
25
  trackCommandUsage('sandbox-delete', null);
28
26
  let accountPrompt;
29
- if (!account) {
27
+ if (!providedAccountId) {
30
28
  if (!force) {
31
- accountPrompt = await deleteSandboxPrompt(config);
29
+ accountPrompt = await deleteSandboxPrompt();
32
30
  }
33
31
  else {
34
32
  // Account is required, throw error if force flag is present and no account is specified
@@ -43,18 +41,19 @@ exports.handler = async (options) => {
43
41
  }
44
42
  }
45
43
  const sandboxAccountId = getAccountId({
46
- account: account || accountPrompt.account,
44
+ account: providedAccountId || accountPrompt.account,
47
45
  });
48
- const isDefaultAccount = sandboxAccountId === getAccountId(config.defaultPortal);
46
+ const isDefaultAccount = sandboxAccountId === getAccountId(getConfigDefaultAccount());
49
47
  const baseUrl = getHubSpotWebsiteOrigin(getValidEnv(getEnv(sandboxAccountId)));
50
48
  let parentAccountId;
51
- for (const portal of config.portals) {
52
- if (portal.portalId === sandboxAccountId) {
49
+ const accountsList = getConfigAccounts();
50
+ for (const portal of accountsList) {
51
+ if (getAccountIdentifier(portal) === sandboxAccountId) {
53
52
  if (portal.parentAccountId) {
54
53
  parentAccountId = portal.parentAccountId;
55
54
  }
56
55
  else if (!force) {
57
- const parentAccountPrompt = await deleteSandboxPrompt(config, true);
56
+ const parentAccountPrompt = await deleteSandboxPrompt(true);
58
57
  parentAccountId = getAccountId({
59
58
  account: parentAccountPrompt.account,
60
59
  });
@@ -107,13 +106,13 @@ exports.handler = async (options) => {
107
106
  : `${i18nKey}.success.delete`;
108
107
  logger.log('');
109
108
  logger.success(i18n(deleteKey, {
110
- account: account || accountPrompt.account,
109
+ account: providedAccountId || accountPrompt.account,
111
110
  sandboxHubId: sandboxAccountId,
112
111
  }));
113
112
  logger.log('');
114
113
  const promptDefaultAccount = removeSandboxAccountFromConfig(sandboxAccountId);
115
114
  if (promptDefaultAccount && !force) {
116
- const newDefaultAccount = await selectAccountFromConfig(getConfig());
115
+ const newDefaultAccount = await selectAccountFromConfig();
117
116
  updateDefaultAccount(newDefaultAccount);
118
117
  }
119
118
  else {
@@ -156,7 +155,7 @@ exports.handler = async (options) => {
156
155
  logger.log('');
157
156
  const promptDefaultAccount = removeSandboxAccountFromConfig(sandboxAccountId);
158
157
  if (promptDefaultAccount && !force) {
159
- const newDefaultAccount = await selectAccountFromConfig(getConfig());
158
+ const newDefaultAccount = await selectAccountFromConfig();
160
159
  updateDefaultAccount(newDefaultAccount);
161
160
  }
162
161
  else {
@@ -176,10 +175,10 @@ exports.builder = yargs => {
176
175
  describe: i18n(`${i18nKey}.options.account.describe`),
177
176
  type: 'string',
178
177
  });
179
- yargs.option('f', {
178
+ yargs.option('force', {
180
179
  type: 'boolean',
181
- alias: 'force',
182
- describe: i18n(`${i18nKey}.examples.force`),
180
+ alias: 'f',
181
+ describe: i18n(`${i18nKey}.options.force.describe`),
183
182
  });
184
183
  yargs.example([
185
184
  [
@@ -1,20 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addConfigOptions, addAccountOptions } = require('../lib/commonOpts');
4
+ const { addGlobalOptions } = require('../lib/commonOpts');
5
5
  const { i18n } = require('../lib/lang');
6
6
  const { uiBetaTag } = require('../lib/ui');
7
7
  const create = require('./sandbox/create');
8
8
  const del = require('./sandbox/delete');
9
9
  const i18nKey = 'commands.sandbox';
10
- exports.command = 'sandbox';
10
+ exports.command = ['sandbox', 'sandboxes'];
11
11
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
12
12
  exports.builder = yargs => {
13
- addConfigOptions(yargs);
14
- addAccountOptions(yargs);
15
- yargs
16
- .command(create)
17
- .command(del)
18
- .demandCommand(1, '');
13
+ addGlobalOptions(yargs);
14
+ yargs.command(create).command(del).demandCommand(1, '');
19
15
  return yargs;
20
16
  };
@@ -1,28 +1,41 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
+ const exitCodes_1 = require("../../lib/enums/exitCodes");
5
+ const secrets_1 = require("@hubspot/local-dev-lib/api/secrets");
6
+ const ui_1 = require("../../lib/ui");
4
7
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
8
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
6
9
  const { addSecret } = require('@hubspot/local-dev-lib/api/secrets');
7
- const { loadAndValidateOptions } = require('../../lib/validation');
8
10
  const { trackCommandUsage } = require('../../lib/usageTracking');
9
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, getAccountId, } = require('../../lib/commonOpts');
11
+ const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
10
12
  const { uiAccountDescription } = require('../../lib/ui');
11
- const { secretValuePrompt } = require('../../lib/prompts/secretPrompt');
13
+ const { secretValuePrompt, secretNamePrompt, } = require('../../lib/prompts/secretPrompt');
12
14
  const { i18n } = require('../../lib/lang');
13
- const i18nKey = 'commands.secrets.subcommands.add';
14
- exports.command = 'add <name>';
15
+ const i18nKey = 'commands.secret.subcommands.add';
16
+ exports.command = 'add [name]';
15
17
  exports.describe = i18n(`${i18nKey}.describe`);
16
18
  exports.handler = async (options) => {
17
- const { name: secretName } = options;
18
- await loadAndValidateOptions(options);
19
- const accountId = getAccountId(options);
20
- trackCommandUsage('secrets-add', null, accountId);
19
+ const { name, derivedAccountId } = options;
20
+ let secretName = name;
21
+ trackCommandUsage('secrets-add', null, derivedAccountId);
21
22
  try {
23
+ if (!secretName) {
24
+ const { secretName: name } = await secretNamePrompt();
25
+ secretName = name;
26
+ }
27
+ const { data: { results: secrets }, } = await (0, secrets_1.fetchSecrets)(derivedAccountId);
28
+ if (secrets.includes(secretName)) {
29
+ logger.error(i18n(`${i18nKey}.errors.alreadyExists`, {
30
+ secretName,
31
+ command: (0, ui_1.uiCommandReference)('hs secret update'),
32
+ }));
33
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
34
+ }
22
35
  const { secretValue } = await secretValuePrompt();
23
- await addSecret(accountId, secretName, secretValue);
36
+ await addSecret(derivedAccountId, secretName, secretValue);
24
37
  logger.success(i18n(`${i18nKey}.success.add`, {
25
- accountIdentifier: uiAccountDescription(accountId),
38
+ accountIdentifier: uiAccountDescription(derivedAccountId),
26
39
  secretName,
27
40
  }));
28
41
  }
@@ -32,7 +45,7 @@ exports.handler = async (options) => {
32
45
  }));
33
46
  logError(err, new ApiErrorContext({
34
47
  request: 'add secret',
35
- accountId,
48
+ accountId: derivedAccountId,
36
49
  }));
37
50
  }
38
51
  };
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // @ts-nocheck
4
+ const secretPrompt_1 = require("../../lib/prompts/secretPrompt");
5
+ const promptUtils_1 = require("../../lib/prompts/promptUtils");
6
+ const exitCodes_1 = require("../../lib/enums/exitCodes");
7
+ const { logger } = require('@hubspot/local-dev-lib/logger');
8
+ const { ApiErrorContext, logError } = require('../../lib/errorHandlers/index');
9
+ const { deleteSecret, fetchSecrets, } = require('@hubspot/local-dev-lib/api/secrets');
10
+ const { trackCommandUsage } = require('../../lib/usageTracking');
11
+ const { uiAccountDescription } = require('../../lib/ui');
12
+ const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
13
+ const { i18n } = require('../../lib/lang');
14
+ const i18nKey = 'commands.secret.subcommands.delete';
15
+ exports.command = 'delete [name]';
16
+ exports.describe = i18n(`${i18nKey}.describe`);
17
+ exports.handler = async (options) => {
18
+ const { name, derivedAccountId, force } = options;
19
+ let secretName = name;
20
+ trackCommandUsage('secrets-delete', null, derivedAccountId);
21
+ try {
22
+ const { data: { results: secrets }, } = await fetchSecrets(derivedAccountId);
23
+ if (secretName && !secrets.includes(secretName)) {
24
+ logger.error(i18n(`${i18nKey}.errors.noSecret`, { secretName }));
25
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
26
+ }
27
+ if (!secretName) {
28
+ const { secretToModify } = await (0, secretPrompt_1.secretListPrompt)(secrets, i18n(`${i18nKey}.selectSecret`));
29
+ secretName = secretToModify;
30
+ }
31
+ const confirmDelete = force ||
32
+ (await (0, promptUtils_1.confirmPrompt)(i18n(`${i18nKey}.confirmDelete`, { secretName }), {
33
+ defaultAnswer: false,
34
+ }));
35
+ if (!confirmDelete) {
36
+ logger.success(i18n(`${i18nKey}.deleteCanceled`));
37
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
38
+ }
39
+ await deleteSecret(derivedAccountId, secretName);
40
+ logger.success(i18n(`${i18nKey}.success.delete`, {
41
+ accountIdentifier: uiAccountDescription(derivedAccountId),
42
+ secretName,
43
+ }));
44
+ }
45
+ catch (err) {
46
+ if (secretName) {
47
+ logger.error(i18n(`${i18nKey}.errors.delete`, {
48
+ secretName,
49
+ }));
50
+ }
51
+ logError(err, new ApiErrorContext({
52
+ request: 'delete a secret',
53
+ accountId: derivedAccountId,
54
+ }));
55
+ }
56
+ };
57
+ exports.builder = yargs => {
58
+ addConfigOptions(yargs);
59
+ addAccountOptions(yargs);
60
+ addUseEnvironmentOptions(yargs);
61
+ yargs
62
+ .positional('name', {
63
+ describe: i18n(`${i18nKey}.positionals.name.describe`),
64
+ type: 'string',
65
+ })
66
+ .options('force', {
67
+ describe: 'Force the deletion',
68
+ type: 'boolean',
69
+ });
70
+ return yargs;
71
+ };
@@ -4,22 +4,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
5
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
6
6
  const { fetchSecrets } = require('@hubspot/local-dev-lib/api/secrets');
7
- const { loadAndValidateOptions } = require('../../lib/validation');
8
7
  const { trackCommandUsage } = require('../../lib/usageTracking');
9
8
  const { uiAccountDescription } = require('../../lib/ui');
10
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, getAccountId, } = require('../../lib/commonOpts');
9
+ const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
11
10
  const { i18n } = require('../../lib/lang');
12
- const i18nKey = 'commands.secrets.subcommands.list';
11
+ const i18nKey = 'commands.secret.subcommands.list';
13
12
  exports.command = 'list';
14
13
  exports.describe = i18n(`${i18nKey}.describe`);
15
14
  exports.handler = async (options) => {
16
- await loadAndValidateOptions(options);
17
- const accountId = getAccountId(options);
18
- trackCommandUsage('secrets-list', null, accountId);
15
+ const { derivedAccountId } = options;
16
+ trackCommandUsage('secrets-list', null, derivedAccountId);
19
17
  try {
20
- const { data: { results }, } = await fetchSecrets(accountId);
18
+ const { data: { results }, } = await fetchSecrets(derivedAccountId);
21
19
  const groupLabel = i18n(`${i18nKey}.groupLabel`, {
22
- accountIdentifier: uiAccountDescription(accountId),
20
+ accountIdentifier: uiAccountDescription(derivedAccountId),
23
21
  });
24
22
  logger.group(groupLabel);
25
23
  results.forEach(secret => logger.log(secret));
@@ -29,7 +27,7 @@ exports.handler = async (options) => {
29
27
  logger.error(i18n(`${i18nKey}.errors.list`));
30
28
  logError(err, new ApiErrorContext({
31
29
  request: 'add secret',
32
- accountId,
30
+ accountId: derivedAccountId,
33
31
  }));
34
32
  }
35
33
  };