@hubspot/cli 6.1.1 → 6.2.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 +2 -2
- package/commands/accounts/clean.js +5 -7
- package/commands/auth.js +5 -5
- package/commands/cms/convertFields.js +2 -2
- package/commands/cms/lighthouseScore.js +47 -36
- package/commands/create/function.js +2 -2
- package/commands/create/module.js +2 -2
- package/commands/create/template.js +2 -2
- package/commands/create.js +3 -5
- package/commands/customObject/create.js +2 -2
- package/commands/customObject/schema/create.js +4 -4
- package/commands/customObject/schema/delete.js +2 -3
- package/commands/customObject/schema/fetch-all.js +2 -5
- package/commands/customObject/schema/fetch.js +2 -4
- package/commands/customObject/schema/list.js +2 -4
- package/commands/customObject/schema/update.js +4 -4
- package/commands/fetch.js +2 -2
- package/commands/filemanager/fetch.js +2 -2
- package/commands/filemanager/upload.js +3 -7
- package/commands/functions/deploy.js +6 -11
- package/commands/functions/list.js +3 -6
- package/commands/hubdb/clear.js +5 -3
- package/commands/hubdb/create.js +2 -2
- package/commands/hubdb/delete.js +2 -2
- package/commands/hubdb/fetch.js +2 -2
- package/commands/init.js +4 -7
- package/commands/lint.js +2 -2
- package/commands/list.js +4 -6
- package/commands/logs.js +6 -3
- package/commands/mv.js +3 -6
- package/commands/project/__tests__/deploy.test.js +37 -26
- package/commands/project/__tests__/logs.test.js +4 -5
- package/commands/project/add.js +2 -2
- package/commands/project/cloneApp.js +14 -10
- package/commands/project/create.js +2 -6
- package/commands/project/deploy.js +9 -12
- package/commands/project/dev.js +6 -5
- package/commands/project/download.js +7 -9
- package/commands/project/listBuilds.js +8 -12
- package/commands/project/logs.js +2 -2
- package/commands/project/migrateApp.js +20 -15
- package/commands/project/upload.js +4 -10
- package/commands/project/watch.js +8 -13
- package/commands/remove.js +2 -5
- package/commands/sandbox/create.js +4 -6
- package/commands/sandbox/delete.js +6 -12
- package/commands/secrets/addSecret.js +2 -5
- package/commands/secrets/deleteSecret.js +2 -5
- package/commands/secrets/listSecrets.js +5 -6
- package/commands/secrets/updateSecret.js +2 -5
- package/commands/theme/preview.js +2 -5
- package/commands/upload.js +3 -7
- package/commands/watch.js +3 -7
- package/lang/en.lyaml +12 -15
- package/lib/LocalDevManager.js +8 -6
- package/lib/__tests__/downloadProjectPrompt.test.js +1 -1
- package/lib/__tests__/projectLogsManager.test.js +19 -17
- package/lib/__tests__/serverlessLogs.test.js +13 -9
- package/lib/buildAccount.js +10 -10
- package/lib/developerTestAccounts.js +27 -27
- package/lib/errorHandlers/index.js +101 -0
- package/lib/errorHandlers/{overrideErrors.js → suppressError.js} +7 -7
- package/lib/hasFeature.js +15 -0
- package/lib/localDev.js +26 -19
- package/lib/marketplace-validate.js +3 -3
- package/lib/oauth.js +1 -1
- package/lib/polling.js +1 -1
- package/lib/projectLogsManager.js +3 -4
- package/lib/projectStructure.js +2 -2
- package/lib/projects.js +34 -24
- package/lib/projectsWatch.js +7 -12
- package/lib/prompts/createProjectPrompt.js +14 -5
- package/lib/prompts/downloadProjectPrompt.js +3 -6
- package/lib/prompts/projectDevTargetAccountPrompt.js +8 -6
- package/lib/prompts/selectPublicAppPrompt.js +3 -3
- package/lib/sandboxSync.js +7 -7
- package/lib/sandboxes.js +11 -7
- package/lib/schema.js +2 -2
- package/lib/serverlessLogs.js +67 -15
- package/lib/upload.js +2 -2
- package/lib/validation.js +2 -2
- package/package.json +6 -6
- package/lib/errorHandlers/apiErrors.js +0 -145
- package/lib/errorHandlers/fileSystemErrors.js +0 -20
- package/lib/errorHandlers/standardErrors.js +0 -103
package/lib/projectsWatch.js
CHANGED
|
@@ -2,10 +2,7 @@ const chokidar = require('chokidar');
|
|
|
2
2
|
const path = require('path');
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const { default: PQueue } = require('p-queue');
|
|
5
|
-
const {
|
|
6
|
-
logApiErrorInstance,
|
|
7
|
-
ApiErrorContext,
|
|
8
|
-
} = require('./errorHandlers/apiErrors');
|
|
5
|
+
const { logError, ApiErrorContext } = require('./errorHandlers/index');
|
|
9
6
|
const { i18n } = require('./lang');
|
|
10
7
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
11
8
|
const { isAllowedExtension } = require('@hubspot/local-dev-lib/path');
|
|
@@ -17,7 +14,7 @@ const {
|
|
|
17
14
|
deleteFileFromBuild,
|
|
18
15
|
queueBuild,
|
|
19
16
|
} = require('@hubspot/local-dev-lib/api/projects');
|
|
20
|
-
const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/
|
|
17
|
+
const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
|
|
21
18
|
const { PROJECT_ERROR_TYPES } = require('./constants');
|
|
22
19
|
|
|
23
20
|
const i18nKey = 'commands.project.subcommands.watch';
|
|
@@ -85,7 +82,7 @@ const debounceQueueBuild = (accountId, projectName, platformVersion) => {
|
|
|
85
82
|
logger.log(i18n(`${i18nKey}.logs.watchCancelledFromUi`));
|
|
86
83
|
process.exit(0);
|
|
87
84
|
} else {
|
|
88
|
-
|
|
85
|
+
logError(err, new ApiErrorContext({ accountId }));
|
|
89
86
|
}
|
|
90
87
|
|
|
91
88
|
return;
|
|
@@ -148,14 +145,12 @@ const queueFileOrFolder = async (
|
|
|
148
145
|
const createNewBuild = async (accountId, projectName, platformVersion) => {
|
|
149
146
|
try {
|
|
150
147
|
logger.debug(i18n(`${i18nKey}.debug.attemptNewBuild`));
|
|
151
|
-
const {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
platformVersion
|
|
155
|
-
);
|
|
148
|
+
const {
|
|
149
|
+
data: { buildId },
|
|
150
|
+
} = await provisionBuild(accountId, projectName, platformVersion);
|
|
156
151
|
return buildId;
|
|
157
152
|
} catch (err) {
|
|
158
|
-
|
|
153
|
+
logError(err, new ApiErrorContext({ accountId }));
|
|
159
154
|
if (
|
|
160
155
|
isSpecifiedError(err, { subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED })
|
|
161
156
|
) {
|
|
@@ -60,14 +60,20 @@ const createProjectPrompt = async (
|
|
|
60
60
|
skipTemplatePrompt = false
|
|
61
61
|
) => {
|
|
62
62
|
let projectTemplates = [];
|
|
63
|
+
let selectedTemplate;
|
|
64
|
+
|
|
63
65
|
if (!skipTemplatePrompt) {
|
|
64
66
|
projectTemplates = await createTemplateOptions(
|
|
65
67
|
promptOptions.templateSource,
|
|
66
68
|
githubRef
|
|
67
69
|
);
|
|
70
|
+
|
|
71
|
+
selectedTemplate =
|
|
72
|
+
promptOptions.template &&
|
|
73
|
+
projectTemplates.find(t => t.name === promptOptions.template);
|
|
68
74
|
}
|
|
69
75
|
|
|
70
|
-
|
|
76
|
+
const result = await promptUser([
|
|
71
77
|
{
|
|
72
78
|
name: 'name',
|
|
73
79
|
message: i18n(`${i18nKey}.enterName`),
|
|
@@ -115,10 +121,7 @@ const createProjectPrompt = async (
|
|
|
115
121
|
})
|
|
116
122
|
: i18n(`${i18nKey}.selectTemplate`);
|
|
117
123
|
},
|
|
118
|
-
when:
|
|
119
|
-
!skipTemplatePrompt &&
|
|
120
|
-
(!promptOptions.template ||
|
|
121
|
-
!projectTemplates.find(t => t.name === promptOptions.template)),
|
|
124
|
+
when: !skipTemplatePrompt && !selectedTemplate,
|
|
122
125
|
type: 'list',
|
|
123
126
|
choices: projectTemplates.map(template => {
|
|
124
127
|
return {
|
|
@@ -128,6 +131,12 @@ const createProjectPrompt = async (
|
|
|
128
131
|
}),
|
|
129
132
|
},
|
|
130
133
|
]);
|
|
134
|
+
|
|
135
|
+
if (selectedTemplate) {
|
|
136
|
+
result.template = selectedTemplate;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return result;
|
|
131
140
|
};
|
|
132
141
|
|
|
133
142
|
module.exports = {
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
const { promptUser } = require('./promptUtils');
|
|
2
2
|
const { getAccountId } = require('@hubspot/local-dev-lib/config');
|
|
3
3
|
const { fetchProjects } = require('@hubspot/local-dev-lib/api/projects');
|
|
4
|
-
const {
|
|
5
|
-
logApiErrorInstance,
|
|
6
|
-
ApiErrorContext,
|
|
7
|
-
} = require('../../lib/errorHandlers/apiErrors');
|
|
4
|
+
const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
|
|
8
5
|
const { EXIT_CODES } = require('../enums/exitCodes');
|
|
9
6
|
const { i18n } = require('../lang');
|
|
10
7
|
|
|
@@ -12,10 +9,10 @@ const i18nKey = 'lib.prompts.downloadProjectPrompt';
|
|
|
12
9
|
|
|
13
10
|
const createProjectsList = async accountId => {
|
|
14
11
|
try {
|
|
15
|
-
const projects = await fetchProjects(accountId);
|
|
12
|
+
const { data: projects } = await fetchProjects(accountId);
|
|
16
13
|
return projects.results;
|
|
17
14
|
} catch (e) {
|
|
18
|
-
|
|
15
|
+
logError(e, new ApiErrorContext({ accountId }));
|
|
19
16
|
process.exit(EXIT_CODES.ERROR);
|
|
20
17
|
}
|
|
21
18
|
};
|
|
@@ -3,7 +3,9 @@ const { i18n } = require('../lang');
|
|
|
3
3
|
const { uiAccountDescription, uiCommandReference } = require('../ui');
|
|
4
4
|
const { isSandbox } = require('../accountTypes');
|
|
5
5
|
const { getAccountId } = require('@hubspot/local-dev-lib/config');
|
|
6
|
-
const {
|
|
6
|
+
const {
|
|
7
|
+
getSandboxUsageLimits,
|
|
8
|
+
} = require('@hubspot/local-dev-lib/api/sandboxHubs');
|
|
7
9
|
const {
|
|
8
10
|
HUBSPOT_ACCOUNT_TYPES,
|
|
9
11
|
HUBSPOT_ACCOUNT_TYPE_STRINGS,
|
|
@@ -11,7 +13,7 @@ const {
|
|
|
11
13
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
12
14
|
const {
|
|
13
15
|
fetchDeveloperTestAccounts,
|
|
14
|
-
} = require('@hubspot/local-dev-lib/developerTestAccounts');
|
|
16
|
+
} = require('@hubspot/local-dev-lib/api/developerTestAccounts');
|
|
15
17
|
|
|
16
18
|
const i18nKey = 'lib.prompts.projectDevTargetAccountPrompt';
|
|
17
19
|
|
|
@@ -38,7 +40,8 @@ const selectSandboxTargetAccountPrompt = async (
|
|
|
38
40
|
let choices = [];
|
|
39
41
|
let sandboxUsage = {};
|
|
40
42
|
try {
|
|
41
|
-
|
|
43
|
+
const { data } = await getSandboxUsageLimits(defaultAccountId);
|
|
44
|
+
sandboxUsage = data.usage;
|
|
42
45
|
} catch (err) {
|
|
43
46
|
logger.debug('Unable to fetch sandbox usage limits: ', err);
|
|
44
47
|
}
|
|
@@ -101,9 +104,8 @@ const selectDeveloperTestTargetAccountPrompt = async (
|
|
|
101
104
|
const defaultAccountId = getAccountId(defaultAccountConfig.name);
|
|
102
105
|
let devTestAccountsResponse = undefined;
|
|
103
106
|
try {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
);
|
|
107
|
+
const { data } = await fetchDeveloperTestAccounts(defaultAccountId);
|
|
108
|
+
devTestAccountsResponse = data;
|
|
107
109
|
} catch (err) {
|
|
108
110
|
logger.debug('Unable to fetch developer test account usage limits: ', err);
|
|
109
111
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { promptUser } = require('./promptUtils');
|
|
2
2
|
const { i18n } = require('../lang');
|
|
3
3
|
const { uiLine } = require('../ui');
|
|
4
|
-
const {
|
|
4
|
+
const { logError } = require('../errorHandlers/index');
|
|
5
5
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
6
6
|
const {
|
|
7
7
|
fetchPublicAppsForPortal,
|
|
@@ -16,7 +16,7 @@ const fetchPublicAppOptions = async (
|
|
|
16
16
|
isMigratingApp = false
|
|
17
17
|
) => {
|
|
18
18
|
try {
|
|
19
|
-
const publicApps = await fetchPublicAppsForPortal(accountId);
|
|
19
|
+
const { data: publicApps } = await fetchPublicAppsForPortal(accountId);
|
|
20
20
|
const filteredPublicApps = publicApps.filter(
|
|
21
21
|
app => !app.projectId && !app.sourceId
|
|
22
22
|
);
|
|
@@ -44,7 +44,7 @@ const fetchPublicAppOptions = async (
|
|
|
44
44
|
}
|
|
45
45
|
return filteredPublicApps;
|
|
46
46
|
} catch (error) {
|
|
47
|
-
|
|
47
|
+
logError(error, { accountId });
|
|
48
48
|
logger.error(i18n(`${i18nKey}.errors.errorFetchingApps`));
|
|
49
49
|
process.exit(EXIT_CODES.ERROR);
|
|
50
50
|
}
|
package/lib/sandboxSync.js
CHANGED
|
@@ -3,13 +3,13 @@ const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
|
|
|
3
3
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
4
4
|
const { i18n } = require('./lang');
|
|
5
5
|
const { getAvailableSyncTypes } = require('./sandboxes');
|
|
6
|
-
const { initiateSync } = require('@hubspot/local-dev-lib/
|
|
7
|
-
const { debugErrorAndContext } = require('./errorHandlers/standardErrors');
|
|
6
|
+
const { initiateSync } = require('@hubspot/local-dev-lib/api/sandboxSync');
|
|
8
7
|
const {
|
|
9
|
-
|
|
8
|
+
debugError,
|
|
9
|
+
logError,
|
|
10
10
|
ApiErrorContext,
|
|
11
|
-
} = require('./errorHandlers/
|
|
12
|
-
const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/
|
|
11
|
+
} = require('./errorHandlers/index');
|
|
12
|
+
const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
|
|
13
13
|
const { getSandboxTypeAsString } = require('./sandboxes');
|
|
14
14
|
const { getAccountId } = require('@hubspot/local-dev-lib/config');
|
|
15
15
|
const {
|
|
@@ -88,7 +88,7 @@ const syncSandbox = async ({
|
|
|
88
88
|
),
|
|
89
89
|
});
|
|
90
90
|
} catch (err) {
|
|
91
|
-
|
|
91
|
+
debugError(err);
|
|
92
92
|
|
|
93
93
|
SpinniesManager.fail('sandboxSync', {
|
|
94
94
|
text: i18n(`${i18nKey}.loading.fail`),
|
|
@@ -155,7 +155,7 @@ const syncSandbox = async ({
|
|
|
155
155
|
'https://app.hubspot.com/l/docs/guides/crm/project-cli-commands#developer-projects-cli-commands-beta'
|
|
156
156
|
);
|
|
157
157
|
} else {
|
|
158
|
-
|
|
158
|
+
logError(
|
|
159
159
|
err,
|
|
160
160
|
new ApiErrorContext({
|
|
161
161
|
accountId: parentAccountId,
|
package/lib/sandboxes.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const { i18n } = require('./lang');
|
|
2
2
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
3
3
|
const {
|
|
4
|
-
fetchTypes,
|
|
5
4
|
getSandboxUsageLimits,
|
|
6
|
-
} = require('@hubspot/local-dev-lib/
|
|
5
|
+
} = require('@hubspot/local-dev-lib/api/sandboxHubs');
|
|
6
|
+
const { fetchTypes } = require('@hubspot/local-dev-lib/api/sandboxSync');
|
|
7
7
|
const {
|
|
8
8
|
getConfig,
|
|
9
9
|
getAccountId,
|
|
@@ -19,9 +19,9 @@ const { uiAccountDescription } = require('./ui');
|
|
|
19
19
|
const {
|
|
20
20
|
isMissingScopeError,
|
|
21
21
|
isSpecifiedError,
|
|
22
|
-
} = require('@hubspot/local-dev-lib/errors/
|
|
22
|
+
} = require('@hubspot/local-dev-lib/errors/index');
|
|
23
23
|
const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
|
|
24
|
-
const {
|
|
24
|
+
const { logError } = require('./errorHandlers/index');
|
|
25
25
|
|
|
26
26
|
const syncTypes = {
|
|
27
27
|
OBJECT_RECORDS: 'object-records',
|
|
@@ -73,7 +73,9 @@ function getSandboxLimit(error) {
|
|
|
73
73
|
async function getAvailableSyncTypes(parentAccountConfig, config) {
|
|
74
74
|
const parentPortalId = getAccountId(parentAccountConfig.portalId);
|
|
75
75
|
const portalId = getAccountId(config.portalId);
|
|
76
|
-
const
|
|
76
|
+
const {
|
|
77
|
+
data: { results: syncTypes },
|
|
78
|
+
} = await fetchTypes(parentPortalId, portalId);
|
|
77
79
|
if (!syncTypes) {
|
|
78
80
|
throw new Error(
|
|
79
81
|
'Unable to fetch available sandbox sync types. Please try again.'
|
|
@@ -126,7 +128,9 @@ const getSyncTypesWithContactRecordsPrompt = async (
|
|
|
126
128
|
*/
|
|
127
129
|
const validateSandboxUsageLimits = async (accountConfig, sandboxType, env) => {
|
|
128
130
|
const accountId = getAccountId(accountConfig.portalId);
|
|
129
|
-
const
|
|
131
|
+
const {
|
|
132
|
+
data: { usage },
|
|
133
|
+
} = await getSandboxUsageLimits(accountId);
|
|
130
134
|
if (!usage) {
|
|
131
135
|
throw new Error('Unable to fetch sandbox usage limits. Please try again.');
|
|
132
136
|
}
|
|
@@ -348,7 +352,7 @@ function handleSandboxCreateError({
|
|
|
348
352
|
}
|
|
349
353
|
logger.log('');
|
|
350
354
|
} else {
|
|
351
|
-
|
|
355
|
+
logError(err);
|
|
352
356
|
}
|
|
353
357
|
throw err;
|
|
354
358
|
}
|
package/lib/schema.js
CHANGED
|
@@ -24,8 +24,8 @@ const logSchemas = schemas => {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
const listSchemas = async accountId => {
|
|
27
|
-
const
|
|
28
|
-
logSchemas(
|
|
27
|
+
const { data } = await fetchObjectSchemas(accountId);
|
|
28
|
+
logSchemas(data.results);
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
module.exports = {
|
package/lib/serverlessLogs.js
CHANGED
|
@@ -4,13 +4,20 @@ const { handleExit, handleKeypress } = require('./process');
|
|
|
4
4
|
const chalk = require('chalk');
|
|
5
5
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
6
6
|
const { outputLogs } = require('./ui/serverlessFunctionLogs');
|
|
7
|
-
const {
|
|
8
|
-
logServerlessFunctionApiErrorInstance,
|
|
9
|
-
logApiErrorInstance,
|
|
10
|
-
ApiErrorContext,
|
|
11
|
-
} = require('./errorHandlers/apiErrors');
|
|
7
|
+
const { logError, ApiErrorContext } = require('./errorHandlers/index');
|
|
12
8
|
|
|
13
9
|
const { EXIT_CODES } = require('../lib/enums/exitCodes');
|
|
10
|
+
const {
|
|
11
|
+
isHubSpotHttpError,
|
|
12
|
+
isMissingScopeError,
|
|
13
|
+
} = require('@hubspot/local-dev-lib/errors/index');
|
|
14
|
+
const {
|
|
15
|
+
SCOPE_GROUPS,
|
|
16
|
+
PERSONAL_ACCESS_KEY_AUTH_METHOD,
|
|
17
|
+
} = require('@hubspot/local-dev-lib/constants/auth');
|
|
18
|
+
const { getAccountConfig } = require('@hubspot/local-dev-lib/config');
|
|
19
|
+
const { fetchScopeData } = require('@hubspot/local-dev-lib/api/localDevAuth');
|
|
20
|
+
const { i18n } = require('./lang');
|
|
14
21
|
|
|
15
22
|
const TAIL_DELAY = 5000;
|
|
16
23
|
|
|
@@ -38,6 +45,47 @@ const handleUserInput = () => {
|
|
|
38
45
|
});
|
|
39
46
|
};
|
|
40
47
|
|
|
48
|
+
async function verifyAccessKeyAndUserAccess(accountId, scopeGroup) {
|
|
49
|
+
const accountConfig = getAccountConfig(accountId);
|
|
50
|
+
// TODO[JOE]: Update this i18n key
|
|
51
|
+
const i18nKey = 'lib.serverless';
|
|
52
|
+
const { authType } = accountConfig;
|
|
53
|
+
if (authType !== PERSONAL_ACCESS_KEY_AUTH_METHOD.value) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let scopesData;
|
|
58
|
+
try {
|
|
59
|
+
scopesData = await fetchScopeData(accountId, scopeGroup);
|
|
60
|
+
} catch (e) {
|
|
61
|
+
logger.debug(
|
|
62
|
+
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.fetchScopeDataError`, {
|
|
63
|
+
scopeGroup,
|
|
64
|
+
error: e,
|
|
65
|
+
})
|
|
66
|
+
);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const { portalScopesInGroup, userScopesInGroup } = scopesData;
|
|
70
|
+
|
|
71
|
+
if (!portalScopesInGroup.length) {
|
|
72
|
+
logger.error(
|
|
73
|
+
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.portalMissingScope`)
|
|
74
|
+
);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (!portalScopesInGroup.every(s => userScopesInGroup.includes(s))) {
|
|
79
|
+
logger.error(
|
|
80
|
+
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.userMissingScope`)
|
|
81
|
+
);
|
|
82
|
+
} else {
|
|
83
|
+
logger.error(
|
|
84
|
+
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.genericMissingScope`)
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
41
89
|
const tailLogs = async ({
|
|
42
90
|
accountId,
|
|
43
91
|
compact,
|
|
@@ -48,16 +96,19 @@ const tailLogs = async ({
|
|
|
48
96
|
let initialAfter;
|
|
49
97
|
|
|
50
98
|
try {
|
|
51
|
-
const latestLog = await fetchLatest();
|
|
99
|
+
const { data: latestLog } = await fetchLatest();
|
|
52
100
|
initialAfter = latestLog && base64EncodeString(latestLog.id);
|
|
53
101
|
} catch (e) {
|
|
54
102
|
// A 404 means no latest log exists(never executed)
|
|
55
|
-
if (e
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
103
|
+
if (isHubSpotHttpError(e) && e.status !== 404) {
|
|
104
|
+
if (isMissingScopeError(e)) {
|
|
105
|
+
await verifyAccessKeyAndUserAccess(
|
|
106
|
+
accountId,
|
|
107
|
+
SCOPE_GROUPS.CMS_FUNCTIONS
|
|
108
|
+
);
|
|
109
|
+
} else {
|
|
110
|
+
await logError(e, new ApiErrorContext({ accountId }));
|
|
111
|
+
}
|
|
61
112
|
}
|
|
62
113
|
}
|
|
63
114
|
|
|
@@ -65,11 +116,12 @@ const tailLogs = async ({
|
|
|
65
116
|
let latestLog;
|
|
66
117
|
let nextAfter;
|
|
67
118
|
try {
|
|
68
|
-
|
|
119
|
+
const { data } = await tailCall(after);
|
|
120
|
+
latestLog = data;
|
|
69
121
|
nextAfter = latestLog.paging.next.after;
|
|
70
122
|
} catch (e) {
|
|
71
|
-
if (e
|
|
72
|
-
|
|
123
|
+
if (isHubSpotHttpError(e) && e.status !== 404) {
|
|
124
|
+
logError(
|
|
73
125
|
e,
|
|
74
126
|
new ApiErrorContext({
|
|
75
127
|
accountId,
|
package/lib/upload.js
CHANGED
|
@@ -6,7 +6,7 @@ const { isAllowedExtension } = require('@hubspot/local-dev-lib/path');
|
|
|
6
6
|
const {
|
|
7
7
|
isConvertableFieldJs,
|
|
8
8
|
} = require('@hubspot/local-dev-lib/cms/handleFieldsJS');
|
|
9
|
-
const {
|
|
9
|
+
const { logError } = require('./errorHandlers/index');
|
|
10
10
|
|
|
11
11
|
/*
|
|
12
12
|
* Walks the src folder for files, filters them based on ignore filter.
|
|
@@ -17,7 +17,7 @@ const getUploadableFileList = async (src, convertFields) => {
|
|
|
17
17
|
try {
|
|
18
18
|
filePaths = await walk(src);
|
|
19
19
|
} catch (e) {
|
|
20
|
-
|
|
20
|
+
logError(e);
|
|
21
21
|
}
|
|
22
22
|
const allowedFiles = filePaths
|
|
23
23
|
.filter(file => {
|
package/lib/validation.js
CHANGED
|
@@ -28,7 +28,7 @@ const { getAccountId, getMode, setLogLevel } = require('./commonOpts');
|
|
|
28
28
|
const { logDebugInfo } = require('./debugInfo');
|
|
29
29
|
const { EXIT_CODES } = require('./enums/exitCodes');
|
|
30
30
|
const { checkAndWarnGitInclusion } = require('./ui/git');
|
|
31
|
-
const {
|
|
31
|
+
const { logError } = require('./errorHandlers/index');
|
|
32
32
|
|
|
33
33
|
async function loadAndValidateOptions(options, shouldValidateAccount = true) {
|
|
34
34
|
setLogLevel(options);
|
|
@@ -156,7 +156,7 @@ async function validateAccount(options) {
|
|
|
156
156
|
return false;
|
|
157
157
|
}
|
|
158
158
|
} catch (e) {
|
|
159
|
-
|
|
159
|
+
logError(e);
|
|
160
160
|
return false;
|
|
161
161
|
}
|
|
162
162
|
} else if (!apiKey) {
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hubspot/cli",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "CLI for working with HubSpot",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/HubSpot/hubspot-
|
|
8
|
+
"url": "https://github.com/HubSpot/hubspot-cli"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@hubspot/local-dev-lib": "
|
|
12
|
-
"@hubspot/serverless-dev-runtime": "6.
|
|
13
|
-
"@hubspot/theme-preview-dev-server": "0.0.
|
|
11
|
+
"@hubspot/local-dev-lib": "2.0.0",
|
|
12
|
+
"@hubspot/serverless-dev-runtime": "6.2.0",
|
|
13
|
+
"@hubspot/theme-preview-dev-server": "0.0.8",
|
|
14
14
|
"@hubspot/ui-extensions-dev-server": "0.8.33",
|
|
15
15
|
"archiver": "^5.3.0",
|
|
16
16
|
"chalk": "^4.1.2",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "760939368a64cd5dedf529ca89106253dbf98fce"
|
|
50
50
|
}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
2
|
-
const { getAccountConfig } = require('@hubspot/local-dev-lib/config');
|
|
3
|
-
const {
|
|
4
|
-
isMissingScopeError,
|
|
5
|
-
isApiUploadValidationError,
|
|
6
|
-
getAxiosErrorWithContext,
|
|
7
|
-
parseValidationErrors,
|
|
8
|
-
} = require('@hubspot/local-dev-lib/errors/apiErrors');
|
|
9
|
-
const {
|
|
10
|
-
SCOPE_GROUPS,
|
|
11
|
-
PERSONAL_ACCESS_KEY_AUTH_METHOD,
|
|
12
|
-
} = require('@hubspot/local-dev-lib/constants/auth');
|
|
13
|
-
const { fetchScopeData } = require('@hubspot/local-dev-lib/api/localDevAuth');
|
|
14
|
-
const {
|
|
15
|
-
debugErrorAndContext,
|
|
16
|
-
logErrorInstance,
|
|
17
|
-
ErrorContext,
|
|
18
|
-
} = require('./standardErrors');
|
|
19
|
-
const { overrideErrors } = require('./overrideErrors');
|
|
20
|
-
const { i18n } = require('../lang');
|
|
21
|
-
|
|
22
|
-
const i18nKey = 'lib.errorHandlers.apiErrors';
|
|
23
|
-
|
|
24
|
-
class ApiErrorContext extends ErrorContext {
|
|
25
|
-
constructor(props = {}) {
|
|
26
|
-
super(props);
|
|
27
|
-
/** @type {string} */
|
|
28
|
-
this.request = props.request || '';
|
|
29
|
-
/** @type {string} */
|
|
30
|
-
this.payload = props.payload || '';
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @param {Error} error
|
|
36
|
-
* @param {ApiErrorContext} context
|
|
37
|
-
*/
|
|
38
|
-
function logValidationErrors(error, context) {
|
|
39
|
-
const { response = {} } = error;
|
|
40
|
-
const validationErrors = parseValidationErrors(response.data);
|
|
41
|
-
if (validationErrors.length) {
|
|
42
|
-
logger.error(validationErrors.join('\n- '));
|
|
43
|
-
}
|
|
44
|
-
debugErrorAndContext(error, context);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Logs a message for an error instance resulting from API interaction.
|
|
49
|
-
*
|
|
50
|
-
* @param {Error|SystemError|Object} error
|
|
51
|
-
* @param {ApiErrorContext} context
|
|
52
|
-
*/
|
|
53
|
-
function logApiErrorInstance(error, context) {
|
|
54
|
-
if (error.isAxiosError) {
|
|
55
|
-
if (overrideErrors(error, context)) return;
|
|
56
|
-
const errorWithContext = getAxiosErrorWithContext(error, context);
|
|
57
|
-
logger.error(errorWithContext.message);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
logErrorInstance(error, context);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Logs a message for an error instance resulting from filemapper API upload.
|
|
65
|
-
*
|
|
66
|
-
* @param {Error|SystemError|Object} error
|
|
67
|
-
* @param {ApiErrorContext} context
|
|
68
|
-
*/
|
|
69
|
-
function logApiUploadErrorInstance(error, context) {
|
|
70
|
-
if (isApiUploadValidationError(error)) {
|
|
71
|
-
logValidationErrors(error, context);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
logApiErrorInstance(error, context);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async function verifyAccessKeyAndUserAccess(accountId, scopeGroup) {
|
|
78
|
-
const accountConfig = getAccountConfig(accountId);
|
|
79
|
-
const { authType } = accountConfig;
|
|
80
|
-
if (authType !== PERSONAL_ACCESS_KEY_AUTH_METHOD.value) {
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
let scopesData;
|
|
85
|
-
try {
|
|
86
|
-
scopesData = await fetchScopeData(accountId, scopeGroup);
|
|
87
|
-
} catch (e) {
|
|
88
|
-
logger.debug(
|
|
89
|
-
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.fetchScopeDataError`, {
|
|
90
|
-
scopeGroup,
|
|
91
|
-
error: e,
|
|
92
|
-
})
|
|
93
|
-
);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
const { portalScopesInGroup, userScopesInGroup } = scopesData;
|
|
97
|
-
|
|
98
|
-
if (!portalScopesInGroup.length) {
|
|
99
|
-
logger.error(
|
|
100
|
-
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.portalMissingScope`)
|
|
101
|
-
);
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
if (!portalScopesInGroup.every(s => userScopesInGroup.includes(s))) {
|
|
106
|
-
logger.error(
|
|
107
|
-
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.userMissingScope`)
|
|
108
|
-
);
|
|
109
|
-
return;
|
|
110
|
-
} else {
|
|
111
|
-
logger.error(
|
|
112
|
-
i18n(`${i18nKey}.verifyAccessKeyAndUserAccess.genericMissingScope`)
|
|
113
|
-
);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Logs a message for an error instance resulting from API interaction
|
|
120
|
-
* related to serverless function.
|
|
121
|
-
*
|
|
122
|
-
* @param {int} accountId
|
|
123
|
-
* @param {Error|SystemError|Object} error
|
|
124
|
-
* @param {ApiErrorContext} context
|
|
125
|
-
*/
|
|
126
|
-
async function logServerlessFunctionApiErrorInstance(
|
|
127
|
-
accountId,
|
|
128
|
-
error,
|
|
129
|
-
context
|
|
130
|
-
) {
|
|
131
|
-
if (isMissingScopeError(error)) {
|
|
132
|
-
await verifyAccessKeyAndUserAccess(accountId, SCOPE_GROUPS.CMS_FUNCTIONS);
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
logApiErrorInstance(error, context);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
module.exports = {
|
|
140
|
-
ApiErrorContext,
|
|
141
|
-
parseValidationErrors,
|
|
142
|
-
logApiErrorInstance,
|
|
143
|
-
logApiUploadErrorInstance,
|
|
144
|
-
logServerlessFunctionApiErrorInstance,
|
|
145
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const {
|
|
2
|
-
getFileSystemError,
|
|
3
|
-
} = require('@hubspot/local-dev-lib/errors/fileSystemErrors');
|
|
4
|
-
const { debugErrorAndContext, logErrorInstance } = require('./standardErrors');
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Logs a message for an error instance resulting from filesystem interaction.
|
|
8
|
-
*
|
|
9
|
-
* @param {Error|SystemError|Object} error
|
|
10
|
-
* @param {FileSystemErrorContext} context
|
|
11
|
-
*/
|
|
12
|
-
function logFileSystemErrorInstance(error, context) {
|
|
13
|
-
const fileSystemError = getFileSystemError(error, context);
|
|
14
|
-
logErrorInstance(fileSystemError.message, context);
|
|
15
|
-
debugErrorAndContext(error, context);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
module.exports = {
|
|
19
|
-
logFileSystemErrorInstance,
|
|
20
|
-
};
|