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

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 (39) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +0 -2
  3. package/commands/auth.js +2 -2
  4. package/commands/config/set/allowUsageTracking.js +2 -2
  5. package/commands/config/set/defaultAccount.js +2 -2
  6. package/commands/config/set/defaultMode.js +2 -2
  7. package/commands/create/api-sample.js +6 -2
  8. package/commands/create/function.js +3 -1
  9. package/commands/create/index.js +0 -1
  10. package/commands/create/module.js +1 -1
  11. package/commands/create/template.js +3 -1
  12. package/commands/create/website-theme.js +12 -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/project/watch.js +103 -0
  19. package/commands/project.js +2 -0
  20. package/commands/sandbox/create.js +2 -2
  21. package/commands/secrets/addSecret.js +1 -1
  22. package/commands/secrets/updateSecret.js +1 -1
  23. package/lib/projects.js +15 -4
  24. package/lib/{createApiSamplePrompt.js → prompts/createApiSamplePrompt.js} +10 -11
  25. package/lib/{createFunctionPrompt.js → prompts/createFunctionPrompt.js} +27 -21
  26. package/lib/{createModulePrompt.js → prompts/createModulePrompt.js} +12 -9
  27. package/lib/prompts/createProjectPrompt.js +68 -0
  28. package/lib/{createTemplatePrompt.js → prompts/createTemplatePrompt.js} +7 -4
  29. package/lib/prompts/folderOverwritePrompt.js +17 -0
  30. package/lib/{prompts.js → prompts/personalAccessKeyPrompt.js} +10 -26
  31. package/lib/prompts/promptUtils.js +10 -0
  32. package/lib/prompts/{sandboxes.js → sandboxesPrompt.js} +5 -6
  33. package/lib/prompts/secretPrompt.js +25 -0
  34. package/package.json +4 -4
  35. package/commands/app/deploy.js +0 -110
  36. package/commands/app.js +0 -14
  37. package/commands/create/project.js +0 -32
  38. package/lib/prompts/projects.js +0 -43
  39. 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/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');
@@ -1,8 +1,19 @@
1
1
  const { createProject } = require('@hubspot/cli-lib/projects');
2
+ const { GITHUB_RELEASE_TYPES } = require('@hubspot/cli-lib/lib/constants');
3
+ const { getIsInProject } = require('../../lib/projects');
4
+
5
+ const PROJECT_BOILERPLATE_REF = 'cms-boilerplate-developer-projects';
2
6
 
3
7
  module.exports = {
4
8
  dest: ({ name, assetType }) => name || assetType,
5
- execute: ({ dest, assetType, options }) => {
9
+ execute: async ({ dest, assetType, options }) => {
10
+ const isInProject = await getIsInProject(dest);
11
+
12
+ if (isInProject) {
13
+ options.ref = PROJECT_BOILERPLATE_REF;
14
+ // releaseType has to be 'REPOSITORY' to download a specific branch
15
+ options.releaseType = GITHUB_RELEASE_TYPES.REPOSITORY;
16
+ }
6
17
  createProject(dest, assetType, 'cms-theme-boilerplate', 'src', options);
7
18
  },
8
19
  };
@@ -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
  });
@@ -0,0 +1,103 @@
1
+ const { i18n } = require('@hubspot/cli-lib/lib/lang');
2
+ const { createWatcher } = require('@hubspot/cli-lib/projectsWatch');
3
+ const { cancelStagedBuild } = require('@hubspot/cli-lib/api/dfs');
4
+ const {
5
+ logApiErrorInstance,
6
+ ApiErrorContext,
7
+ } = require('@hubspot/cli-lib/errorHandlers');
8
+ const { logger } = require('@hubspot/cli-lib/logger');
9
+ const {
10
+ addAccountOptions,
11
+ addConfigOptions,
12
+ getAccountId,
13
+ addUseEnvironmentOptions,
14
+ } = require('../../lib/commonOpts');
15
+ const { trackCommandUsage } = require('../../lib/usageTracking');
16
+ const {
17
+ getProjectConfig,
18
+ validateProjectConfig,
19
+ pollBuildStatus,
20
+ pollDeployStatus,
21
+ } = require('../../lib/projects');
22
+ const { loadAndValidateOptions } = require('../../lib/validation');
23
+ const { EXIT_CODES } = require('../../lib/enums/exitCodes');
24
+
25
+ const i18nKey = 'cli.commands.project.subcommands.watch';
26
+
27
+ exports.command = 'watch [path]';
28
+ exports.describe = false;
29
+
30
+ const handleBuildStatus = async (accountId, projectName, buildId) => {
31
+ const {
32
+ isAutoDeployEnabled,
33
+ deployStatusTaskLocator,
34
+ } = await pollBuildStatus(accountId, projectName, buildId);
35
+
36
+ if (isAutoDeployEnabled && deployStatusTaskLocator) {
37
+ await pollDeployStatus(
38
+ accountId,
39
+ projectName,
40
+ deployStatusTaskLocator.id,
41
+ buildId
42
+ );
43
+ }
44
+ };
45
+
46
+ const handleSigInt = (accountId, projectName, currentBuildId) => {
47
+ process.removeAllListeners('SIGINT');
48
+ process.on('SIGINT', async () => {
49
+ if (currentBuildId) {
50
+ try {
51
+ await cancelStagedBuild(accountId, projectName);
52
+ logger.debug(i18n(`${i18nKey}.debug.buildCancelled`));
53
+ process.exit(EXIT_CODES.SUCCESS);
54
+ } catch (err) {
55
+ logApiErrorInstance(
56
+ err,
57
+ new ApiErrorContext({ accountId, projectName: projectName })
58
+ );
59
+ process.exit(EXIT_CODES.ERROR);
60
+ }
61
+ } else {
62
+ process.exit(EXIT_CODES.SUCCESS);
63
+ }
64
+ });
65
+ };
66
+
67
+ exports.handler = async options => {
68
+ await loadAndValidateOptions(options);
69
+
70
+ const { path: projectPath } = options;
71
+ const accountId = getAccountId(options);
72
+
73
+ trackCommandUsage('project-watch', { projectPath }, accountId);
74
+
75
+ const { projectConfig, projectDir } = await getProjectConfig(projectPath);
76
+
77
+ validateProjectConfig(projectConfig, projectDir);
78
+
79
+ await createWatcher(
80
+ accountId,
81
+ projectConfig,
82
+ projectDir,
83
+ handleBuildStatus,
84
+ handleSigInt
85
+ );
86
+ };
87
+
88
+ exports.builder = yargs => {
89
+ yargs.positional('path', {
90
+ describe: i18n(`${i18nKey}.describe`),
91
+ type: 'string',
92
+ });
93
+
94
+ yargs.example([
95
+ ['$0 project watch myProjectFolder', i18n(`${i18nKey}.examples.default`)],
96
+ ]);
97
+
98
+ addConfigOptions(yargs, true);
99
+ addAccountOptions(yargs, true);
100
+ addUseEnvironmentOptions(yargs, true);
101
+
102
+ return yargs;
103
+ };
@@ -4,6 +4,7 @@ const create = require('./project/create');
4
4
  const upload = require('./project/upload');
5
5
  const listBuilds = require('./project/listBuilds');
6
6
  const logs = require('./project/logs');
7
+ const watch = require('./project/watch');
7
8
 
8
9
  exports.command = 'project';
9
10
  exports.describe = false; //'Commands for working with projects';
@@ -16,6 +17,7 @@ exports.builder = yargs => {
16
17
  yargs.command(deploy).demandCommand(1, '');
17
18
  yargs.command(create).demandCommand(0, '');
18
19
  yargs.command(upload).demandCommand(0, '');
20
+ yargs.command(watch).demandCommand(0, '');
19
21
  yargs.command(listBuilds).demandCommand(0, '');
20
22
  yargs.command(logs).demandCommand(1, '');
21
23
 
@@ -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
 
@@ -69,7 +69,12 @@ const writeProjectConfig = (configPath, config) => {
69
69
  }
70
70
  };
71
71
 
72
- const getProjectConfig = async _dir => {
72
+ const getIsInProject = async _dir => {
73
+ const configPath = await getProjectConfigPath(_dir);
74
+ return !!configPath;
75
+ };
76
+
77
+ const getProjectConfigPath = async _dir => {
73
78
  const projectDir = _dir ? path.resolve(getCwd(), _dir) : getCwd();
74
79
 
75
80
  const configPath = findup(PROJECT_CONFIG_FILE, {
@@ -77,6 +82,11 @@ const getProjectConfig = async _dir => {
77
82
  nocase: true,
78
83
  });
79
84
 
85
+ return configPath;
86
+ };
87
+
88
+ const getProjectConfig = async _dir => {
89
+ const configPath = await getProjectConfigPath(_dir);
80
90
  if (!configPath) {
81
91
  return { projectConfig: null, projectDir: null };
82
92
  }
@@ -103,7 +113,7 @@ const createProjectConfig = async (projectPath, projectName, template) => {
103
113
  : `Found an existing project definition in ${projectDir}.`
104
114
  );
105
115
 
106
- const { shouldContinue } = await prompt([
116
+ const { shouldContinue } = await promptUser([
107
117
  {
108
118
  name: 'shouldContinue',
109
119
  message: () => {
@@ -182,7 +192,7 @@ const ensureProjectExists = async (accountId, projectName, forceCreate) => {
182
192
  let shouldCreateProject = forceCreate;
183
193
 
184
194
  if (!shouldCreateProject) {
185
- const promptResult = await prompt([
195
+ const promptResult = await promptUser([
186
196
  {
187
197
  name: 'shouldCreateProject',
188
198
  message: `The project ${projectName} does not exist in ${uiAccountDescription(
@@ -381,6 +391,7 @@ const makeGetTaskStatus = taskType => {
381
391
  module.exports = {
382
392
  writeProjectConfig,
383
393
  getProjectConfig,
394
+ getIsInProject,
384
395
  createProjectConfig,
385
396
  validateProjectConfig,
386
397
  showWelcomeMessage,
@@ -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.18",
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.18",
12
+ "@hubspot/serverless-dev-runtime": "^3.0.10-beta.18",
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": "c0d4e2201f2e1b8e7f79b549b92eb7845ae7cd71"
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
- };