@hubspot/cli 3.0.10-beta.14 → 3.0.10-beta.15

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 (37) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +0 -2
  3. package/bin/hubspot +3 -0
  4. package/commands/auth.js +2 -2
  5. package/commands/config/set/allowUsageTracking.js +2 -2
  6. package/commands/config/set/defaultAccount.js +2 -2
  7. package/commands/config/set/defaultMode.js +2 -2
  8. package/commands/create/api-sample.js +6 -2
  9. package/commands/create/function.js +3 -1
  10. package/commands/create/index.js +0 -1
  11. package/commands/create/module.js +1 -1
  12. package/commands/create/template.js +3 -1
  13. package/commands/functions/deploy.js +1 -1
  14. package/commands/init.js +2 -2
  15. package/commands/open.js +2 -2
  16. package/commands/project/create.js +4 -54
  17. package/commands/project/listBuilds.js +2 -2
  18. package/commands/sandbox/create.js +2 -2
  19. package/commands/secrets/addSecret.js +1 -1
  20. package/commands/secrets/updateSecret.js +1 -1
  21. package/lib/projects.js +3 -3
  22. package/lib/{createApiSamplePrompt.js → prompts/createApiSamplePrompt.js} +10 -11
  23. package/lib/{createFunctionPrompt.js → prompts/createFunctionPrompt.js} +27 -21
  24. package/lib/{createModulePrompt.js → prompts/createModulePrompt.js} +12 -9
  25. package/lib/prompts/createProjectPrompt.js +68 -0
  26. package/lib/{createTemplatePrompt.js → prompts/createTemplatePrompt.js} +7 -4
  27. package/lib/prompts/folderOverwritePrompt.js +17 -0
  28. package/lib/{prompts.js → prompts/personalAccessKeyPrompt.js} +10 -26
  29. package/lib/prompts/promptUtils.js +10 -0
  30. package/lib/prompts/{sandboxes.js → sandboxesPrompt.js} +5 -6
  31. package/lib/prompts/secretPrompt.js +25 -0
  32. package/package.json +4 -4
  33. package/commands/app/deploy.js +0 -110
  34. package/commands/app.js +0 -14
  35. package/commands/create/project.js +0 -32
  36. package/lib/prompts/projects.js +0 -43
  37. package/lib/secretPrompt.js +0 -22
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @hubspot/cli
2
2
 
3
- Provides an `hs` command for interacting with the HubSpot. [Learn more about building on HubSpot](https://developers.hubspot.com).
3
+ Provides an `hs` command for interacting with HubSpot. [Learn more about building on HubSpot](https://developers.hubspot.com).
4
4
 
5
5
  ## Getting started
6
6
 
package/bin/cli.js CHANGED
@@ -10,7 +10,6 @@ const { setLogLevel, getCommandName } = require('../lib/commonOpts');
10
10
  const { trackHelpUsage } = require('../lib/usageTracking');
11
11
  const pkg = require('../package.json');
12
12
 
13
- const appCommand = require('../commands/app');
14
13
  const removeCommand = require('../commands/remove');
15
14
  const initCommand = require('../commands/init');
16
15
  const logsCommand = require('../commands/logs');
@@ -75,7 +74,6 @@ const argv = yargs
75
74
  describe: 'set log level to debug',
76
75
  type: 'boolean',
77
76
  })
78
- .command(appCommand)
79
77
  .command(authCommand)
80
78
  .command(initCommand)
81
79
  .command(logsCommand)
package/bin/hubspot ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('./cli');
package/commands/auth.js CHANGED
@@ -18,13 +18,13 @@ const {
18
18
  getConfigPath,
19
19
  } = require('@hubspot/cli-lib/lib/config');
20
20
  const { commaSeparatedValues } = require('@hubspot/cli-lib/lib/text');
21
+ const { promptUser } = require('../lib/prompts/promptUtils');
21
22
  const {
22
- promptUser,
23
23
  personalAccessKeyPrompt,
24
24
  OAUTH_FLOW,
25
25
  API_KEY_FLOW,
26
26
  ACCOUNT_NAME,
27
- } = require('../lib/prompts');
27
+ } = require('../lib/prompts/personalAccessKeyPrompt');
28
28
  const {
29
29
  addConfigOptions,
30
30
  setLogLevel,
@@ -1,9 +1,9 @@
1
1
  const { logger } = require('@hubspot/cli-lib/logger');
2
2
  const { updateAllowUsageTracking } = require('@hubspot/cli-lib/lib/config');
3
- const inquirer = require('inquirer');
4
3
 
5
4
  const { getAccountId } = require('../../../lib/commonOpts');
6
5
  const { trackCommandUsage } = require('../../../lib/usageTracking');
6
+ const { promptUser } = require('../../../lib/prompts/promptUtils');
7
7
  const { loadAndValidateOptions } = require('../../../lib/validation');
8
8
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
9
9
 
@@ -11,7 +11,7 @@ const i18nKey =
11
11
  'cli.commands.config.subcommands.set.subcommands.allowUsageTracking';
12
12
 
13
13
  const enableOrDisableUsageTracking = async () => {
14
- const { isEnabled } = await inquirer.prompt([
14
+ const { isEnabled } = await promptUser([
15
15
  {
16
16
  type: 'list',
17
17
  look: false,
@@ -4,18 +4,18 @@ const {
4
4
  getConfigPath,
5
5
  updateDefaultAccount,
6
6
  } = require('@hubspot/cli-lib/lib/config');
7
- const inquirer = require('inquirer');
8
7
  const { loadAndValidateOptions } = require('../../../lib/validation');
9
8
 
10
9
  const { getAccountId } = require('../../../lib/commonOpts');
11
10
  const { trackCommandUsage } = require('../../../lib/usageTracking');
11
+ const { promptUser } = require('../../../lib/prompts/promptUtils');
12
12
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
13
13
 
14
14
  const i18nKey =
15
15
  'cli.commands.config.subcommands.set.subcommands.defaultAccount';
16
16
 
17
17
  const selectAccountFromConfig = async config => {
18
- const { default: selectedDefault } = await inquirer.prompt([
18
+ const { default: selectedDefault } = await promptUser([
19
19
  {
20
20
  type: 'list',
21
21
  look: false,
@@ -1,11 +1,11 @@
1
1
  const { logger } = require('@hubspot/cli-lib/logger');
2
2
  const { updateDefaultMode } = require('@hubspot/cli-lib/lib/config');
3
- const inquirer = require('inquirer');
4
3
  const { Mode } = require('@hubspot/cli-lib');
5
4
  const { commaSeparatedValues } = require('@hubspot/cli-lib/lib/text');
6
5
 
7
6
  const { getAccountId } = require('../../../lib/commonOpts');
8
7
  const { trackCommandUsage } = require('../../../lib/usageTracking');
8
+ const { promptUser } = require('../../../lib/prompts/promptUtils');
9
9
  const { loadAndValidateOptions } = require('../../../lib/validation');
10
10
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
11
11
 
@@ -14,7 +14,7 @@ const i18nKey = 'cli.commands.config.subcommands.set.subcommands.defaultMode';
14
14
  const ALL_MODES = Object.values(Mode);
15
15
 
16
16
  const selectMode = async () => {
17
- const { mode } = await inquirer.prompt([
17
+ const { mode } = await promptUser([
18
18
  {
19
19
  type: 'list',
20
20
  look: false,
@@ -1,5 +1,9 @@
1
- const { createApiSamplePrompt } = require('../../lib/createApiSamplePrompt');
2
- const { folderOverwritePrompt } = require('../../lib/prompts');
1
+ const {
2
+ createApiSamplePrompt,
3
+ } = require('../../lib/prompts/createApiSamplePrompt');
4
+ const {
5
+ folderOverwritePrompt,
6
+ } = require('../../lib/prompts/folderOverwritePrompt');
3
7
  const { logger } = require('@hubspot/cli-lib/logger');
4
8
  const path = require('path');
5
9
  const fs = require('fs-extra');
@@ -1,5 +1,7 @@
1
1
  const { createFunction } = require('@hubspot/cli-lib/functions');
2
- const { createFunctionPrompt } = require('../../lib/createFunctionPrompt');
2
+ const {
3
+ createFunctionPrompt,
4
+ } = require('../../lib/prompts/createFunctionPrompt');
3
5
 
4
6
  module.exports = {
5
7
  dest: ({ name }) => name,
@@ -3,7 +3,6 @@ module.exports = {
3
3
  app: require('./app'),
4
4
  function: require('./function'),
5
5
  module: require('./module'),
6
- project: require('./project'),
7
6
  'react-app': require('./react-app'),
8
7
  template: require('./template'),
9
8
  'vue-app': require('./vue-app'),
@@ -1,5 +1,5 @@
1
1
  const path = require('path');
2
- const { createModulePrompt } = require('../../lib/createModulePrompt');
2
+ const { createModulePrompt } = require('../../lib/prompts/createModulePrompt');
3
3
  const fs = require('fs-extra');
4
4
  const { logger } = require('@hubspot/cli-lib/logger');
5
5
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
@@ -1,4 +1,6 @@
1
- const { createTemplatePrompt } = require('../../lib/createTemplatePrompt');
1
+ const {
2
+ createTemplatePrompt,
3
+ } = require('../../lib/prompts/createTemplatePrompt');
2
4
  const { logger } = require('@hubspot/cli-lib/logger');
3
5
  const path = require('path');
4
6
  const fs = require('fs-extra');
@@ -83,7 +83,7 @@ exports.handler = async options => {
83
83
  spinner.stop();
84
84
  await outputBuildLog(successResp.cdnUrl);
85
85
  logger.success(
86
- i18n(`${i18nKey}.success.deploy`, {
86
+ i18n(`${i18nKey}.success.deployed`, {
87
87
  accountId,
88
88
  buildTimeSeconds,
89
89
  functionPath,
package/commands/init.js CHANGED
@@ -26,13 +26,13 @@ const {
26
26
  const { getCwd } = require('@hubspot/cli-lib/path');
27
27
  const { trackCommandUsage, trackAuthAction } = require('../lib/usageTracking');
28
28
  const { setLogLevel, addTestingOptions } = require('../lib/commonOpts');
29
+ const { promptUser } = require('../lib/prompts/promptUtils');
29
30
  const {
30
31
  OAUTH_FLOW,
31
32
  API_KEY_FLOW,
32
33
  ACCOUNT_NAME,
33
34
  personalAccessKeyPrompt,
34
- promptUser,
35
- } = require('../lib/prompts');
35
+ } = require('../lib/prompts/personalAccessKeyPrompt');
36
36
  const { logDebugInfo } = require('../lib/debugInfo');
37
37
  const { authenticateWithOauth } = require('../lib/oauth');
38
38
  const { EXIT_CODES } = require('../lib/enums/exitCodes');
package/commands/open.js CHANGED
@@ -6,14 +6,14 @@ const {
6
6
  } = require('../lib/commonOpts');
7
7
  const { trackCommandUsage } = require('../lib/usageTracking');
8
8
  const { logSiteLinks, getSiteLinksAsArray, openLink } = require('../lib/links');
9
- const inquirer = require('inquirer');
9
+ const { promptUser } = require('../lib/prompts/promptUtils');
10
10
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
11
11
 
12
12
  const i18nKey = 'cli.commands.open';
13
13
 
14
14
  const separator = ' => ';
15
15
  const createListPrompt = async accountId =>
16
- inquirer.prompt([
16
+ promptUser([
17
17
  {
18
18
  type: 'rawlist',
19
19
  look: false,
@@ -8,9 +8,10 @@ const { trackCommandUsage } = require('../../lib/usageTracking');
8
8
  const { loadAndValidateOptions } = require('../../lib/validation');
9
9
  const { getCwd } = require('@hubspot/cli-lib/path');
10
10
  const path = require('path');
11
- const { prompt } = require('inquirer');
11
+ const {
12
+ createProjectPrompt,
13
+ } = require('../../lib/prompts/createProjectPrompt');
12
14
  const { createProjectConfig } = require('../../lib/projects');
13
- const { PROJECT_TEMPLATES } = require('@hubspot/cli-lib/lib/constants');
14
15
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
15
16
 
16
17
  const i18nKey = 'cli.commands.project.subcommands.create';
@@ -23,58 +24,7 @@ exports.handler = async options => {
23
24
 
24
25
  const accountId = getAccountId(options);
25
26
 
26
- const { name, template, location } = await prompt([
27
- {
28
- name: 'name',
29
- message: '[--name] Give your project a name:',
30
- when: !options.name,
31
- validate: input => {
32
- if (!input) {
33
- return 'A project name is required';
34
- }
35
- return true;
36
- },
37
- },
38
- {
39
- name: 'location',
40
- message: '[--location] Where should the project be created?',
41
- when: !options.location,
42
- default: answers => {
43
- return path.resolve(getCwd(), answers.name || options.name);
44
- },
45
- validate: input => {
46
- if (!input) {
47
- return 'A project location is required';
48
- }
49
- return true;
50
- },
51
- },
52
- {
53
- name: 'template',
54
- message: () => {
55
- return options.template &&
56
- !PROJECT_TEMPLATES.find(t => t.name === options.template)
57
- ? `[--template] Could not find template ${options.template}. Please choose an available template.`
58
- : '[--template] Start from a template?';
59
- },
60
- when:
61
- !options.template ||
62
- !PROJECT_TEMPLATES.find(t => t.name === options.template),
63
- type: 'list',
64
- choices: [
65
- {
66
- name: 'No template',
67
- value: 'none',
68
- },
69
- ...PROJECT_TEMPLATES.map(template => {
70
- return {
71
- name: template.label,
72
- value: template.name,
73
- };
74
- }),
75
- ],
76
- },
77
- ]);
27
+ const { name, template, location } = await createProjectPrompt(options);
78
28
 
79
29
  trackCommandUsage('project-create', { projectName: name }, accountId);
80
30
 
@@ -29,7 +29,7 @@ const {
29
29
  validateProjectConfig,
30
30
  } = require('../../lib/projects');
31
31
  const moment = require('moment');
32
- const { prompt } = require('inquirer');
32
+ const { promptUser } = require('../../lib/prompts/promptUtils');
33
33
 
34
34
  exports.command = 'list-builds [path]';
35
35
  exports.describe = false;
@@ -111,7 +111,7 @@ exports.handler = async options => {
111
111
  );
112
112
  }
113
113
  if (paging && paging.next) {
114
- await prompt({
114
+ await promptUser({
115
115
  name: 'more',
116
116
  message: 'Press <enter> to load more, or ctrl+c to exit',
117
117
  });
@@ -9,7 +9,7 @@ const { logger } = require('@hubspot/cli-lib/logger');
9
9
 
10
10
  const { createSandbox } = require('@hubspot/cli-lib/sandboxes');
11
11
  const { loadAndValidateOptions } = require('../../lib/validation');
12
- const { createSandbox: prompt } = require('../../lib/prompts/sandboxes');
12
+ const { createSandboxPrompt } = require('../../lib/prompts/sandboxesPrompt');
13
13
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
14
14
 
15
15
  const i18nKey = 'cli.commands.sandbox.subcommands.create';
@@ -27,7 +27,7 @@ exports.handler = async options => {
27
27
  trackCommandUsage('sandbox-create', {}, accountId);
28
28
 
29
29
  if (!name) {
30
- namePrompt = await prompt();
30
+ namePrompt = await createSandboxPrompt();
31
31
  }
32
32
 
33
33
  const sandboxName = name || namePrompt.name;
@@ -14,7 +14,7 @@ const {
14
14
  addUseEnvironmentOptions,
15
15
  getAccountId,
16
16
  } = require('../../lib/commonOpts');
17
- const { secretValuePrompt } = require('../../lib/secretPrompt');
17
+ const { secretValuePrompt } = require('../../lib/prompts/secretPrompt');
18
18
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
19
19
 
20
20
  const i18nKey = 'cli.commands.secrets.subcommands.add';
@@ -14,7 +14,7 @@ const {
14
14
  addUseEnvironmentOptions,
15
15
  getAccountId,
16
16
  } = require('../../lib/commonOpts');
17
- const { secretValuePrompt } = require('../../lib/secretPrompt');
17
+ const { secretValuePrompt } = require('../../lib/prompts/secretPrompt');
18
18
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
19
19
 
20
20
  const i18nKey = 'cli.commands.secrets.subcommands.update';
package/lib/projects.js CHANGED
@@ -3,7 +3,6 @@ const path = require('path');
3
3
 
4
4
  const chalk = require('chalk');
5
5
  const findup = require('findup-sync');
6
- const { prompt } = require('inquirer');
7
6
  const Spinnies = require('spinnies');
8
7
  const { logger } = require('@hubspot/cli-lib/logger');
9
8
  const { getEnv } = require('@hubspot/cli-lib/lib/config');
@@ -29,6 +28,7 @@ const {
29
28
  ApiErrorContext,
30
29
  } = require('@hubspot/cli-lib/errorHandlers');
31
30
  const { getCwd } = require('@hubspot/cli-lib/path');
31
+ const { promptUser } = require('./prompts/promptUtils');
32
32
  const { EXIT_CODES } = require('./enums/exitCodes');
33
33
  const { uiLine, uiAccountDescription } = require('../lib/ui');
34
34
 
@@ -103,7 +103,7 @@ const createProjectConfig = async (projectPath, projectName, template) => {
103
103
  : `Found an existing project definition in ${projectDir}.`
104
104
  );
105
105
 
106
- const { shouldContinue } = await prompt([
106
+ const { shouldContinue } = await promptUser([
107
107
  {
108
108
  name: 'shouldContinue',
109
109
  message: () => {
@@ -182,7 +182,7 @@ const ensureProjectExists = async (accountId, projectName, forceCreate) => {
182
182
  let shouldCreateProject = forceCreate;
183
183
 
184
184
  if (!shouldCreateProject) {
185
- const promptResult = await prompt([
185
+ const promptResult = await promptUser([
186
186
  {
187
187
  name: 'shouldCreateProject',
188
188
  message: `The project ${projectName} does not exist in ${uiAccountDescription(
@@ -1,9 +1,12 @@
1
- const inquirer = require('inquirer');
1
+ const { promptUser } = require('./promptUtils');
2
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
3
+
4
+ const i18nKey = 'cli.lib.prompts.createApiSamplePrompt';
2
5
 
3
6
  const getSampleTypesPrompt = choices => ({
4
7
  type: 'rawlist',
5
8
  name: 'sampleType',
6
- message: 'Please, select API sample app',
9
+ message: i18n(`${i18nKey}.selectApiSampleApp`),
7
10
  choices: choices.map(choice => ({
8
11
  name: `${choice.name} - ${choice.description}`,
9
12
  value: choice.id,
@@ -13,7 +16,7 @@ const getSampleTypesPrompt = choices => ({
13
16
  if (input.length > 0) {
14
17
  resolve(true);
15
18
  }
16
- reject('Please select API sample app');
19
+ reject(i18n(`${i18nKey}.errors.apiSampleAppRequired`));
17
20
  });
18
21
  },
19
22
  });
@@ -21,7 +24,7 @@ const getSampleTypesPrompt = choices => ({
21
24
  const getLanguagesPrompt = choices => ({
22
25
  type: 'rawlist',
23
26
  name: 'sampleLanguage',
24
- message: "Please, select sample app's language",
27
+ message: i18n(`${i18nKey}.selectLanguage`),
25
28
  choices: choices.map(choice => ({
26
29
  name: choice,
27
30
  value: choice,
@@ -31,7 +34,7 @@ const getLanguagesPrompt = choices => ({
31
34
  if (input.length > 0) {
32
35
  resolve(true);
33
36
  }
34
- reject("Please select API sample app's language");
37
+ reject(i18n(`${i18nKey}.errors.languageRequired`));
35
38
  });
36
39
  },
37
40
  });
@@ -39,16 +42,12 @@ const getLanguagesPrompt = choices => ({
39
42
  const createApiSamplePrompt = async samplesConfig => {
40
43
  try {
41
44
  const { samples } = samplesConfig;
42
- const sampleTypeAnswer = await inquirer.prompt(
43
- getSampleTypesPrompt(samples)
44
- );
45
+ const sampleTypeAnswer = await promptUser(getSampleTypesPrompt(samples));
45
46
  const chosenSample = samples.find(
46
47
  sample => sample.id === sampleTypeAnswer.sampleType
47
48
  );
48
49
  const { languages } = chosenSample;
49
- const languagesAnswer = await inquirer.prompt(
50
- getLanguagesPrompt(languages)
51
- );
50
+ const languagesAnswer = await promptUser(getLanguagesPrompt(languages));
52
51
  return {
53
52
  ...sampleTypeAnswer,
54
53
  ...languagesAnswer,
@@ -1,66 +1,72 @@
1
- const inquirer = require('inquirer');
1
+ const { promptUser } = require('./promptUtils');
2
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
2
3
 
3
- const { STRING_WITH_NO_SPACES_REGEX } = require('./regex');
4
+ const { STRING_WITH_NO_SPACES_REGEX } = require('../regex');
5
+
6
+ const i18nKey = 'cli.lib.prompts.createFunctionPrompt';
4
7
 
5
8
  const FUNCTIONS_FOLDER_PROMPT = {
6
9
  name: 'functionsFolder',
7
- message: 'Name of the folder where your function will be created',
10
+ message: i18n(`${i18nKey}.enterFolder`),
8
11
  validate(val) {
9
12
  if (typeof val !== 'string') {
10
- return 'You entered an invalid name. Please try again.';
13
+ return i18n(`${i18nKey}.errors.invalid`);
11
14
  } else if (!val.length) {
12
- return 'The name may not be blank. Please try again.';
15
+ return i18n(`${i18nKey}.errors.blank`);
13
16
  } else if (!STRING_WITH_NO_SPACES_REGEX.test(val)) {
14
- return 'The name may not contain spaces. Please try again.';
17
+ return i18n(`${i18nKey}.errors.space`);
15
18
  }
16
19
  return true;
17
20
  },
18
21
  };
19
- const ENDPOINT_PATH_PROMPT = {
20
- name: 'endpointPath',
21
- message: 'Path portion of the URL created for the function',
22
+
23
+ const FUNCTION_FILENAME_PROMPT = {
24
+ name: 'filename',
25
+ message: i18n(`${i18nKey}.enterFilename`),
22
26
  validate(val) {
23
27
  if (typeof val !== 'string') {
24
- return 'You entered an invalid name. Please try again.';
28
+ return i18n(`${i18nKey}.errors.invalid`);
25
29
  } else if (!val.length) {
26
- return 'The name may not be blank. Please try again.';
30
+ return i18n(`${i18nKey}.errors.blank`);
27
31
  } else if (!STRING_WITH_NO_SPACES_REGEX.test(val)) {
28
- return 'The name may not contain spaces. Please try again.';
32
+ return i18n(`${i18nKey}.errors.space`);
29
33
  }
30
34
  return true;
31
35
  },
32
36
  };
37
+
33
38
  const ENDPOINT_METHOD_PROMPT = {
34
39
  type: 'list',
35
40
  name: 'endpointMethod',
36
- message: 'Select the HTTP method for the endpoint',
41
+ message: i18n(`${i18nKey}.selectEndpointMethod`),
37
42
  default: 'GET',
38
43
  choices: ['DELETE', 'GET', 'PATCH', 'POST', 'PUT'],
39
44
  };
40
- const FUNCTION_FILENAME_PROMPT = {
41
- name: 'filename',
42
- message: 'Name of the JavaScript file for your function',
45
+
46
+ const ENDPOINT_PATH_PROMPT = {
47
+ name: 'endpointPath',
48
+ message: i18n(`${i18nKey}.enterEndpointPath`),
43
49
  validate(val) {
44
50
  if (typeof val !== 'string') {
45
- return 'You entered an invalid name. Please try again.';
51
+ return i18n(`${i18nKey}.errors.invalid`);
46
52
  } else if (!val.length) {
47
- return 'The name may not be blank. Please try again.';
53
+ return i18n(`${i18nKey}.errors.blank`);
48
54
  } else if (!STRING_WITH_NO_SPACES_REGEX.test(val)) {
49
- return 'The name may not contain spaces. Please try again.';
55
+ return i18n(`${i18nKey}.errors.space`);
50
56
  }
51
57
  return true;
52
58
  },
53
59
  };
54
60
 
55
61
  function createFunctionPrompt() {
56
- const prompt = inquirer.createPromptModule();
57
- return prompt([
62
+ return promptUser([
58
63
  FUNCTIONS_FOLDER_PROMPT,
59
64
  FUNCTION_FILENAME_PROMPT,
60
65
  ENDPOINT_METHOD_PROMPT,
61
66
  ENDPOINT_PATH_PROMPT,
62
67
  ]);
63
68
  }
69
+
64
70
  module.exports = {
65
71
  createFunctionPrompt,
66
72
  };
@@ -1,13 +1,16 @@
1
- const inquirer = require('inquirer');
1
+ const { promptUser } = require('./promptUtils');
2
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
3
+
4
+ const i18nKey = 'cli.lib.prompts.createModulePrompt';
2
5
 
3
6
  const MODULE_LABEL_PROMPT = {
4
7
  name: 'moduleLabel',
5
- message: 'What should the module label be?',
8
+ message: i18n(`${i18nKey}.enterLabel`),
6
9
  validate(val) {
7
10
  if (typeof val !== 'string') {
8
- return 'You entered an invalid name. Please try again.';
11
+ return i18n(`${i18nKey}.errors.invalidLabel`);
9
12
  } else if (!val.length) {
10
- return 'The name may not be blank. Please try again.';
13
+ return i18n(`${i18nKey}.errors.labelRequired`);
11
14
  }
12
15
  return true;
13
16
  },
@@ -15,7 +18,7 @@ const MODULE_LABEL_PROMPT = {
15
18
  const CONTENT_TYPES_PROMPT = {
16
19
  type: 'checkbox',
17
20
  name: 'contentTypes',
18
- message: 'What types of content will this module be used in?',
21
+ message: i18n(`${i18nKey}.selectContentType`),
19
22
  default: ['PAGE'],
20
23
  choices: [
21
24
  { name: 'Page', value: 'PAGE' },
@@ -28,7 +31,7 @@ const CONTENT_TYPES_PROMPT = {
28
31
  if (input.length > 0) {
29
32
  resolve(true);
30
33
  }
31
- reject('Please select at least one content type for this module.');
34
+ reject(i18n(`${i18nKey}.errors.contentTypeRequired`));
32
35
  });
33
36
  },
34
37
  };
@@ -36,14 +39,14 @@ const CONTENT_TYPES_PROMPT = {
36
39
  const GLOBAL_PROMPT = {
37
40
  type: 'confirm',
38
41
  name: 'global',
39
- message: 'Is this a global module?',
42
+ message: i18n(`${i18nKey}.confirmGlobal`),
40
43
  default: false,
41
44
  };
42
45
 
43
46
  function createModulePrompt() {
44
- const prompt = inquirer.createPromptModule();
45
- return prompt([MODULE_LABEL_PROMPT, CONTENT_TYPES_PROMPT, GLOBAL_PROMPT]);
47
+ return promptUser([MODULE_LABEL_PROMPT, CONTENT_TYPES_PROMPT, GLOBAL_PROMPT]);
46
48
  }
49
+
47
50
  module.exports = {
48
51
  createModulePrompt,
49
52
  };
@@ -0,0 +1,68 @@
1
+ const path = require('path');
2
+ const { getCwd } = require('@hubspot/cli-lib/path');
3
+ const { PROJECT_TEMPLATES } = require('@hubspot/cli-lib/lib/constants');
4
+ const { promptUser } = require('./promptUtils');
5
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
6
+
7
+ const i18nKey = 'cli.lib.prompts.createProjectPrompt';
8
+
9
+ const createProjectPrompt = (promptOptions = {}) => {
10
+ return promptUser([
11
+ {
12
+ name: 'name',
13
+ message: i18n(`${i18nKey}.enterName`),
14
+ when: !promptOptions.name,
15
+ validate: input => {
16
+ if (!input) {
17
+ return i18n(`${i18nKey}.errors.nameRequired`);
18
+ }
19
+ return true;
20
+ },
21
+ },
22
+ {
23
+ name: 'location',
24
+ message: i18n(`${i18nKey}.enterLocation`),
25
+ when: !promptOptions.location,
26
+ default: answers => {
27
+ return path.resolve(getCwd(), answers.name || promptOptions.name);
28
+ },
29
+ validate: input => {
30
+ if (!input) {
31
+ return i18n(`${i18nKey}.errors.locationRequired`);
32
+ }
33
+ return true;
34
+ },
35
+ },
36
+ {
37
+ name: 'template',
38
+ message: () => {
39
+ return promptOptions.template &&
40
+ !PROJECT_TEMPLATES.find(t => t.name === promptOptions.template)
41
+ ? i18n(`${i18nKey}.errors.invalidTemplate`, {
42
+ template: promptOptions.template,
43
+ })
44
+ : i18n(`${i18nKey}.selectTemplate`);
45
+ },
46
+ when:
47
+ !promptOptions.template ||
48
+ !PROJECT_TEMPLATES.find(t => t.name === promptOptions.template),
49
+ type: 'list',
50
+ choices: [
51
+ {
52
+ name: i18n(`${i18nKey}.templateOptions.noTemplate`),
53
+ value: 'none',
54
+ },
55
+ ...PROJECT_TEMPLATES.map(template => {
56
+ return {
57
+ name: template.label,
58
+ value: template.name,
59
+ };
60
+ }),
61
+ ],
62
+ },
63
+ ]);
64
+ };
65
+
66
+ module.exports = {
67
+ createProjectPrompt,
68
+ };
@@ -1,9 +1,12 @@
1
- const inquirer = require('inquirer');
1
+ const { promptUser } = require('./promptUtils');
2
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
3
+
4
+ const i18nKey = 'cli.lib.prompts.createTemplatePrompt';
2
5
 
3
6
  const TEMPLATE_TYPE_PROMPT = {
4
7
  type: 'list',
5
8
  name: 'templateType',
6
- message: 'Select the type of template to create',
9
+ message: i18n(`${i18nKey}.selectTemplate`),
7
10
  default: 'page',
8
11
  choices: [
9
12
  { name: 'page', value: 'page-template' },
@@ -17,9 +20,9 @@ const TEMPLATE_TYPE_PROMPT = {
17
20
  };
18
21
 
19
22
  function createTemplatePrompt() {
20
- const prompt = inquirer.createPromptModule();
21
- return prompt([TEMPLATE_TYPE_PROMPT]);
23
+ return promptUser([TEMPLATE_TYPE_PROMPT]);
22
24
  }
25
+
23
26
  module.exports = {
24
27
  createTemplatePrompt,
25
28
  };
@@ -0,0 +1,17 @@
1
+ const { promptUser } = require('./promptUtils');
2
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
3
+
4
+ const i18nKey = 'cli.lib.prompts.folderOverwritePrompt';
5
+
6
+ const folderOverwritePrompt = folderName => {
7
+ return promptUser({
8
+ type: 'confirm',
9
+ name: 'overwrite',
10
+ message: i18n(`${i18nKey}.overwriteConfirm`, { folderName }),
11
+ default: false,
12
+ });
13
+ };
14
+
15
+ module.exports = {
16
+ folderOverwritePrompt,
17
+ };
@@ -1,4 +1,3 @@
1
- const inquirer = require('inquirer');
2
1
  const open = require('open');
3
2
  const {
4
3
  OAUTH_SCOPES,
@@ -6,15 +5,11 @@ const {
6
5
  } = require('@hubspot/cli-lib/lib/constants');
7
6
  const { getHubSpotWebsiteOrigin } = require('@hubspot/cli-lib/lib/urls');
8
7
  const { logger } = require('@hubspot/cli-lib/logger');
9
- const { API_KEY_REGEX, STRING_WITH_NO_SPACES_REGEX } = require('./regex');
8
+ const { API_KEY_REGEX, STRING_WITH_NO_SPACES_REGEX } = require('../regex');
9
+ const { promptUser } = require('./promptUtils');
10
10
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
11
11
 
12
- const i18nKey = 'cli.lib.prompts';
13
-
14
- const promptUser = async promptConfig => {
15
- const prompt = inquirer.createPromptModule();
16
- return prompt(promptConfig);
17
- };
12
+ const i18nKey = 'cli.lib.prompts.personalAccessKeyPrompt';
18
13
 
19
14
  /**
20
15
  * Displays notification to user that we are about to open the browser,
@@ -39,7 +34,7 @@ const personalAccessKeyPrompt = async ({ env } = {}) => {
39
34
 
40
35
  const ACCOUNT_ID = {
41
36
  name: 'accountId',
42
- message: i18n(`${i18nKey}.accountId`),
37
+ message: i18n(`${i18nKey}.enterAccountId`),
43
38
  type: 'number',
44
39
  validate(val) {
45
40
  if (!Number.isNaN(val) && val > 0) {
@@ -51,7 +46,7 @@ const ACCOUNT_ID = {
51
46
 
52
47
  const CLIENT_ID = {
53
48
  name: 'clientId',
54
- message: i18n(`${i18nKey}.clientId`),
49
+ message: i18n(`${i18nKey}.enterClientId`),
55
50
  validate(val) {
56
51
  if (typeof val !== 'string') {
57
52
  return i18n(`${i18nKey}.errors.invalidOauthClientId`);
@@ -64,7 +59,7 @@ const CLIENT_ID = {
64
59
 
65
60
  const CLIENT_SECRET = {
66
61
  name: 'clientSecret',
67
- message: i18n(`${i18nKey}.clientSecret`),
62
+ message: i18n(`${i18nKey}.enterClientSecret`),
68
63
  validate(val) {
69
64
  if (typeof val !== 'string') {
70
65
  return i18n(`${i18nKey}.errors.invalidOauthClientSecret`);
@@ -79,7 +74,7 @@ const CLIENT_SECRET = {
79
74
 
80
75
  const ACCOUNT_NAME = {
81
76
  name: 'name',
82
- message: i18n(`${i18nKey}.accountName`),
77
+ message: i18n(`${i18nKey}.enterAccountName`),
83
78
  validate(val) {
84
79
  if (typeof val !== 'string') {
85
80
  return i18n(`${i18nKey}.errors.invalidName`);
@@ -94,7 +89,7 @@ const ACCOUNT_NAME = {
94
89
 
95
90
  const ACCOUNT_API_KEY = {
96
91
  name: 'apiKey',
97
- message: i18n(`${i18nKey}.apiKey`),
92
+ message: i18n(`${i18nKey}.enterApiKey`),
98
93
  validate(val) {
99
94
  if (!API_KEY_REGEX.test(val)) {
100
95
  return i18n(`${i18nKey}.errors.invalidAPIKey`);
@@ -110,7 +105,7 @@ const PERSONAL_ACCESS_KEY_BROWSER_OPEN_PREP = {
110
105
 
111
106
  const PERSONAL_ACCESS_KEY = {
112
107
  name: 'personalAccessKey',
113
- message: i18n(`${i18nKey}.personalAccessKey`),
108
+ message: i18n(`${i18nKey}.enterPersonalAccessKey`),
114
109
  validate(val) {
115
110
  if (typeof val !== 'string') {
116
111
  return i18n(`${i18nKey}.errors.invalidPersonalAccessKey`);
@@ -124,7 +119,7 @@ const PERSONAL_ACCESS_KEY = {
124
119
  const SCOPES = {
125
120
  type: 'checkbox',
126
121
  name: 'scopes',
127
- message: i18n(`${i18nKey}.scopes`),
122
+ message: i18n(`${i18nKey}.selectScopes`),
128
123
  default: DEFAULT_OAUTH_SCOPES,
129
124
  choices: OAUTH_SCOPES,
130
125
  };
@@ -132,18 +127,7 @@ const SCOPES = {
132
127
  const OAUTH_FLOW = [ACCOUNT_NAME, ACCOUNT_ID, CLIENT_ID, CLIENT_SECRET, SCOPES];
133
128
  const API_KEY_FLOW = [ACCOUNT_NAME, ACCOUNT_ID, ACCOUNT_API_KEY];
134
129
 
135
- const folderOverwritePrompt = folderName => {
136
- return promptUser({
137
- type: 'confirm',
138
- name: 'overwrite',
139
- message: i18n(`${i18nKey}.folderOverwrite`, { folderName }),
140
- default: false,
141
- });
142
- };
143
-
144
130
  module.exports = {
145
- folderOverwritePrompt,
146
- promptUser,
147
131
  personalAccessKeyPrompt,
148
132
  CLIENT_ID,
149
133
  CLIENT_SECRET,
@@ -0,0 +1,10 @@
1
+ const inquirer = require('inquirer');
2
+
3
+ const promptUser = async promptConfig => {
4
+ const prompt = inquirer.createPromptModule();
5
+ return prompt(promptConfig);
6
+ };
7
+
8
+ module.exports = {
9
+ promptUser,
10
+ };
@@ -1,11 +1,10 @@
1
- const inquirer = require('inquirer');
1
+ const { promptUser } = require('./promptUtils');
2
2
  const { i18n } = require('@hubspot/cli-lib/lib/lang');
3
3
 
4
- const i18nKey = 'cli.lib.prompts.sandboxes';
4
+ const i18nKey = 'cli.lib.prompts.sandboxesPrompt';
5
5
 
6
- const createSandbox = () => {
7
- const prompt = inquirer.createPromptModule();
8
- return prompt([
6
+ const createSandboxPrompt = () => {
7
+ return promptUser([
9
8
  {
10
9
  name: 'name',
11
10
  message: i18n(`${i18nKey}.enterName`),
@@ -21,5 +20,5 @@ const createSandbox = () => {
21
20
  };
22
21
 
23
22
  module.exports = {
24
- createSandbox,
23
+ createSandboxPrompt,
25
24
  };
@@ -0,0 +1,25 @@
1
+ const { promptUser } = require('./promptUtils');
2
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
3
+
4
+ const i18nKey = 'cli.lib.prompts.secretPrompt';
5
+
6
+ const SECRET_VALUE_PROMPT = {
7
+ name: 'secretValue',
8
+ type: 'password',
9
+ mask: '*',
10
+ message: i18n(`${i18nKey}.enterValue`),
11
+ validate(val) {
12
+ if (typeof val !== 'string') {
13
+ return i18n(`${i18nKey}.errors.invalidValue`);
14
+ }
15
+ return true;
16
+ },
17
+ };
18
+
19
+ function secretValuePrompt() {
20
+ return promptUser([SECRET_VALUE_PROMPT]);
21
+ }
22
+
23
+ module.exports = {
24
+ secretValuePrompt,
25
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hubspot/cli",
3
- "version": "3.0.10-beta.14",
3
+ "version": "3.0.10-beta.15",
4
4
  "description": "CLI for working with HubSpot",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -8,8 +8,8 @@
8
8
  "url": "https://github.com/HubSpot/hubspot-cms-tools"
9
9
  },
10
10
  "dependencies": {
11
- "@hubspot/cli-lib": "^3.0.10-beta.13",
12
- "@hubspot/serverless-dev-runtime": "^3.0.10-beta.13",
11
+ "@hubspot/cli-lib": "^3.0.10-beta.15",
12
+ "@hubspot/serverless-dev-runtime": "^3.0.10-beta.15",
13
13
  "archiver": "^5.3.0",
14
14
  "chalk": "^4.1.2",
15
15
  "express": "^4.17.1",
@@ -39,5 +39,5 @@
39
39
  "publishConfig": {
40
40
  "access": "public"
41
41
  },
42
- "gitHead": "e77b37281411b7eed123974eefd2b839d92376c8"
42
+ "gitHead": "314c0c53c64f45e0eb7663db46808d7265361a0a"
43
43
  }
@@ -1,110 +0,0 @@
1
- const ora = require('ora');
2
- const { getEnv } = require('@hubspot/cli-lib');
3
- const {
4
- logApiErrorInstance,
5
- ApiErrorContext,
6
- } = require('@hubspot/cli-lib/errorHandlers');
7
- const { getHubSpotWebsiteOrigin } = require('@hubspot/cli-lib/lib/urls');
8
- const { logger } = require('@hubspot/cli-lib/logger');
9
- const { deployAppSync } = require('@hubspot/cli-lib/api/appPipeline');
10
-
11
- const {
12
- getAccountId,
13
- addUseEnvironmentOptions,
14
- } = require('../../lib/commonOpts');
15
- const { trackCommandUsage } = require('../../lib/usageTracking');
16
- const { outputBuildLog } = require('../../lib/serverlessLogs');
17
- const { loadAndValidateOptions } = require('../../lib/validation');
18
- const { i18n } = require('@hubspot/cli-lib/lib/lang');
19
-
20
- const i18nKey = 'cli.commands.app.subcommands.deploy';
21
- const { EXIT_CODES } = require('../../lib/enums/exitCodes');
22
-
23
- const logServerlessBuildFailures = async errorDetails => {
24
- const folderPaths = errorDetails.context.folderPath;
25
- const buildLogUrls = errorDetails.context.serverlessBuildLogUrl;
26
- for (let i = 0; i < buildLogUrls.length; i++) {
27
- logger.log(`Building serverless functions in "${folderPaths[i]}":`);
28
- await outputBuildLog(buildLogUrls[i]);
29
- }
30
- logger.error(
31
- 'Your app failed to build and deploy due to a problem building the serverless functions.'
32
- );
33
- };
34
-
35
- exports.command = 'deploy <path>';
36
- exports.describe = false;
37
-
38
- exports.handler = async options => {
39
- await loadAndValidateOptions(options);
40
-
41
- const { path: appPath } = options;
42
- const accountId = getAccountId(options);
43
-
44
- trackCommandUsage('app-deploy', {}, accountId);
45
-
46
- let result;
47
-
48
- const spinner = ora(
49
- i18n(`${i18nKey}.building`, {
50
- accountId,
51
- appPath,
52
- })
53
- ).start();
54
- try {
55
- result = await deployAppSync(accountId, appPath);
56
- } catch (error) {
57
- spinner.fail();
58
- if (error.response && error.response.body) {
59
- const errorDetails = error.response.body;
60
- if (
61
- errorDetails.subCategory === 'PipelineErrors.SERVERLESS_BUILD_ERROR' &&
62
- errorDetails.context &&
63
- Array.isArray(errorDetails.context.serverlessBuildLogUrl)
64
- ) {
65
- await logServerlessBuildFailures(errorDetails);
66
- } else {
67
- logApiErrorInstance(
68
- error,
69
- new ApiErrorContext({
70
- accountId,
71
- request: appPath,
72
- })
73
- );
74
- }
75
- } else {
76
- logApiErrorInstance(
77
- error,
78
- new ApiErrorContext({
79
- accountId,
80
- request: appPath,
81
- })
82
- );
83
- }
84
- process.exit(EXIT_CODES.ERROR);
85
- }
86
-
87
- spinner.succeed();
88
- logger.success(
89
- i18n(`${i18nKey}.success.deployed`, {
90
- appUrl: `${getHubSpotWebsiteOrigin(getEnv())}/private-apps/${accountId}/${
91
- result.appId
92
- }`,
93
- })
94
- );
95
- };
96
-
97
- exports.builder = yargs => {
98
- yargs.positional('path', {
99
- describe: i18n(`${i18nKey}.positionals.path.describe`),
100
- type: 'string',
101
- });
102
-
103
- yargs.example([
104
- ['$0 app deploy /example-app', i18n(`${i18nKey}.examples.default`)],
105
- ]);
106
-
107
- addUseEnvironmentOptions(yargs, true);
108
-
109
- return yargs;
110
- };
package/commands/app.js DELETED
@@ -1,14 +0,0 @@
1
- const { addConfigOptions, addAccountOptions } = require('../lib/commonOpts');
2
- const deploy = require('./app/deploy');
3
-
4
- exports.command = 'app';
5
- exports.describe = false;
6
-
7
- exports.builder = yargs => {
8
- addConfigOptions(yargs, true);
9
- addAccountOptions(yargs, true);
10
-
11
- yargs.command(deploy).demandCommand(1, '');
12
-
13
- return yargs;
14
- };
@@ -1,32 +0,0 @@
1
- const path = require('path');
2
- const {
3
- createProjectConfig,
4
- createProjectTemplateFiles,
5
- } = require('@hubspot/cli-lib/projects');
6
- const { logger } = require('@hubspot/cli-lib/logger');
7
- const { createProjectPrompt } = require('../../lib/prompts/projects');
8
- const { i18n } = require('@hubspot/cli-lib/lib/lang');
9
-
10
- const i18nKey = 'cli.commands.create.subcommands.project';
11
-
12
- module.exports = {
13
- hidden: true,
14
- dest: ({ name, dest }) => path.join(dest || './', name),
15
- execute: async ({ dest, name }) => {
16
- const { label, description, template } = await createProjectPrompt({
17
- label: name,
18
- });
19
-
20
- createProjectConfig(dest, {
21
- label,
22
- description,
23
- });
24
- createProjectTemplateFiles(dest, template);
25
-
26
- logger.success(
27
- i18n(`${i18nKey}.success.projectCreated`, {
28
- path: dest,
29
- })
30
- );
31
- },
32
- };
@@ -1,43 +0,0 @@
1
- const inquirer = require('inquirer');
2
- const { PROJECT_TEMPLATE_TYPES } = require('@hubspot/cli-lib/lib/constants');
3
- const { i18n } = require('@hubspot/cli-lib/lib/lang');
4
-
5
- const i18nKey = 'cli.lib.prompts.projects';
6
-
7
- const createProjectPrompt = (promptOptions = {}) => {
8
- const prompt = inquirer.createPromptModule();
9
- return prompt([
10
- {
11
- type: 'list',
12
- name: 'template',
13
- message: i18n(`${i18nKey}.selectTemplate`),
14
- default: PROJECT_TEMPLATE_TYPES.blank,
15
- choices: Object.keys(PROJECT_TEMPLATE_TYPES),
16
- },
17
- {
18
- name: 'label',
19
- message: i18n(`${i18nKey}.enterLabel`),
20
- validate(val) {
21
- if (typeof val !== 'string') {
22
- return i18n(`${i18nKey}.errors.invalidLabel`);
23
- }
24
- return true;
25
- },
26
- default: promptOptions.label || 'New project',
27
- },
28
- {
29
- name: 'description',
30
- message: i18n(`${i18nKey}.enterDescription`),
31
- validate(val) {
32
- if (typeof val !== 'string') {
33
- return i18n(`${i18nKey}.errors.invalidDescription`);
34
- }
35
- return true;
36
- },
37
- },
38
- ]);
39
- };
40
-
41
- module.exports = {
42
- createProjectPrompt,
43
- };
@@ -1,22 +0,0 @@
1
- const inquirer = require('inquirer');
2
-
3
- const SECRET_VALUE_PROMPT = {
4
- name: 'secretValue',
5
- type: 'password',
6
- mask: '*',
7
- message: 'Enter a value for your secret',
8
- validate(val) {
9
- if (typeof val !== 'string') {
10
- return 'You entered an invalid value. Please try again.';
11
- }
12
- return true;
13
- },
14
- };
15
-
16
- function secretValuePrompt() {
17
- const prompt = inquirer.createPromptModule();
18
- return prompt([SECRET_VALUE_PROMPT]);
19
- }
20
- module.exports = {
21
- secretValuePrompt,
22
- };