@hubspot/cli 7.0.1 → 7.0.2-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 (67) hide show
  1. package/bin/cli.js +7 -2
  2. package/commands/account/info.d.ts +7 -0
  3. package/commands/account/info.js +28 -25
  4. package/commands/account/remove.js +4 -4
  5. package/commands/account/use.js +3 -3
  6. package/commands/auth.js +3 -3
  7. package/commands/function/deploy.js +1 -1
  8. package/commands/init.js +1 -1
  9. package/commands/logs.js +1 -7
  10. package/commands/project/cloneApp.js +1 -1
  11. package/commands/project/create.js +6 -0
  12. package/commands/project/dev.js +4 -3
  13. package/commands/project/installDeps.js +2 -4
  14. package/commands/project/migrateApp.js +1 -1
  15. package/commands/project/upload.js +4 -4
  16. package/commands/project/watch.js +4 -4
  17. package/commands/sandbox/create.js +7 -18
  18. package/commands/sandbox/delete.js +6 -10
  19. package/commands/theme/preview.js +3 -2
  20. package/lang/en.lyaml +11 -4
  21. package/lib/DevServerManager.d.ts +40 -1
  22. package/lib/DevServerManager.js +39 -30
  23. package/lib/LocalDevManager.d.ts +58 -1
  24. package/lib/LocalDevManager.js +162 -121
  25. package/lib/buildAccount.d.ts +12 -0
  26. package/lib/buildAccount.js +110 -95
  27. package/lib/commonOpts.d.ts +4 -8
  28. package/lib/commonOpts.js +2 -14
  29. package/lib/constants.d.ts +1 -7
  30. package/lib/constants.js +2 -8
  31. package/lib/dependencyManagement.d.ts +9 -4
  32. package/lib/dependencyManagement.js +45 -49
  33. package/lib/developerTestAccounts.d.ts +1 -0
  34. package/lib/developerTestAccounts.js +1 -0
  35. package/lib/errorHandlers/index.js +5 -2
  36. package/lib/localDev.d.ts +17 -1
  37. package/lib/localDev.js +203 -203
  38. package/lib/polling.d.ts +13 -5
  39. package/lib/polling.js +21 -7
  40. package/lib/projects/buildAndDeploy.d.ts +1 -7
  41. package/lib/projects/buildAndDeploy.js +3 -3
  42. package/lib/projects/index.js +9 -4
  43. package/lib/projects/structure.d.ts +5 -71
  44. package/lib/projects/structure.js +27 -10
  45. package/lib/projects/upload.d.ts +4 -3
  46. package/lib/projects/upload.js +3 -5
  47. package/lib/prompts/createProjectPrompt.js +8 -1
  48. package/lib/prompts/installPublicAppPrompt.d.ts +1 -1
  49. package/lib/prompts/personalAccessKeyPrompt.d.ts +1 -1
  50. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +2 -2
  51. package/lib/sandboxSync.d.ts +4 -1
  52. package/lib/sandboxSync.js +67 -68
  53. package/lib/sandboxes.d.ts +20 -1
  54. package/lib/sandboxes.js +77 -175
  55. package/lib/serverlessLogs.d.ts +4 -1
  56. package/lib/serverlessLogs.js +64 -60
  57. package/lib/ui/serverlessFunctionLogs.d.ts +8 -0
  58. package/lib/ui/serverlessFunctionLogs.js +1 -3
  59. package/lib/validation.d.ts +2 -0
  60. package/lib/validation.js +5 -8
  61. package/package.json +8 -7
  62. package/types/Projects.d.ts +74 -0
  63. package/types/Projects.js +7 -0
  64. package/types/Sandboxes.d.ts +3 -0
  65. package/types/Sandboxes.js +2 -0
  66. package/types/Yargs.d.ts +14 -0
  67. package/types/Yargs.js +2 -0
package/lib/localDev.js CHANGED
@@ -1,167 +1,181 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
4
- const { logger } = require('@hubspot/local-dev-lib/logger');
5
- const { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } = require('@hubspot/local-dev-lib/constants/config');
6
- const { isMissingScopeError, isSpecifiedError, } = require('@hubspot/local-dev-lib/errors/index');
7
- const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
8
- const { getAccountConfig, getEnv } = require('@hubspot/local-dev-lib/config');
9
- const { createProject } = require('@hubspot/local-dev-lib/api/projects');
10
- const { ENVIRONMENTS, } = require('@hubspot/local-dev-lib/constants/environments');
11
- const { confirmDefaultAccountPrompt, selectSandboxTargetAccountPrompt, selectDeveloperTestTargetAccountPrompt, confirmUseExistingDeveloperTestAccountPrompt, } = require('./prompts/projectDevTargetAccountPrompt');
12
- const { confirmPrompt } = require('./prompts/promptUtils');
13
- const { validateSandboxUsageLimits, getAvailableSyncTypes, } = require('./sandboxes');
14
- const { syncSandbox } = require('./sandboxSync');
15
- const { validateDevTestAccountUsageLimits, } = require('./developerTestAccounts');
16
- const { uiCommandReference, uiLine, uiAccountDescription } = require('./ui');
17
- const SpinniesManager = require('./ui/SpinniesManager');
18
- const { i18n } = require('./lang');
19
- const { EXIT_CODES } = require('./enums/exitCodes');
20
- const { trackCommandMetadataUsage } = require('./usageTracking');
21
- const { isAppDeveloperAccount, isDeveloperTestAccount, } = require('./accountTypes');
22
- const { handleProjectUpload } = require('./projects/upload');
23
- const { pollProjectBuildAndDeploy } = require('./projects/buildAndDeploy');
24
- const { PROJECT_ERROR_TYPES, PROJECT_BUILD_TEXT, PROJECT_DEPLOY_TEXT, } = require('./constants');
25
- const { logError, ApiErrorContext } = require('./errorHandlers/index');
26
- const { PERSONAL_ACCESS_KEY_AUTH_METHOD, } = require('@hubspot/local-dev-lib/constants/auth');
27
- const { buildNewAccount, saveAccountToConfig } = require('./buildAccount');
28
- const { hubspotAccountNamePrompt } = require('./prompts/accountNamePrompt');
6
+ exports.confirmDefaultAccountIsTarget = confirmDefaultAccountIsTarget;
7
+ exports.checkIfDefaultAccountIsSupported = checkIfDefaultAccountIsSupported;
8
+ exports.checkIfParentAccountIsAuthed = checkIfParentAccountIsAuthed;
9
+ exports.checkIfAccountFlagIsSupported = checkIfAccountFlagIsSupported;
10
+ exports.suggestRecommendedNestedAccount = suggestRecommendedNestedAccount;
11
+ exports.createSandboxForLocalDev = createSandboxForLocalDev;
12
+ exports.createDeveloperTestAccountForLocalDev = createDeveloperTestAccountForLocalDev;
13
+ exports.useExistingDevTestAccount = useExistingDevTestAccount;
14
+ exports.createNewProjectForLocalDev = createNewProjectForLocalDev;
15
+ exports.createInitialBuildForNewProject = createInitialBuildForNewProject;
16
+ exports.getAccountHomeUrl = getAccountHomeUrl;
17
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
18
+ const config_1 = require("@hubspot/local-dev-lib/constants/config");
19
+ const index_1 = require("@hubspot/local-dev-lib/errors/index");
20
+ const urls_1 = require("@hubspot/local-dev-lib/urls");
21
+ const config_2 = require("@hubspot/local-dev-lib/config");
22
+ const projects_1 = require("@hubspot/local-dev-lib/api/projects");
23
+ const environments_1 = require("@hubspot/local-dev-lib/constants/environments");
24
+ const auth_1 = require("@hubspot/local-dev-lib/constants/auth");
25
+ const getAccountIdentifier_1 = require("@hubspot/local-dev-lib/config/getAccountIdentifier");
26
+ const projectDevTargetAccountPrompt_1 = require("./prompts/projectDevTargetAccountPrompt");
27
+ const promptUtils_1 = require("./prompts/promptUtils");
28
+ const sandboxes_1 = require("./sandboxes");
29
+ const sandboxSync_1 = require("./sandboxSync");
30
+ const developerTestAccounts_1 = require("./developerTestAccounts");
31
+ const ui_1 = require("./ui");
32
+ const SpinniesManager_1 = __importDefault(require("./ui/SpinniesManager"));
33
+ const lang_1 = require("./lang");
34
+ const exitCodes_1 = require("./enums/exitCodes");
35
+ const usageTracking_1 = require("./usageTracking");
36
+ const accountTypes_1 = require("./accountTypes");
37
+ const upload_1 = require("./projects/upload");
38
+ const buildAndDeploy_1 = require("./projects/buildAndDeploy");
39
+ const constants_1 = require("./constants");
40
+ const index_2 = require("./errorHandlers/index");
41
+ const buildAccount_1 = require("./buildAccount");
42
+ const accountNamePrompt_1 = require("./prompts/accountNamePrompt");
29
43
  const i18nKey = 'lib.localDev';
30
44
  // If the user passed in the --account flag, confirm they want to use that account as
31
45
  // their target account, otherwise exit
32
- const confirmDefaultAccountIsTarget = async (accountConfig) => {
33
- logger.log();
34
- const useDefaultAccount = await confirmDefaultAccountPrompt(accountConfig.name, HUBSPOT_ACCOUNT_TYPE_STRINGS[accountConfig.accountType]);
46
+ async function confirmDefaultAccountIsTarget(accountConfig) {
47
+ if (!accountConfig.name || !accountConfig.accountType) {
48
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.confirmDefaultAccountIsTarget.configError`, {
49
+ authCommand: (0, ui_1.uiCommandReference)('hs auth'),
50
+ }));
51
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
52
+ }
53
+ logger_1.logger.log();
54
+ const useDefaultAccount = await (0, projectDevTargetAccountPrompt_1.confirmDefaultAccountPrompt)(accountConfig.name, config_1.HUBSPOT_ACCOUNT_TYPE_STRINGS[accountConfig.accountType]);
35
55
  if (!useDefaultAccount) {
36
- logger.log(i18n(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
37
- useCommand: uiCommandReference('hs accounts use'),
38
- devCommand: uiCommandReference('hs project dev'),
56
+ logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
57
+ useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
58
+ devCommand: (0, ui_1.uiCommandReference)('hs project dev'),
39
59
  }));
40
- process.exit(EXIT_CODES.SUCCESS);
60
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
41
61
  }
42
- };
62
+ }
43
63
  // Confirm the default account is supported for the type of apps being developed
44
- const checkIfDefaultAccountIsSupported = (accountConfig, hasPublicApps) => {
64
+ function checkIfDefaultAccountIsSupported(accountConfig, hasPublicApps) {
45
65
  if (hasPublicApps &&
46
- !(isAppDeveloperAccount(accountConfig) ||
47
- isDeveloperTestAccount(accountConfig))) {
48
- logger.error(i18n(`${i18nKey}.checkIfDefaultAccountIsSupported.publicApp`, {
49
- useCommand: uiCommandReference('hs accounts use'),
50
- authCommand: uiCommandReference('hs auth'),
66
+ !((0, accountTypes_1.isAppDeveloperAccount)(accountConfig) ||
67
+ (0, accountTypes_1.isDeveloperTestAccount)(accountConfig))) {
68
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.checkIfDefaultAccountIsSupported.publicApp`, {
69
+ useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
70
+ authCommand: (0, ui_1.uiCommandReference)('hs auth'),
51
71
  }));
52
- process.exit(EXIT_CODES.SUCCESS);
72
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
53
73
  }
54
- else if (!hasPublicApps && isAppDeveloperAccount(accountConfig)) {
55
- logger.error(i18n(`${i18nKey}.checkIfDefaultAccountIsSupported.privateApp`, {
56
- useCommand: uiCommandReference('hs accounts use'),
57
- authCommand: uiCommandReference('hs auth'),
74
+ else if (!hasPublicApps && (0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
75
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.checkIfDefaultAccountIsSupported.privateApp`, {
76
+ useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
77
+ authCommand: (0, ui_1.uiCommandReference)('hs auth'),
58
78
  }));
59
- process.exit(EXIT_CODES.SUCCESS);
79
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
60
80
  }
61
- };
62
- const checkIfParentAccountIsAuthed = accountConfig => {
63
- if (!getAccountConfig(accountConfig.parentAccountId)) {
64
- logger.error(i18n(`${i18nKey}.checkIfParentAccountIsAuthed.notAuthedError`, {
65
- accountId: accountConfig.parentAccountId,
66
- accountIdentifier: uiAccountDescription(accountConfig.portalId),
67
- authCommand: uiCommandReference(`hs auth --account=${accountConfig.parentAccountId}`),
81
+ }
82
+ function checkIfParentAccountIsAuthed(accountConfig) {
83
+ if (!accountConfig.parentAccountId ||
84
+ !(0, config_2.getAccountConfig)(accountConfig.parentAccountId)) {
85
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.checkIfParentAccountIsAuthed.notAuthedError`, {
86
+ accountId: accountConfig.parentAccountId || '',
87
+ accountIdentifier: (0, ui_1.uiAccountDescription)((0, getAccountIdentifier_1.getAccountIdentifier)(accountConfig)),
88
+ authCommand: (0, ui_1.uiCommandReference)(`hs auth --account=${accountConfig.parentAccountId}`),
68
89
  }));
69
- process.exit(EXIT_CODES.SUCCESS);
90
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
70
91
  }
71
- };
92
+ }
72
93
  // Confirm the default account is a developer account if developing public apps
73
- const checkIfAccountFlagIsSupported = (accountConfig, hasPublicApps) => {
94
+ function checkIfAccountFlagIsSupported(accountConfig, hasPublicApps) {
74
95
  if (hasPublicApps) {
75
- if (!isDeveloperTestAccount(accountConfig)) {
76
- logger.error(i18n(`${i18nKey}.validateAccountOption.invalidPublicAppAccount`, {
77
- useCommand: uiCommandReference('hs accounts use'),
78
- devCommand: uiCommandReference('hs project dev'),
96
+ if (!(0, accountTypes_1.isDeveloperTestAccount)(accountConfig)) {
97
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.invalidPublicAppAccount`, {
98
+ useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
99
+ devCommand: (0, ui_1.uiCommandReference)('hs project dev'),
79
100
  }));
80
- process.exit(EXIT_CODES.SUCCESS);
101
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
81
102
  }
82
103
  checkIfParentAccountIsAuthed(accountConfig);
83
104
  }
84
- else if (isAppDeveloperAccount(accountConfig)) {
85
- logger.error(i18n(`${i18nKey}.validateAccountOption.invalidPrivateAppAccount`, {
86
- useCommand: uiCommandReference('hs accounts use'),
105
+ else if ((0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
106
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.invalidPrivateAppAccount`, {
107
+ useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
87
108
  }));
88
- process.exit(EXIT_CODES.SUCCESS);
109
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
89
110
  }
90
- };
111
+ }
91
112
  // If the user isn't using the recommended account type, prompt them to use or create one
92
- const suggestRecommendedNestedAccount = async (accounts, accountConfig, hasPublicApps) => {
93
- logger.log();
94
- uiLine();
113
+ async function suggestRecommendedNestedAccount(accounts, accountConfig, hasPublicApps) {
114
+ logger_1.logger.log();
115
+ (0, ui_1.uiLine)();
95
116
  if (hasPublicApps) {
96
- logger.log(i18n(`${i18nKey}.validateAccountOption.publicAppNonDeveloperTestAccountWarning`));
117
+ logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.publicAppNonDeveloperTestAccountWarning`));
97
118
  }
98
119
  else {
99
- logger.log(i18n(`${i18nKey}.validateAccountOption.nonSandboxWarning`));
120
+ logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.validateAccountOption.nonSandboxWarning`));
100
121
  }
101
- uiLine();
102
- logger.log();
103
- const targetAccountPrompt = isAppDeveloperAccount(accountConfig)
104
- ? selectDeveloperTestTargetAccountPrompt
105
- : selectSandboxTargetAccountPrompt;
106
- return targetAccountPrompt(accounts, accountConfig, hasPublicApps);
107
- };
122
+ (0, ui_1.uiLine)();
123
+ logger_1.logger.log();
124
+ const targetAccountPrompt = (0, accountTypes_1.isAppDeveloperAccount)(accountConfig)
125
+ ? projectDevTargetAccountPrompt_1.selectDeveloperTestTargetAccountPrompt
126
+ : projectDevTargetAccountPrompt_1.selectSandboxTargetAccountPrompt;
127
+ return targetAccountPrompt(accounts, accountConfig);
128
+ }
108
129
  // Create a new sandbox and return its accountId
109
- const createSandboxForLocalDev = async (accountId, accountConfig, env) => {
130
+ async function createSandboxForLocalDev(accountId, accountConfig, env) {
110
131
  try {
111
- await validateSandboxUsageLimits(accountConfig, HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX, env);
132
+ await (0, sandboxes_1.validateSandboxUsageLimits)(accountConfig, config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX, env);
112
133
  }
113
134
  catch (err) {
114
- if (isMissingScopeError(err)) {
115
- logger.error(i18n('lib.sandbox.create.failure.scopes.message', {
135
+ if ((0, index_1.isMissingScopeError)(err)) {
136
+ logger_1.logger.error((0, lang_1.i18n)('lib.sandbox.create.failure.scopes.message', {
116
137
  accountName: accountConfig.name || accountId,
117
138
  }));
118
- const websiteOrigin = getHubSpotWebsiteOrigin(env);
139
+ const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
119
140
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
120
- logger.info(i18n('lib.sandbox.create.failure.scopes.instructions', {
141
+ logger_1.logger.info((0, lang_1.i18n)('lib.sandbox.create.failure.scopes.instructions', {
121
142
  accountName: accountConfig.name || accountId,
122
143
  url,
123
144
  }));
124
145
  }
125
146
  else {
126
- logError(err);
147
+ (0, index_2.logError)(err);
127
148
  }
128
- process.exit(EXIT_CODES.ERROR);
149
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
129
150
  }
130
151
  try {
131
- const { name } = await hubspotAccountNamePrompt({
132
- accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
133
- });
134
- trackCommandMetadataUsage('sandbox-create', { step: 'project-dev' }, accountId);
135
- const { result } = await buildNewAccount({
136
- name,
137
- accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
138
- accountConfig,
139
- env,
152
+ const { name } = await (0, accountNamePrompt_1.hubspotAccountNamePrompt)({
153
+ accountType: config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX,
140
154
  });
155
+ (0, usageTracking_1.trackCommandMetadataUsage)('sandbox-create', { step: 'project-dev' }, accountId);
156
+ const result = await (0, buildAccount_1.buildSandbox)(name, accountConfig, config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX, env);
141
157
  const targetAccountId = result.sandbox.sandboxHubId;
142
- const sandboxAccountConfig = getAccountConfig(result.sandbox.sandboxHubId);
143
- const syncTasks = await getAvailableSyncTypes(accountConfig, sandboxAccountConfig);
158
+ const sandboxAccountConfig = (0, config_2.getAccountConfig)(result.sandbox.sandboxHubId);
159
+ if (!sandboxAccountConfig) {
160
+ logger_1.logger.error((0, lang_1.i18n)('lib.sandbox.create.failure.generic'));
161
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
162
+ }
163
+ const syncTasks = await (0, sandboxes_1.getAvailableSyncTypes)(accountConfig, sandboxAccountConfig);
144
164
  // For v1 sandboxes, keep sync here. Once we migrate to v2, this will be handled by BE automatically
145
- await syncSandbox({
146
- accountConfig: sandboxAccountConfig,
147
- parentAccountConfig: accountConfig,
148
- env,
149
- syncTasks,
150
- slimInfoMessage: true,
151
- });
165
+ await (0, sandboxSync_1.syncSandbox)(sandboxAccountConfig, accountConfig, env, syncTasks, true);
152
166
  return targetAccountId;
153
167
  }
154
168
  catch (err) {
155
- logError(err);
156
- process.exit(EXIT_CODES.ERROR);
169
+ (0, index_2.logError)(err);
170
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
157
171
  }
158
- };
172
+ }
159
173
  // Create a developer test account and return its accountId
160
- const createDeveloperTestAccountForLocalDev = async (accountId, accountConfig, env) => {
174
+ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, env) {
161
175
  let currentPortalCount = 0;
162
176
  let maxTestPortals = 10;
163
177
  try {
164
- const validateResult = await validateDevTestAccountUsageLimits(accountConfig);
178
+ const validateResult = await (0, developerTestAccounts_1.validateDevTestAccountUsageLimits)(accountConfig);
165
179
  if (validateResult) {
166
180
  currentPortalCount = validateResult.results
167
181
  ? validateResult.results.length
@@ -170,96 +184,86 @@ const createDeveloperTestAccountForLocalDev = async (accountId, accountConfig, e
170
184
  }
171
185
  }
172
186
  catch (err) {
173
- if (isMissingScopeError(err)) {
174
- logger.error(i18n('lib.developerTestAccount.create.failure.scopes.message', {
187
+ if ((0, index_1.isMissingScopeError)(err)) {
188
+ logger_1.logger.error((0, lang_1.i18n)('lib.developerTestAccount.create.failure.scopes.message', {
175
189
  accountName: accountConfig.name || accountId,
176
190
  }));
177
- const websiteOrigin = getHubSpotWebsiteOrigin(env);
191
+ const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
178
192
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
179
- logger.info(i18n('lib.developerTestAccount.create.failure.scopes.instructions', {
193
+ logger_1.logger.info((0, lang_1.i18n)('lib.developerTestAccount.create.failure.scopes.instructions', {
180
194
  accountName: accountConfig.name || accountId,
181
195
  url,
182
196
  }));
183
197
  }
184
198
  else {
185
- logError(err);
199
+ (0, index_2.logError)(err);
186
200
  }
187
- process.exit(EXIT_CODES.ERROR);
201
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
188
202
  }
189
203
  try {
190
- const { name } = await hubspotAccountNamePrompt({
204
+ const { name } = await (0, accountNamePrompt_1.hubspotAccountNamePrompt)({
191
205
  currentPortalCount,
192
- accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
193
- });
194
- trackCommandMetadataUsage('developer-test-account-create', { step: 'project-dev' }, accountId);
195
- const { result } = await buildNewAccount({
196
- name,
197
- accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
198
- accountConfig,
199
- env,
200
- portalLimit: maxTestPortals,
206
+ accountType: config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
201
207
  });
208
+ (0, usageTracking_1.trackCommandMetadataUsage)('developer-test-account-create', { step: 'project-dev' }, accountId);
209
+ const result = await (0, buildAccount_1.buildDeveloperTestAccount)(name, accountConfig, env, maxTestPortals);
202
210
  return result.id;
203
211
  }
204
212
  catch (err) {
205
- logError(err);
206
- process.exit(EXIT_CODES.ERROR);
213
+ (0, index_2.logError)(err);
214
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
207
215
  }
208
- };
216
+ }
209
217
  // Prompt user to confirm usage of an existing developer test account that is not currently in the config
210
- const useExistingDevTestAccount = async (env, account) => {
211
- const useExistingDevTestAcct = await confirmUseExistingDeveloperTestAccountPrompt(account);
218
+ async function useExistingDevTestAccount(env, account) {
219
+ const useExistingDevTestAcct = await (0, projectDevTargetAccountPrompt_1.confirmUseExistingDeveloperTestAccountPrompt)(account);
212
220
  if (!useExistingDevTestAcct) {
213
- logger.log('');
214
- logger.log(i18n(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
215
- useCommand: uiCommandReference('hs accounts use'),
216
- devCommand: uiCommandReference('hs project dev'),
221
+ logger_1.logger.log('');
222
+ logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
223
+ useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
224
+ devCommand: (0, ui_1.uiCommandReference)('hs project dev'),
217
225
  }));
218
- logger.log('');
219
- process.exit(EXIT_CODES.SUCCESS);
226
+ logger_1.logger.log('');
227
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
220
228
  }
221
- const devTestAcctConfigName = await saveAccountToConfig({
222
- env,
223
- accountName: account.accountName,
224
- accountId: account.id,
225
- });
226
- logger.success(i18n(`lib.developerTestAccount.create.success.configFileUpdated`, {
229
+ const devTestAcctConfigName = await (0, buildAccount_1.saveAccountToConfig)(account.id, account.accountName, env);
230
+ logger_1.logger.success((0, lang_1.i18n)(`lib.developerTestAccount.create.success.configFileUpdated`, {
227
231
  accountName: devTestAcctConfigName,
228
- authType: PERSONAL_ACCESS_KEY_AUTH_METHOD.name,
232
+ authType: auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.name,
229
233
  }));
230
- };
234
+ }
231
235
  // Prompt the user to create a new project if one doesn't exist on their target account
232
- const createNewProjectForLocalDev = async (projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) => {
236
+ async function createNewProjectForLocalDev(projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) {
233
237
  // Create the project without prompting if this is a newly created sandbox
234
238
  let shouldCreateProject = shouldCreateWithoutConfirmation;
235
239
  if (!shouldCreateProject) {
236
- const explanationString = i18n(hasPublicApps
240
+ const explanationString = (0, lang_1.i18n)(hasPublicApps
237
241
  ? `${i18nKey}.createNewProjectForLocalDev.publicAppProjectMustExistExplanation`
238
242
  : `${i18nKey}.createNewProjectForLocalDev.projectMustExistExplanation`, {
239
- accountIdentifier: uiAccountDescription(targetAccountId),
243
+ accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
240
244
  projectName: projectConfig.name,
241
245
  });
242
- logger.log();
243
- uiLine();
244
- logger.log(explanationString);
245
- uiLine();
246
- shouldCreateProject = await confirmPrompt(i18n(`${i18nKey}.createNewProjectForLocalDev.createProject`, {
247
- accountIdentifier: uiAccountDescription(targetAccountId),
246
+ logger_1.logger.log();
247
+ (0, ui_1.uiLine)();
248
+ logger_1.logger.log(explanationString);
249
+ (0, ui_1.uiLine)();
250
+ shouldCreateProject = await (0, promptUtils_1.confirmPrompt)((0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.createProject`, {
251
+ accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
248
252
  projectName: projectConfig.name,
249
253
  }));
250
254
  }
251
255
  if (shouldCreateProject) {
252
- SpinniesManager.add('createProject', {
253
- text: i18n(`${i18nKey}.createNewProjectForLocalDev.creatingProject`, {
254
- accountIdentifier: uiAccountDescription(targetAccountId),
256
+ SpinniesManager_1.default.add('createProject', {
257
+ text: (0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.creatingProject`, {
258
+ accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
255
259
  projectName: projectConfig.name,
256
260
  }),
257
261
  });
258
262
  try {
259
- const { data: project } = await createProject(targetAccountId, projectConfig.name);
260
- SpinniesManager.succeed('createProject', {
261
- text: i18n(`${i18nKey}.createNewProjectForLocalDev.createdProject`, {
262
- accountIdentifier: uiAccountDescription(targetAccountId),
263
+ const { data: project } = await (0, projects_1.createProject)(targetAccountId, projectConfig.name);
264
+ SpinniesManager_1.default.succeed('createProject', {
265
+ text: (0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.createdProject`, {
266
+ accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
263
267
  projectName: projectConfig.name,
264
268
  }),
265
269
  succeedColor: 'white',
@@ -267,72 +271,68 @@ const createNewProjectForLocalDev = async (projectConfig, targetAccountId, shoul
267
271
  return project;
268
272
  }
269
273
  catch (err) {
270
- SpinniesManager.fail('createProject');
271
- logger.log(i18n(`${i18nKey}.createNewProjectForLocalDev.failedToCreateProject`));
272
- process.exit(EXIT_CODES.ERROR);
274
+ SpinniesManager_1.default.fail('createProject');
275
+ logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.failedToCreateProject`));
276
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
273
277
  }
274
278
  }
275
279
  else {
276
280
  // We cannot continue if the project does not exist in the target account
277
- logger.log();
278
- logger.log(i18n(`${i18nKey}.createNewProjectForLocalDev.choseNotToCreateProject`));
279
- process.exit(EXIT_CODES.SUCCESS);
281
+ logger_1.logger.log();
282
+ logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.createNewProjectForLocalDev.choseNotToCreateProject`));
283
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
280
284
  }
281
- };
285
+ }
286
+ function projectUploadCallback(accountId, projectConfig, tempFile, buildId) {
287
+ if (!buildId) {
288
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.initialUploadMessage`, {
289
+ uploadCommand: (0, ui_1.uiCommandReference)('hs project upload'),
290
+ }));
291
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
292
+ }
293
+ return (0, buildAndDeploy_1.pollProjectBuildAndDeploy)(accountId, projectConfig, tempFile, buildId, true);
294
+ }
282
295
  // Create an initial build if the project was newly created in the account
283
296
  // Return the newly deployed build
284
- const createInitialBuildForNewProject = async (projectConfig, projectDir, targetAccountId) => {
285
- const initialUploadResult = await handleProjectUpload(targetAccountId, projectConfig, projectDir, (...args) => pollProjectBuildAndDeploy(...args, true), i18n(`${i18nKey}.createInitialBuildForNewProject.initialUploadMessage`));
286
- if (initialUploadResult.uploadError) {
287
- if (isSpecifiedError(initialUploadResult.uploadError, {
288
- subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
297
+ async function createInitialBuildForNewProject(projectConfig, projectDir, targetAccountId) {
298
+ const { result: initialUploadResult, uploadError } = await (0, upload_1.handleProjectUpload)(targetAccountId, projectConfig, projectDir, projectUploadCallback, (0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.initialUploadMessage`));
299
+ if (uploadError) {
300
+ if ((0, index_1.isSpecifiedError)(uploadError, {
301
+ subCategory: constants_1.PROJECT_ERROR_TYPES.PROJECT_LOCKED,
289
302
  })) {
290
- logger.log();
291
- logger.error(i18n(`${i18nKey}.createInitialBuildForNewProject.projectLockedError`));
292
- logger.log();
303
+ logger_1.logger.log();
304
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.projectLockedError`));
305
+ logger_1.logger.log();
293
306
  }
294
307
  else {
295
- logError(initialUploadResult.uploadError, new ApiErrorContext({
308
+ (0, index_2.logError)(uploadError, new index_2.ApiErrorContext({
296
309
  accountId: targetAccountId,
297
310
  projectName: projectConfig.name,
298
311
  }));
299
312
  }
300
- process.exit(EXIT_CODES.ERROR);
313
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
301
314
  }
302
- if (!initialUploadResult.succeeded) {
315
+ if (!initialUploadResult?.succeeded) {
303
316
  let subTasks = [];
304
- if (initialUploadResult.buildResult.status === 'FAILURE') {
317
+ if (initialUploadResult?.buildResult.status === 'FAILURE') {
305
318
  subTasks =
306
- initialUploadResult.buildResult[PROJECT_BUILD_TEXT.SUBTASK_KEY];
319
+ initialUploadResult.buildResult[constants_1.PROJECT_BUILD_TEXT.SUBTASK_KEY];
307
320
  }
308
- else if (initialUploadResult.deployResult.status === 'FAILURE') {
321
+ else if (initialUploadResult?.deployResult?.status === 'FAILURE') {
309
322
  subTasks =
310
- initialUploadResult.deployResult[PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
323
+ initialUploadResult.deployResult[constants_1.PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
311
324
  }
312
325
  const failedSubTasks = subTasks.filter(task => task.status === 'FAILURE');
313
- logger.log();
326
+ logger_1.logger.log();
314
327
  failedSubTasks.forEach(failedSubTask => {
315
- logger.error(failedSubTask.errorMessage);
328
+ logger_1.logger.error(failedSubTask.errorMessage);
316
329
  });
317
- logger.log();
318
- process.exit(EXIT_CODES.ERROR);
330
+ logger_1.logger.log();
331
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
319
332
  }
320
333
  return initialUploadResult.buildResult;
321
- };
322
- const getAccountHomeUrl = accountId => {
323
- const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
334
+ }
335
+ function getAccountHomeUrl(accountId) {
336
+ const baseUrl = (0, urls_1.getHubSpotWebsiteOrigin)((0, config_2.getEnv)(accountId) === 'qa' ? environments_1.ENVIRONMENTS.QA : environments_1.ENVIRONMENTS.PROD);
324
337
  return `${baseUrl}/home?portalId=${accountId}`;
325
- };
326
- module.exports = {
327
- confirmDefaultAccountIsTarget,
328
- checkIfDefaultAccountIsSupported,
329
- checkIfAccountFlagIsSupported,
330
- suggestRecommendedNestedAccount,
331
- createSandboxForLocalDev,
332
- createDeveloperTestAccountForLocalDev,
333
- useExistingDevTestAccount,
334
- createNewProjectForLocalDev,
335
- createInitialBuildForNewProject,
336
- getAccountHomeUrl,
337
- checkIfParentAccountIsAuthed,
338
- };
338
+ }
package/lib/polling.d.ts CHANGED
@@ -1,9 +1,17 @@
1
1
  import { HubSpotPromise } from '@hubspot/local-dev-lib/types/Http';
2
- import { ValueOf } from '@hubspot/local-dev-lib/types/Utils';
3
- import { POLLING_STATUS } from './constants';
2
+ export declare const DEFAULT_POLLING_STATES: {
3
+ readonly STARTED: "STARTED";
4
+ readonly SUCCESS: "SUCCESS";
5
+ readonly ERROR: "ERROR";
6
+ readonly REVERTED: "REVERTED";
7
+ readonly FAILURE: "FAILURE";
8
+ };
4
9
  type GenericPollingResponse = {
5
- status: ValueOf<typeof POLLING_STATUS>;
10
+ status: string;
6
11
  };
7
- type PollingCallback<T extends GenericPollingResponse> = (accountId: number, taskId: number | string) => HubSpotPromise<T>;
8
- export declare function poll<T extends GenericPollingResponse>(callback: PollingCallback<T>, accountId: number, taskId: number | string): Promise<T>;
12
+ type PollingCallback<T extends GenericPollingResponse> = () => HubSpotPromise<T>;
13
+ export declare function poll<T extends GenericPollingResponse>(callback: PollingCallback<T>, statusLookup?: {
14
+ successStates: string[];
15
+ errorStates: string[];
16
+ }): Promise<T>;
9
17
  export {};
package/lib/polling.js CHANGED
@@ -1,20 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_POLLING_STATES = void 0;
3
4
  exports.poll = poll;
4
5
  const constants_1 = require("./constants");
5
- function poll(callback, accountId, taskId) {
6
+ exports.DEFAULT_POLLING_STATES = {
7
+ STARTED: 'STARTED',
8
+ SUCCESS: 'SUCCESS',
9
+ ERROR: 'ERROR',
10
+ REVERTED: 'REVERTED',
11
+ FAILURE: 'FAILURE',
12
+ };
13
+ const DEFAULT_POLLING_STATUS_LOOKUP = {
14
+ successStates: [exports.DEFAULT_POLLING_STATES.SUCCESS],
15
+ errorStates: [
16
+ exports.DEFAULT_POLLING_STATES.ERROR,
17
+ exports.DEFAULT_POLLING_STATES.REVERTED,
18
+ exports.DEFAULT_POLLING_STATES.FAILURE,
19
+ ],
20
+ };
21
+ function poll(callback, statusLookup = DEFAULT_POLLING_STATUS_LOOKUP) {
6
22
  return new Promise((resolve, reject) => {
7
23
  const pollInterval = setInterval(async () => {
8
24
  try {
9
- const { data: pollResp } = await callback(accountId, taskId);
25
+ const { data: pollResp } = await callback();
10
26
  const { status } = pollResp;
11
- if (status === constants_1.POLLING_STATUS.SUCCESS) {
27
+ if (statusLookup.successStates.includes(status)) {
12
28
  clearInterval(pollInterval);
13
29
  resolve(pollResp);
14
30
  }
15
- else if (status === constants_1.POLLING_STATUS.ERROR ||
16
- status === constants_1.POLLING_STATUS.REVERTED ||
17
- status === constants_1.POLLING_STATUS.FAILURE) {
31
+ else if (statusLookup.errorStates.includes(status)) {
18
32
  clearInterval(pollInterval);
19
33
  reject(pollResp);
20
34
  }
@@ -23,6 +37,6 @@ function poll(callback, accountId, taskId) {
23
37
  clearInterval(pollInterval);
24
38
  reject(error);
25
39
  }
26
- }, constants_1.POLLING_DELAY);
40
+ }, constants_1.DEFAULT_POLLING_DELAY);
27
41
  });
28
42
  }
@@ -1,16 +1,10 @@
1
1
  import { FileResult } from 'tmp';
2
2
  import { Build } from '@hubspot/local-dev-lib/types/Build';
3
3
  import { Deploy } from '@hubspot/local-dev-lib/types/Deploy';
4
- import { ProjectConfig, ProjectTask } from '../../types/Projects';
4
+ import { ProjectConfig, ProjectTask, ProjectPollResult } from '../../types/Projects';
5
5
  type PollTaskStatusFunction<T extends ProjectTask> = (accountId: number, taskName: string, taskId: number, deployedBuildId: number | null, silenceLogs: boolean) => Promise<T>;
6
6
  export declare const pollBuildStatus: PollTaskStatusFunction<Build>;
7
7
  export declare const pollDeployStatus: PollTaskStatusFunction<Deploy>;
8
- type ProjectPollResult = {
9
- succeeded: boolean;
10
- buildId: number;
11
- buildResult: Build;
12
- deployResult: Deploy | null;
13
- };
14
8
  export declare function displayWarnLogs(accountId: number, projectName: string, taskId: number, isDeploy?: boolean): Promise<void>;
15
9
  export declare function pollProjectBuildAndDeploy(accountId: number, projectConfig: ProjectConfig, tempFile: FileResult, buildId: number, silenceLogs?: boolean): Promise<ProjectPollResult>;
16
10
  export {};