@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.
- 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/dev.js +4 -3
- package/commands/project/installDeps.js +2 -4
- package/commands/project/migrateApp.js +1 -1
- package/commands/project/upload.js +4 -4
- package/commands/project/watch.js +4 -4
- package/commands/sandbox/create.js +7 -18
- package/commands/sandbox/delete.js +6 -10
- package/commands/theme/preview.js +3 -2
- package/lang/en.lyaml +11 -4
- package/lib/DevServerManager.d.ts +40 -1
- package/lib/DevServerManager.js +39 -30
- package/lib/LocalDevManager.d.ts +58 -1
- package/lib/LocalDevManager.js +162 -121
- 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/dependencyManagement.d.ts +9 -4
- package/lib/dependencyManagement.js +45 -49
- package/lib/developerTestAccounts.d.ts +1 -0
- package/lib/developerTestAccounts.js +1 -0
- package/lib/errorHandlers/index.js +5 -2
- package/lib/localDev.d.ts +17 -1
- package/lib/localDev.js +203 -203
- 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 +5 -71
- package/lib/projects/structure.js +27 -10
- package/lib/projects/upload.d.ts +4 -3
- package/lib/projects/upload.js +3 -5
- 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/sandboxSync.d.ts +4 -1
- package/lib/sandboxSync.js +67 -68
- package/lib/sandboxes.d.ts +20 -1
- package/lib/sandboxes.js +77 -175
- 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 +8 -7
- package/types/Projects.d.ts +74 -0
- package/types/Projects.js +7 -0
- package/types/Sandboxes.d.ts +3 -0
- package/types/Sandboxes.js +2 -0
- package/types/Yargs.d.ts +14 -0
- 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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
285
|
-
const initialUploadResult = await handleProjectUpload(targetAccountId, projectConfig, projectDir,
|
|
286
|
-
if (
|
|
287
|
-
if (isSpecifiedError(
|
|
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(
|
|
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
|
|
315
|
+
if (!initialUploadResult?.succeeded) {
|
|
303
316
|
let subTasks = [];
|
|
304
|
-
if (initialUploadResult
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 {};
|