@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
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
- const { getAccountId } = require('@hubspot/local-dev-lib/config');
6
5
  const { logError } = require('../../lib/errorHandlers/index');
7
6
  const { fetchReleaseData } = require('@hubspot/local-dev-lib/github');
8
7
  const { trackCommandUsage } = require('../../lib/usageTracking');
@@ -17,10 +16,10 @@ exports.command = 'add';
17
16
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
18
17
  exports.handler = async (options) => {
19
18
  await loadAndValidateOptions(options);
19
+ const { derivedAccountId } = options;
20
20
  logger.log('');
21
21
  logger.log(i18n(`${i18nKey}.creatingComponent.message`));
22
22
  logger.log('');
23
- const accountId = getAccountId(options);
24
23
  const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
25
24
  const projectComponentsVersion = releaseData.tag_name;
26
25
  const components = await getProjectComponentsByVersion(projectComponentsVersion);
@@ -29,7 +28,7 @@ exports.handler = async (options) => {
29
28
  if (!component) {
30
29
  component = components.find(t => t.path === options.type);
31
30
  }
32
- trackCommandUsage('project-add', null, accountId);
31
+ trackCommandUsage('project-add', null, derivedAccountId);
33
32
  try {
34
33
  await createProjectComponent(component, name, projectComponentsVersion);
35
34
  logger.log('');
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const path = require('path');
5
5
  const fs = require('fs');
6
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
6
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
7
7
  const { trackCommandUsage, trackCommandMetadataUsage, } = require('../../lib/usageTracking');
8
8
  const { loadAndValidateOptions } = require('../../lib/validation');
9
9
  const { i18n } = require('../../lib/lang');
@@ -27,10 +27,10 @@ exports.command = 'clone-app';
27
27
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
28
28
  exports.handler = async (options) => {
29
29
  await loadAndValidateOptions(options);
30
- const accountId = getAccountId(options);
31
- const accountConfig = getAccountConfig(accountId);
32
- const accountName = uiAccountDescription(accountId);
33
- trackCommandUsage('clone-app', {}, accountId);
30
+ const { derivedAccountId } = options;
31
+ const accountConfig = getAccountConfig(derivedAccountId);
32
+ const accountName = uiAccountDescription(derivedAccountId);
33
+ trackCommandUsage('clone-app', {}, derivedAccountId);
34
34
  if (!isAppDeveloperAccount(accountConfig)) {
35
35
  uiLine();
36
36
  logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`));
@@ -42,58 +42,54 @@ exports.handler = async (options) => {
42
42
  process.exit(EXIT_CODES.SUCCESS);
43
43
  }
44
44
  let appId;
45
- let name;
46
- let location;
45
+ let projectName;
46
+ let projectDest;
47
47
  try {
48
48
  appId = options.appId;
49
49
  if (!appId) {
50
50
  const appIdResponse = await selectPublicAppPrompt({
51
- accountId,
51
+ accountId: derivedAccountId,
52
52
  accountName,
53
53
  options,
54
54
  isMigratingApp: false,
55
55
  });
56
56
  appId = appIdResponse.appId;
57
57
  }
58
- const projectResponse = await createProjectPrompt('', options, true);
59
- name = projectResponse.name;
60
- location = projectResponse.location;
58
+ const { name, dest } = await createProjectPrompt('', options, true);
59
+ projectName = name;
60
+ projectDest = options.dest || dest;
61
61
  }
62
62
  catch (error) {
63
- logError(error, new ApiErrorContext({ accountId }));
63
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
64
64
  process.exit(EXIT_CODES.ERROR);
65
65
  }
66
+ await trackCommandMetadataUsage('clone-app', { status: 'STARTED' }, derivedAccountId);
66
67
  try {
67
68
  SpinniesManager.init();
68
69
  SpinniesManager.add('cloneApp', {
69
70
  text: i18n(`${i18nKey}.cloneStatus.inProgress`),
70
71
  });
71
- const { data: { exportId }, } = await cloneApp(accountId, appId);
72
- const { status } = await poll(checkCloneStatus, accountId, exportId);
72
+ const { data: { exportId }, } = await cloneApp(derivedAccountId, appId);
73
+ const { status } = await poll(checkCloneStatus, derivedAccountId, exportId);
73
74
  if (status === 'SUCCESS') {
74
75
  // Ensure correct project folder structure exists
75
- const baseDestPath = path.resolve(getCwd(), location);
76
+ const baseDestPath = path.resolve(getCwd(), projectDest);
76
77
  const absoluteDestPath = path.resolve(baseDestPath, 'src', 'app');
77
78
  fs.mkdirSync(absoluteDestPath, { recursive: true });
78
79
  // Extract zipped app files and place them in correct directory
79
- const { data: zippedApp } = await downloadClonedProject(accountId, exportId);
80
- await extractZipArchive(zippedApp, sanitizeFileName(name), absoluteDestPath, {
80
+ const { data: zippedApp } = await downloadClonedProject(derivedAccountId, exportId);
81
+ await extractZipArchive(zippedApp, sanitizeFileName(projectName), absoluteDestPath, {
81
82
  includesRootDir: true,
82
83
  hideLogs: true,
83
84
  });
84
85
  // Create hsproject.json file
85
86
  const configPath = path.join(baseDestPath, PROJECT_CONFIG_FILE);
86
87
  const configContent = {
87
- name,
88
+ name: projectName,
88
89
  srcDir: 'src',
89
90
  platformVersion: '2023.2',
90
91
  };
91
92
  const success = writeProjectConfig(configPath, configContent);
92
- trackCommandMetadataUsage('clone-app', {
93
- type: name,
94
- assetType: appId,
95
- successful: success,
96
- }, accountId);
97
93
  SpinniesManager.succeed('cloneApp', {
98
94
  text: i18n(`${i18nKey}.cloneStatus.done`),
99
95
  succeedColor: 'white',
@@ -103,33 +99,35 @@ exports.handler = async (options) => {
103
99
  }
104
100
  logger.log('');
105
101
  uiLine();
106
- logger.success(i18n(`${i18nKey}.cloneStatus.success`, { location }));
102
+ logger.success(i18n(`${i18nKey}.cloneStatus.success`, { dest }));
107
103
  logger.log('');
108
104
  process.exit(EXIT_CODES.SUCCESS);
109
105
  }
110
106
  }
111
107
  catch (error) {
112
- trackCommandMetadataUsage('clone-app', { projectName: name, appId, status: 'FAILURE', error }, accountId);
108
+ await trackCommandMetadataUsage('clone-app', { status: 'FAILURE' }, derivedAccountId);
113
109
  SpinniesManager.fail('cloneApp', {
114
110
  text: i18n(`${i18nKey}.cloneStatus.failure`),
115
111
  failColor: 'white',
116
112
  });
117
113
  // Migrations endpoints return a response object with an errors property. The errors property contains an array of errors.
118
114
  if (error.errors && Array.isArray(error.errors)) {
119
- error.errors.forEach(e => logError(e, new ApiErrorContext({ accountId })));
115
+ error.errors.forEach(e => logError(e, new ApiErrorContext({ accountId: derivedAccountId })));
120
116
  }
121
117
  else {
122
- logError(error, new ApiErrorContext({ accountId }));
118
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
123
119
  }
124
120
  }
121
+ await trackCommandMetadataUsage('clone-app', { status: 'SUCCESS' }, derivedAccountId);
122
+ process.exit(EXIT_CODES.SUCCESS);
125
123
  };
126
124
  exports.builder = yargs => {
127
125
  yargs.options({
128
- location: {
129
- describe: i18n(`${i18nKey}.options.location.describe`),
126
+ dest: {
127
+ describe: i18n(`${i18nKey}.options.dest.describe`),
130
128
  type: 'string',
131
129
  },
132
- appId: {
130
+ 'app-id': {
133
131
  describe: i18n(`${i18nKey}.options.appId.describe`),
134
132
  type: 'number',
135
133
  },
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
4
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
5
5
  const { trackCommandUsage } = require('../../lib/usageTracking');
6
6
  const { loadAndValidateOptions } = require('../../lib/validation');
7
7
  const { getCwd } = require('@hubspot/local-dev-lib/path');
@@ -19,16 +19,16 @@ exports.command = 'create';
19
19
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
20
20
  exports.handler = async (options) => {
21
21
  await loadAndValidateOptions(options);
22
- const accountId = getAccountId(options);
22
+ const { derivedAccountId } = options;
23
23
  const hasCustomTemplateSource = Boolean(options.templateSource);
24
24
  let githubRef = '';
25
25
  if (!hasCustomTemplateSource) {
26
26
  const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
27
27
  githubRef = releaseData.tag_name;
28
28
  }
29
- const { name, template, location } = await createProjectPrompt(githubRef, options);
30
- trackCommandUsage('project-create', { type: template.name }, accountId);
31
- await createProjectConfig(path.resolve(getCwd(), options.location || location), options.name || name, template, options.templateSource, githubRef);
29
+ const { name, template, dest } = await createProjectPrompt(githubRef, options);
30
+ trackCommandUsage('project-create', { type: template.name }, derivedAccountId);
31
+ await createProjectConfig(path.resolve(getCwd(), options.dest || dest), options.name || name, template, options.templateSource, githubRef);
32
32
  logger.log('');
33
33
  logger.log(chalk.bold(i18n(`${i18nKey}.logs.welcomeMessage`)));
34
34
  uiFeatureHighlight([
@@ -44,15 +44,15 @@ exports.builder = yargs => {
44
44
  describe: i18n(`${i18nKey}.options.name.describe`),
45
45
  type: 'string',
46
46
  },
47
- location: {
48
- describe: i18n(`${i18nKey}.options.location.describe`),
47
+ dest: {
48
+ describe: i18n(`${i18nKey}.options.dest.describe`),
49
49
  type: 'string',
50
50
  },
51
51
  template: {
52
52
  describe: i18n(`${i18nKey}.options.template.describe`),
53
53
  type: 'string',
54
54
  },
55
- templateSource: {
55
+ 'template-source': {
56
56
  describe: i18n(`${i18nKey}.options.templateSource.describe`),
57
57
  type: 'string',
58
58
  },
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const chalk = require('chalk');
5
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
5
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
6
6
  const { trackCommandUsage } = require('../../lib/usageTracking');
7
7
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
8
8
  const { logger } = require('@hubspot/local-dev-lib/logger');
@@ -38,17 +38,17 @@ const validateBuildId = (buildId, deployedBuildId, latestBuildId, projectName, a
38
38
  };
39
39
  exports.handler = async (options) => {
40
40
  await loadAndValidateOptions(options);
41
- const accountId = getAccountId(options);
42
- const accountConfig = getAccountConfig(accountId);
41
+ const { derivedAccountId } = options;
42
+ const accountConfig = getAccountConfig(derivedAccountId);
43
43
  const { project: projectOption, buildId: buildIdOption } = options;
44
44
  const accountType = accountConfig && accountConfig.accountType;
45
- trackCommandUsage('project-deploy', { type: accountType }, accountId);
45
+ trackCommandUsage('project-deploy', { type: accountType }, derivedAccountId);
46
46
  const { projectConfig } = await getProjectConfig();
47
47
  let projectName = projectOption;
48
48
  if (!projectOption && projectConfig) {
49
49
  projectName = projectConfig.name;
50
50
  }
51
- const namePromptResponse = await projectNamePrompt(accountId, {
51
+ const namePromptResponse = await projectNamePrompt(derivedAccountId, {
52
52
  project: projectName,
53
53
  });
54
54
  if (!projectName && namePromptResponse.projectName) {
@@ -56,13 +56,13 @@ exports.handler = async (options) => {
56
56
  }
57
57
  let buildIdToDeploy = buildIdOption;
58
58
  try {
59
- const { data: { latestBuild, deployedBuildId }, } = await fetchProject(accountId, projectName);
59
+ const { data: { latestBuild, deployedBuildId }, } = await fetchProject(derivedAccountId, projectName);
60
60
  if (!latestBuild || !latestBuild.buildId) {
61
61
  logger.error(i18n(`${i18nKey}.errors.noBuilds`));
62
62
  return process.exit(EXIT_CODES.ERROR);
63
63
  }
64
64
  if (buildIdToDeploy) {
65
- const validationResult = validateBuildId(buildIdToDeploy, deployedBuildId, latestBuild.buildId, projectName, accountId);
65
+ const validationResult = validateBuildId(buildIdToDeploy, deployedBuildId, latestBuild.buildId, projectName, derivedAccountId);
66
66
  if (validationResult !== true) {
67
67
  logger.error(validationResult);
68
68
  return process.exit(EXIT_CODES.ERROR);
@@ -75,7 +75,7 @@ exports.handler = async (options) => {
75
75
  default: latestBuild.buildId === deployedBuildId
76
76
  ? undefined
77
77
  : latestBuild.buildId,
78
- validate: () => validateBuildId(buildId, deployedBuildId, latestBuild.buildId, projectName, accountId),
78
+ validate: () => validateBuildId(buildId, deployedBuildId, latestBuild.buildId, projectName, derivedAccountId),
79
79
  });
80
80
  buildIdToDeploy = deployBuildIdPromptResponse.buildId;
81
81
  }
@@ -83,20 +83,20 @@ exports.handler = async (options) => {
83
83
  logger.error(i18n(`${i18nKey}.errors.noBuildId`));
84
84
  return process.exit(EXIT_CODES.ERROR);
85
85
  }
86
- const { data: deployResp } = await deployProject(accountId, projectName, buildIdToDeploy);
86
+ const { data: deployResp } = await deployProject(derivedAccountId, projectName, buildIdToDeploy);
87
87
  if (!deployResp || deployResp.error) {
88
88
  logger.error(i18n(`${i18nKey}.errors.deploy`, {
89
89
  details: deployResp.error.message,
90
90
  }));
91
91
  return process.exit(EXIT_CODES.ERROR);
92
92
  }
93
- await pollDeployStatus(accountId, projectName, deployResp.id, buildIdToDeploy);
93
+ await pollDeployStatus(derivedAccountId, projectName, deployResp.id, buildIdToDeploy);
94
94
  }
95
95
  catch (e) {
96
96
  if (isHubSpotHttpError(e) && e.status === 404) {
97
97
  logger.error(i18n(`${i18nKey}.errors.projectNotFound`, {
98
98
  projectName: chalk.bold(projectName),
99
- accountIdentifier: uiAccountDescription(accountId),
99
+ accountIdentifier: uiAccountDescription(derivedAccountId),
100
100
  command: uiCommandReference('hs project upload'),
101
101
  }));
102
102
  }
@@ -104,7 +104,10 @@ exports.handler = async (options) => {
104
104
  logger.error(e.message);
105
105
  }
106
106
  else {
107
- logError(e, new ApiErrorContext({ accountId, request: 'project deploy' }));
107
+ logError(e, new ApiErrorContext({
108
+ accountId: derivedAccountId,
109
+ request: 'project deploy',
110
+ }));
108
111
  }
109
112
  return process.exit(EXIT_CODES.ERROR);
110
113
  }
@@ -116,7 +119,7 @@ exports.builder = yargs => {
116
119
  type: 'string',
117
120
  },
118
121
  build: {
119
- alias: ['buildId'],
122
+ alias: ['build-id'],
120
123
  describe: i18n(`${i18nKey}.options.build.describe`),
121
124
  type: 'number',
122
125
  },
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
4
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
5
5
  const { trackCommandUsage } = require('../../lib/usageTracking');
6
6
  const { loadAndValidateOptions } = require('../../lib/validation');
7
7
  const { handleExit } = require('../../lib/process');
@@ -18,14 +18,14 @@ const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
18
18
  const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, } = require('../../lib/projectStructure');
19
19
  const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, createNewProjectForLocalDev, createInitialBuildForNewProject, useExistingDevTestAccount, checkIfAccountFlagIsSupported, checkIfParentAccountIsAuthed, } = require('../../lib/localDev');
20
20
  const i18nKey = 'commands.project.subcommands.dev';
21
- exports.command = 'dev [--account]';
21
+ exports.command = 'dev';
22
22
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
23
23
  exports.handler = async (options) => {
24
24
  await loadAndValidateOptions(options);
25
- const accountId = getAccountId(options);
26
- const accountConfig = getAccountConfig(accountId);
27
- const env = getValidEnv(getEnv(accountId));
28
- trackCommandUsage('project-dev', null, accountId);
25
+ const { derivedAccountId } = options;
26
+ const accountConfig = getAccountConfig(derivedAccountId);
27
+ const env = getValidEnv(getEnv(derivedAccountId));
28
+ trackCommandUsage('project-dev', null, derivedAccountId);
29
29
  const { projectConfig, projectDir } = await getProjectConfig();
30
30
  uiBetaTag(i18n(`${i18nKey}.logs.betaMessage`));
31
31
  logger.log(uiLink(i18n(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
@@ -54,11 +54,11 @@ exports.handler = async (options) => {
54
54
  const defaultAccountIsRecommendedType = isDeveloperTestAccount(accountConfig) ||
55
55
  (!hasPublicApps && isSandbox(accountConfig));
56
56
  // The account that the project must exist in
57
- let targetProjectAccountId = options.account ? accountId : null;
57
+ let targetProjectAccountId = derivedAccountId;
58
58
  // The account that we are locally testing against
59
- let targetTestingAccountId = options.account ? accountId : null;
59
+ let targetTestingAccountId = derivedAccountId;
60
60
  // Check that the default account or flag option is valid for the type of app in this project
61
- if (options.account) {
61
+ if (derivedAccountId) {
62
62
  checkIfAccountFlagIsSupported(accountConfig, hasPublicApps);
63
63
  if (hasPublicApps) {
64
64
  targetProjectAccountId = accountConfig.parentAccountId;
@@ -69,14 +69,14 @@ exports.handler = async (options) => {
69
69
  }
70
70
  // The user is targeting an account type that we recommend developing on
71
71
  if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
72
- targetTestingAccountId = accountId;
72
+ targetTestingAccountId = derivedAccountId;
73
73
  await confirmDefaultAccountIsTarget(accountConfig, hasPublicApps);
74
74
  if (hasPublicApps) {
75
75
  checkIfParentAccountIsAuthed(accountConfig);
76
76
  targetProjectAccountId = accountConfig.parentAccountId;
77
77
  }
78
78
  else {
79
- targetProjectAccountId = accountId;
79
+ targetProjectAccountId = derivedAccountId;
80
80
  }
81
81
  }
82
82
  let createNewSandbox = false;
@@ -94,13 +94,13 @@ exports.handler = async (options) => {
94
94
  isAppDeveloperAccount(accountConfig) && createNestedAccount;
95
95
  }
96
96
  if (createNewSandbox) {
97
- targetProjectAccountId = await createSandboxForLocalDev(accountId, accountConfig, env);
97
+ targetProjectAccountId = await createSandboxForLocalDev(derivedAccountId, accountConfig, env);
98
98
  // We will be running our tests against this new sandbox account
99
99
  targetTestingAccountId = targetProjectAccountId;
100
100
  }
101
101
  if (createNewDeveloperTestAccount) {
102
- targetTestingAccountId = await createDeveloperTestAccountForLocalDev(accountId, accountConfig, env);
103
- targetProjectAccountId = accountId;
102
+ targetTestingAccountId = await createDeveloperTestAccountForLocalDev(derivedAccountId, accountConfig, env);
103
+ targetProjectAccountId = derivedAccountId;
104
104
  }
105
105
  // eslint-disable-next-line prefer-const
106
106
  let { projectExists, project } = await ensureProjectExists(targetProjectAccountId, projectConfig.name, {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const path = require('path');
5
5
  const chalk = require('chalk');
6
- const { getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
6
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
7
7
  const { trackCommandUsage } = require('../../lib/usageTracking');
8
8
  const { getCwd, sanitizeFileName } = require('@hubspot/local-dev-lib/path');
9
9
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
@@ -17,7 +17,7 @@ const { i18n } = require('../../lib/lang');
17
17
  const { uiBetaTag } = require('../../lib/ui');
18
18
  const i18nKey = 'commands.project.subcommands.download';
19
19
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
20
- exports.command = 'download [--project]';
20
+ exports.command = 'download';
21
21
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
22
22
  exports.handler = async (options) => {
23
23
  await loadAndValidateOptions(options);
@@ -26,35 +26,34 @@ exports.handler = async (options) => {
26
26
  logger.error(i18n(`${i18nKey}.warnings.cannotDownloadWithinProject`));
27
27
  process.exit(EXIT_CODES.ERROR);
28
28
  }
29
- const { project, dest, buildNumber } = options;
29
+ const { project, dest, build, derivedAccountId } = options;
30
30
  const { project: promptedProjectName } = await downloadProjectPrompt(options);
31
31
  let projectName = promptedProjectName || project;
32
- const accountId = getAccountId(options);
33
- trackCommandUsage('project-download', null, accountId);
32
+ trackCommandUsage('project-download', null, derivedAccountId);
34
33
  try {
35
- const { projectExists } = await ensureProjectExists(accountId, projectName, {
34
+ const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
36
35
  allowCreate: false,
37
36
  noLogs: true,
38
37
  });
39
38
  if (!projectExists) {
40
39
  logger.error(i18n(`${i18nKey}.errors.projectNotFound`, {
41
40
  projectName: chalk.bold(projectName),
42
- accountId: chalk.bold(accountId),
41
+ accountId: chalk.bold(derivedAccountId),
43
42
  }));
44
43
  const { name: promptedProjectName } = await downloadProjectPrompt(options);
45
44
  projectName = promptedProjectName || project;
46
45
  }
47
46
  const absoluteDestPath = dest ? path.resolve(getCwd(), dest) : getCwd();
48
- let buildNumberToDownload = buildNumber;
47
+ let buildNumberToDownload = build;
49
48
  if (!buildNumberToDownload) {
50
- const { data: projectBuildsResult } = await fetchProjectBuilds(accountId, projectName);
49
+ const { data: projectBuildsResult } = await fetchProjectBuilds(derivedAccountId, projectName);
51
50
  const { results: projectBuilds } = projectBuildsResult;
52
51
  if (projectBuilds && projectBuilds.length) {
53
52
  const latestBuild = projectBuilds[0];
54
53
  buildNumberToDownload = latestBuild.buildId;
55
54
  }
56
55
  }
57
- const { data: zippedProject } = await downloadProject(accountId, projectName, buildNumberToDownload);
56
+ const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, buildNumberToDownload);
58
57
  await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: false });
59
58
  logger.log(i18n(`${i18nKey}.logs.downloadSucceeded`, {
60
59
  buildId: buildNumberToDownload,
@@ -63,11 +62,16 @@ exports.handler = async (options) => {
63
62
  process.exit(EXIT_CODES.SUCCESS);
64
63
  }
65
64
  catch (e) {
66
- logError(e, new ApiErrorContext({ accountId, request: 'project download' }));
65
+ logError(e, new ApiErrorContext({
66
+ accountId: derivedAccountId,
67
+ request: 'project download',
68
+ }));
67
69
  process.exit(EXIT_CODES.ERROR);
68
70
  }
69
71
  };
70
72
  exports.builder = yargs => {
73
+ addAccountOptions(yargs);
74
+ addConfigOptions(yargs);
71
75
  addUseEnvironmentOptions(yargs);
72
76
  yargs.options({
73
77
  project: {
@@ -78,8 +82,9 @@ exports.builder = yargs => {
78
82
  describe: i18n(`${i18nKey}.options.dest.describe`),
79
83
  type: 'string',
80
84
  },
81
- buildNumber: {
82
- describe: i18n(`${i18nKey}.options.buildNumber.describe`),
85
+ build: {
86
+ describe: i18n(`${i18nKey}.options.build.describe`),
87
+ alias: ['build-id'],
83
88
  type: 'number',
84
89
  },
85
90
  });
@@ -1,15 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const path = require('path');
5
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
4
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
6
5
  const { trackCommandUsage } = require('../../lib/usageTracking');
7
6
  const { i18n } = require('../../lib/lang');
8
7
  const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
9
8
  const { logger } = require('@hubspot/local-dev-lib/logger');
10
9
  const { fetchProject, fetchProjectBuilds, } = require('@hubspot/local-dev-lib/api/projects');
11
10
  const { getTableContents, getTableHeader } = require('../../lib/ui/table');
12
- const { getCwd } = require('@hubspot/local-dev-lib/path');
13
11
  const { uiBetaTag, uiLink } = require('../../lib/ui');
14
12
  const { loadAndValidateOptions } = require('../../lib/validation');
15
13
  const { getProjectConfig, getProjectDetailUrl, validateProjectConfig, } = require('../../lib/projects');
@@ -17,29 +15,36 @@ const moment = require('moment');
17
15
  const { promptUser } = require('../../lib/prompts/promptUtils');
18
16
  const { isHubSpotHttpError } = require('@hubspot/local-dev-lib/errors/index');
19
17
  const i18nKey = 'commands.project.subcommands.listBuilds';
20
- exports.command = 'list-builds [path]';
18
+ exports.command = 'list-builds';
21
19
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
22
20
  exports.handler = async (options) => {
23
21
  await loadAndValidateOptions(options);
24
- const { path: projectPath, limit } = options;
25
- const accountId = getAccountId(options);
26
- trackCommandUsage('project-list-builds', null, accountId);
27
- const cwd = projectPath ? path.resolve(getCwd(), projectPath) : getCwd();
28
- const { projectConfig, projectDir } = await getProjectConfig(cwd);
29
- validateProjectConfig(projectConfig, projectDir);
30
- logger.debug(`Fetching builds for project at path: ${projectPath}`);
22
+ const { project: projectFlagValue, limit, derivedAccountId } = options;
23
+ trackCommandUsage('project-list-builds', null, derivedAccountId);
24
+ let projectName = projectFlagValue;
25
+ if (!projectName) {
26
+ const { projectConfig, projectDir } = await getProjectConfig();
27
+ validateProjectConfig(projectConfig, projectDir);
28
+ projectName = projectConfig.name;
29
+ }
31
30
  const fetchAndDisplayBuilds = async (project, options) => {
32
- const { data: { results, paging }, } = await fetchProjectBuilds(accountId, project.name, options);
31
+ const { data: { results, paging }, } = await fetchProjectBuilds(derivedAccountId, project.name, options);
33
32
  const currentDeploy = project.deployedBuildId;
34
33
  if (options && options.after) {
35
- logger.log(`Showing the next ${results.length} builds for ${project.name}`);
34
+ logger.log(i18n(`${i18nKey}.logs.showingNextBuilds`, {
35
+ count: results.length,
36
+ projectName: project.name,
37
+ }));
36
38
  }
37
39
  else {
38
- logger.log(`Showing the ${results.length} most recent builds for ${project.name}. ` +
39
- uiLink('View all builds in project details.', getProjectDetailUrl(project.name, accountId)));
40
+ logger.log(i18n(`${i18nKey}.logs.showingRecentBuilds`, {
41
+ count: results.length,
42
+ projectName: project.name,
43
+ viewBuildsLink: uiLink(i18n(`${i18nKey}.logs.viewAllBuildsLink`), getProjectDetailUrl(project.name, derivedAccountId)),
44
+ }));
40
45
  }
41
46
  if (results.length === 0) {
42
- logger.log('No builds found.');
47
+ logger.log(i18n(`${i18nKey}.errors.noBuilds`));
43
48
  }
44
49
  else {
45
50
  const builds = results.map(build => {
@@ -75,40 +80,40 @@ exports.handler = async (options) => {
75
80
  if (paging && paging.next) {
76
81
  await promptUser({
77
82
  name: 'more',
78
- message: 'Press <enter> to load more, or ctrl+c to exit',
83
+ message: i18n(`${i18nKey}.continueOrExitPrompt`),
79
84
  });
80
85
  await fetchAndDisplayBuilds(project, { limit, after: paging.next.after });
81
86
  }
82
87
  };
83
88
  try {
84
- const { data: project } = await fetchProject(accountId, projectConfig.name);
89
+ const { data: project } = await fetchProject(derivedAccountId, projectName);
85
90
  await fetchAndDisplayBuilds(project, { limit });
86
91
  }
87
92
  catch (e) {
88
93
  if (isHubSpotHttpError(e) && e.status === 404) {
89
- logger.error(`Project ${projectConfig.name} not found. `);
94
+ logger.error(i18n(`${i18nKey}.errors.projectNotFound`, { projectName }));
90
95
  }
91
96
  else {
92
- logError(e, new ApiErrorContext({ accountId, projectName: projectConfig.name }));
97
+ logError(e, new ApiErrorContext({
98
+ accountId: derivedAccountId,
99
+ projectName,
100
+ }));
93
101
  }
94
102
  }
95
103
  };
96
104
  exports.builder = yargs => {
97
- yargs.positional('path', {
98
- describe: 'Path to a project folder',
99
- type: 'string',
100
- });
101
105
  yargs.options({
106
+ project: {
107
+ describe: i18n(`${i18nKey}.options.project.describe`),
108
+ type: 'string',
109
+ },
102
110
  limit: {
103
- describe: 'Max number of builds to load',
111
+ describe: i18n(`${i18nKey}.options.limit.describe`),
104
112
  type: 'string',
105
113
  },
106
114
  });
107
115
  yargs.example([
108
- [
109
- '$0 project list-builds myProjectFolder',
110
- 'Fetch a list of builds for a project within the myProjectFolder folder',
111
- ],
116
+ ['$0 project list-builds', i18n(`${i18nKey}.examples.default`)],
112
117
  ]);
113
118
  addConfigOptions(yargs);
114
119
  addAccountOptions(yargs);
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const { getEnv } = require('@hubspot/local-dev-lib/config');
5
5
  const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
6
6
  const { ENVIRONMENTS, } = require('@hubspot/local-dev-lib/constants/environments');
7
- const { getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
7
+ const { addUseEnvironmentOptions } = require('../../lib/commonOpts');
8
8
  const { trackCommandUsage } = require('../../lib/usageTracking');
9
9
  const { logger } = require('@hubspot/local-dev-lib/logger');
10
10
  const { getTableContents, getTableHeader } = require('../../lib/ui/table');
@@ -50,11 +50,11 @@ function logPreamble() {
50
50
  exports.command = 'logs';
51
51
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
52
52
  exports.handler = async (options) => {
53
- const accountId = getAccountId(options);
54
- trackCommandUsage('project-logs', null, accountId);
53
+ const { derivedAccountId } = options;
54
+ trackCommandUsage('project-logs', null, derivedAccountId);
55
55
  await loadAndValidateOptions(options);
56
56
  try {
57
- await ProjectLogsManager.init(accountId);
57
+ await ProjectLogsManager.init(derivedAccountId);
58
58
  const { functionName } = await projectLogsPrompt({
59
59
  functionChoices: ProjectLogsManager.getFunctionNames(),
60
60
  promptOptions: options,
@@ -65,7 +65,7 @@ exports.handler = async (options) => {
65
65
  }
66
66
  catch (e) {
67
67
  logError(e, {
68
- accountId,
68
+ accountId: derivedAccountId,
69
69
  projectName: ProjectLogsManager.projectName,
70
70
  });
71
71
  return process.exit(EXIT_CODES.ERROR);