@hubspot/cli 6.4.0-beta.1 → 7.0.0-experimental.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/bin/cli.js +36 -15
  2. package/commands/{accounts → account}/clean.js +10 -9
  3. package/commands/{accounts → account}/info.js +10 -14
  4. package/commands/{accounts → account}/list.js +16 -13
  5. package/commands/{accounts → account}/remove.js +8 -8
  6. package/commands/{accounts → account}/rename.js +4 -5
  7. package/commands/{accounts → account}/use.js +5 -8
  8. package/commands/account.js +26 -0
  9. package/commands/auth.js +30 -23
  10. package/commands/cms/getReactModule.js +70 -0
  11. package/commands/cms/lighthouseScore.js +19 -19
  12. package/commands/cms.js +4 -3
  13. package/commands/completion.js +22 -0
  14. package/commands/config/set.js +22 -22
  15. package/commands/config.js +2 -2
  16. package/commands/create.js +5 -3
  17. package/commands/customObject/create.js +18 -13
  18. package/commands/customObject/schema/create.js +14 -14
  19. package/commands/customObject/schema/delete.js +29 -9
  20. package/commands/customObject/schema/fetch-all.js +14 -9
  21. package/commands/customObject/schema/fetch.js +22 -12
  22. package/commands/customObject/schema/list.js +3 -4
  23. package/commands/customObject/schema/update.js +27 -16
  24. package/commands/customObject/schema.js +1 -1
  25. package/commands/customObject.js +3 -4
  26. package/commands/doctor.js +2 -0
  27. package/commands/feedback.js +2 -0
  28. package/commands/fetch.js +13 -12
  29. package/commands/filemanager/fetch.js +6 -5
  30. package/commands/filemanager/upload.js +10 -10
  31. package/commands/filemanager.js +0 -4
  32. package/commands/{functions → function}/deploy.js +13 -11
  33. package/commands/{functions → function}/list.js +7 -7
  34. package/commands/{functions → function}/server.js +5 -6
  35. package/commands/function.js +20 -0
  36. package/commands/hubdb/clear.js +14 -8
  37. package/commands/hubdb/create.js +36 -11
  38. package/commands/hubdb/delete.js +31 -8
  39. package/commands/hubdb/fetch.js +14 -7
  40. package/commands/hubdb.js +2 -3
  41. package/commands/init.js +37 -14
  42. package/commands/lint.js +6 -5
  43. package/commands/list.js +5 -5
  44. package/commands/logs.js +24 -13
  45. package/commands/module/marketplace-validate.js +6 -7
  46. package/commands/module.js +2 -1
  47. package/commands/mv.js +11 -11
  48. package/commands/open.js +11 -10
  49. package/commands/project/add.js +2 -3
  50. package/commands/project/cloneApp.js +28 -30
  51. package/commands/project/create.js +8 -8
  52. package/commands/project/deploy.js +16 -13
  53. package/commands/project/dev.js +14 -14
  54. package/commands/project/download.js +18 -13
  55. package/commands/project/listBuilds.js +34 -29
  56. package/commands/project/logs.js +5 -5
  57. package/commands/project/migrateApp.js +27 -25
  58. package/commands/project/open.js +7 -8
  59. package/commands/project/upload.js +27 -29
  60. package/commands/project/watch.js +12 -19
  61. package/commands/project.js +3 -4
  62. package/commands/remove.js +14 -11
  63. package/commands/sandbox/create.js +12 -13
  64. package/commands/sandbox/delete.js +15 -13
  65. package/commands/sandbox.js +3 -4
  66. package/commands/{secrets → secret}/addSecret.js +24 -9
  67. package/commands/secret/deleteSecret.js +71 -0
  68. package/commands/{secrets → secret}/listSecrets.js +6 -6
  69. package/commands/secret/updateSecret.d.ts +1 -0
  70. package/commands/{secrets → secret}/updateSecret.js +20 -10
  71. package/commands/secret.js +22 -0
  72. package/commands/theme/generate-selectors.js +8 -8
  73. package/commands/theme/marketplace-validate.js +10 -11
  74. package/commands/theme/preview.js +6 -7
  75. package/commands/theme.js +3 -1
  76. package/commands/upload.js +28 -24
  77. package/commands/watch.js +19 -19
  78. package/lang/en.lyaml +177 -111
  79. package/lib/buildAccount.js +3 -1
  80. package/lib/commonOpts.d.ts +15 -6
  81. package/lib/commonOpts.js +53 -38
  82. package/lib/configOptions.js +19 -18
  83. package/lib/developerTestAccounts.js +8 -5
  84. package/lib/oauth.js +3 -1
  85. package/lib/projects.js +10 -5
  86. package/lib/prompts/accountsPrompt.js +9 -5
  87. package/lib/prompts/createModulePrompt.js +17 -2
  88. package/lib/prompts/createProjectPrompt.js +5 -5
  89. package/lib/prompts/projectDevTargetAccountPrompt.js +3 -2
  90. package/lib/prompts/promptUtils.d.ts +3 -0
  91. package/lib/prompts/promptUtils.js +14 -2
  92. package/lib/prompts/sandboxesPrompt.js +10 -7
  93. package/lib/prompts/secretPrompt.d.ts +3 -1
  94. package/lib/prompts/secretPrompt.js +32 -19
  95. package/lib/prompts/selectHubDBTablePrompt.d.ts +8 -0
  96. package/lib/prompts/selectHubDBTablePrompt.js +69 -0
  97. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -2
  98. package/lib/sandboxSync.js +5 -2
  99. package/lib/sandboxes.js +12 -7
  100. package/lib/validation.js +14 -13
  101. package/package.json +5 -4
  102. package/commands/accounts.js +0 -30
  103. package/commands/cms/reactModules.js +0 -60
  104. package/commands/functions.js +0 -24
  105. package/commands/secrets/deleteSecret.js +0 -46
  106. package/commands/secrets.js +0 -23
  107. /package/commands/{accounts → account}/clean.d.ts +0 -0
  108. /package/commands/{accounts → account}/info.d.ts +0 -0
  109. /package/commands/{accounts → account}/list.d.ts +0 -0
  110. /package/commands/{accounts → account}/remove.d.ts +0 -0
  111. /package/commands/{accounts → account}/rename.d.ts +0 -0
  112. /package/commands/{accounts → account}/use.d.ts +0 -0
  113. /package/commands/{accounts.d.ts → account.d.ts} +0 -0
  114. /package/commands/cms/{reactModules.d.ts → getReactModule.d.ts} +0 -0
  115. /package/commands/{functions.d.ts → completion.d.ts} +0 -0
  116. /package/commands/{functions/list.d.ts → function/deploy.d.ts} +0 -0
  117. /package/commands/{functions/server.d.ts → function/list.d.ts} +0 -0
  118. /package/commands/{secrets.d.ts → function/server.d.ts} +0 -0
  119. /package/commands/{functions/deploy.d.ts → function.d.ts} +0 -0
  120. /package/commands/{secrets/deleteSecret.d.ts → secret/addSecret.d.ts} +0 -0
  121. /package/commands/{secrets/listSecrets.d.ts → secret/deleteSecret.d.ts} +0 -0
  122. /package/commands/{secrets/updateSecret.d.ts → secret/listSecrets.d.ts} +0 -0
  123. /package/commands/{secrets/addSecret.d.ts → secret.d.ts} +0 -0
package/bin/cli.js CHANGED
@@ -3,10 +3,12 @@
3
3
  const yargs = require('yargs');
4
4
  const updateNotifier = require('update-notifier');
5
5
  const chalk = require('chalk');
6
+ const fs = require('fs');
6
7
  const { logger } = require('@hubspot/local-dev-lib/logger');
7
8
  const { addUserAgentHeader } = require('@hubspot/local-dev-lib/http');
9
+ const { loadConfig, configFileExists, getConfigPath, } = require('@hubspot/local-dev-lib/config');
8
10
  const { logError } = require('../lib/errorHandlers/index');
9
- const { setLogLevel, getCommandName } = require('../lib/commonOpts');
11
+ const { setLogLevel, getCommandName, injectAccountIdMiddleware, } = require('../lib/commonOpts');
10
12
  const { trackHelpUsage, trackConvertFieldsUsage, } = require('../lib/usageTracking');
11
13
  const { getIsInProject } = require('../lib/projects');
12
14
  const pkg = require('../package.json');
@@ -24,9 +26,9 @@ const uploadCommand = require('../commands/upload');
24
26
  const createCommand = require('../commands/create');
25
27
  const fetchCommand = require('../commands/fetch');
26
28
  const filemanagerCommand = require('../commands/filemanager');
27
- const secretsCommand = require('../commands/secrets');
29
+ const secretCommands = require('../commands/secret');
28
30
  const customObjectCommand = require('../commands/customObject');
29
- const functionsCommand = require('../commands/functions');
31
+ const functionCommands = require('../commands/function');
30
32
  const listCommand = require('../commands/list');
31
33
  const openCommand = require('../commands/open');
32
34
  const mvCommand = require('../commands/mv');
@@ -34,11 +36,12 @@ const projectCommands = require('../commands/project');
34
36
  const themeCommand = require('../commands/theme');
35
37
  const moduleCommand = require('../commands/module');
36
38
  const configCommand = require('../commands/config');
37
- const accountsCommand = require('../commands/accounts');
39
+ const accountCommands = require('../commands/account');
38
40
  const sandboxesCommand = require('../commands/sandbox');
39
41
  const cmsCommand = require('../commands/cms');
40
42
  const feedbackCommand = require('../commands/feedback');
41
43
  const doctorCommand = require('../commands/doctor');
44
+ const completionCommand = require('../commands/completion');
42
45
  const notifier = updateNotifier({
43
46
  pkg: { ...pkg, name: '@hubspot/cli' },
44
47
  distTag: 'latest',
@@ -116,17 +119,34 @@ const performChecks = argv => {
116
119
  const setRequestHeaders = () => {
117
120
  addUserAgentHeader('HubSpot CLI', pkg.version);
118
121
  };
122
+ const loadConfigMiddleware = async (options) => {
123
+ if (configFileExists(true)) {
124
+ loadConfig('', options);
125
+ if (options.config) {
126
+ logger.error(i18n(`${i18nKey}.loadConfigMiddleware.configFileExists`, {
127
+ configPath: getConfigPath(),
128
+ }));
129
+ process.exit(EXIT_CODES.ERROR);
130
+ }
131
+ }
132
+ // We need to load the config when options.config exists,
133
+ // so that getAccountIdFromConfig() in injectAccountIdMiddleware reads from the right config
134
+ if (options.config && fs.existsSync(options.config)) {
135
+ const { config: configPath } = options;
136
+ await loadConfig(configPath, options);
137
+ }
138
+ };
119
139
  const argv = yargs
120
140
  .usage('The command line interface to interact with HubSpot.')
121
- .middleware([setLogLevel, setRequestHeaders])
141
+ // loadConfigMiddleware loads the new hidden config for all commands
142
+ .middleware([
143
+ setLogLevel,
144
+ setRequestHeaders,
145
+ loadConfigMiddleware,
146
+ injectAccountIdMiddleware,
147
+ ])
122
148
  .exitProcess(false)
123
149
  .fail(handleFailure)
124
- .option('debug', {
125
- alias: 'd',
126
- default: false,
127
- describe: 'Set log level to debug',
128
- type: 'boolean',
129
- })
130
150
  .option('noHyperlinks', {
131
151
  default: false,
132
152
  describe: 'prevent hyperlinks from displaying in the ui',
@@ -152,9 +172,9 @@ const argv = yargs
152
172
  .command(createCommand)
153
173
  .command(fetchCommand)
154
174
  .command(filemanagerCommand)
155
- .command(secretsCommand)
175
+ .command(secretCommands)
156
176
  .command(customObjectCommand)
157
- .command(functionsCommand)
177
+ .command(functionCommands)
158
178
  .command({
159
179
  ...listCommand,
160
180
  aliases: 'ls',
@@ -165,14 +185,15 @@ const argv = yargs
165
185
  .command(themeCommand)
166
186
  .command(moduleCommand)
167
187
  .command(configCommand)
168
- .command(accountsCommand)
188
+ .command(accountCommands)
169
189
  .command(sandboxesCommand)
170
190
  .command(feedbackCommand)
171
191
  .command(doctorCommand)
192
+ .command(completionCommand)
172
193
  .help()
194
+ .alias('h', 'help')
173
195
  .recommendCommands()
174
196
  .demandCommand(1, '')
175
- .completion()
176
197
  .wrap(getTerminalWidth())
177
198
  .strict().argv;
178
199
  if (argv.help) {
@@ -7,22 +7,23 @@ const { trackCommandUsage } = require('../../lib/usageTracking');
7
7
  const { i18n } = require('../../lib/lang');
8
8
  const { loadAndValidateOptions } = require('../../lib/validation');
9
9
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
10
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
10
+ const { addTestingOptions, addConfigOptions } = require('../../lib/commonOpts');
11
11
  const { promptUser } = require('../../lib/prompts/promptUtils');
12
12
  const { getTableContents } = require('../../lib/ui/table');
13
13
  const SpinniesManager = require('../../lib/ui/SpinniesManager');
14
- const { getConfig, deleteAccount } = require('@hubspot/local-dev-lib/config');
15
14
  const { uiAccountDescription } = require('../../lib/ui');
15
+ const { deleteAccount, getConfigAccounts, } = require('@hubspot/local-dev-lib/config');
16
+ const { getAccountIdentifier, } = require('@hubspot/local-dev-lib/config/getAccountIdentifier');
16
17
  const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
17
- const i18nKey = 'commands.accounts.subcommands.clean';
18
+ const i18nKey = 'commands.account.subcommands.clean';
18
19
  exports.command = 'clean';
19
20
  exports.describe = i18n(`${i18nKey}.describe`);
20
21
  exports.handler = async (options) => {
21
22
  const { qa } = options;
22
23
  await loadAndValidateOptions(options, false);
23
- const config = getConfig();
24
24
  trackCommandUsage('accounts-clean', null);
25
- const filteredTestAccounts = config.portals.filter(p => qa ? p.env === 'qa' : p.env !== 'qa');
25
+ const accountsList = getConfigAccounts();
26
+ const filteredTestAccounts = accountsList.filter(p => qa ? p.env === 'qa' : p.env !== 'qa');
26
27
  if (filteredTestAccounts && filteredTestAccounts.length === 0) {
27
28
  logger.log(i18n(`${i18nKey}.noResults`));
28
29
  process.exit(EXIT_CODES.SUCCESS);
@@ -36,7 +37,7 @@ exports.handler = async (options) => {
36
37
  });
37
38
  for (const account of filteredTestAccounts) {
38
39
  try {
39
- await accessTokenForPersonalAccessKey(account.portalId, true);
40
+ await accessTokenForPersonalAccessKey(getAccountIdentifier(account), true);
40
41
  }
41
42
  catch (error) {
42
43
  if (isSpecifiedError(error, {
@@ -62,7 +63,9 @@ exports.handler = async (options) => {
62
63
  count: accountsToRemove.length,
63
64
  }),
64
65
  });
65
- logger.log(getTableContents(accountsToRemove.map(p => [uiAccountDescription(p.portalId)]), { border: { bodyLeft: ' ' } }));
66
+ logger.log(getTableContents(accountsToRemove.map(p => [
67
+ uiAccountDescription(getAccountIdentifier(p)),
68
+ ]), { border: { bodyLeft: ' ' } }));
66
69
  const { accountsCleanPrompt } = await promptUser([
67
70
  {
68
71
  name: 'accountsCleanPrompt',
@@ -94,8 +97,6 @@ exports.handler = async (options) => {
94
97
  };
95
98
  exports.builder = yargs => {
96
99
  addConfigOptions(yargs);
97
- addAccountOptions(yargs);
98
- addUseEnvironmentOptions(yargs);
99
100
  addTestingOptions(yargs);
100
101
  yargs.example([['$0 accounts clean']]);
101
102
  return yargs;
@@ -4,24 +4,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
5
  const { getAccountConfig } = require('@hubspot/local-dev-lib/config');
6
6
  const { getAccessToken } = require('@hubspot/local-dev-lib/personalAccessKey');
7
- const { getAccountId, addAccountOptions, addConfigOptions, } = require('../../lib/commonOpts');
7
+ const { addConfigOptions } = require('../../lib/commonOpts');
8
8
  const { loadAndValidateOptions } = require('../../lib/validation');
9
9
  const { i18n } = require('../../lib/lang');
10
10
  const { getTableContents } = require('../../lib/ui/table');
11
- const i18nKey = 'commands.accounts.subcommands.info';
11
+ const i18nKey = 'commands.account.subcommands.info';
12
12
  exports.describe = i18n(`${i18nKey}.describe`);
13
- exports.command = 'info [--account]';
13
+ exports.command = 'info [account]';
14
14
  exports.handler = async (options) => {
15
15
  await loadAndValidateOptions(options);
16
- const accountId = getAccountId(options);
17
- const config = getAccountConfig(accountId);
16
+ const { derivedAccountId } = options;
17
+ const config = getAccountConfig(derivedAccountId);
18
18
  // check if the provided account is using a personal access key, if not, show an error
19
- if (config.authType === 'personalaccesskey') {
19
+ if (config && config.authType === 'personalaccesskey') {
20
20
  const { name, personalAccessKey, env } = config;
21
- const response = await getAccessToken(personalAccessKey, env, accountId);
21
+ const response = await getAccessToken(personalAccessKey, env, derivedAccountId);
22
22
  const scopeGroups = response.scopeGroups.map(s => [s]);
23
23
  logger.log(i18n(`${i18nKey}.name`, { name }));
24
- logger.log(i18n(`${i18nKey}.accountId`, { accountId }));
24
+ logger.log(i18n(`${i18nKey}.accountId`, { accountId: derivedAccountId }));
25
25
  logger.log(i18n(`${i18nKey}.scopeGroups`));
26
26
  logger.log(getTableContents(scopeGroups, { border: { bodyLeft: ' ' } }));
27
27
  }
@@ -31,14 +31,10 @@ exports.handler = async (options) => {
31
31
  };
32
32
  exports.builder = yargs => {
33
33
  addConfigOptions(yargs);
34
- addAccountOptions(yargs);
35
34
  yargs.example([
36
35
  ['$0 accounts info', i18n(`${i18nKey}.examples.default`)],
37
- [
38
- '$0 accounts info --account=MyAccount',
39
- i18n(`${i18nKey}.examples.nameBased`),
40
- ],
41
- ['$0 accounts info --account=1234567', i18n(`${i18nKey}.examples.idBased`)],
36
+ ['$0 accounts info MyAccount', i18n(`${i18nKey}.examples.nameBased`)],
37
+ ['$0 accounts info 1234567', i18n(`${i18nKey}.examples.idBased`)],
42
38
  ]);
43
39
  return yargs;
44
40
  };
@@ -2,16 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
- const { getConfig, getConfigPath } = require('@hubspot/local-dev-lib/config');
5
+ const { getConfig, getConfigPath, getConfigDefaultAccount, getConfigAccounts, } = require('@hubspot/local-dev-lib/config');
6
+ const { getAccountIdentifier, } = require('@hubspot/local-dev-lib/config/getAccountIdentifier');
7
+ const { addConfigOptions } = require('../../lib/commonOpts');
6
8
  const { getTableContents, getTableHeader } = require('../../lib/ui/table');
7
- const { addConfigOptions, addAccountOptions, getAccountId, } = require('../../lib/commonOpts');
8
9
  const { trackCommandUsage } = require('../../lib/usageTracking');
9
10
  const { loadAndValidateOptions } = require('../../lib/validation');
10
11
  const { isSandbox, isDeveloperTestAccount } = require('../../lib/accountTypes');
11
12
  const { i18n } = require('../../lib/lang');
12
13
  const { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } = require('@hubspot/local-dev-lib/constants/config');
13
- const i18nKey = 'commands.accounts.subcommands.list';
14
- exports.command = 'list';
14
+ const i18nKey = 'commands.account.subcommands.list';
15
+ exports.command = ['list', 'ls'];
15
16
  exports.describe = i18n(`${i18nKey}.describe`);
16
17
  const sortAndMapPortals = portals => {
17
18
  const mappedPortalData = {};
@@ -21,7 +22,7 @@ const sortAndMapPortals = portals => {
21
22
  (p.accountType === HUBSPOT_ACCOUNT_TYPES.STANDARD ||
22
23
  p.accountType === HUBSPOT_ACCOUNT_TYPES.APP_DEVELOPER))
23
24
  .forEach(portal => {
24
- mappedPortalData[portal.portalId] = [portal];
25
+ mappedPortalData[getAccountIdentifier(portal)] = [portal];
25
26
  });
26
27
  // Non-standard portals (sandbox, developer test account)
27
28
  portals
@@ -34,7 +35,7 @@ const sortAndMapPortals = portals => {
34
35
  ];
35
36
  }
36
37
  else {
37
- mappedPortalData[p.portalId] = [p];
38
+ mappedPortalData[getAccountIdentifier(p)] = [p];
38
39
  }
39
40
  });
40
41
  return mappedPortalData;
@@ -42,7 +43,7 @@ const sortAndMapPortals = portals => {
42
43
  const getPortalData = mappedPortalData => {
43
44
  const portalData = [];
44
45
  Object.entries(mappedPortalData).forEach(([key, set]) => {
45
- const hasParentPortal = set.filter(p => p.portalId === parseInt(key, 10))[0];
46
+ const hasParentPortal = set.filter(p => getAccountIdentifier(p) === parseInt(key, 10))[0];
46
47
  set.forEach(portal => {
47
48
  let name = `${portal.name} [${HUBSPOT_ACCOUNT_TYPE_STRINGS[portal.accountType]}]`;
48
49
  if (isSandbox(portal)) {
@@ -55,18 +56,19 @@ const getPortalData = mappedPortalData => {
55
56
  name = `↳ ${name}`;
56
57
  }
57
58
  }
58
- portalData.push([name, portal.portalId, portal.authType]);
59
+ portalData.push([name, getAccountIdentifier(portal), portal.authType]);
59
60
  });
60
61
  });
61
62
  return portalData;
62
63
  };
63
64
  exports.handler = async (options) => {
64
65
  await loadAndValidateOptions(options, false);
65
- const accountId = getAccountId(options);
66
- trackCommandUsage('accounts-list', null, accountId);
66
+ const { derivedAccountId } = options;
67
+ trackCommandUsage('accounts-list', null, derivedAccountId);
67
68
  const config = getConfig();
68
69
  const configPath = getConfigPath();
69
- const mappedPortalData = sortAndMapPortals(config.portals);
70
+ const accountsList = getConfigAccounts();
71
+ const mappedPortalData = sortAndMapPortals(accountsList);
70
72
  const portalData = getPortalData(mappedPortalData);
71
73
  portalData.unshift(getTableHeader([
72
74
  i18n(`${i18nKey}.labels.name`),
@@ -74,13 +76,14 @@ exports.handler = async (options) => {
74
76
  i18n(`${i18nKey}.labels.authType`),
75
77
  ]));
76
78
  logger.log(i18n(`${i18nKey}.configPath`, { configPath }));
77
- logger.log(i18n(`${i18nKey}.defaultAccount`, { account: config.defaultPortal }));
79
+ logger.log(i18n(`${i18nKey}.defaultAccount`, {
80
+ account: getConfigDefaultAccount(config),
81
+ }));
78
82
  logger.log(i18n(`${i18nKey}.accounts`));
79
83
  logger.log(getTableContents(portalData, { border: { bodyLeft: ' ' } }));
80
84
  };
81
85
  exports.builder = yargs => {
82
86
  addConfigOptions(yargs);
83
- addAccountOptions(yargs);
84
87
  yargs.example([['$0 accounts list']]);
85
88
  return yargs;
86
89
  };
@@ -1,19 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
+ const { addConfigOptions } = require('../../lib/commonOpts');
4
5
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
6
  const { getConfig, getConfigPath, deleteAccount, getConfigDefaultAccount, getAccountId: getAccountIdFromConfig, updateDefaultAccount, } = require('@hubspot/local-dev-lib/config');
6
7
  const { trackCommandUsage } = require('../../lib/usageTracking');
7
8
  const { i18n } = require('../../lib/lang');
8
9
  const { selectAccountFromConfig } = require('../../lib/prompts/accountsPrompt');
9
10
  const { loadAndValidateOptions } = require('../../lib/validation');
10
- const i18nKey = 'commands.accounts.subcommands.remove';
11
- exports.command = 'remove [--account]';
11
+ const i18nKey = 'commands.account.subcommands.remove';
12
+ exports.command = 'remove [account]';
12
13
  exports.describe = i18n(`${i18nKey}.describe`);
13
14
  exports.handler = async (options) => {
14
15
  await loadAndValidateOptions(options, false);
16
+ const { account } = options;
17
+ let accountToRemove = account;
15
18
  let config = getConfig();
16
- let accountToRemove = options.account;
17
19
  if (accountToRemove && !getAccountIdFromConfig(accountToRemove)) {
18
20
  logger.error(i18n(`${i18nKey}.errors.accountNotFound`, {
19
21
  specifiedAccount: accountToRemove,
@@ -39,16 +41,14 @@ exports.handler = async (options) => {
39
41
  }
40
42
  };
41
43
  exports.builder = yargs => {
42
- yargs.option('account', {
44
+ addConfigOptions(yargs);
45
+ yargs.positional('account', {
43
46
  describe: i18n(`${i18nKey}.options.account.describe`),
44
47
  type: 'string',
45
48
  });
46
49
  yargs.example([
47
50
  ['$0 accounts remove', i18n(`${i18nKey}.examples.default`)],
48
- [
49
- '$0 accounts remove --account=MyAccount',
50
- i18n(`${i18nKey}.examples.byName`),
51
- ],
51
+ ['$0 accounts remove MyAccount', i18n(`${i18nKey}.examples.byName`)],
52
52
  ]);
53
53
  return yargs;
54
54
  };
@@ -3,18 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
5
  const { renameAccount } = require('@hubspot/local-dev-lib/config');
6
- const { addConfigOptions, addAccountOptions, getAccountId, } = require('../../lib/commonOpts');
6
+ const { addConfigOptions, addAccountOptions } = require('../../lib/commonOpts');
7
7
  const { trackCommandUsage } = require('../../lib/usageTracking');
8
8
  const { loadAndValidateOptions } = require('../../lib/validation');
9
9
  const { i18n } = require('../../lib/lang');
10
- const i18nKey = 'commands.accounts.subcommands.rename';
10
+ const i18nKey = 'commands.account.subcommands.rename';
11
11
  exports.command = 'rename <accountName> <newName>';
12
12
  exports.describe = i18n(`${i18nKey}.describe`);
13
13
  exports.handler = async (options) => {
14
14
  loadAndValidateOptions(options);
15
- const { accountName, newName } = options;
16
- const accountId = getAccountId(options);
17
- trackCommandUsage('accounts-rename', null, accountId);
15
+ const { accountName, newName, derivedAccountId } = options;
16
+ trackCommandUsage('accounts-rename', null, derivedAccountId);
18
17
  await renameAccount(accountName, newName);
19
18
  return logger.log(i18n(`${i18nKey}.success.renamed`, {
20
19
  name: accountName,
@@ -7,8 +7,8 @@ const { trackCommandUsage } = require('../../lib/usageTracking');
7
7
  const { i18n } = require('../../lib/lang');
8
8
  const { selectAccountFromConfig } = require('../../lib/prompts/accountsPrompt');
9
9
  const { loadAndValidateOptions } = require('../../lib/validation');
10
- const i18nKey = 'commands.accounts.subcommands.use';
11
- exports.command = 'use [--account]';
10
+ const i18nKey = 'commands.account.subcommands.use';
11
+ exports.command = 'use [account]';
12
12
  exports.describe = i18n(`${i18nKey}.describe`);
13
13
  exports.handler = async (options) => {
14
14
  await loadAndValidateOptions(options, false);
@@ -31,17 +31,14 @@ exports.handler = async (options) => {
31
31
  }));
32
32
  };
33
33
  exports.builder = yargs => {
34
- yargs.option('account', {
34
+ yargs.positional('account', {
35
35
  describe: i18n(`${i18nKey}.options.account.describe`),
36
36
  type: 'string',
37
37
  });
38
38
  yargs.example([
39
39
  ['$0 accounts use', i18n(`${i18nKey}.examples.default`)],
40
- [
41
- '$0 accounts use --account=MyAccount',
42
- i18n(`${i18nKey}.examples.nameBased`),
43
- ],
44
- ['$0 accounts use --account=1234567', i18n(`${i18nKey}.examples.idBased`)],
40
+ ['$0 accounts use MyAccount', i18n(`${i18nKey}.examples.nameBased`)],
41
+ ['$0 accounts use 1234567', i18n(`${i18nKey}.examples.idBased`)],
45
42
  ]);
46
43
  return yargs;
47
44
  };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // @ts-nocheck
4
+ const { addGlobalOptions } = require('../lib/commonOpts');
5
+ const { i18n } = require('../lib/lang');
6
+ const list = require('./account/list');
7
+ const rename = require('./account/rename');
8
+ const use = require('./account/use');
9
+ const info = require('./account/info');
10
+ const remove = require('./account/remove');
11
+ const clean = require('./account/clean');
12
+ const i18nKey = 'commands.account';
13
+ exports.command = ['account', 'accounts'];
14
+ exports.describe = i18n(`${i18nKey}.describe`);
15
+ exports.builder = yargs => {
16
+ addGlobalOptions(yargs);
17
+ yargs
18
+ .command(list)
19
+ .command(rename)
20
+ .command(use)
21
+ .command(info)
22
+ .command(remove)
23
+ .command(clean)
24
+ .demandCommand(1, '');
25
+ return yargs;
26
+ };
package/commands/auth.js CHANGED
@@ -8,13 +8,13 @@ const { ENVIRONMENTS, } = require('@hubspot/local-dev-lib/constants/environments
8
8
  const { DEFAULT_HUBSPOT_CONFIG_YAML_FILE_NAME, } = require('@hubspot/local-dev-lib/constants/config');
9
9
  const { i18n } = require('../lib/lang');
10
10
  const { getAccessToken, updateConfigWithAccessToken, } = require('@hubspot/local-dev-lib/personalAccessKey');
11
- const { updateAccountConfig, writeConfig, getConfig, getConfigPath, loadConfig, } = require('@hubspot/local-dev-lib/config');
11
+ const { updateAccountConfig, writeConfig, getConfig, getConfigPath, loadConfig, getConfigDefaultAccount, } = require('@hubspot/local-dev-lib/config');
12
12
  const { commaSeparatedValues, toKebabCase, } = require('@hubspot/local-dev-lib/text');
13
13
  const { promptUser } = require('../lib/prompts/promptUtils');
14
14
  const { personalAccessKeyPrompt, OAUTH_FLOW, } = require('../lib/prompts/personalAccessKeyPrompt');
15
15
  const { cliAccountNamePrompt } = require('../lib/prompts/accountNamePrompt');
16
16
  const { setAsDefaultAccountPrompt, } = require('../lib/prompts/setAsDefaultAccountPrompt');
17
- const { addConfigOptions, setLogLevel, getAccountId, addTestingOptions, } = require('../lib/commonOpts');
17
+ const { addConfigOptions, setLogLevel, getAccountId, addTestingOptions, addGlobalOptions, } = require('../lib/commonOpts');
18
18
  const { trackAuthAction, trackCommandUsage } = require('../lib/usageTracking');
19
19
  const { authenticateWithOauth } = require('../lib/oauth');
20
20
  const { EXIT_CODES } = require('../lib/enums/exitCodes');
@@ -31,21 +31,23 @@ const ALLOWED_AUTH_METHODS = [
31
31
  PERSONAL_ACCESS_KEY_AUTH_METHOD.value,
32
32
  ];
33
33
  const SUPPORTED_AUTHENTICATION_PROTOCOLS_TEXT = commaSeparatedValues(ALLOWED_AUTH_METHODS);
34
- exports.command = 'auth [type] [--account]';
34
+ exports.command = 'auth';
35
35
  exports.describe = i18n(`${i18nKey}.describe`, {
36
36
  supportedProtocols: SUPPORTED_AUTHENTICATION_PROTOCOLS_TEXT,
37
37
  });
38
38
  exports.handler = async (options) => {
39
- const { type, config: c, qa, account } = options;
40
- const authType = (type && type.toLowerCase()) || PERSONAL_ACCESS_KEY_AUTH_METHOD.value;
39
+ const { authType: authTypeFlagValue, config: configFlagValue, qa, providedAccountId, } = options;
40
+ const authType = (authTypeFlagValue && authTypeFlagValue.toLowerCase()) ||
41
+ PERSONAL_ACCESS_KEY_AUTH_METHOD.value;
41
42
  setLogLevel(options);
42
- if (!getConfigPath(c)) {
43
+ const env = qa ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD;
44
+ // Needed to load deprecated config
45
+ loadConfig(configFlagValue);
46
+ checkAndWarnGitInclusion(getConfigPath());
47
+ if (!getConfigPath(configFlagValue)) {
43
48
  logger.error(i18n(`${i18nKey}.errors.noConfigFileFound`));
44
49
  process.exit(EXIT_CODES.ERROR);
45
50
  }
46
- const env = qa ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD;
47
- loadConfig(c);
48
- checkAndWarnGitInclusion(getConfigPath());
49
51
  trackCommandUsage('auth');
50
52
  trackAuthAction('auth', authType, TRACKING_STATUS.STARTED);
51
53
  let configData;
@@ -64,7 +66,10 @@ exports.handler = async (options) => {
64
66
  successAuthMethod = OAUTH_AUTH_METHOD.name;
65
67
  break;
66
68
  case PERSONAL_ACCESS_KEY_AUTH_METHOD.value:
67
- configData = await personalAccessKeyPrompt({ env, account });
69
+ configData = await personalAccessKeyPrompt({
70
+ env,
71
+ account: providedAccountId,
72
+ });
68
73
  try {
69
74
  token = await getAccessToken(configData.personalAccessKey, env);
70
75
  defaultName = toKebabCase(token.hubName);
@@ -112,7 +117,7 @@ exports.handler = async (options) => {
112
117
  else {
113
118
  const config = getConfig();
114
119
  logger.info(i18n(`lib.prompts.setAsDefaultAccountPrompt.keepingCurrentDefault`, {
115
- accountName: config.defaultPortal,
120
+ accountName: getConfigDefaultAccount(config),
116
121
  }));
117
122
  }
118
123
  logger.success(i18n(`${i18nKey}.success.configFileUpdated`, {
@@ -130,25 +135,27 @@ exports.handler = async (options) => {
130
135
  process.exit(EXIT_CODES.SUCCESS);
131
136
  };
132
137
  exports.builder = yargs => {
133
- yargs.positional('type', {
134
- describe: i18n(`${i18nKey}.positionals.type.describe`),
135
- type: 'string',
136
- choices: [
137
- `${PERSONAL_ACCESS_KEY_AUTH_METHOD.value}`,
138
- `${OAUTH_AUTH_METHOD.value}`,
139
- ],
140
- default: PERSONAL_ACCESS_KEY_AUTH_METHOD.value,
141
- defaultDescription: i18n(`${i18nKey}.positionals.type.defaultDescription`, {
142
- authMethod: PERSONAL_ACCESS_KEY_AUTH_METHOD.value,
143
- }),
144
- });
145
138
  yargs.options({
139
+ 'auth-type': {
140
+ describe: i18n(`${i18nKey}.options.authType.describe`),
141
+ type: 'string',
142
+ choices: [
143
+ `${PERSONAL_ACCESS_KEY_AUTH_METHOD.value}`,
144
+ `${OAUTH_AUTH_METHOD.value}`,
145
+ ],
146
+ default: PERSONAL_ACCESS_KEY_AUTH_METHOD.value,
147
+ defaultDescription: i18n(`${i18nKey}.options.authType.defaultDescription`, {
148
+ authMethod: PERSONAL_ACCESS_KEY_AUTH_METHOD.value,
149
+ }),
150
+ },
146
151
  account: {
147
152
  describe: i18n(`${i18nKey}.options.account.describe`),
148
153
  type: 'string',
154
+ alias: 'a',
149
155
  },
150
156
  });
151
157
  addConfigOptions(yargs);
152
158
  addTestingOptions(yargs);
159
+ addGlobalOptions(yargs);
153
160
  return yargs;
154
161
  };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // @ts-nocheck
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const { getCwd } = require('@hubspot/local-dev-lib/path');
7
+ const { logger } = require('@hubspot/local-dev-lib/logger');
8
+ const { retrieveDefaultModule } = require('@hubspot/local-dev-lib/cms/modules');
9
+ const { i18n } = require('../../lib/lang');
10
+ const { logError } = require('../../lib/errorHandlers/index');
11
+ const { trackCommandUsage } = require('../../lib/usageTracking');
12
+ const { listPrompt } = require('../../lib/prompts/promptUtils');
13
+ const { EXIT_CODES } = require('../../lib/enums/exitCodes');
14
+ const i18nKey = 'commands.cms.subcommands.getReactModule';
15
+ exports.command = 'get-react-module [name] [dest]';
16
+ exports.describe = i18n(`${i18nKey}.describe`);
17
+ exports.handler = async (options) => {
18
+ const { name, dest } = options;
19
+ trackCommandUsage('get-react-modules');
20
+ let moduleToRetrieve = name;
21
+ if (!moduleToRetrieve) {
22
+ let availableModules;
23
+ try {
24
+ availableModules = await retrieveDefaultModule(null, '');
25
+ }
26
+ catch (e) {
27
+ logError(e);
28
+ }
29
+ const moduleChoice = await listPrompt(i18n(`${i18nKey}.selectModulePrompt`), {
30
+ choices: availableModules.map(module => module.name),
31
+ });
32
+ moduleToRetrieve = moduleChoice;
33
+ }
34
+ const destPath = dest
35
+ ? path.join(path.resolve(getCwd(), dest), `${moduleToRetrieve}`)
36
+ : path.join(getCwd(), `${moduleToRetrieve}`);
37
+ if (fs.existsSync(destPath)) {
38
+ logger.error(i18n(`${i18nKey}.errors.pathExists`, {
39
+ path: destPath,
40
+ }));
41
+ return;
42
+ }
43
+ try {
44
+ await retrieveDefaultModule(moduleToRetrieve, destPath);
45
+ logger.success(i18n(`${i18nKey}.success.moduleDownloaded`, {
46
+ moduleName: moduleToRetrieve,
47
+ path: destPath,
48
+ }));
49
+ }
50
+ catch (e) {
51
+ if (e.cause && e.cause.code === 'ERR_BAD_REQUEST') {
52
+ logger.error(i18n(`${i18nKey}.errors.invalidName`));
53
+ }
54
+ else {
55
+ logError(e);
56
+ }
57
+ }
58
+ process.exit(EXIT_CODES.SUCCESS);
59
+ };
60
+ exports.builder = yargs => {
61
+ yargs.positional('name', {
62
+ describe: i18n(`${i18nKey}.positionals.name.describe`),
63
+ type: 'string',
64
+ });
65
+ yargs.positional('dest', {
66
+ describe: i18n(`${i18nKey}.positionals.dest.describe`),
67
+ type: 'string',
68
+ });
69
+ return yargs;
70
+ };