@hubspot/cli 6.4.0 → 7.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/bin/cli.js +110 -16
  2. package/bin/hs +2 -0
  3. package/bin/hscms +2 -0
  4. package/bin/silenceErrors.d.ts +2 -0
  5. package/bin/silenceErrors.js +12 -0
  6. package/commands/{accounts → account}/clean.js +10 -11
  7. package/commands/{accounts → account}/info.js +10 -16
  8. package/commands/{accounts → account}/list.js +16 -16
  9. package/commands/{accounts → account}/remove.js +12 -15
  10. package/commands/{accounts → account}/rename.js +4 -7
  11. package/commands/{accounts → account}/use.js +8 -14
  12. package/commands/account.js +26 -0
  13. package/commands/auth.js +30 -24
  14. package/commands/cms/getReactModule.js +70 -0
  15. package/commands/cms/lighthouseScore.js +19 -21
  16. package/commands/cms.js +4 -3
  17. package/commands/completion.js +22 -0
  18. package/commands/config/set.js +22 -24
  19. package/commands/config.js +2 -2
  20. package/commands/create.js +6 -3
  21. package/commands/customObject/create.js +19 -15
  22. package/commands/customObject/schema/create.js +15 -16
  23. package/commands/customObject/schema/delete.js +29 -11
  24. package/commands/customObject/schema/fetch-all.js +14 -11
  25. package/commands/customObject/schema/fetch.js +22 -14
  26. package/commands/customObject/schema/list.js +3 -6
  27. package/commands/customObject/schema/update.js +28 -18
  28. package/commands/customObject/schema.js +1 -1
  29. package/commands/customObject.js +3 -4
  30. package/commands/doctor.js +4 -2
  31. package/commands/feedback.js +2 -0
  32. package/commands/fetch.js +13 -13
  33. package/commands/filemanager/fetch.js +6 -7
  34. package/commands/filemanager/upload.js +10 -12
  35. package/commands/filemanager.js +1 -8
  36. package/commands/{functions → function}/deploy.js +13 -13
  37. package/commands/{functions → function}/list.js +7 -9
  38. package/commands/{functions → function}/server.js +5 -8
  39. package/commands/function.js +16 -0
  40. package/commands/hubdb/clear.js +14 -10
  41. package/commands/hubdb/create.js +37 -13
  42. package/commands/hubdb/delete.js +31 -10
  43. package/commands/hubdb/fetch.js +14 -9
  44. package/commands/hubdb.js +2 -3
  45. package/commands/init.js +37 -14
  46. package/commands/lint.js +6 -7
  47. package/commands/list.js +5 -7
  48. package/commands/logs.js +24 -15
  49. package/commands/module/marketplace-validate.js +6 -9
  50. package/commands/module.js +2 -1
  51. package/commands/mv.js +11 -13
  52. package/commands/open.js +11 -10
  53. package/commands/project/add.js +2 -5
  54. package/commands/project/cloneApp.js +28 -32
  55. package/commands/project/create.js +8 -10
  56. package/commands/project/deploy.js +19 -16
  57. package/commands/project/dev.js +17 -18
  58. package/commands/project/download.js +18 -15
  59. package/commands/project/listBuilds.js +36 -32
  60. package/commands/project/logs.js +6 -8
  61. package/commands/project/migrateApp.js +27 -27
  62. package/commands/project/open.js +9 -11
  63. package/commands/project/upload.js +30 -32
  64. package/commands/project/watch.js +17 -24
  65. package/commands/project.js +3 -4
  66. package/commands/remove.js +14 -13
  67. package/commands/sandbox/create.js +12 -15
  68. package/commands/sandbox/delete.js +19 -20
  69. package/commands/sandbox.js +4 -8
  70. package/commands/{secrets → secret}/addSecret.js +25 -12
  71. package/commands/secret/deleteSecret.js +71 -0
  72. package/commands/{secrets → secret}/listSecrets.js +7 -9
  73. package/commands/{secrets → secret}/updateSecret.js +21 -13
  74. package/commands/secret.js +22 -0
  75. package/commands/theme/generate-selectors.js +8 -8
  76. package/commands/theme/marketplace-validate.js +10 -13
  77. package/commands/theme/preview.js +7 -10
  78. package/commands/theme.js +3 -1
  79. package/commands/upload.js +32 -26
  80. package/commands/watch.js +19 -20
  81. package/lang/en.lyaml +200 -126
  82. package/lib/DevServerManager.js +1 -1
  83. package/lib/LocalDevManager.js +4 -4
  84. package/lib/buildAccount.js +5 -11
  85. package/lib/commonOpts.d.ts +15 -6
  86. package/lib/commonOpts.js +53 -39
  87. package/lib/configOptions.d.ts +13 -1
  88. package/lib/configOptions.js +54 -57
  89. package/lib/constants.d.ts +1 -4
  90. package/lib/dependencyManagement.d.ts +4 -1
  91. package/lib/dependencyManagement.js +2 -2
  92. package/lib/developerTestAccounts.d.ts +5 -1
  93. package/lib/developerTestAccounts.js +45 -39
  94. package/lib/doctor/DiagnosticInfoBuilder.js +8 -4
  95. package/lib/doctor/Doctor.js +11 -6
  96. package/lib/generateSelectors.d.ts +19 -0
  97. package/lib/generateSelectors.js +23 -23
  98. package/lib/localDev.js +3 -2
  99. package/lib/marketplaceValidate.d.ts +6 -1
  100. package/lib/marketplaceValidate.js +76 -77
  101. package/lib/oauth.d.ts +2 -1
  102. package/lib/oauth.js +49 -37
  103. package/lib/polling.d.ts +8 -0
  104. package/lib/polling.js +9 -12
  105. package/lib/projects/ProjectLogsManager.d.ts +20 -0
  106. package/lib/projects/ProjectLogsManager.js +105 -0
  107. package/lib/projects/buildAndDeploy.d.ts +16 -0
  108. package/lib/projects/buildAndDeploy.js +342 -0
  109. package/lib/projects/index.d.ts +24 -0
  110. package/lib/projects/index.js +256 -0
  111. package/lib/projects/structure.d.ts +78 -0
  112. package/lib/projects/structure.js +151 -0
  113. package/lib/projects/upload.d.ts +8 -0
  114. package/lib/projects/upload.js +107 -0
  115. package/lib/projects/urls.d.ts +4 -0
  116. package/lib/projects/urls.js +27 -0
  117. package/lib/{projectsWatch.js → projects/watch.js} +3 -3
  118. package/lib/prompts/accountNamePrompt.d.ts +11 -0
  119. package/lib/prompts/accountNamePrompt.js +45 -46
  120. package/lib/prompts/accountsPrompt.d.ts +1 -1
  121. package/lib/prompts/accountsPrompt.js +21 -19
  122. package/lib/prompts/cmsFieldPrompt.d.ts +1 -1
  123. package/lib/prompts/cmsFieldPrompt.js +23 -24
  124. package/lib/prompts/createApiSamplePrompt.d.ts +17 -0
  125. package/lib/prompts/createApiSamplePrompt.js +47 -44
  126. package/lib/prompts/createFunctionPrompt.d.ts +7 -0
  127. package/lib/prompts/createFunctionPrompt.js +17 -20
  128. package/lib/prompts/createModulePrompt.d.ts +8 -0
  129. package/lib/prompts/createModulePrompt.js +29 -17
  130. package/lib/prompts/createProjectPrompt.d.ts +13 -0
  131. package/lib/prompts/createProjectPrompt.js +48 -49
  132. package/lib/prompts/createTemplatePrompt.d.ts +8 -0
  133. package/lib/prompts/createTemplatePrompt.js +15 -17
  134. package/lib/prompts/downloadProjectPrompt.d.ts +8 -0
  135. package/lib/prompts/downloadProjectPrompt.js +25 -23
  136. package/lib/prompts/installPublicAppPrompt.d.ts +1 -1
  137. package/lib/prompts/installPublicAppPrompt.js +21 -19
  138. package/lib/prompts/personalAccessKeyPrompt.d.ts +28 -0
  139. package/lib/prompts/personalAccessKeyPrompt.js +46 -52
  140. package/lib/prompts/previewPrompt.d.ts +14 -0
  141. package/lib/prompts/previewPrompt.js +24 -24
  142. package/lib/prompts/projectAddPrompt.d.ts +9 -0
  143. package/lib/prompts/projectAddPrompt.js +11 -14
  144. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
  145. package/lib/prompts/projectDevTargetAccountPrompt.js +87 -69
  146. package/lib/prompts/projectsLogsPrompt.d.ts +11 -0
  147. package/lib/prompts/projectsLogsPrompt.js +8 -11
  148. package/lib/prompts/promptUtils.d.ts +7 -6
  149. package/lib/prompts/promptUtils.js +21 -8
  150. package/lib/prompts/sandboxesPrompt.d.ts +8 -0
  151. package/lib/prompts/sandboxesPrompt.js +43 -45
  152. package/lib/prompts/secretPrompt.d.ts +12 -0
  153. package/lib/prompts/secretPrompt.js +32 -19
  154. package/lib/prompts/selectHubDBTablePrompt.d.ts +12 -0
  155. package/lib/prompts/selectHubDBTablePrompt.js +69 -0
  156. package/lib/prompts/selectPublicAppPrompt.d.ts +8 -0
  157. package/lib/prompts/selectPublicAppPrompt.js +28 -27
  158. package/lib/prompts/setAsDefaultAccountPrompt.d.ts +1 -1
  159. package/lib/prompts/setAsDefaultAccountPrompt.js +12 -14
  160. package/lib/prompts/uploadPrompt.d.ts +8 -0
  161. package/lib/prompts/uploadPrompt.js +18 -18
  162. package/lib/sandboxSync.js +5 -2
  163. package/lib/sandboxes.js +12 -7
  164. package/lib/ui/index.d.ts +1 -1
  165. package/lib/ui/index.js +1 -1
  166. package/lib/usageTracking.d.ts +21 -2
  167. package/lib/usageTracking.js +53 -81
  168. package/lib/validation.d.ts +11 -1
  169. package/lib/validation.js +98 -91
  170. package/package.json +12 -6
  171. package/types/Projects.d.ts +43 -0
  172. package/types/Projects.js +2 -0
  173. package/types/Prompts.d.ts +25 -0
  174. package/types/Prompts.js +2 -0
  175. package/commands/accounts.js +0 -30
  176. package/commands/cms/reactModules.js +0 -60
  177. package/commands/functions.js +0 -24
  178. package/commands/secrets/deleteSecret.js +0 -46
  179. package/commands/secrets.js +0 -23
  180. package/lib/ProjectLogsManager.js +0 -91
  181. package/lib/projectStructure.js +0 -116
  182. package/lib/projects.d.ts +0 -4
  183. package/lib/projects.js +0 -681
  184. package/lib/projectsWatch.d.ts +0 -1
  185. package/lib/prompts/cleanUploadPrompt.d.ts +0 -1
  186. package/lib/prompts/cleanUploadPrompt.js +0 -20
  187. /package/commands/{accounts → account}/clean.d.ts +0 -0
  188. /package/commands/{accounts → account}/info.d.ts +0 -0
  189. /package/commands/{accounts → account}/list.d.ts +0 -0
  190. /package/commands/{accounts → account}/remove.d.ts +0 -0
  191. /package/commands/{accounts → account}/rename.d.ts +0 -0
  192. /package/commands/{accounts → account}/use.d.ts +0 -0
  193. /package/commands/{accounts.d.ts → account.d.ts} +0 -0
  194. /package/commands/cms/{reactModules.d.ts → getReactModule.d.ts} +0 -0
  195. /package/commands/{functions.d.ts → completion.d.ts} +0 -0
  196. /package/commands/{functions/list.d.ts → function/deploy.d.ts} +0 -0
  197. /package/commands/{functions/server.d.ts → function/list.d.ts} +0 -0
  198. /package/commands/{secrets.d.ts → function/server.d.ts} +0 -0
  199. /package/commands/{functions/deploy.d.ts → function.d.ts} +0 -0
  200. /package/commands/{secrets/deleteSecret.d.ts → secret/addSecret.d.ts} +0 -0
  201. /package/commands/{secrets/listSecrets.d.ts → secret/deleteSecret.d.ts} +0 -0
  202. /package/commands/{secrets/updateSecret.d.ts → secret/listSecrets.d.ts} +0 -0
  203. /package/{lib/ProjectLogsManager.d.ts → commands/secret/updateSecret.d.ts} +0 -0
  204. /package/commands/{secrets/addSecret.d.ts → secret.d.ts} +0 -0
  205. /package/lib/{projectStructure.d.ts → projects/watch.d.ts} +0 -0
@@ -1,9 +1,8 @@
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
- const { loadAndValidateOptions } = require('../../lib/validation');
7
6
  const { handleExit } = require('../../lib/process');
8
7
  const { i18n } = require('../../lib/lang');
9
8
  const { logger } = require('@hubspot/local-dev-lib/logger');
@@ -15,17 +14,16 @@ const SpinniesManager = require('../../lib/ui/SpinniesManager');
15
14
  const LocalDevManager = require('../../lib/LocalDevManager');
16
15
  const { isSandbox, isDeveloperTestAccount, isStandardAccount, isAppDeveloperAccount, } = require('../../lib/accountTypes');
17
16
  const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
18
- const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, } = require('../../lib/projectStructure');
17
+ const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, } = require('../../lib/projects/structure');
19
18
  const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, createNewProjectForLocalDev, createInitialBuildForNewProject, useExistingDevTestAccount, checkIfAccountFlagIsSupported, checkIfParentAccountIsAuthed, } = require('../../lib/localDev');
20
19
  const i18nKey = 'commands.project.subcommands.dev';
21
- exports.command = 'dev [--account]';
20
+ exports.command = 'dev';
22
21
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
23
22
  exports.handler = async (options) => {
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);
23
+ const { derivedAccountId, providedAccountId } = options;
24
+ const accountConfig = getAccountConfig(derivedAccountId);
25
+ const env = getValidEnv(getEnv(derivedAccountId));
26
+ trackCommandUsage('project-dev', null, derivedAccountId);
29
27
  const { projectConfig, projectDir } = await getProjectConfig();
30
28
  uiBetaTag(i18n(`${i18nKey}.logs.betaMessage`));
31
29
  logger.log(uiLink(i18n(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
@@ -53,12 +51,13 @@ exports.handler = async (options) => {
53
51
  const accounts = getConfigAccounts();
54
52
  const defaultAccountIsRecommendedType = isDeveloperTestAccount(accountConfig) ||
55
53
  (!hasPublicApps && isSandbox(accountConfig));
56
- // The account that the project must exist in
57
- let targetProjectAccountId = options.account ? accountId : null;
54
+ // targetProjectAccountId and targetTestingAccountId are set to null if --account flag is not provided.
55
+ // By setting them to null, we can later check if they need to be assigned based on the default account configuration and the type of app.
56
+ let targetProjectAccountId = providedAccountId ? derivedAccountId : null;
58
57
  // The account that we are locally testing against
59
- let targetTestingAccountId = options.account ? accountId : null;
58
+ let targetTestingAccountId = providedAccountId ? derivedAccountId : null;
60
59
  // Check that the default account or flag option is valid for the type of app in this project
61
- if (options.account) {
60
+ if (providedAccountId) {
62
61
  checkIfAccountFlagIsSupported(accountConfig, hasPublicApps);
63
62
  if (hasPublicApps) {
64
63
  targetProjectAccountId = accountConfig.parentAccountId;
@@ -69,14 +68,14 @@ exports.handler = async (options) => {
69
68
  }
70
69
  // The user is targeting an account type that we recommend developing on
71
70
  if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
72
- targetTestingAccountId = accountId;
71
+ targetTestingAccountId = derivedAccountId;
73
72
  await confirmDefaultAccountIsTarget(accountConfig, hasPublicApps);
74
73
  if (hasPublicApps) {
75
74
  checkIfParentAccountIsAuthed(accountConfig);
76
75
  targetProjectAccountId = accountConfig.parentAccountId;
77
76
  }
78
77
  else {
79
- targetProjectAccountId = accountId;
78
+ targetProjectAccountId = derivedAccountId;
80
79
  }
81
80
  }
82
81
  let createNewSandbox = false;
@@ -94,13 +93,13 @@ exports.handler = async (options) => {
94
93
  isAppDeveloperAccount(accountConfig) && createNestedAccount;
95
94
  }
96
95
  if (createNewSandbox) {
97
- targetProjectAccountId = await createSandboxForLocalDev(accountId, accountConfig, env);
96
+ targetProjectAccountId = await createSandboxForLocalDev(derivedAccountId, accountConfig, env);
98
97
  // We will be running our tests against this new sandbox account
99
98
  targetTestingAccountId = targetProjectAccountId;
100
99
  }
101
100
  if (createNewDeveloperTestAccount) {
102
- targetTestingAccountId = await createDeveloperTestAccountForLocalDev(accountId, accountConfig, env);
103
- targetProjectAccountId = accountId;
101
+ targetTestingAccountId = await createDeveloperTestAccountForLocalDev(derivedAccountId, accountConfig, env);
102
+ targetProjectAccountId = derivedAccountId;
104
103
  }
105
104
  // eslint-disable-next-line prefer-const
106
105
  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');
@@ -11,50 +11,47 @@ const { logger } = require('@hubspot/local-dev-lib/logger');
11
11
  const { extractZipArchive } = require('@hubspot/local-dev-lib/archive');
12
12
  const { downloadProject, fetchProjectBuilds, } = require('@hubspot/local-dev-lib/api/projects');
13
13
  const { ensureProjectExists, getProjectConfig } = require('../../lib/projects');
14
- const { loadAndValidateOptions } = require('../../lib/validation');
15
14
  const { downloadProjectPrompt, } = require('../../lib/prompts/downloadProjectPrompt');
16
15
  const { i18n } = require('../../lib/lang');
17
16
  const { uiBetaTag } = require('../../lib/ui');
18
17
  const i18nKey = 'commands.project.subcommands.download';
19
18
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
20
- exports.command = 'download [--project]';
19
+ exports.command = 'download';
21
20
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
22
21
  exports.handler = async (options) => {
23
- await loadAndValidateOptions(options);
24
22
  const { projectConfig } = await getProjectConfig();
25
23
  if (projectConfig) {
26
24
  logger.error(i18n(`${i18nKey}.warnings.cannotDownloadWithinProject`));
27
25
  process.exit(EXIT_CODES.ERROR);
28
26
  }
29
- const { project, dest, buildNumber } = options;
27
+ const { project, dest, build, derivedAccountId } = options;
30
28
  const { project: promptedProjectName } = await downloadProjectPrompt(options);
31
29
  let projectName = promptedProjectName || project;
32
- const accountId = getAccountId(options);
33
- trackCommandUsage('project-download', null, accountId);
30
+ trackCommandUsage('project-download', null, derivedAccountId);
34
31
  try {
35
- const { projectExists } = await ensureProjectExists(accountId, projectName, {
32
+ const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
36
33
  allowCreate: false,
37
34
  noLogs: true,
38
35
  });
39
36
  if (!projectExists) {
40
37
  logger.error(i18n(`${i18nKey}.errors.projectNotFound`, {
41
38
  projectName: chalk.bold(projectName),
42
- accountId: chalk.bold(accountId),
39
+ accountId: chalk.bold(derivedAccountId),
43
40
  }));
44
41
  const { name: promptedProjectName } = await downloadProjectPrompt(options);
45
42
  projectName = promptedProjectName || project;
46
43
  }
47
44
  const absoluteDestPath = dest ? path.resolve(getCwd(), dest) : getCwd();
48
- let buildNumberToDownload = buildNumber;
45
+ let buildNumberToDownload = build;
49
46
  if (!buildNumberToDownload) {
50
- const { data: projectBuildsResult } = await fetchProjectBuilds(accountId, projectName);
47
+ const { data: projectBuildsResult } = await fetchProjectBuilds(derivedAccountId, projectName);
51
48
  const { results: projectBuilds } = projectBuildsResult;
52
49
  if (projectBuilds && projectBuilds.length) {
53
50
  const latestBuild = projectBuilds[0];
54
51
  buildNumberToDownload = latestBuild.buildId;
55
52
  }
56
53
  }
57
- const { data: zippedProject } = await downloadProject(accountId, projectName, buildNumberToDownload);
54
+ const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, buildNumberToDownload);
58
55
  await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: false });
59
56
  logger.log(i18n(`${i18nKey}.logs.downloadSucceeded`, {
60
57
  buildId: buildNumberToDownload,
@@ -63,11 +60,16 @@ exports.handler = async (options) => {
63
60
  process.exit(EXIT_CODES.SUCCESS);
64
61
  }
65
62
  catch (e) {
66
- logError(e, new ApiErrorContext({ accountId, request: 'project download' }));
63
+ logError(e, new ApiErrorContext({
64
+ accountId: derivedAccountId,
65
+ request: 'project download',
66
+ }));
67
67
  process.exit(EXIT_CODES.ERROR);
68
68
  }
69
69
  };
70
70
  exports.builder = yargs => {
71
+ addAccountOptions(yargs);
72
+ addConfigOptions(yargs);
71
73
  addUseEnvironmentOptions(yargs);
72
74
  yargs.options({
73
75
  project: {
@@ -78,8 +80,9 @@ exports.builder = yargs => {
78
80
  describe: i18n(`${i18nKey}.options.dest.describe`),
79
81
  type: 'string',
80
82
  },
81
- buildNumber: {
82
- describe: i18n(`${i18nKey}.options.buildNumber.describe`),
83
+ build: {
84
+ describe: i18n(`${i18nKey}.options.build.describe`),
85
+ alias: ['build-id'],
83
86
  type: 'number',
84
87
  },
85
88
  });
@@ -1,45 +1,49 @@
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
- const { loadAndValidateOptions } = require('../../lib/validation');
15
- const { getProjectConfig, getProjectDetailUrl, validateProjectConfig, } = require('../../lib/projects');
12
+ const { getProjectConfig, validateProjectConfig, } = require('../../lib/projects');
13
+ const { getProjectDetailUrl } = require('../../lib/projects/urls');
16
14
  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
- 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}`);
21
+ const { project: projectFlagValue, limit, derivedAccountId } = options;
22
+ trackCommandUsage('project-list-builds', null, derivedAccountId);
23
+ let projectName = projectFlagValue;
24
+ if (!projectName) {
25
+ const { projectConfig, projectDir } = await getProjectConfig();
26
+ validateProjectConfig(projectConfig, projectDir);
27
+ projectName = projectConfig.name;
28
+ }
31
29
  const fetchAndDisplayBuilds = async (project, options) => {
32
- const { data: { results, paging }, } = await fetchProjectBuilds(accountId, project.name, options);
30
+ const { data: { results, paging }, } = await fetchProjectBuilds(derivedAccountId, project.name, options);
33
31
  const currentDeploy = project.deployedBuildId;
34
32
  if (options && options.after) {
35
- logger.log(`Showing the next ${results.length} builds for ${project.name}`);
33
+ logger.log(i18n(`${i18nKey}.logs.showingNextBuilds`, {
34
+ count: results.length,
35
+ projectName: project.name,
36
+ }));
36
37
  }
37
38
  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)));
39
+ logger.log(i18n(`${i18nKey}.logs.showingRecentBuilds`, {
40
+ count: results.length,
41
+ projectName: project.name,
42
+ viewBuildsLink: uiLink(i18n(`${i18nKey}.logs.viewAllBuildsLink`), getProjectDetailUrl(project.name, derivedAccountId)),
43
+ }));
40
44
  }
41
45
  if (results.length === 0) {
42
- logger.log('No builds found.');
46
+ logger.log(i18n(`${i18nKey}.errors.noBuilds`));
43
47
  }
44
48
  else {
45
49
  const builds = results.map(build => {
@@ -75,40 +79,40 @@ exports.handler = async (options) => {
75
79
  if (paging && paging.next) {
76
80
  await promptUser({
77
81
  name: 'more',
78
- message: 'Press <enter> to load more, or ctrl+c to exit',
82
+ message: i18n(`${i18nKey}.continueOrExitPrompt`),
79
83
  });
80
84
  await fetchAndDisplayBuilds(project, { limit, after: paging.next.after });
81
85
  }
82
86
  };
83
87
  try {
84
- const { data: project } = await fetchProject(accountId, projectConfig.name);
88
+ const { data: project } = await fetchProject(derivedAccountId, projectName);
85
89
  await fetchAndDisplayBuilds(project, { limit });
86
90
  }
87
91
  catch (e) {
88
92
  if (isHubSpotHttpError(e) && e.status === 404) {
89
- logger.error(`Project ${projectConfig.name} not found. `);
93
+ logger.error(i18n(`${i18nKey}.errors.projectNotFound`, { projectName }));
90
94
  }
91
95
  else {
92
- logError(e, new ApiErrorContext({ accountId, projectName: projectConfig.name }));
96
+ logError(e, new ApiErrorContext({
97
+ accountId: derivedAccountId,
98
+ projectName,
99
+ }));
93
100
  }
94
101
  }
95
102
  };
96
103
  exports.builder = yargs => {
97
- yargs.positional('path', {
98
- describe: 'Path to a project folder',
99
- type: 'string',
100
- });
101
104
  yargs.options({
105
+ project: {
106
+ describe: i18n(`${i18nKey}.options.project.describe`),
107
+ type: 'string',
108
+ },
102
109
  limit: {
103
- describe: 'Max number of builds to load',
110
+ describe: i18n(`${i18nKey}.options.limit.describe`),
104
111
  type: 'string',
105
112
  },
106
113
  });
107
114
  yargs.example([
108
- [
109
- '$0 project list-builds myProjectFolder',
110
- 'Fetch a list of builds for a project within the myProjectFolder folder',
111
- ],
115
+ ['$0 project list-builds', i18n(`${i18nKey}.examples.default`)],
112
116
  ]);
113
117
  addConfigOptions(yargs);
114
118
  addAccountOptions(yargs);
@@ -4,17 +4,16 @@ 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');
11
11
  const { logError } = require('../../lib/errorHandlers/');
12
- const { loadAndValidateOptions } = require('../../lib/validation');
13
12
  const { uiBetaTag, uiLine, uiLink } = require('../../lib/ui');
14
13
  const { projectLogsPrompt } = require('../../lib/prompts/projectsLogsPrompt');
15
14
  const { i18n } = require('../../lib/lang');
16
15
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
17
- const ProjectLogsManager = require('../../lib/ProjectLogsManager');
16
+ const { ProjectLogsManager } = require('../../lib/projects/ProjectLogsManager');
18
17
  const i18nKey = 'commands.project.subcommands.logs';
19
18
  const getPrivateAppsUrl = accountId => {
20
19
  const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
@@ -50,11 +49,10 @@ function logPreamble() {
50
49
  exports.command = 'logs';
51
50
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
52
51
  exports.handler = async (options) => {
53
- const accountId = getAccountId(options);
54
- trackCommandUsage('project-logs', null, accountId);
55
- await loadAndValidateOptions(options);
52
+ const { derivedAccountId } = options;
53
+ trackCommandUsage('project-logs', null, derivedAccountId);
56
54
  try {
57
- await ProjectLogsManager.init(accountId);
55
+ await ProjectLogsManager.init(derivedAccountId);
58
56
  const { functionName } = await projectLogsPrompt({
59
57
  functionChoices: ProjectLogsManager.getFunctionNames(),
60
58
  promptOptions: options,
@@ -65,7 +63,7 @@ exports.handler = async (options) => {
65
63
  }
66
64
  catch (e) {
67
65
  logError(e, {
68
- accountId,
66
+ accountId: derivedAccountId,
69
67
  projectName: ProjectLogsManager.projectName,
70
68
  });
71
69
  return process.exit(EXIT_CODES.ERROR);
@@ -2,9 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const path = require('path');
5
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
5
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
6
6
  const { trackCommandUsage, trackCommandMetadataUsage, } = require('../../lib/usageTracking');
7
- const { loadAndValidateOptions } = require('../../lib/validation');
8
7
  const { createProjectPrompt, } = require('../../lib/prompts/createProjectPrompt');
9
8
  const { i18n } = require('../../lib/lang');
10
9
  const { selectPublicAppPrompt, } = require('../../lib/prompts/selectPublicAppPrompt');
@@ -29,11 +28,10 @@ const i18nKey = 'commands.project.subcommands.migrateApp';
29
28
  exports.command = 'migrate-app';
30
29
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
31
30
  exports.handler = async (options) => {
32
- await loadAndValidateOptions(options);
33
- const accountId = getAccountId(options);
34
- const accountConfig = getAccountConfig(accountId);
35
- const accountName = uiAccountDescription(accountId);
36
- trackCommandUsage('migrate-app', {}, accountId);
31
+ const { derivedAccountId } = options;
32
+ const accountConfig = getAccountConfig(derivedAccountId);
33
+ const accountName = uiAccountDescription(derivedAccountId);
34
+ trackCommandUsage('migrate-app', {}, derivedAccountId);
37
35
  logger.log('');
38
36
  logger.log(uiBetaTag(i18n(`${i18nKey}.header.text`), false));
39
37
  logger.log(uiLink(i18n(`${i18nKey}.header.link`), 'https://developers.hubspot.com/docs/platform/migrate-a-public-app-to-projects'));
@@ -51,12 +49,12 @@ exports.handler = async (options) => {
51
49
  const { appId } = 'appId' in options
52
50
  ? options
53
51
  : await selectPublicAppPrompt({
54
- accountId,
52
+ accountId: derivedAccountId,
55
53
  accountName,
56
54
  isMigratingApp: true,
57
55
  });
58
56
  try {
59
- const { data: selectedApp } = await fetchPublicAppMetadata(appId, accountId);
57
+ const { data: selectedApp } = await fetchPublicAppMetadata(appId, derivedAccountId);
60
58
  // preventProjectMigrations returns true if we have not added app to allowlist config.
61
59
  // listingInfo will only exist for marketplace apps
62
60
  const preventProjectMigrations = selectedApp.preventProjectMigrations;
@@ -67,16 +65,16 @@ exports.handler = async (options) => {
67
65
  }
68
66
  }
69
67
  catch (error) {
70
- logError(error, new ApiErrorContext({ accountId }));
68
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
71
69
  process.exit(EXIT_CODES.ERROR);
72
70
  }
73
71
  let projectName;
74
- let projectLocation;
72
+ let projectDest;
75
73
  try {
76
- const { name, location } = await createProjectPrompt('', options, true);
74
+ const { name, dest } = await createProjectPrompt('', options, true);
77
75
  projectName = options.name || name;
78
- projectLocation = options.location || location;
79
- const { projectExists } = await ensureProjectExists(accountId, projectName, {
76
+ projectDest = options.dest || dest;
77
+ const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
80
78
  allowCreate: false,
81
79
  noLogs: true,
82
80
  });
@@ -88,9 +86,10 @@ exports.handler = async (options) => {
88
86
  }
89
87
  }
90
88
  catch (error) {
91
- logError(error, new ApiErrorContext({ accountId }));
89
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
92
90
  process.exit(EXIT_CODES.ERROR);
93
91
  }
92
+ await trackCommandMetadataUsage('migrate-app', { status: 'STARTED' }, derivedAccountId);
94
93
  logger.log('');
95
94
  uiLine();
96
95
  logger.warn(i18n(`${i18nKey}.warning.title`));
@@ -125,17 +124,16 @@ exports.handler = async (options) => {
125
124
  process.exit(EXIT_CODES.SUCCESS);
126
125
  }
127
126
  });
128
- const { data: migrateResponse } = await migrateApp(accountId, appId, projectName);
127
+ const { data: migrateResponse } = await migrateApp(derivedAccountId, appId, projectName);
129
128
  const { id } = migrateResponse;
130
- const pollResponse = await poll(checkMigrationStatus, accountId, id);
129
+ const pollResponse = await poll(checkMigrationStatus, derivedAccountId, id);
131
130
  const { status, project } = pollResponse;
132
131
  if (status === 'SUCCESS') {
133
- const absoluteDestPath = path.resolve(getCwd(), projectLocation);
134
- const { env } = getAccountConfig(accountId);
132
+ const absoluteDestPath = path.resolve(getCwd(), projectDest);
133
+ const { env } = accountConfig;
135
134
  const baseUrl = getHubSpotWebsiteOrigin(env);
136
- const { data: zippedProject } = await downloadProject(accountId, projectName, 1);
135
+ const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, 1);
137
136
  await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: true, hideLogs: true });
138
- trackCommandMetadataUsage('migrate-app', { type: projectName, assetType: appId, successful: status }, accountId);
139
137
  SpinniesManager.succeed('migrateApp', {
140
138
  text: i18n(`${i18nKey}.migrationStatus.done`),
141
139
  succeedColor: 'white',
@@ -144,12 +142,12 @@ exports.handler = async (options) => {
144
142
  uiLine();
145
143
  logger.success(i18n(`${i18nKey}.migrationStatus.success`));
146
144
  logger.log('');
147
- logger.log(uiLink(i18n(`${i18nKey}.projectDetailsLink`), `${baseUrl}/developer-projects/${accountId}/project/${encodeURIComponent(project.name)}`));
145
+ logger.log(uiLink(i18n(`${i18nKey}.projectDetailsLink`), `${baseUrl}/developer-projects/${derivedAccountId}/project/${encodeURIComponent(project.name)}`));
148
146
  process.exit(EXIT_CODES.SUCCESS);
149
147
  }
150
148
  }
151
149
  catch (error) {
152
- trackCommandMetadataUsage('migrate-app', { projectName, appId, status: 'FAILURE', error }, accountId);
150
+ await trackCommandMetadataUsage('migrate-app', { status: 'FAILURE' }, derivedAccountId);
153
151
  SpinniesManager.fail('migrateApp', {
154
152
  text: i18n(`${i18nKey}.migrationStatus.failure`),
155
153
  failColor: 'white',
@@ -158,10 +156,12 @@ exports.handler = async (options) => {
158
156
  error.errors.forEach(logError);
159
157
  }
160
158
  else {
161
- logError(error, new ApiErrorContext({ accountId }));
159
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
162
160
  }
163
161
  process.exit(EXIT_CODES.ERROR);
164
162
  }
163
+ await trackCommandMetadataUsage('migrate-app', { status: 'SUCCESS' }, derivedAccountId);
164
+ process.exit(EXIT_CODES.SUCCESS);
165
165
  };
166
166
  exports.builder = yargs => {
167
167
  yargs.options({
@@ -169,11 +169,11 @@ exports.builder = yargs => {
169
169
  describe: i18n(`${i18nKey}.options.name.describe`),
170
170
  type: 'string',
171
171
  },
172
- location: {
173
- describe: i18n(`${i18nKey}.options.location.describe`),
172
+ dest: {
173
+ describe: i18n(`${i18nKey}.options.dest.describe`),
174
174
  type: 'string',
175
175
  },
176
- appId: {
176
+ 'app-id': {
177
177
  describe: i18n(`${i18nKey}.options.appId.describe`),
178
178
  type: 'number',
179
179
  },
@@ -2,27 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const open = require('open');
5
- const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
5
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
6
6
  const { trackCommandUsage } = require('../../lib/usageTracking');
7
- const { loadAndValidateOptions } = require('../../lib/validation');
8
7
  const { i18n } = require('../../lib/lang');
9
8
  const { logger } = require('@hubspot/local-dev-lib/logger');
10
- const { getProjectConfig, getProjectDetailUrl, ensureProjectExists, } = require('../../lib/projects');
9
+ const { getProjectConfig, ensureProjectExists } = require('../../lib/projects');
10
+ const { getProjectDetailUrl } = require('../../lib/projects/urls');
11
11
  const { projectNamePrompt } = require('../../lib/prompts/projectNamePrompt');
12
12
  const { uiBetaTag } = require('../../lib/ui');
13
13
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
14
14
  const i18nKey = 'commands.project.subcommands.open';
15
- exports.command = 'open [--project]';
15
+ exports.command = 'open';
16
16
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
17
17
  exports.handler = async (options) => {
18
- await loadAndValidateOptions(options);
19
- const accountId = getAccountId(options);
20
- const { project } = options;
21
- trackCommandUsage('project-open', null, accountId);
18
+ const { project, derivedAccountId } = options;
19
+ trackCommandUsage('project-open', null, derivedAccountId);
22
20
  const { projectConfig } = await getProjectConfig();
23
21
  let projectName = project;
24
22
  if (projectName) {
25
- const { projectExists } = await ensureProjectExists(accountId, projectName, {
23
+ const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
26
24
  allowCreate: false,
27
25
  });
28
26
  if (!projectExists) {
@@ -33,13 +31,13 @@ exports.handler = async (options) => {
33
31
  projectName = projectConfig.name;
34
32
  }
35
33
  else if (!projectName && !projectConfig) {
36
- const namePrompt = await projectNamePrompt(accountId);
34
+ const namePrompt = await projectNamePrompt(derivedAccountId);
37
35
  if (!namePrompt.projectName) {
38
36
  process.exit(EXIT_CODES.ERROR);
39
37
  }
40
38
  projectName = namePrompt.projectName;
41
39
  }
42
- const url = getProjectDetailUrl(projectName, accountId);
40
+ const url = getProjectDetailUrl(projectName, derivedAccountId);
43
41
  open(url, { url: true });
44
42
  logger.success(i18n(`${i18nKey}.success`, { projectName }));
45
43
  process.exit(EXIT_CODES.SUCCESS);