@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.
- package/bin/cli.js +7 -2
- package/commands/account/info.d.ts +7 -0
- package/commands/account/info.js +28 -25
- package/commands/account/remove.js +4 -4
- package/commands/account/use.js +3 -3
- package/commands/auth.js +3 -3
- package/commands/function/deploy.js +1 -1
- package/commands/init.js +1 -1
- package/commands/logs.js +1 -7
- package/commands/project/cloneApp.js +1 -1
- package/commands/project/create.js +6 -0
- package/commands/project/installDeps.js +2 -4
- package/commands/project/migrateApp.js +1 -1
- package/commands/project/upload.js +5 -10
- package/commands/project/watch.js +4 -4
- package/commands/sandbox/create.js +2 -8
- package/commands/sandbox/delete.js +6 -10
- package/lang/en.lyaml +9 -4
- package/lib/LocalDevManager.d.ts +58 -1
- package/lib/LocalDevManager.js +162 -122
- package/lib/buildAccount.d.ts +12 -0
- package/lib/buildAccount.js +110 -95
- package/lib/commonOpts.d.ts +4 -8
- package/lib/commonOpts.js +2 -14
- package/lib/constants.d.ts +1 -7
- package/lib/constants.js +2 -8
- package/lib/developerTestAccounts.d.ts +1 -0
- package/lib/developerTestAccounts.js +1 -0
- package/lib/localDev.d.ts +17 -1
- package/lib/localDev.js +203 -197
- package/lib/polling.d.ts +13 -5
- package/lib/polling.js +21 -7
- package/lib/projects/buildAndDeploy.d.ts +1 -7
- package/lib/projects/buildAndDeploy.js +3 -3
- package/lib/projects/index.js +9 -4
- package/lib/projects/structure.d.ts +3 -0
- package/lib/projects/structure.js +21 -0
- package/lib/projects/upload.d.ts +4 -3
- package/lib/projects/upload.js +7 -31
- package/lib/prompts/createProjectPrompt.js +8 -1
- package/lib/prompts/installPublicAppPrompt.d.ts +1 -1
- package/lib/prompts/personalAccessKeyPrompt.d.ts +1 -1
- package/lib/prompts/projectDevTargetAccountPrompt.d.ts +2 -2
- package/lib/sandboxes.d.ts +1 -1
- package/lib/serverlessLogs.d.ts +4 -1
- package/lib/serverlessLogs.js +64 -60
- package/lib/ui/serverlessFunctionLogs.d.ts +8 -0
- package/lib/ui/serverlessFunctionLogs.js +1 -3
- package/lib/validation.d.ts +2 -0
- package/lib/validation.js +5 -8
- package/package.json +3 -4
- package/types/Projects.d.ts +8 -2
- package/types/Yargs.d.ts +14 -0
- 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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
if (!
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
279
|
-
const initialUploadResult = await handleProjectUpload(targetAccountId, projectConfig, projectDir,
|
|
280
|
-
if (
|
|
281
|
-
if (isSpecifiedError(
|
|
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(
|
|
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
|
|
315
|
+
if (!initialUploadResult?.succeeded) {
|
|
297
316
|
let subTasks = [];
|
|
298
|
-
if (initialUploadResult
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
|
|
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:
|
|
10
|
+
status: string;
|
|
6
11
|
};
|
|
7
|
-
type PollingCallback<T extends GenericPollingResponse> = (
|
|
8
|
-
export declare function poll<T extends GenericPollingResponse>(callback: PollingCallback<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
|
-
|
|
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(
|
|
25
|
+
const { data: pollResp } = await callback();
|
|
10
26
|
const { status } = pollResp;
|
|
11
|
-
if (
|
|
27
|
+
if (statusLookup.successStates.includes(status)) {
|
|
12
28
|
clearInterval(pollInterval);
|
|
13
29
|
resolve(pollResp);
|
|
14
30
|
}
|
|
15
|
-
else if (
|
|
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.
|
|
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 {};
|