@hubspot/cli 7.0.2-experimental.0 → 7.0.2

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 (54) 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/installDeps.js +2 -4
  13. package/commands/project/migrateApp.js +1 -1
  14. package/commands/project/upload.js +5 -10
  15. package/commands/project/watch.js +4 -4
  16. package/commands/sandbox/create.js +2 -8
  17. package/commands/sandbox/delete.js +6 -10
  18. package/lang/en.lyaml +9 -4
  19. package/lib/LocalDevManager.d.ts +58 -1
  20. package/lib/LocalDevManager.js +162 -122
  21. package/lib/buildAccount.d.ts +12 -0
  22. package/lib/buildAccount.js +110 -95
  23. package/lib/commonOpts.d.ts +4 -8
  24. package/lib/commonOpts.js +2 -14
  25. package/lib/constants.d.ts +1 -7
  26. package/lib/constants.js +2 -8
  27. package/lib/developerTestAccounts.d.ts +1 -0
  28. package/lib/developerTestAccounts.js +1 -0
  29. package/lib/localDev.d.ts +17 -1
  30. package/lib/localDev.js +203 -197
  31. package/lib/polling.d.ts +13 -5
  32. package/lib/polling.js +21 -7
  33. package/lib/projects/buildAndDeploy.d.ts +1 -7
  34. package/lib/projects/buildAndDeploy.js +3 -3
  35. package/lib/projects/index.js +9 -4
  36. package/lib/projects/structure.d.ts +3 -0
  37. package/lib/projects/structure.js +21 -0
  38. package/lib/projects/upload.d.ts +4 -3
  39. package/lib/projects/upload.js +7 -31
  40. package/lib/prompts/createProjectPrompt.js +8 -1
  41. package/lib/prompts/installPublicAppPrompt.d.ts +1 -1
  42. package/lib/prompts/personalAccessKeyPrompt.d.ts +1 -1
  43. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +2 -2
  44. package/lib/sandboxes.d.ts +1 -1
  45. package/lib/serverlessLogs.d.ts +4 -1
  46. package/lib/serverlessLogs.js +64 -60
  47. package/lib/ui/serverlessFunctionLogs.d.ts +8 -0
  48. package/lib/ui/serverlessFunctionLogs.js +1 -3
  49. package/lib/validation.d.ts +2 -0
  50. package/lib/validation.js +5 -8
  51. package/package.json +3 -4
  52. package/types/Projects.d.ts +8 -2
  53. package/types/Yargs.d.ts +14 -0
  54. package/types/Yargs.js +2 -0
package/lib/localDev.js CHANGED
@@ -1,161 +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(sandboxAccountConfig, accountConfig, env, syncTasks, true);
165
+ await (0, sandboxSync_1.syncSandbox)(sandboxAccountConfig, accountConfig, env, syncTasks, true);
146
166
  return targetAccountId;
147
167
  }
148
168
  catch (err) {
149
- logError(err);
150
- process.exit(EXIT_CODES.ERROR);
169
+ (0, index_2.logError)(err);
170
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
151
171
  }
152
- };
172
+ }
153
173
  // Create a developer test account and return its accountId
154
- const createDeveloperTestAccountForLocalDev = async (accountId, accountConfig, env) => {
174
+ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, env) {
155
175
  let currentPortalCount = 0;
156
176
  let maxTestPortals = 10;
157
177
  try {
158
- const validateResult = await validateDevTestAccountUsageLimits(accountConfig);
178
+ const validateResult = await (0, developerTestAccounts_1.validateDevTestAccountUsageLimits)(accountConfig);
159
179
  if (validateResult) {
160
180
  currentPortalCount = validateResult.results
161
181
  ? validateResult.results.length
@@ -164,96 +184,86 @@ const createDeveloperTestAccountForLocalDev = async (accountId, accountConfig, e
164
184
  }
165
185
  }
166
186
  catch (err) {
167
- if (isMissingScopeError(err)) {
168
- 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', {
169
189
  accountName: accountConfig.name || accountId,
170
190
  }));
171
- const websiteOrigin = getHubSpotWebsiteOrigin(env);
191
+ const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
172
192
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
173
- logger.info(i18n('lib.developerTestAccount.create.failure.scopes.instructions', {
193
+ logger_1.logger.info((0, lang_1.i18n)('lib.developerTestAccount.create.failure.scopes.instructions', {
174
194
  accountName: accountConfig.name || accountId,
175
195
  url,
176
196
  }));
177
197
  }
178
198
  else {
179
- logError(err);
199
+ (0, index_2.logError)(err);
180
200
  }
181
- process.exit(EXIT_CODES.ERROR);
201
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
182
202
  }
183
203
  try {
184
- const { name } = await hubspotAccountNamePrompt({
204
+ const { name } = await (0, accountNamePrompt_1.hubspotAccountNamePrompt)({
185
205
  currentPortalCount,
186
- accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
187
- });
188
- trackCommandMetadataUsage('developer-test-account-create', { step: 'project-dev' }, accountId);
189
- const { result } = await buildNewAccount({
190
- name,
191
- accountType: HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
192
- accountConfig,
193
- env,
194
- portalLimit: maxTestPortals,
206
+ accountType: config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST,
195
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);
196
210
  return result.id;
197
211
  }
198
212
  catch (err) {
199
- logError(err);
200
- process.exit(EXIT_CODES.ERROR);
213
+ (0, index_2.logError)(err);
214
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
201
215
  }
202
- };
216
+ }
203
217
  // Prompt user to confirm usage of an existing developer test account that is not currently in the config
204
- const useExistingDevTestAccount = async (env, account) => {
205
- const useExistingDevTestAcct = await confirmUseExistingDeveloperTestAccountPrompt(account);
218
+ async function useExistingDevTestAccount(env, account) {
219
+ const useExistingDevTestAcct = await (0, projectDevTargetAccountPrompt_1.confirmUseExistingDeveloperTestAccountPrompt)(account);
206
220
  if (!useExistingDevTestAcct) {
207
- logger.log('');
208
- logger.log(i18n(`${i18nKey}.confirmDefaultAccountIsTarget.declineDefaultAccountExplanation`, {
209
- useCommand: uiCommandReference('hs accounts use'),
210
- 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'),
211
225
  }));
212
- logger.log('');
213
- process.exit(EXIT_CODES.SUCCESS);
226
+ logger_1.logger.log('');
227
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
214
228
  }
215
- const devTestAcctConfigName = await saveAccountToConfig({
216
- env,
217
- accountName: account.accountName,
218
- accountId: account.id,
219
- });
220
- 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`, {
221
231
  accountName: devTestAcctConfigName,
222
- authType: PERSONAL_ACCESS_KEY_AUTH_METHOD.name,
232
+ authType: auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.name,
223
233
  }));
224
- };
234
+ }
225
235
  // Prompt the user to create a new project if one doesn't exist on their target account
226
- const createNewProjectForLocalDev = async (projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) => {
236
+ async function createNewProjectForLocalDev(projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) {
227
237
  // Create the project without prompting if this is a newly created sandbox
228
238
  let shouldCreateProject = shouldCreateWithoutConfirmation;
229
239
  if (!shouldCreateProject) {
230
- const explanationString = i18n(hasPublicApps
240
+ const explanationString = (0, lang_1.i18n)(hasPublicApps
231
241
  ? `${i18nKey}.createNewProjectForLocalDev.publicAppProjectMustExistExplanation`
232
242
  : `${i18nKey}.createNewProjectForLocalDev.projectMustExistExplanation`, {
233
- accountIdentifier: uiAccountDescription(targetAccountId),
243
+ accountIdentifier: (0, ui_1.uiAccountDescription)(targetAccountId),
234
244
  projectName: projectConfig.name,
235
245
  });
236
- logger.log();
237
- uiLine();
238
- logger.log(explanationString);
239
- uiLine();
240
- shouldCreateProject = await confirmPrompt(i18n(`${i18nKey}.createNewProjectForLocalDev.createProject`, {
241
- 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),
242
252
  projectName: projectConfig.name,
243
253
  }));
244
254
  }
245
255
  if (shouldCreateProject) {
246
- SpinniesManager.add('createProject', {
247
- text: i18n(`${i18nKey}.createNewProjectForLocalDev.creatingProject`, {
248
- 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),
249
259
  projectName: projectConfig.name,
250
260
  }),
251
261
  });
252
262
  try {
253
- const { data: project } = await createProject(targetAccountId, projectConfig.name);
254
- SpinniesManager.succeed('createProject', {
255
- text: i18n(`${i18nKey}.createNewProjectForLocalDev.createdProject`, {
256
- 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),
257
267
  projectName: projectConfig.name,
258
268
  }),
259
269
  succeedColor: 'white',
@@ -261,72 +271,68 @@ const createNewProjectForLocalDev = async (projectConfig, targetAccountId, shoul
261
271
  return project;
262
272
  }
263
273
  catch (err) {
264
- SpinniesManager.fail('createProject');
265
- logger.log(i18n(`${i18nKey}.createNewProjectForLocalDev.failedToCreateProject`));
266
- 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);
267
277
  }
268
278
  }
269
279
  else {
270
280
  // We cannot continue if the project does not exist in the target account
271
- logger.log();
272
- logger.log(i18n(`${i18nKey}.createNewProjectForLocalDev.choseNotToCreateProject`));
273
- 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);
274
284
  }
275
- };
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
+ }
276
295
  // Create an initial build if the project was newly created in the account
277
296
  // Return the newly deployed build
278
- const createInitialBuildForNewProject = async (projectConfig, projectDir, targetAccountId) => {
279
- const initialUploadResult = await handleProjectUpload(targetAccountId, projectConfig, projectDir, (...args) => pollProjectBuildAndDeploy(...args, true), i18n(`${i18nKey}.createInitialBuildForNewProject.initialUploadMessage`));
280
- if (initialUploadResult.uploadError) {
281
- if (isSpecifiedError(initialUploadResult.uploadError, {
282
- 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,
283
302
  })) {
284
- logger.log();
285
- logger.error(i18n(`${i18nKey}.createInitialBuildForNewProject.projectLockedError`));
286
- logger.log();
303
+ logger_1.logger.log();
304
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.createInitialBuildForNewProject.projectLockedError`));
305
+ logger_1.logger.log();
287
306
  }
288
307
  else {
289
- logError(initialUploadResult.uploadError, new ApiErrorContext({
308
+ (0, index_2.logError)(uploadError, new index_2.ApiErrorContext({
290
309
  accountId: targetAccountId,
291
310
  projectName: projectConfig.name,
292
311
  }));
293
312
  }
294
- process.exit(EXIT_CODES.ERROR);
313
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
295
314
  }
296
- if (!initialUploadResult.succeeded) {
315
+ if (!initialUploadResult?.succeeded) {
297
316
  let subTasks = [];
298
- if (initialUploadResult.buildResult.status === 'FAILURE') {
317
+ if (initialUploadResult?.buildResult.status === 'FAILURE') {
299
318
  subTasks =
300
- initialUploadResult.buildResult[PROJECT_BUILD_TEXT.SUBTASK_KEY];
319
+ initialUploadResult.buildResult[constants_1.PROJECT_BUILD_TEXT.SUBTASK_KEY];
301
320
  }
302
- else if (initialUploadResult.deployResult.status === 'FAILURE') {
321
+ else if (initialUploadResult?.deployResult?.status === 'FAILURE') {
303
322
  subTasks =
304
- initialUploadResult.deployResult[PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
323
+ initialUploadResult.deployResult[constants_1.PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
305
324
  }
306
325
  const failedSubTasks = subTasks.filter(task => task.status === 'FAILURE');
307
- logger.log();
326
+ logger_1.logger.log();
308
327
  failedSubTasks.forEach(failedSubTask => {
309
- logger.error(failedSubTask.errorMessage);
328
+ logger_1.logger.error(failedSubTask.errorMessage);
310
329
  });
311
- logger.log();
312
- process.exit(EXIT_CODES.ERROR);
330
+ logger_1.logger.log();
331
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
313
332
  }
314
333
  return initialUploadResult.buildResult;
315
- };
316
- const getAccountHomeUrl = accountId => {
317
- 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);
318
337
  return `${baseUrl}/home?portalId=${accountId}`;
319
- };
320
- module.exports = {
321
- confirmDefaultAccountIsTarget,
322
- checkIfDefaultAccountIsSupported,
323
- checkIfAccountFlagIsSupported,
324
- suggestRecommendedNestedAccount,
325
- createSandboxForLocalDev,
326
- createDeveloperTestAccountForLocalDev,
327
- useExistingDevTestAccount,
328
- createNewProjectForLocalDev,
329
- createInitialBuildForNewProject,
330
- getAccountHomeUrl,
331
- checkIfParentAccountIsAuthed,
332
- };
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 {};