@hubspot/cli 7.4.3-beta.0 → 7.4.4-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 (73) hide show
  1. package/api/migrate.d.ts +11 -2
  2. package/api/migrate.js +4 -0
  3. package/commands/app/migrate.d.ts +0 -1
  4. package/commands/app/migrate.js +15 -9
  5. package/commands/auth.js +9 -10
  6. package/commands/cms.js +1 -2
  7. package/commands/completion.js +2 -3
  8. package/commands/create.js +7 -8
  9. package/commands/customObject.js +3 -4
  10. package/commands/doctor.js +5 -6
  11. package/commands/feedback.js +7 -8
  12. package/commands/fetch.js +6 -7
  13. package/commands/filemanager.js +1 -2
  14. package/commands/function.js +1 -2
  15. package/commands/hubdb/clear.js +5 -6
  16. package/commands/hubdb/create.js +7 -8
  17. package/commands/hubdb/delete.js +8 -7
  18. package/commands/hubdb/fetch.js +4 -5
  19. package/commands/hubdb.js +1 -2
  20. package/commands/init.js +10 -11
  21. package/commands/lint.js +3 -4
  22. package/commands/list.js +5 -6
  23. package/commands/logs.js +12 -13
  24. package/commands/module/marketplace-validate.js +5 -6
  25. package/commands/module.js +1 -3
  26. package/commands/mv.js +4 -5
  27. package/commands/open.js +4 -5
  28. package/commands/project/add.js +17 -13
  29. package/commands/project/cloneApp.js +16 -11
  30. package/commands/project/create.js +18 -14
  31. package/commands/project/deploy.js +17 -15
  32. package/commands/project/dev/deprecatedFlow.js +19 -12
  33. package/commands/project/dev/index.js +11 -7
  34. package/commands/project/dev/unifiedFlow.js +2 -3
  35. package/commands/project/download.js +8 -9
  36. package/commands/project/installDeps.js +9 -7
  37. package/commands/project/listBuilds.js +15 -11
  38. package/commands/project/logs.js +19 -17
  39. package/commands/project/migrate.js +20 -7
  40. package/commands/project/migrateApp.d.ts +1 -1
  41. package/commands/project/migrateApp.js +7 -5
  42. package/commands/project/open.js +11 -5
  43. package/commands/project/upload.js +12 -8
  44. package/commands/project/watch.js +10 -6
  45. package/commands/project.js +1 -2
  46. package/commands/remove.js +7 -5
  47. package/commands/sandbox/create.js +10 -11
  48. package/commands/sandbox/delete.js +18 -19
  49. package/commands/sandbox.js +1 -2
  50. package/commands/secret/addSecret.js +5 -6
  51. package/commands/secret/deleteSecret.js +12 -9
  52. package/commands/secret/listSecret.js +3 -4
  53. package/commands/secret/updateSecret.js +9 -8
  54. package/commands/secret.js +1 -2
  55. package/commands/theme/generate-selectors.js +5 -6
  56. package/commands/theme/marketplace-validate.js +5 -6
  57. package/commands/theme/preview.js +14 -14
  58. package/commands/theme.js +1 -2
  59. package/commands/upload.js +23 -24
  60. package/commands/watch.js +18 -19
  61. package/lang/en.d.ts +2212 -2262
  62. package/lang/en.js +14 -14
  63. package/lang/en.lyaml +3 -9
  64. package/lib/accountTypes.d.ts +1 -0
  65. package/lib/accountTypes.js +12 -0
  66. package/lib/app/migrate.js +53 -21
  67. package/lib/app/migrate_legacy.js +2 -1
  68. package/lib/constants.d.ts +4 -0
  69. package/lib/constants.js +5 -1
  70. package/lib/hasFeature.d.ts +3 -1
  71. package/lib/localDev.d.ts +2 -1
  72. package/lib/localDev.js +21 -3
  73. package/package.json +1 -1
@@ -17,9 +17,8 @@ const { uiBetaTag, uiFeatureHighlight } = require('../../lib/ui');
17
17
  const { debugError } = require('../../lib/errorHandlers');
18
18
  const { EXIT_CODES } = require('../../lib/enums/exitCodes');
19
19
  const { PROJECT_CONFIG_FILE, HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, DEFAULT_PROJECT_TEMPLATE_BRANCH, } = require('../../lib/constants');
20
- const i18nKey = 'commands.project.subcommands.create';
21
20
  exports.command = 'create';
22
- exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
21
+ exports.describe = uiBetaTag(i18n(`commands.project.subcommands.create.describe`), false);
23
22
  exports.handler = async (options) => {
24
23
  const { derivedAccountId } = options;
25
24
  let latestRepoReleaseTag;
@@ -33,13 +32,13 @@ exports.handler = async (options) => {
33
32
  }
34
33
  }
35
34
  catch (err) {
36
- logger.error(i18n(`${i18nKey}.error.failedToFetchProjectList`));
35
+ logger.error(i18n(`commands.project.subcommands.create.error.failedToFetchProjectList`));
37
36
  process.exit(EXIT_CODES.ERROR);
38
37
  }
39
38
  }
40
39
  const projectTemplates = await getProjectTemplateListFromRepo(templateSource, latestRepoReleaseTag || DEFAULT_PROJECT_TEMPLATE_BRANCH);
41
40
  if (!projectTemplates.length) {
42
- logger.error(i18n(`${i18nKey}.error.failedToFetchProjectList`));
41
+ logger.error(i18n(`commands.project.subcommands.create.error.failedToFetchProjectList`));
43
42
  process.exit(EXIT_CODES.ERROR);
44
43
  }
45
44
  const createProjectPromptResponse = await createProjectPrompt(options, projectTemplates);
@@ -48,7 +47,7 @@ exports.handler = async (options) => {
48
47
  const { projectConfig: existingProjectConfig, projectDir: existingProjectDir, } = await getProjectConfig(projectDest);
49
48
  // Exit if the target destination is within an existing project
50
49
  if (existingProjectConfig && projectDest.startsWith(existingProjectDir)) {
51
- logger.error(i18n(`${i18nKey}.errors.cannotNestProjects`, {
50
+ logger.error(i18n(`commands.project.subcommands.create.errors.cannotNestProjects`, {
52
51
  projectDir: existingProjectDir,
53
52
  }));
54
53
  process.exit(EXIT_CODES.ERROR);
@@ -62,7 +61,7 @@ exports.handler = async (options) => {
62
61
  }
63
62
  catch (err) {
64
63
  debugError(err);
65
- logger.error(i18n(`${i18nKey}.errors.failedToDownloadProject`));
64
+ logger.error(i18n(`commands.project.subcommands.create.errors.failedToDownloadProject`));
66
65
  process.exit(EXIT_CODES.ERROR);
67
66
  }
68
67
  const projectConfigPath = path.join(projectDest, PROJECT_CONFIG_FILE);
@@ -77,12 +76,12 @@ exports.handler = async (options) => {
77
76
  fs.ensureDirSync(path.join(projectDest, 'src'));
78
77
  }
79
78
  logger.log('');
80
- logger.success(i18n(`${i18nKey}.logs.success`, {
79
+ logger.success(i18n(`commands.project.subcommands.create.logs.success`, {
81
80
  projectName: createProjectPromptResponse.name,
82
81
  projectDest,
83
82
  }));
84
83
  logger.log('');
85
- logger.log(chalk.bold(i18n(`${i18nKey}.logs.welcomeMessage`)));
84
+ logger.log(chalk.bold(i18n(`commands.project.subcommands.create.logs.welcomeMessage`)));
86
85
  uiFeatureHighlight([
87
86
  'projectCommandTip',
88
87
  'projectUploadCommand',
@@ -97,27 +96,32 @@ exports.handler = async (options) => {
97
96
  exports.builder = yargs => {
98
97
  yargs.options({
99
98
  name: {
100
- describe: i18n(`${i18nKey}.options.name.describe`),
99
+ describe: i18n(`commands.project.subcommands.create.options.name.describe`),
101
100
  type: 'string',
102
101
  },
103
102
  dest: {
104
- describe: i18n(`${i18nKey}.options.dest.describe`),
103
+ describe: i18n(`commands.project.subcommands.create.options.dest.describe`),
105
104
  type: 'string',
106
105
  },
107
106
  template: {
108
- describe: i18n(`${i18nKey}.options.template.describe`),
107
+ describe: i18n(`commands.project.subcommands.create.options.template.describe`),
109
108
  type: 'string',
110
109
  },
111
110
  'template-source': {
112
- describe: i18n(`${i18nKey}.options.templateSource.describe`),
111
+ describe: i18n(`commands.project.subcommands.create.options.templateSource.describe`),
113
112
  type: 'string',
114
113
  },
115
114
  });
116
- yargs.example([['$0 project create', i18n(`${i18nKey}.examples.default`)]]);
115
+ yargs.example([
116
+ [
117
+ '$0 project create',
118
+ i18n(`commands.project.subcommands.create.examples.default`),
119
+ ],
120
+ ]);
117
121
  yargs.example([
118
122
  [
119
123
  '$0 project create --template-source HubSpot/ui-extensions-examples',
120
- i18n(`${i18nKey}.examples.templateSource`),
124
+ i18n(`commands.project.subcommands.create.examples.templateSource`),
121
125
  ],
122
126
  ]);
123
127
  addConfigOptions(yargs);
@@ -23,21 +23,20 @@ const ui_1 = require("../../lib/ui");
23
23
  const exitCodes_1 = require("../../lib/enums/exitCodes");
24
24
  const ui_2 = require("../../lib/ui");
25
25
  const yargsUtils_1 = require("../../lib/yargsUtils");
26
- const i18nKey = 'commands.project.subcommands.deploy';
27
26
  exports.command = 'deploy';
28
- exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
27
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.deploy.describe`), false);
29
28
  function validateBuildId(buildId, deployedBuildId, latestBuildId, projectName, accountId) {
30
29
  if (Number(buildId) > latestBuildId) {
31
- return (0, lang_1.i18n)(`${i18nKey}.errors.buildIdDoesNotExist`, {
30
+ return (0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.buildIdDoesNotExist`, {
32
31
  buildId: buildId,
33
32
  projectName: projectName,
34
- linkToProject: (0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.errors.viewProjectsBuilds`), (0, urls_1.getProjectDetailUrl)(projectName, accountId)),
33
+ linkToProject: (0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.viewProjectsBuilds`), (0, urls_1.getProjectDetailUrl)(projectName, accountId)),
35
34
  });
36
35
  }
37
36
  if (Number(buildId) === deployedBuildId) {
38
- return (0, lang_1.i18n)(`${i18nKey}.errors.buildAlreadyDeployed`, {
37
+ return (0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.buildAlreadyDeployed`, {
39
38
  buildId: buildId,
40
- linkToProject: (0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.errors.viewProjectsBuilds`), (0, urls_1.getProjectDetailUrl)(projectName, accountId)),
39
+ linkToProject: (0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.viewProjectsBuilds`), (0, urls_1.getProjectDetailUrl)(projectName, accountId)),
41
40
  });
42
41
  }
43
42
  return true;
@@ -61,7 +60,7 @@ async function handler(args) {
61
60
  try {
62
61
  const { data: { latestBuild, deployedBuildId }, } = await (0, projects_1.fetchProject)(derivedAccountId, projectName);
63
62
  if (!latestBuild || !latestBuild.buildId) {
64
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noBuilds`));
63
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.noBuilds`));
65
64
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
66
65
  }
67
66
  if (buildIdToDeploy) {
@@ -74,7 +73,7 @@ async function handler(args) {
74
73
  else {
75
74
  const deployBuildIdPromptResponse = await (0, promptUtils_1.promptUser)({
76
75
  name: 'buildId',
77
- message: (0, lang_1.i18n)(`${i18nKey}.deployBuildIdPrompt`),
76
+ message: (0, lang_1.i18n)(`commands.project.subcommands.deploy.deployBuildIdPrompt`),
78
77
  default: latestBuild.buildId === deployedBuildId
79
78
  ? undefined
80
79
  : latestBuild.buildId,
@@ -83,19 +82,19 @@ async function handler(args) {
83
82
  buildIdToDeploy = deployBuildIdPromptResponse.buildId;
84
83
  }
85
84
  if (!buildIdToDeploy) {
86
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noBuildId`));
85
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.noBuildId`));
87
86
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
88
87
  }
89
88
  const { data: deployResp } = await (0, projects_1.deployProject)(derivedAccountId, projectName, buildIdToDeploy, (0, buildAndDeploy_1.useV3Api)(projectConfig?.platformVersion));
90
89
  if (!deployResp) {
91
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.deploy`));
90
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.deploy`));
92
91
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
93
92
  }
94
93
  await (0, buildAndDeploy_2.pollDeployStatus)(derivedAccountId, projectName, Number(deployResp.id), buildIdToDeploy);
95
94
  }
96
95
  catch (e) {
97
96
  if ((0, index_1.isHubSpotHttpError)(e) && e.status === 404) {
98
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.projectNotFound`, {
97
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.projectNotFound`, {
99
98
  projectName: chalk_1.default.bold(projectName),
100
99
  accountIdentifier: (0, ui_2.uiAccountDescription)(derivedAccountId),
101
100
  command: (0, ui_2.uiCommandReference)('hs project upload'),
@@ -116,20 +115,23 @@ async function handler(args) {
116
115
  function projectDeployBuilder(yargs) {
117
116
  yargs.options({
118
117
  project: {
119
- describe: (0, lang_1.i18n)(`${i18nKey}.options.project.describe`),
118
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.deploy.options.project.describe`),
120
119
  type: 'string',
121
120
  },
122
121
  build: {
123
122
  alias: ['build-id'],
124
- describe: (0, lang_1.i18n)(`${i18nKey}.options.build.describe`),
123
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.deploy.options.build.describe`),
125
124
  type: 'number',
126
125
  },
127
126
  });
128
127
  yargs.example([
129
- ['$0 project deploy', (0, lang_1.i18n)(`${i18nKey}.examples.default`)],
128
+ [
129
+ '$0 project deploy',
130
+ (0, lang_1.i18n)(`commands.project.subcommands.deploy.examples.default`),
131
+ ],
130
132
  [
131
133
  '$0 project deploy --project="my-project" --build=5',
132
- (0, lang_1.i18n)(`${i18nKey}.examples.withOptions`),
134
+ (0, lang_1.i18n)(`commands.project.subcommands.deploy.examples.withOptions`),
133
135
  ],
134
136
  ]);
135
137
  return yargs;
@@ -18,7 +18,6 @@ const localDev_1 = require("../../../lib/localDev");
18
18
  const process_1 = require("../../../lib/process");
19
19
  const accountTypes_1 = require("../../../lib/accountTypes");
20
20
  const projects_1 = require("../../../lib/projects");
21
- const i18nKey = 'commands.project.subcommands.dev';
22
21
  async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, projectDir) {
23
22
  const { providedAccountId, derivedAccountId } = args;
24
23
  const env = (0, environment_1.getValidEnv)((0, config_1.getEnv)(derivedAccountId));
@@ -28,25 +27,34 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
28
27
  const hasPrivateApps = !!componentTypes[Projects_1.ComponentTypes.PrivateApp];
29
28
  const hasPublicApps = !!componentTypes[Projects_1.ComponentTypes.PublicApp];
30
29
  if (runnableComponents.length === 0) {
31
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noRunnableComponents`, {
30
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noRunnableComponents`, {
32
31
  projectDir,
33
32
  command: (0, ui_1.uiCommandReference)('hs project add'),
34
33
  }));
35
34
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
36
35
  }
37
36
  else if (hasPrivateApps && hasPublicApps) {
38
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.invalidProjectComponents`));
37
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.invalidProjectComponents`));
39
38
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
40
39
  }
41
40
  const accounts = (0, config_1.getConfigAccounts)();
42
41
  if (!accounts) {
43
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noAccountsInConfig`, {
42
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noAccountsInConfig`, {
44
43
  authCommand: (0, ui_1.uiCommandReference)('hs auth'),
45
44
  }));
46
45
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
47
46
  }
48
- const defaultAccountIsRecommendedType = (0, accountTypes_1.isDeveloperTestAccount)(accountConfig) ||
49
- (!hasPublicApps && (0, accountTypes_1.isSandbox)(accountConfig));
47
+ let bypassRecommendedAccountPrompt = false;
48
+ if ((0, accountTypes_1.isDeveloperTestAccount)(accountConfig)) {
49
+ bypassRecommendedAccountPrompt = true;
50
+ }
51
+ else if (!hasPublicApps && (0, accountTypes_1.isSandbox)(accountConfig)) {
52
+ bypassRecommendedAccountPrompt = true;
53
+ }
54
+ else if (!hasPublicApps) {
55
+ const defaultAccountHasSandboxes = await (0, localDev_1.hasSandboxes)(accountConfig);
56
+ bypassRecommendedAccountPrompt = !defaultAccountHasSandboxes;
57
+ }
50
58
  // targetProjectAccountId and targetTestingAccountId are set to null if --account flag is not provided.
51
59
  // 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.
52
60
  let targetProjectAccountId = providedAccountId ? derivedAccountId : null;
@@ -60,10 +68,10 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
60
68
  }
61
69
  }
62
70
  else {
63
- (0, localDev_1.checkIfDefaultAccountIsSupported)(accountConfig, hasPublicApps);
71
+ await (0, localDev_1.checkIfDefaultAccountIsSupported)(accountConfig, hasPublicApps);
64
72
  }
65
73
  // The user is targeting an account type that we recommend developing on
66
- if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
74
+ if (!targetProjectAccountId && bypassRecommendedAccountPrompt) {
67
75
  targetTestingAccountId = derivedAccountId;
68
76
  await (0, localDev_1.confirmDefaultAccountIsTarget)(accountConfig);
69
77
  if (hasPublicApps) {
@@ -86,9 +94,8 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
86
94
  if (notInConfigAccount) {
87
95
  await (0, localDev_1.useExistingDevTestAccount)(env, notInConfigAccount);
88
96
  }
89
- createNewSandbox = (0, accountTypes_1.isStandardAccount)(accountConfig) && createNestedAccount;
90
- createNewDeveloperTestAccount =
91
- (0, accountTypes_1.isAppDeveloperAccount)(accountConfig) && createNestedAccount;
97
+ createNewSandbox = hasPrivateApps && createNestedAccount;
98
+ createNewDeveloperTestAccount = hasPublicApps && createNestedAccount;
92
99
  }
93
100
  if (createNewSandbox) {
94
101
  targetProjectAccountId = await (0, localDev_1.createSandboxForLocalDev)(derivedAccountId, accountConfig, env);
@@ -100,7 +107,7 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
100
107
  targetProjectAccountId = derivedAccountId;
101
108
  }
102
109
  if (!targetProjectAccountId || !targetTestingAccountId) {
103
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noAccount`));
110
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noAccount`));
104
111
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
105
112
  }
106
113
  // eslint-disable-next-line prefer-const
@@ -14,25 +14,24 @@ const ui_1 = require("../../../lib/ui");
14
14
  const deprecatedFlow_1 = require("./deprecatedFlow");
15
15
  const unifiedFlow_1 = require("./unifiedFlow");
16
16
  const buildAndDeploy_1 = require("../../../lib/projects/buildAndDeploy");
17
- const i18nKey = 'commands.project.subcommands.dev';
18
17
  exports.command = 'dev';
19
- exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
18
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.dev.describe`), false);
20
19
  async function handler(args) {
21
20
  const { derivedAccountId } = args;
22
21
  const accountConfig = (0, config_1.getAccountConfig)(derivedAccountId);
23
22
  (0, usageTracking_1.trackCommandUsage)('project-dev', {}, derivedAccountId);
24
23
  const { projectConfig, projectDir } = await (0, projects_1.getProjectConfig)();
25
- (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.logs.betaMessage`));
26
- logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
24
+ (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.betaMessage`));
25
+ logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
27
26
  if (!projectConfig || !projectDir) {
28
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noProjectConfig`, {
27
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noProjectConfig`, {
29
28
  accountId: derivedAccountId,
30
29
  authCommand: (0, ui_1.uiCommandReference)('hs auth'),
31
30
  }));
32
31
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
33
32
  }
34
33
  if (!accountConfig) {
35
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noAccount`));
34
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noAccount`));
36
35
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
37
36
  }
38
37
  (0, projects_1.validateProjectConfig)(projectConfig, projectDir);
@@ -47,6 +46,11 @@ function builder(yargs) {
47
46
  (0, commonOpts_1.addConfigOptions)(yargs);
48
47
  (0, commonOpts_1.addAccountOptions)(yargs);
49
48
  (0, commonOpts_1.addUseEnvironmentOptions)(yargs);
50
- yargs.example([['$0 project dev', (0, lang_1.i18n)(`${i18nKey}.examples.default`)]]);
49
+ yargs.example([
50
+ [
51
+ '$0 project dev',
52
+ (0, lang_1.i18n)(`commands.project.subcommands.dev.examples.default`),
53
+ ],
54
+ ]);
51
55
  return yargs;
52
56
  }
@@ -22,7 +22,6 @@ const process_1 = require("../../../lib/process");
22
22
  const accountTypes_1 = require("../../../lib/accountTypes");
23
23
  const ui_1 = require("../../../lib/ui");
24
24
  const lang_1 = require("../../../lib/lang");
25
- const i18nKey = 'commands.project.subcommands.dev';
26
25
  async function unifiedProjectDevFlow(args, accountConfig, projectConfig, projectDir) {
27
26
  logger_1.logger.log('Unified Apps Local Dev');
28
27
  const targetProjectAccountId = args.derivedAccountId;
@@ -49,7 +48,7 @@ async function unifiedProjectDevFlow(args, accountConfig, projectConfig, project
49
48
  }
50
49
  // @TODO Do we need to do more than this or leave it to the dev servers?
51
50
  if (!Object.keys(projectNodes).length) {
52
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noRunnableComponents`, {
51
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noRunnableComponents`, {
53
52
  projectDir,
54
53
  command: (0, ui_1.uiCommandReference)('hs project add'),
55
54
  }));
@@ -61,7 +60,7 @@ async function unifiedProjectDevFlow(args, accountConfig, projectConfig, project
61
60
  // For now, check if the account is either developer or standard
62
61
  const derivedAccountIsRecommendedType = (0, accountTypes_1.isAppDeveloperAccount)(accountConfig) || (0, accountTypes_1.isStandardAccount)(accountConfig);
63
62
  if (!derivedAccountIsRecommendedType) {
64
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.invalidUnifiedAppsAccount`), {
63
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.invalidUnifiedAppsAccount`), {
65
64
  authCommand: (0, ui_1.uiCommandReference)('hs auth'),
66
65
  });
67
66
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
@@ -18,13 +18,12 @@ const ui_1 = require("../../lib/ui");
18
18
  const usageTracking_1 = require("../../lib/usageTracking");
19
19
  const exitCodes_1 = require("../../lib/enums/exitCodes");
20
20
  const yargsUtils_1 = require("../../lib/yargsUtils");
21
- const i18nKey = 'commands.project.subcommands.download';
22
21
  exports.command = 'download';
23
- exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
22
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.download.describe`), false);
24
23
  async function handler(args) {
25
24
  const { projectConfig } = await (0, projects_2.getProjectConfig)();
26
25
  if (projectConfig) {
27
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.warnings.cannotDownloadWithinProject`));
26
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.download.warnings.cannotDownloadWithinProject`));
28
27
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
29
28
  }
30
29
  const { dest, build, derivedAccountId } = args;
@@ -41,13 +40,13 @@ async function handler(args) {
41
40
  }
42
41
  }
43
42
  if (!buildNumberToDownload) {
44
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noBuildIdToDownload`));
43
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.download.errors.noBuildIdToDownload`));
45
44
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
46
45
  }
47
46
  const absoluteDestPath = dest ? path_1.default.resolve((0, path_2.getCwd)(), dest) : (0, path_2.getCwd)();
48
47
  const { data: zippedProject } = await (0, projects_1.downloadProject)(derivedAccountId, projectName, buildNumberToDownload);
49
48
  await (0, archive_1.extractZipArchive)(zippedProject, (0, path_2.sanitizeFileName)(projectName), path_1.default.resolve(absoluteDestPath), { includesRootDir: false });
50
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.logs.downloadSucceeded`, {
49
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.download.logs.downloadSucceeded`, {
51
50
  buildId: buildNumberToDownload,
52
51
  projectName,
53
52
  }));
@@ -64,15 +63,15 @@ async function handler(args) {
64
63
  function projectDownloadBuilder(yargs) {
65
64
  yargs.options({
66
65
  project: {
67
- describe: (0, lang_1.i18n)(`${i18nKey}.options.project.describe`),
66
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.download.options.project.describe`),
68
67
  type: 'string',
69
68
  },
70
69
  dest: {
71
- describe: (0, lang_1.i18n)(`${i18nKey}.options.dest.describe`),
70
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.download.options.dest.describe`),
72
71
  type: 'string',
73
72
  },
74
73
  build: {
75
- describe: (0, lang_1.i18n)(`${i18nKey}.options.build.describe`),
74
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.download.options.build.describe`),
76
75
  alias: ['build-id'],
77
76
  type: 'number',
78
77
  },
@@ -80,7 +79,7 @@ function projectDownloadBuilder(yargs) {
80
79
  yargs.example([
81
80
  [
82
81
  '$0 project download --project=myProject --dest=myProjectFolder',
83
- (0, lang_1.i18n)(`${i18nKey}.examples.default`),
82
+ (0, lang_1.i18n)(`commands.project.subcommands.download.examples.default`),
84
83
  ],
85
84
  ]);
86
85
  return yargs;
@@ -16,16 +16,15 @@ const usageTracking_1 = require("../../lib/usageTracking");
16
16
  const ui_1 = require("../../lib/ui");
17
17
  const errorHandlers_1 = require("../../lib/errorHandlers");
18
18
  const yargsUtils_1 = require("../../lib/yargsUtils");
19
- const i18nKey = `commands.project.subcommands.installDeps`;
20
19
  exports.command = 'install-deps [packages..]';
21
- exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.help.describe`), false);
20
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.installDeps.help.describe`), false);
22
21
  async function handler(args) {
23
22
  const { derivedAccountId, packages } = args;
24
23
  try {
25
24
  (0, usageTracking_1.trackCommandUsage)('project-install-deps', undefined, derivedAccountId);
26
25
  const projectConfig = await (0, projects_1.getProjectConfig)();
27
26
  if (!projectConfig || !projectConfig.projectDir) {
28
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.noProjectConfig`));
27
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.installDeps.noProjectConfig`));
29
28
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
30
29
  }
31
30
  const { projectDir } = projectConfig;
@@ -36,14 +35,14 @@ async function handler(args) {
36
35
  name: 'selectedInstallLocations',
37
36
  type: 'checkbox',
38
37
  when: () => packages && packages.length > 0,
39
- message: (0, lang_1.i18n)(`${i18nKey}.installLocationPrompt`),
38
+ message: (0, lang_1.i18n)(`commands.project.subcommands.installDeps.installLocationPrompt`),
40
39
  choices: installLocations.map(dir => ({
41
40
  name: path_1.default.relative(projectDir, dir),
42
41
  value: dir,
43
42
  })),
44
43
  validate: choices => {
45
44
  if (choices === undefined || choices.length === 0) {
46
- return (0, lang_1.i18n)(`${i18nKey}.installLocationPromptRequired`);
45
+ return (0, lang_1.i18n)(`commands.project.subcommands.installDeps.installLocationPromptRequired`);
47
46
  }
48
47
  return true;
49
48
  },
@@ -65,10 +64,13 @@ async function handler(args) {
65
64
  }
66
65
  function projectInstallDepsBuilder(yargs) {
67
66
  yargs.example([
68
- ['$0 project install-deps', (0, lang_1.i18n)(`${i18nKey}.help.installAppDepsExample`)],
67
+ [
68
+ '$0 project install-deps',
69
+ (0, lang_1.i18n)(`commands.project.subcommands.installDeps.help.installAppDepsExample`),
70
+ ],
69
71
  [
70
72
  '$0 project install-deps dependency1 dependency2',
71
- (0, lang_1.i18n)(`${i18nKey}.help.addDepToSubComponentExample`),
73
+ (0, lang_1.i18n)(`commands.project.subcommands.installDeps.help.addDepToSubComponentExample`),
72
74
  ],
73
75
  ]);
74
76
  return yargs;
@@ -20,27 +20,26 @@ const usageTracking_1 = require("../../lib/usageTracking");
20
20
  const lang_1 = require("../../lib/lang");
21
21
  const index_2 = require("../../lib/errorHandlers/index");
22
22
  const exitCodes_1 = require("../../lib/enums/exitCodes");
23
- const i18nKey = 'commands.project.subcommands.listBuilds';
24
23
  exports.command = 'list-builds';
25
- exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
24
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.listBuilds.describe`), false);
26
25
  async function fetchAndDisplayBuilds(accountId, project, options) {
27
26
  const { data: { results, paging }, } = await (0, projects_1.fetchProjectBuilds)(accountId, project.name, options);
28
27
  const currentDeploy = project.deployedBuildId;
29
28
  if (options && options.after) {
30
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.logs.showingNextBuilds`, {
29
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.listBuilds.logs.showingNextBuilds`, {
31
30
  count: results.length,
32
31
  projectName: project.name,
33
32
  }));
34
33
  }
35
34
  else {
36
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.logs.showingRecentBuilds`, {
35
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.listBuilds.logs.showingRecentBuilds`, {
37
36
  count: results.length,
38
37
  projectName: project.name,
39
- viewBuildsLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.logs.viewAllBuildsLink`), (0, urls_1.getProjectDetailUrl)(project.name, accountId)),
38
+ viewBuildsLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.listBuilds.logs.viewAllBuildsLink`), (0, urls_1.getProjectDetailUrl)(project.name, accountId)),
40
39
  }));
41
40
  }
42
41
  if (results.length === 0) {
43
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.errors.noBuilds`));
42
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.listBuilds.errors.noBuilds`));
44
43
  }
45
44
  else {
46
45
  const builds = results.map(build => {
@@ -70,7 +69,7 @@ async function fetchAndDisplayBuilds(accountId, project, options) {
70
69
  if (paging && paging.next) {
71
70
  await (0, promptUtils_1.promptUser)({
72
71
  name: 'more',
73
- message: (0, lang_1.i18n)(`${i18nKey}.continueOrExitPrompt`),
72
+ message: (0, lang_1.i18n)(`commands.project.subcommands.listBuilds.continueOrExitPrompt`),
74
73
  });
75
74
  await fetchAndDisplayBuilds(accountId, project, {
76
75
  limit: options.limit,
@@ -93,7 +92,9 @@ async function handler(args) {
93
92
  }
94
93
  catch (e) {
95
94
  if ((0, index_1.isHubSpotHttpError)(e) && e.status === 404) {
96
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.projectNotFound`, { projectName }));
95
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.listBuilds.errors.projectNotFound`, {
96
+ projectName,
97
+ }));
97
98
  }
98
99
  else {
99
100
  (0, index_2.logError)(e, new index_2.ApiErrorContext({
@@ -110,16 +111,19 @@ function builder(yargs) {
110
111
  (0, commonOpts_1.addUseEnvironmentOptions)(yargs);
111
112
  yargs.options({
112
113
  project: {
113
- describe: (0, lang_1.i18n)(`${i18nKey}.options.project.describe`),
114
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.listBuilds.options.project.describe`),
114
115
  type: 'string',
115
116
  },
116
117
  limit: {
117
- describe: (0, lang_1.i18n)(`${i18nKey}.options.limit.describe`),
118
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.listBuilds.options.limit.describe`),
118
119
  type: 'string',
119
120
  },
120
121
  });
121
122
  yargs.example([
122
- ['$0 project list-builds', (0, lang_1.i18n)(`${i18nKey}.examples.default`)],
123
+ [
124
+ '$0 project list-builds',
125
+ (0, lang_1.i18n)(`commands.project.subcommands.listBuilds.examples.default`),
126
+ ],
123
127
  ]);
124
128
  return yargs;
125
129
  }
@@ -14,40 +14,39 @@ const lang_1 = require("../../lib/lang");
14
14
  const exitCodes_1 = require("../../lib/enums/exitCodes");
15
15
  const ProjectLogsManager_1 = require("../../lib/projects/ProjectLogsManager");
16
16
  const yargsUtils_1 = require("../../lib/yargsUtils");
17
- const i18nKey = 'commands.project.subcommands.logs';
18
17
  function getPrivateAppsUrl(accountId) {
19
18
  const baseUrl = (0, urls_1.getHubSpotWebsiteOrigin)((0, config_1.getEnv)(accountId) === 'qa' ? environments_1.ENVIRONMENTS.QA : environments_1.ENVIRONMENTS.PROD);
20
19
  return `${baseUrl}/private-apps/${accountId}`;
21
20
  }
22
21
  function logTable(tableHeader, logsInfo) {
23
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.logs.showingLogs`));
22
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.logs.logs.showingLogs`));
24
23
  logger_1.logger.log((0, table_1.getTableContents)([tableHeader, logsInfo], { border: { bodyLeft: ' ' } }));
25
24
  }
26
25
  function logPreamble() {
27
26
  if (ProjectLogsManager_1.ProjectLogsManager.isPublicFunction) {
28
27
  logTable((0, table_1.getTableHeader)([
29
- (0, lang_1.i18n)(`${i18nKey}.table.accountHeader`),
30
- (0, lang_1.i18n)(`${i18nKey}.table.functionHeader`),
31
- (0, lang_1.i18n)(`${i18nKey}.table.endpointHeader`),
28
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.table.accountHeader`),
29
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.table.functionHeader`),
30
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.table.endpointHeader`),
32
31
  ]), [
33
32
  ProjectLogsManager_1.ProjectLogsManager.accountId,
34
33
  ProjectLogsManager_1.ProjectLogsManager.functionName,
35
34
  ProjectLogsManager_1.ProjectLogsManager.endpointName,
36
35
  ]);
37
- logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.logs.hubspotLogsDirectLink`), `${getPrivateAppsUrl(ProjectLogsManager_1.ProjectLogsManager.accountId)}/${ProjectLogsManager_1.ProjectLogsManager.appId}/logs/serverlessGatewayExecution?path=${ProjectLogsManager_1.ProjectLogsManager.endpointName}`));
36
+ logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.logs.logs.hubspotLogsDirectLink`), `${getPrivateAppsUrl(ProjectLogsManager_1.ProjectLogsManager.accountId)}/${ProjectLogsManager_1.ProjectLogsManager.appId}/logs/serverlessGatewayExecution?path=${ProjectLogsManager_1.ProjectLogsManager.endpointName}`));
38
37
  }
39
38
  else {
40
39
  logTable((0, table_1.getTableHeader)([
41
- (0, lang_1.i18n)(`${i18nKey}.table.accountHeader`),
42
- (0, lang_1.i18n)(`${i18nKey}.table.functionHeader`),
40
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.table.accountHeader`),
41
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.table.functionHeader`),
43
42
  ]), [ProjectLogsManager_1.ProjectLogsManager.accountId, ProjectLogsManager_1.ProjectLogsManager.functionName]);
44
- logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.logs.hubspotLogsDirectLink`), `${getPrivateAppsUrl(ProjectLogsManager_1.ProjectLogsManager.accountId)}/${ProjectLogsManager_1.ProjectLogsManager.appId}/logs/crm?serverlessFunction=${ProjectLogsManager_1.ProjectLogsManager.functionName}`));
43
+ logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.logs.logs.hubspotLogsDirectLink`), `${getPrivateAppsUrl(ProjectLogsManager_1.ProjectLogsManager.accountId)}/${ProjectLogsManager_1.ProjectLogsManager.appId}/logs/crm?serverlessFunction=${ProjectLogsManager_1.ProjectLogsManager.functionName}`));
45
44
  }
46
45
  logger_1.logger.log();
47
46
  (0, ui_1.uiLine)();
48
47
  }
49
48
  exports.command = 'logs';
50
- exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
49
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.logs.describe`), false);
51
50
  const handler = async (args) => {
52
51
  const { derivedAccountId } = args;
53
52
  (0, usageTracking_1.trackCommandUsage)('project-logs', undefined, derivedAccountId);
@@ -75,35 +74,38 @@ function projectLogsBuilder(yargs) {
75
74
  yargs.options({
76
75
  function: {
77
76
  alias: 'function',
78
- describe: (0, lang_1.i18n)(`${i18nKey}.options.function.describe`),
77
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.logs.options.function.describe`),
79
78
  requiresArg: true,
80
79
  type: 'string',
81
80
  },
82
81
  latest: {
83
82
  alias: 'l',
84
- describe: (0, lang_1.i18n)(`${i18nKey}.options.latest.describe`),
83
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.logs.options.latest.describe`),
85
84
  type: 'boolean',
86
85
  },
87
86
  compact: {
88
- describe: (0, lang_1.i18n)(`${i18nKey}.options.compact.describe`),
87
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.logs.options.compact.describe`),
89
88
  type: 'boolean',
90
89
  },
91
90
  tail: {
92
91
  alias: ['t', 'follow'],
93
- describe: (0, lang_1.i18n)(`${i18nKey}.options.tail.describe`),
92
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.logs.options.tail.describe`),
94
93
  type: 'boolean',
95
94
  },
96
95
  limit: {
97
- describe: (0, lang_1.i18n)(`${i18nKey}.options.limit.describe`),
96
+ describe: (0, lang_1.i18n)(`commands.project.subcommands.logs.options.limit.describe`),
98
97
  type: 'number',
99
98
  },
100
99
  });
101
100
  yargs.conflicts('tail', 'limit');
102
101
  yargs.example([
103
- ['$0 project logs', (0, lang_1.i18n)(`${i18nKey}.examples.default`)],
102
+ [
103
+ '$0 project logs',
104
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.examples.default`),
105
+ ],
104
106
  [
105
107
  '$0 project logs --function=my-function',
106
- (0, lang_1.i18n)(`${i18nKey}.examples.withOptions`),
108
+ (0, lang_1.i18n)(`commands.project.subcommands.logs.examples.withOptions`),
107
109
  ],
108
110
  ]);
109
111
  return yargs;