@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
package/commands/logs.js CHANGED
@@ -1,14 +1,14 @@
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, addGlobalOptions, } = require('../lib/commonOpts');
5
5
  const { trackCommandUsage } = require('../lib/usageTracking');
6
6
  const { logger } = require('@hubspot/local-dev-lib/logger');
7
7
  const { outputLogs } = require('../lib/ui/serverlessFunctionLogs');
8
8
  const { getFunctionLogs, getLatestFunctionLog, } = require('@hubspot/local-dev-lib/api/functions');
9
9
  const { tailLogs } = require('../lib/serverlessLogs');
10
- const { loadAndValidateOptions } = require('../lib/validation');
11
10
  const { i18n } = require('../lib/lang');
11
+ const { promptUser } = require('../lib/prompts/promptUtils');
12
12
  const { EXIT_CODES } = require('../lib/enums/exitCodes');
13
13
  const { isHubSpotHttpError } = require('@hubspot/local-dev-lib/errors/index');
14
14
  const i18nKey = 'commands.logs';
@@ -20,8 +20,15 @@ const handleLogsError = (e, accountId, functionPath) => {
20
20
  }));
21
21
  }
22
22
  };
23
- const endpointLog = async (accountId, options) => {
24
- const { latest, follow, compact, endpoint: functionPath } = options;
23
+ const endpointLog = async (accountId, functionPath, options) => {
24
+ const { limit, latest, follow, compact } = options;
25
+ const requestOptions = {
26
+ limit,
27
+ latest,
28
+ follow,
29
+ compact,
30
+ endpoint: functionPath,
31
+ };
25
32
  logger.debug(i18n(`${i18nKey}.gettingLogs`, {
26
33
  latest,
27
34
  functionPath,
@@ -57,7 +64,7 @@ const endpointLog = async (accountId, options) => {
57
64
  }
58
65
  else {
59
66
  try {
60
- const { data } = await getFunctionLogs(accountId, functionPath, options);
67
+ const { data } = await getFunctionLogs(accountId, functionPath, requestOptions);
61
68
  logsResp = data;
62
69
  }
63
70
  catch (e) {
@@ -66,17 +73,20 @@ const endpointLog = async (accountId, options) => {
66
73
  }
67
74
  }
68
75
  if (logsResp) {
69
- return outputLogs(logsResp, options);
76
+ return outputLogs(logsResp, requestOptions);
70
77
  }
71
78
  };
72
79
  exports.command = 'logs [endpoint]';
73
80
  exports.describe = i18n(`${i18nKey}.describe`);
74
81
  exports.handler = async (options) => {
75
- await loadAndValidateOptions(options);
76
- const { latest } = options;
77
- const accountId = getAccountId(options);
78
- trackCommandUsage('logs', { latest }, accountId);
79
- endpointLog(accountId, options);
82
+ const { endpoint: endpointArgValue, latest, derivedAccountId } = options;
83
+ trackCommandUsage('logs', { latest }, derivedAccountId);
84
+ const { endpointPromptValue } = await promptUser({
85
+ name: 'endpointPromptValue',
86
+ message: i18n(`${i18nKey}.endpointPrompt`),
87
+ when: !endpointArgValue,
88
+ });
89
+ endpointLog(derivedAccountId, endpointArgValue || endpointPromptValue, options);
80
90
  };
81
91
  exports.builder = yargs => {
82
92
  yargs.positional('endpoint', {
@@ -95,18 +105,16 @@ exports.builder = yargs => {
95
105
  type: 'boolean',
96
106
  },
97
107
  follow: {
98
- alias: ['t', 'tail', 'f'],
108
+ alias: ['f'],
99
109
  describe: i18n(`${i18nKey}.options.follow.describe`),
100
110
  type: 'boolean',
101
111
  },
102
112
  limit: {
103
- alias: ['limit', 'n', 'max-count'],
104
113
  describe: i18n(`${i18nKey}.options.limit.describe`),
105
114
  type: 'number',
106
115
  },
107
116
  })
108
- .conflicts('follow', 'limit')
109
- .conflicts('functionName', 'endpoint');
117
+ .conflicts('follow', 'limit');
110
118
  yargs.example([
111
119
  ['$0 logs my-endpoint', i18n(`${i18nKey}.examples.default`)],
112
120
  ['$0 logs my-endpoint --limit=10', i18n(`${i18nKey}.examples.limit`)],
@@ -115,5 +123,6 @@ exports.builder = yargs => {
115
123
  addConfigOptions(yargs);
116
124
  addAccountOptions(yargs);
117
125
  addUseEnvironmentOptions(yargs);
126
+ addGlobalOptions(yargs);
118
127
  return yargs;
119
128
  };
@@ -2,8 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const SpinniesManager = require('../../lib/ui/SpinniesManager');
5
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, getAccountId, } = require('../../lib/commonOpts');
6
- const { loadAndValidateOptions } = require('../../lib/validation');
5
+ const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
7
6
  const { trackCommandUsage } = require('../../lib/usageTracking');
8
7
  const { kickOffValidation, pollForValidationFinish, fetchValidationResults, processValidationErrors, displayValidationResults, } = require('../../lib/marketplaceValidate');
9
8
  const { i18n } = require('../../lib/lang');
@@ -11,10 +10,8 @@ const i18nKey = 'commands.module.subcommands.marketplaceValidate';
11
10
  exports.command = 'marketplace-validate <src>';
12
11
  exports.describe = i18n(`${i18nKey}.describe`);
13
12
  exports.handler = async (options) => {
14
- const { src } = options;
15
- await loadAndValidateOptions(options);
16
- const accountId = getAccountId(options);
17
- trackCommandUsage('validate', null, accountId);
13
+ const { src, derivedAccountId } = options;
14
+ trackCommandUsage('validate', null, derivedAccountId);
18
15
  SpinniesManager.init();
19
16
  SpinniesManager.add('marketplaceValidation', {
20
17
  text: i18n(`${i18nKey}.logs.validatingModule`, {
@@ -22,10 +19,10 @@ exports.handler = async (options) => {
22
19
  }),
23
20
  });
24
21
  const assetType = 'MODULE';
25
- const validationId = await kickOffValidation(accountId, assetType, src);
26
- await pollForValidationFinish(accountId, validationId);
22
+ const validationId = await kickOffValidation(derivedAccountId, assetType, src);
23
+ await pollForValidationFinish(derivedAccountId, validationId);
27
24
  SpinniesManager.remove('marketplaceValidation');
28
- const validationResults = await fetchValidationResults(accountId, validationId);
25
+ const validationResults = await fetchValidationResults(derivedAccountId, validationId);
29
26
  processValidationErrors(i18nKey, validationResults);
30
27
  displayValidationResults(i18nKey, validationResults);
31
28
  process.exit();
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
4
  const marketplaceValidate = require('./module/marketplace-validate');
5
- const { addConfigOptions, addAccountOptions } = require('../lib/commonOpts');
5
+ const { addConfigOptions, addAccountOptions, addGlobalOptions, } = require('../lib/commonOpts');
6
6
  // const { i18n } = require('../lib/lang');
7
7
  // const i18nKey = 'commands.module';
8
8
  exports.command = 'module';
@@ -10,6 +10,7 @@ exports.describe = false; //i18n(`${i18nKey}.describe`);
10
10
  exports.builder = yargs => {
11
11
  addConfigOptions(yargs);
12
12
  addAccountOptions(yargs);
13
+ addGlobalOptions(yargs);
13
14
  yargs.command(marketplaceValidate).demandCommand(1, '');
14
15
  return yargs;
15
16
  };
package/commands/mv.js CHANGED
@@ -5,10 +5,9 @@ const { logger } = require('@hubspot/local-dev-lib/logger');
5
5
  const { moveFile } = require('@hubspot/local-dev-lib/api/fileMapper');
6
6
  const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
7
7
  const { logError, ApiErrorContext } = require('../lib/errorHandlers/index');
8
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, getAccountId, } = require('../lib/commonOpts');
8
+ const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, addGlobalOptions, } = require('../lib/commonOpts');
9
9
  const { trackCommandUsage } = require('../lib/usageTracking');
10
10
  const { isPathFolder } = require('../lib/filesystem');
11
- const { loadAndValidateOptions } = require('../lib/validation');
12
11
  const { i18n } = require('../lib/lang');
13
12
  const { uiBetaTag } = require('../lib/ui');
14
13
  const i18nKey = 'commands.mv';
@@ -22,21 +21,19 @@ const getCorrectedDestPath = (srcPath, destPath) => {
22
21
  exports.command = 'mv <srcPath> <destPath>';
23
22
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
24
23
  exports.handler = async (options) => {
25
- await loadAndValidateOptions(options);
26
- const { srcPath, destPath } = options;
27
- const accountId = getAccountId(options);
28
- trackCommandUsage('mv', null, accountId);
24
+ const { srcPath, destPath, derivedAccountId } = options;
25
+ trackCommandUsage('mv', null, derivedAccountId);
29
26
  try {
30
- await moveFile(accountId, srcPath, getCorrectedDestPath(srcPath, destPath));
27
+ await moveFile(derivedAccountId, srcPath, getCorrectedDestPath(srcPath, destPath));
31
28
  logger.success(i18n(`${i18nKey}.move`, {
32
- accountId,
29
+ accountId: derivedAccountId,
33
30
  destPath,
34
31
  srcPath,
35
32
  }));
36
33
  }
37
34
  catch (error) {
38
35
  logger.error(i18n(`${i18nKey}.errors.moveFailed`, {
39
- accountId,
36
+ accountId: derivedAccountId,
40
37
  destPath,
41
38
  srcPath,
42
39
  }));
@@ -48,7 +45,7 @@ exports.handler = async (options) => {
48
45
  }
49
46
  else {
50
47
  logError(error, new ApiErrorContext({
51
- accountId,
48
+ accountId: derivedAccountId,
52
49
  srcPath,
53
50
  destPath,
54
51
  }));
@@ -56,9 +53,6 @@ exports.handler = async (options) => {
56
53
  }
57
54
  };
58
55
  exports.builder = yargs => {
59
- addConfigOptions(yargs);
60
- addAccountOptions(yargs);
61
- addUseEnvironmentOptions(yargs);
62
56
  yargs.positional('srcPath', {
63
57
  describe: 'Remote hubspot path',
64
58
  type: 'string',
@@ -67,5 +61,9 @@ exports.builder = yargs => {
67
61
  describe: 'Remote hubspot path',
68
62
  type: 'string',
69
63
  });
64
+ addConfigOptions(yargs);
65
+ addAccountOptions(yargs);
66
+ addUseEnvironmentOptions(yargs);
67
+ addGlobalOptions(yargs);
70
68
  return yargs;
71
69
  };
package/commands/open.js CHANGED
@@ -1,7 +1,8 @@
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 exitCodes_1 = require("../lib/enums/exitCodes");
5
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addGlobalOptions, } = require('../lib/commonOpts');
5
6
  const { trackCommandUsage } = require('../lib/usageTracking');
6
7
  const { logSiteLinks, getSiteLinksAsArray, openLink } = require('../lib/links');
7
8
  const { promptUser } = require('../lib/prompts/promptUtils');
@@ -22,20 +23,19 @@ const createListPrompt = async (accountId) => promptUser([
22
23
  exports.command = 'open [shortcut]';
23
24
  exports.describe = i18n(`${i18nKey}.describe`);
24
25
  exports.handler = async (options) => {
25
- const { shortcut, list } = options;
26
- const accountId = getAccountId(options);
27
- trackCommandUsage('open', null, accountId);
26
+ const { shortcut, list, derivedAccountId } = options;
27
+ trackCommandUsage('open', null, derivedAccountId);
28
28
  if (shortcut === undefined && !list) {
29
- const choice = await createListPrompt(accountId);
30
- openLink(accountId, choice.open);
29
+ const choice = await createListPrompt(derivedAccountId);
30
+ openLink(derivedAccountId, choice.open);
31
31
  }
32
- else if (list || shortcut === 'list') {
33
- logSiteLinks(accountId);
34
- return;
32
+ else if (list) {
33
+ logSiteLinks(derivedAccountId);
35
34
  }
36
35
  else {
37
- openLink(accountId, shortcut);
36
+ openLink(derivedAccountId, shortcut);
38
37
  }
38
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
39
39
  };
40
40
  exports.builder = yargs => {
41
41
  yargs.positional('[shortcut]', {
@@ -57,5 +57,6 @@ exports.builder = yargs => {
57
57
  addConfigOptions(yargs);
58
58
  addAccountOptions(yargs);
59
59
  addUseEnvironmentOptions(yargs);
60
+ addGlobalOptions(yargs);
60
61
  return yargs;
61
62
  };
@@ -2,25 +2,22 @@
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');
9
8
  const { i18n } = require('../../lib/lang');
10
9
  const { projectAddPrompt } = require('../../lib/prompts/projectAddPrompt');
11
10
  const { createProjectComponent, getProjectComponentsByVersion, } = require('../../lib/projects');
12
- const { loadAndValidateOptions } = require('../../lib/validation');
13
11
  const { uiBetaTag } = require('../../lib/ui');
14
12
  const { HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, } = require('../../lib/constants');
15
13
  const i18nKey = 'commands.project.subcommands.add';
16
14
  exports.command = 'add';
17
15
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
18
16
  exports.handler = async (options) => {
19
- await loadAndValidateOptions(options);
17
+ const { derivedAccountId } = options;
20
18
  logger.log('');
21
19
  logger.log(i18n(`${i18nKey}.creatingComponent.message`));
22
20
  logger.log('');
23
- const accountId = getAccountId(options);
24
21
  const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
25
22
  const projectComponentsVersion = releaseData.tag_name;
26
23
  const components = await getProjectComponentsByVersion(projectComponentsVersion);
@@ -29,7 +26,7 @@ exports.handler = async (options) => {
29
26
  if (!component) {
30
27
  component = components.find(t => t.path === options.type);
31
28
  }
32
- trackCommandUsage('project-add', null, accountId);
29
+ trackCommandUsage('project-add', null, derivedAccountId);
33
30
  try {
34
31
  await createProjectComponent(component, name, projectComponentsVersion);
35
32
  logger.log('');
@@ -3,9 +3,8 @@ 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
- const { loadAndValidateOptions } = require('../../lib/validation');
9
8
  const { i18n } = require('../../lib/lang');
10
9
  const { selectPublicAppPrompt, } = require('../../lib/prompts/selectPublicAppPrompt');
11
10
  const { createProjectPrompt, } = require('../../lib/prompts/createProjectPrompt');
@@ -26,11 +25,10 @@ const i18nKey = 'commands.project.subcommands.cloneApp';
26
25
  exports.command = 'clone-app';
27
26
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
28
27
  exports.handler = async (options) => {
29
- await loadAndValidateOptions(options);
30
- const accountId = getAccountId(options);
31
- const accountConfig = getAccountConfig(accountId);
32
- const accountName = uiAccountDescription(accountId);
33
- trackCommandUsage('clone-app', {}, accountId);
28
+ const { derivedAccountId } = options;
29
+ const accountConfig = getAccountConfig(derivedAccountId);
30
+ const accountName = uiAccountDescription(derivedAccountId);
31
+ trackCommandUsage('clone-app', {}, derivedAccountId);
34
32
  if (!isAppDeveloperAccount(accountConfig)) {
35
33
  uiLine();
36
34
  logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`));
@@ -42,58 +40,54 @@ exports.handler = async (options) => {
42
40
  process.exit(EXIT_CODES.SUCCESS);
43
41
  }
44
42
  let appId;
45
- let name;
46
- let location;
43
+ let projectName;
44
+ let projectDest;
47
45
  try {
48
46
  appId = options.appId;
49
47
  if (!appId) {
50
48
  const appIdResponse = await selectPublicAppPrompt({
51
- accountId,
49
+ accountId: derivedAccountId,
52
50
  accountName,
53
51
  options,
54
52
  isMigratingApp: false,
55
53
  });
56
54
  appId = appIdResponse.appId;
57
55
  }
58
- const projectResponse = await createProjectPrompt('', options, true);
59
- name = projectResponse.name;
60
- location = projectResponse.location;
56
+ const { name, dest } = await createProjectPrompt('', options, true);
57
+ projectName = name;
58
+ projectDest = options.dest || dest;
61
59
  }
62
60
  catch (error) {
63
- logError(error, new ApiErrorContext({ accountId }));
61
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
64
62
  process.exit(EXIT_CODES.ERROR);
65
63
  }
64
+ await trackCommandMetadataUsage('clone-app', { status: 'STARTED' }, derivedAccountId);
66
65
  try {
67
66
  SpinniesManager.init();
68
67
  SpinniesManager.add('cloneApp', {
69
68
  text: i18n(`${i18nKey}.cloneStatus.inProgress`),
70
69
  });
71
- const { data: { exportId }, } = await cloneApp(accountId, appId);
72
- const { status } = await poll(checkCloneStatus, accountId, exportId);
70
+ const { data: { exportId }, } = await cloneApp(derivedAccountId, appId);
71
+ const { status } = await poll(checkCloneStatus, derivedAccountId, exportId);
73
72
  if (status === 'SUCCESS') {
74
73
  // Ensure correct project folder structure exists
75
- const baseDestPath = path.resolve(getCwd(), location);
74
+ const baseDestPath = path.resolve(getCwd(), projectDest);
76
75
  const absoluteDestPath = path.resolve(baseDestPath, 'src', 'app');
77
76
  fs.mkdirSync(absoluteDestPath, { recursive: true });
78
77
  // 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, {
78
+ const { data: zippedApp } = await downloadClonedProject(derivedAccountId, exportId);
79
+ await extractZipArchive(zippedApp, sanitizeFileName(projectName), absoluteDestPath, {
81
80
  includesRootDir: true,
82
81
  hideLogs: true,
83
82
  });
84
83
  // Create hsproject.json file
85
84
  const configPath = path.join(baseDestPath, PROJECT_CONFIG_FILE);
86
85
  const configContent = {
87
- name,
86
+ name: projectName,
88
87
  srcDir: 'src',
89
88
  platformVersion: '2023.2',
90
89
  };
91
90
  const success = writeProjectConfig(configPath, configContent);
92
- trackCommandMetadataUsage('clone-app', {
93
- type: name,
94
- assetType: appId,
95
- successful: success,
96
- }, accountId);
97
91
  SpinniesManager.succeed('cloneApp', {
98
92
  text: i18n(`${i18nKey}.cloneStatus.done`),
99
93
  succeedColor: 'white',
@@ -103,33 +97,35 @@ exports.handler = async (options) => {
103
97
  }
104
98
  logger.log('');
105
99
  uiLine();
106
- logger.success(i18n(`${i18nKey}.cloneStatus.success`, { location }));
100
+ logger.success(i18n(`${i18nKey}.cloneStatus.success`, { dest }));
107
101
  logger.log('');
108
102
  process.exit(EXIT_CODES.SUCCESS);
109
103
  }
110
104
  }
111
105
  catch (error) {
112
- trackCommandMetadataUsage('clone-app', { projectName: name, appId, status: 'FAILURE', error }, accountId);
106
+ await trackCommandMetadataUsage('clone-app', { status: 'FAILURE' }, derivedAccountId);
113
107
  SpinniesManager.fail('cloneApp', {
114
108
  text: i18n(`${i18nKey}.cloneStatus.failure`),
115
109
  failColor: 'white',
116
110
  });
117
111
  // Migrations endpoints return a response object with an errors property. The errors property contains an array of errors.
118
112
  if (error.errors && Array.isArray(error.errors)) {
119
- error.errors.forEach(e => logError(e, new ApiErrorContext({ accountId })));
113
+ error.errors.forEach(e => logError(e, new ApiErrorContext({ accountId: derivedAccountId })));
120
114
  }
121
115
  else {
122
- logError(error, new ApiErrorContext({ accountId }));
116
+ logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
123
117
  }
124
118
  }
119
+ await trackCommandMetadataUsage('clone-app', { status: 'SUCCESS' }, derivedAccountId);
120
+ process.exit(EXIT_CODES.SUCCESS);
125
121
  };
126
122
  exports.builder = yargs => {
127
123
  yargs.options({
128
- location: {
129
- describe: i18n(`${i18nKey}.options.location.describe`),
124
+ dest: {
125
+ describe: i18n(`${i18nKey}.options.dest.describe`),
130
126
  type: 'string',
131
127
  },
132
- appId: {
128
+ 'app-id': {
133
129
  describe: i18n(`${i18nKey}.options.appId.describe`),
134
130
  type: 'number',
135
131
  },
@@ -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, } = require('../../lib/commonOpts');
4
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
5
5
  const { trackCommandUsage } = require('../../lib/usageTracking');
6
- const { loadAndValidateOptions } = require('../../lib/validation');
7
6
  const { getCwd } = require('@hubspot/local-dev-lib/path');
8
7
  const path = require('path');
9
8
  const chalk = require('chalk');
@@ -18,17 +17,16 @@ const i18nKey = 'commands.project.subcommands.create';
18
17
  exports.command = 'create';
19
18
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
20
19
  exports.handler = async (options) => {
21
- await loadAndValidateOptions(options);
22
- const accountId = getAccountId(options);
20
+ const { derivedAccountId } = options;
23
21
  const hasCustomTemplateSource = Boolean(options.templateSource);
24
22
  let githubRef = '';
25
23
  if (!hasCustomTemplateSource) {
26
24
  const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
27
25
  githubRef = releaseData.tag_name;
28
26
  }
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);
27
+ const { name, template, dest } = await createProjectPrompt(githubRef, options);
28
+ trackCommandUsage('project-create', { type: template.name }, derivedAccountId);
29
+ await createProjectConfig(path.resolve(getCwd(), options.dest || dest), options.name || name, template, options.templateSource, githubRef);
32
30
  logger.log('');
33
31
  logger.log(chalk.bold(i18n(`${i18nKey}.logs.welcomeMessage`)));
34
32
  uiFeatureHighlight([
@@ -44,15 +42,15 @@ exports.builder = yargs => {
44
42
  describe: i18n(`${i18nKey}.options.name.describe`),
45
43
  type: 'string',
46
44
  },
47
- location: {
48
- describe: i18n(`${i18nKey}.options.location.describe`),
45
+ dest: {
46
+ describe: i18n(`${i18nKey}.options.dest.describe`),
49
47
  type: 'string',
50
48
  },
51
49
  template: {
52
50
  describe: i18n(`${i18nKey}.options.template.describe`),
53
51
  type: 'string',
54
52
  },
55
- templateSource: {
53
+ 'template-source': {
56
54
  describe: i18n(`${i18nKey}.options.templateSource.describe`),
57
55
  type: 'string',
58
56
  },
@@ -2,13 +2,14 @@
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');
9
9
  const { deployProject, fetchProject, } = require('@hubspot/local-dev-lib/api/projects');
10
- const { loadAndValidateOptions } = require('../../lib/validation');
11
- const { getProjectConfig, pollDeployStatus, getProjectDetailUrl, } = require('../../lib/projects');
10
+ const { getProjectConfig } = require('../../lib/projects');
11
+ const { pollDeployStatus } = require('../../lib/projects/buildAndDeploy');
12
+ const { getProjectDetailUrl } = require('../../lib/projects/urls');
12
13
  const { projectNamePrompt } = require('../../lib/prompts/projectNamePrompt');
13
14
  const { promptUser } = require('../../lib/prompts/promptUtils');
14
15
  const { i18n } = require('../../lib/lang');
@@ -37,18 +38,17 @@ const validateBuildId = (buildId, deployedBuildId, latestBuildId, projectName, a
37
38
  return true;
38
39
  };
39
40
  exports.handler = async (options) => {
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: buildId => 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
  },