@hubspot/cli 6.1.0 → 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.
Files changed (85) hide show
  1. package/bin/cli.js +2 -2
  2. package/commands/accounts/clean.js +5 -7
  3. package/commands/auth.js +5 -5
  4. package/commands/cms/convertFields.js +2 -2
  5. package/commands/cms/lighthouseScore.js +47 -36
  6. package/commands/create/function.js +2 -2
  7. package/commands/create/module.js +2 -2
  8. package/commands/create/template.js +2 -2
  9. package/commands/create.js +3 -5
  10. package/commands/customObject/create.js +2 -2
  11. package/commands/customObject/schema/create.js +4 -4
  12. package/commands/customObject/schema/delete.js +2 -3
  13. package/commands/customObject/schema/fetch-all.js +2 -5
  14. package/commands/customObject/schema/fetch.js +2 -4
  15. package/commands/customObject/schema/list.js +2 -4
  16. package/commands/customObject/schema/update.js +4 -4
  17. package/commands/fetch.js +2 -2
  18. package/commands/filemanager/fetch.js +2 -2
  19. package/commands/filemanager/upload.js +3 -7
  20. package/commands/functions/deploy.js +6 -11
  21. package/commands/functions/list.js +3 -6
  22. package/commands/hubdb/clear.js +5 -3
  23. package/commands/hubdb/create.js +2 -2
  24. package/commands/hubdb/delete.js +2 -2
  25. package/commands/hubdb/fetch.js +2 -2
  26. package/commands/init.js +4 -7
  27. package/commands/lint.js +2 -2
  28. package/commands/list.js +4 -6
  29. package/commands/logs.js +6 -3
  30. package/commands/mv.js +3 -6
  31. package/commands/project/__tests__/deploy.test.js +37 -26
  32. package/commands/project/__tests__/logs.test.js +4 -5
  33. package/commands/project/add.js +2 -2
  34. package/commands/project/cloneApp.js +14 -10
  35. package/commands/project/create.js +2 -6
  36. package/commands/project/deploy.js +9 -12
  37. package/commands/project/dev.js +6 -5
  38. package/commands/project/download.js +7 -9
  39. package/commands/project/listBuilds.js +8 -12
  40. package/commands/project/logs.js +2 -2
  41. package/commands/project/migrateApp.js +20 -15
  42. package/commands/project/upload.js +4 -10
  43. package/commands/project/watch.js +8 -13
  44. package/commands/remove.js +2 -5
  45. package/commands/sandbox/create.js +4 -6
  46. package/commands/sandbox/delete.js +6 -12
  47. package/commands/secrets/addSecret.js +2 -5
  48. package/commands/secrets/deleteSecret.js +2 -5
  49. package/commands/secrets/listSecrets.js +5 -6
  50. package/commands/secrets/updateSecret.js +2 -5
  51. package/commands/theme/preview.js +2 -5
  52. package/commands/upload.js +3 -7
  53. package/commands/watch.js +3 -7
  54. package/lang/en.lyaml +12 -15
  55. package/lib/LocalDevManager.js +8 -6
  56. package/lib/__tests__/downloadProjectPrompt.test.js +1 -1
  57. package/lib/__tests__/projectLogsManager.test.js +19 -17
  58. package/lib/__tests__/serverlessLogs.test.js +13 -9
  59. package/lib/buildAccount.js +10 -10
  60. package/lib/developerTestAccounts.js +27 -27
  61. package/lib/errorHandlers/index.js +101 -0
  62. package/lib/errorHandlers/{overrideErrors.js → suppressError.js} +7 -7
  63. package/lib/hasFeature.js +15 -0
  64. package/lib/localDev.js +26 -19
  65. package/lib/marketplace-validate.js +3 -3
  66. package/lib/oauth.js +1 -1
  67. package/lib/polling.js +1 -1
  68. package/lib/projectLogsManager.js +3 -4
  69. package/lib/projectStructure.js +2 -2
  70. package/lib/projects.js +34 -24
  71. package/lib/projectsWatch.js +7 -12
  72. package/lib/prompts/createProjectPrompt.js +14 -5
  73. package/lib/prompts/downloadProjectPrompt.js +3 -6
  74. package/lib/prompts/projectDevTargetAccountPrompt.js +8 -6
  75. package/lib/prompts/selectPublicAppPrompt.js +3 -3
  76. package/lib/sandboxSync.js +7 -7
  77. package/lib/sandboxes.js +11 -7
  78. package/lib/schema.js +2 -2
  79. package/lib/serverlessLogs.js +67 -15
  80. package/lib/upload.js +2 -2
  81. package/lib/validation.js +2 -2
  82. package/package.json +6 -6
  83. package/lib/errorHandlers/apiErrors.js +0 -145
  84. package/lib/errorHandlers/fileSystemErrors.js +0 -20
  85. package/lib/errorHandlers/standardErrors.js +0 -103
@@ -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/apiErrors');
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
- logApiErrorInstance(err, new ApiErrorContext({ accountId }));
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 { buildId } = await provisionBuild(
152
- accountId,
153
- projectName,
154
- platformVersion
155
- );
148
+ const {
149
+ data: { buildId },
150
+ } = await provisionBuild(accountId, projectName, platformVersion);
156
151
  return buildId;
157
152
  } catch (err) {
158
- logApiErrorInstance(err, new ApiErrorContext({ accountId }));
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
- return promptUser([
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
- logApiErrorInstance(e, new ApiErrorContext({ accountId }));
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 { getSandboxUsageLimits } = require('@hubspot/local-dev-lib/sandboxes');
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
- sandboxUsage = await getSandboxUsageLimits(defaultAccountId);
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
- devTestAccountsResponse = await fetchDeveloperTestAccounts(
105
- defaultAccountId
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 { logApiErrorInstance } = require('../errorHandlers/apiErrors');
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
- logApiErrorInstance(error, { accountId });
47
+ logError(error, { accountId });
48
48
  logger.error(i18n(`${i18nKey}.errors.errorFetchingApps`));
49
49
  process.exit(EXIT_CODES.ERROR);
50
50
  }
@@ -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/sandboxes');
7
- const { debugErrorAndContext } = require('./errorHandlers/standardErrors');
6
+ const { initiateSync } = require('@hubspot/local-dev-lib/api/sandboxSync');
8
7
  const {
9
- logApiErrorInstance,
8
+ debugError,
9
+ logError,
10
10
  ApiErrorContext,
11
- } = require('./errorHandlers/apiErrors');
12
- const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/apiErrors');
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
- debugErrorAndContext(err);
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
- logApiErrorInstance(
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/sandboxes');
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/apiErrors');
22
+ } = require('@hubspot/local-dev-lib/errors/index');
23
23
  const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
24
- const { logErrorInstance } = require('./errorHandlers/standardErrors');
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 syncTypes = await fetchTypes(parentPortalId, portalId);
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 usage = await getSandboxUsageLimits(accountId);
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
- logErrorInstance(err);
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 response = await fetchObjectSchemas(accountId);
28
- logSchemas(response.results);
27
+ const { data } = await fetchObjectSchemas(accountId);
28
+ logSchemas(data.results);
29
29
  };
30
30
 
31
31
  module.exports = {
@@ -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.response && e.response.status !== 404) {
56
- await logServerlessFunctionApiErrorInstance(
57
- accountId,
58
- e,
59
- new ApiErrorContext({ accountId })
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
- latestLog = await tailCall(after);
119
+ const { data } = await tailCall(after);
120
+ latestLog = data;
69
121
  nextAfter = latestLog.paging.next.after;
70
122
  } catch (e) {
71
- if (e.response && e.response.status !== 404) {
72
- logApiErrorInstance(
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 { logErrorInstance } = require('./errorHandlers/standardErrors');
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
- logErrorInstance(e);
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 { logErrorInstance } = require('./errorHandlers/standardErrors');
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
- logErrorInstance(e);
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.1.0",
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-cms-tools"
8
+ "url": "https://github.com/HubSpot/hubspot-cli"
9
9
  },
10
10
  "dependencies": {
11
- "@hubspot/local-dev-lib": "1.13.0",
12
- "@hubspot/serverless-dev-runtime": "6.0.0",
13
- "@hubspot/theme-preview-dev-server": "0.0.7",
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": "51f7638e491a999b6f64a9f3bda3c4d05fff0dbc"
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
- };