@hubspot/cli 7.10.0-beta.1 → 7.10.0-experimental.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 +5 -4
- package/commands/__tests__/getStarted.test.js +10 -0
- package/commands/__tests__/project.test.js +3 -0
- package/commands/account/__tests__/rename.test.js +10 -3
- package/commands/account/auth.js +10 -14
- package/commands/account/clean.js +11 -19
- package/commands/account/createOverride.js +15 -11
- package/commands/account/info.js +8 -5
- package/commands/account/list.js +15 -19
- package/commands/account/remove.js +23 -22
- package/commands/account/removeOverride.js +6 -6
- package/commands/account/rename.js +2 -2
- package/commands/account/use.js +19 -8
- package/commands/app/__tests__/migrate.test.js +8 -4
- package/commands/app/migrate.js +2 -2
- package/commands/auth.js +18 -14
- package/commands/config/migrate.js +5 -5
- package/commands/customObject/createSchema.js +2 -3
- package/commands/customObject/updateSchema.js +2 -3
- package/commands/getStarted.js +2 -3
- package/commands/hubdb/__tests__/list.test.js +1 -0
- package/commands/hubdb/list.js +2 -2
- package/commands/init.js +36 -32
- package/commands/project/__tests__/deploy.test.js +10 -5
- package/commands/project/__tests__/devUnifiedFlow.test.js +6 -4
- package/commands/project/__tests__/lint.test.js +709 -0
- package/commands/project/__tests__/logs.test.js +4 -0
- package/commands/project/__tests__/validate.test.js +2 -2
- package/commands/project/cloneApp.js +2 -2
- package/commands/project/deploy.js +2 -2
- package/commands/project/dev/deprecatedFlow.js +4 -5
- package/commands/project/dev/index.js +6 -3
- package/commands/project/dev/unifiedFlow.js +4 -5
- package/commands/project/lint.d.ts +6 -0
- package/commands/project/lint.js +178 -0
- package/commands/project/logs.js +2 -3
- package/commands/project/profile/add.js +6 -7
- package/commands/project/profile/delete.js +2 -2
- package/commands/project/upload.js +2 -2
- package/commands/project/validate.js +2 -2
- package/commands/project.js +2 -0
- package/commands/sandbox/__tests__/create.test.js +14 -5
- package/commands/sandbox/create.js +4 -5
- package/commands/sandbox/delete.js +23 -20
- package/commands/testAccount/__tests__/create.test.js +5 -5
- package/commands/testAccount/create.js +2 -2
- package/commands/testAccount/delete.js +9 -8
- package/lang/en.d.ts +40 -6
- package/lang/en.js +54 -14
- package/lib/__tests__/buildAccount.test.js +22 -30
- package/lib/__tests__/commonOpts.test.js +9 -13
- package/lib/__tests__/developerTestAccounts.test.js +29 -17
- package/lib/__tests__/importData.test.js +20 -10
- package/lib/__tests__/oauth.test.js +19 -8
- package/lib/__tests__/sandboxSync.test.js +33 -11
- package/lib/__tests__/sandboxes.test.js +30 -19
- package/lib/__tests__/usageTracking.test.js +10 -10
- package/lib/__tests__/validation.test.js +32 -32
- package/lib/accountTypes.d.ts +9 -9
- package/lib/accountTypes.js +2 -4
- package/lib/app/__tests__/migrate.test.js +15 -0
- package/lib/app/__tests__/migrate_legacy.test.js +9 -0
- package/lib/app/migrate_legacy.d.ts +2 -2
- package/lib/buildAccount.d.ts +4 -4
- package/lib/buildAccount.js +7 -14
- package/lib/commonOpts.js +3 -3
- package/lib/configMigrate.d.ts +2 -2
- package/lib/configMigrate.js +42 -18
- package/lib/configOptions.js +3 -2
- package/lib/developerTestAccounts.d.ts +3 -3
- package/lib/developerTestAccounts.js +4 -7
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
- package/lib/doctor/DiagnosticInfoBuilder.js +9 -6
- package/lib/doctor/Doctor.js +4 -3
- package/lib/doctor/__tests__/Diagnosis.test.js +4 -3
- package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +17 -9
- package/lib/doctor/__tests__/Doctor.test.js +14 -0
- package/lib/importData.js +8 -7
- package/lib/links.js +5 -5
- package/lib/middleware/{__test__ → __tests__}/commandTargetingUtils.test.js +3 -3
- package/lib/middleware/{__test__ → __tests__}/configMiddleware.test.js +23 -22
- package/lib/middleware/{__test__ → __tests__}/gitMiddleware.test.js +9 -7
- package/lib/middleware/autoUpdateMiddleware.js +12 -4
- package/lib/middleware/commandTargetingUtils.js +3 -2
- package/lib/middleware/configMiddleware.d.ts +6 -1
- package/lib/middleware/configMiddleware.js +36 -15
- package/lib/middleware/gitMiddleware.js +8 -4
- package/lib/oauth.d.ts +2 -2
- package/lib/oauth.js +8 -10
- package/lib/projects/__tests__/AppDevModeInterface.test.js +17 -6
- package/lib/projects/__tests__/DevServerManager.test.js +1 -0
- package/lib/projects/__tests__/LocalDevProcess.test.js +1 -0
- package/lib/projects/__tests__/components.test.js +1 -1
- package/lib/projects/__tests__/deploy.test.js +1 -0
- package/lib/projects/__tests__/uieLinting.test.js +640 -0
- package/lib/projects/components.js +1 -1
- package/lib/projects/create/__tests__/v2.test.js +11 -0
- package/lib/projects/localDev/AppDevModeInterface.js +2 -2
- package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
- package/lib/projects/localDev/DevSessionManager.d.ts +17 -0
- package/lib/projects/localDev/DevSessionManager.js +56 -0
- package/lib/projects/localDev/LocalDevLogger.d.ts +3 -0
- package/lib/projects/localDev/LocalDevLogger.js +13 -4
- package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +3 -3
- package/lib/projects/localDev/LocalDevProcess.d.ts +1 -0
- package/lib/projects/localDev/LocalDevProcess.js +12 -1
- package/lib/projects/localDev/LocalDevState.d.ts +3 -0
- package/lib/projects/localDev/LocalDevState.js +9 -0
- package/lib/projects/localDev/helpers/account.d.ts +10 -10
- package/lib/projects/localDev/helpers/account.js +6 -11
- package/lib/projects/localDev/helpers/devSessionsApi.d.ts +9 -0
- package/lib/projects/localDev/helpers/devSessionsApi.js +19 -0
- package/lib/projects/uieLinting.d.ts +33 -0
- package/lib/projects/uieLinting.js +222 -0
- package/lib/projects/urls.js +5 -6
- package/lib/prompts/__tests__/downloadProjectPrompt.test.js +7 -5
- package/lib/prompts/accountNamePrompt.js +3 -3
- package/lib/prompts/accountsPrompt.d.ts +1 -1
- package/lib/prompts/accountsPrompt.js +6 -7
- package/lib/prompts/confirmImportDataPrompt.js +2 -2
- package/lib/prompts/downloadProjectPrompt.d.ts +1 -0
- package/lib/prompts/downloadProjectPrompt.js +5 -2
- package/lib/prompts/importDataTestAccountSelectPrompt.js +4 -5
- package/lib/prompts/personalAccessKeyPrompt.js +2 -2
- package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -3
- package/lib/prompts/projectDevTargetAccountPrompt.js +5 -7
- package/lib/prompts/sandboxesPrompt.js +7 -8
- package/lib/prompts/setAsDefaultAccountPrompt.js +7 -6
- package/lib/sandboxSync.d.ts +2 -2
- package/lib/sandboxSync.js +3 -9
- package/lib/sandboxes.d.ts +4 -4
- package/lib/sandboxes.js +6 -11
- package/lib/serverlessLogs.js +2 -2
- package/lib/theme/__tests__/migrate.test.js +15 -0
- package/lib/ui/index.js +6 -3
- package/lib/usageTracking.js +15 -8
- package/lib/validation.js +13 -11
- package/mcp-server/tools/cms/HsCreateFunctionTool.js +4 -2
- package/mcp-server/tools/cms/HsCreateModuleTool.js +4 -2
- package/mcp-server/tools/cms/HsCreateTemplateTool.js +4 -2
- package/mcp-server/tools/cms/HsFunctionLogsTool.js +4 -2
- package/mcp-server/tools/cms/HsListFunctionsTool.js +3 -1
- package/mcp-server/tools/cms/HsListTool.js +3 -1
- package/mcp-server/tools/cms/__tests__/HsCreateFunctionTool.test.js +1 -0
- package/mcp-server/tools/index.js +4 -0
- package/mcp-server/tools/project/AddFeatureToProjectTool.js +4 -2
- package/mcp-server/tools/project/CreateProjectTool.js +4 -2
- package/mcp-server/tools/project/CreateTestAccountTool.js +42 -19
- package/mcp-server/tools/project/DeployProjectTool.js +3 -1
- package/mcp-server/tools/project/DocFetchTool.js +6 -4
- package/mcp-server/tools/project/DocsSearchTool.d.ts +1 -1
- package/mcp-server/tools/project/DocsSearchTool.js +10 -8
- package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +1 -1
- package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +9 -7
- package/mcp-server/tools/project/GetApplicationInfoTool.js +8 -6
- package/mcp-server/tools/project/GetBuildLogsTool.d.ts +26 -0
- package/mcp-server/tools/project/GetBuildLogsTool.js +125 -0
- package/mcp-server/tools/project/GetBuildStatusTool.d.ts +26 -0
- package/mcp-server/tools/project/GetBuildStatusTool.js +166 -0
- package/mcp-server/tools/project/GetConfigValuesTool.d.ts +1 -1
- package/mcp-server/tools/project/GetConfigValuesTool.js +9 -7
- package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
- package/mcp-server/tools/project/GuidedWalkthroughTool.js +5 -3
- package/mcp-server/tools/project/UploadProjectTools.js +3 -1
- package/mcp-server/tools/project/ValidateProjectTool.js +4 -2
- package/mcp-server/tools/project/__tests__/CreateTestAccountTool.test.js +226 -3
- package/mcp-server/tools/project/__tests__/DocFetchTool.test.js +5 -1
- package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +23 -11
- package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +7 -5
- package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +7 -5
- package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetBuildLogsTool.test.js +305 -0
- package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetBuildStatusTool.test.js +240 -0
- package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -6
- package/mcp-server/utils/__tests__/content.test.js +21 -20
- package/mcp-server/utils/__tests__/feedbackTracking.test.js +34 -28
- package/mcp-server/utils/config.d.ts +1 -0
- package/mcp-server/utils/config.js +10 -0
- package/mcp-server/utils/content.d.ts +1 -1
- package/mcp-server/utils/content.js +2 -2
- package/mcp-server/utils/feedbackTracking.d.ts +1 -1
- package/mcp-server/utils/feedbackTracking.js +3 -3
- package/mcp-server/utils/toolUsageTracking.js +4 -3
- package/package.json +8 -7
- package/types/LocalDev.d.ts +1 -0
- package/lib/middleware/__test__/notificationsMiddleware.test.js +0 -8
- package/lib/middleware/notificationsMiddleware.d.ts +0 -1
- package/lib/middleware/notificationsMiddleware.js +0 -28
- package/mcp-server/utils/__tests__/cliConfig.test.js +0 -110
- package/mcp-server/utils/cliConfig.d.ts +0 -1
- package/mcp-server/utils/cliConfig.js +0 -12
- /package/{lib/middleware/__test__/commandTargetingUtils.test.d.ts → commands/project/__tests__/lint.test.d.ts} +0 -0
- /package/lib/middleware/{__test__/configMiddleware.test.d.ts → __tests__/commandTargetingUtils.test.d.ts} +0 -0
- /package/lib/middleware/{__test__/gitMiddleware.test.d.ts → __tests__/configMiddleware.test.d.ts} +0 -0
- /package/lib/middleware/{__test__/notificationsMiddleware.test.d.ts → __tests__/gitMiddleware.test.d.ts} +0 -0
- /package/lib/middleware/{__test__ → __tests__}/requestMiddleware.test.d.ts +0 -0
- /package/lib/middleware/{__test__ → __tests__}/requestMiddleware.test.js +0 -0
- /package/lib/middleware/{__test__ → __tests__}/yargsChecksMiddleware.test.d.ts +0 -0
- /package/lib/middleware/{__test__ → __tests__}/yargsChecksMiddleware.test.js +0 -0
- /package/{mcp-server/utils/__tests__/cliConfig.test.d.ts → lib/projects/__tests__/uieLinting.test.d.ts} +0 -0
|
@@ -3,8 +3,8 @@ import { fetchProject } from '@hubspot/local-dev-lib/api/projects';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { pkg } from '../jsonLoader.js';
|
|
5
5
|
import { uiLogger } from '../ui/logger.js';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { isConfigFlagEnabled, getConfigFilePath, getConfigDefaultAccountIfExists, } from '@hubspot/local-dev-lib/config';
|
|
7
|
+
import { getDefaultAccountOverrideFilePath } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
|
|
8
8
|
import { getAccessToken } from '@hubspot/local-dev-lib/personalAccessKey';
|
|
9
9
|
import { walk } from '@hubspot/local-dev-lib/fs';
|
|
10
10
|
import util from 'util';
|
|
@@ -33,15 +33,18 @@ export class DiagnosticInfoBuilder {
|
|
|
33
33
|
files;
|
|
34
34
|
processInfo;
|
|
35
35
|
constructor(processInfo) {
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const accountConfig = getConfigDefaultAccountIfExists();
|
|
37
|
+
this.accountId = accountConfig?.accountId;
|
|
38
38
|
this.configSettings = {
|
|
39
39
|
httpUseLocalhost: isConfigFlagEnabled('httpUseLocalhost'),
|
|
40
40
|
};
|
|
41
41
|
this.env = accountConfig?.env;
|
|
42
42
|
this.authType = accountConfig?.authType;
|
|
43
43
|
this.accountType = accountConfig?.accountType;
|
|
44
|
-
this.personalAccessKey =
|
|
44
|
+
this.personalAccessKey =
|
|
45
|
+
accountConfig && 'personalAccessKey' in accountConfig
|
|
46
|
+
? accountConfig.personalAccessKey
|
|
47
|
+
: undefined;
|
|
45
48
|
this.processInfo = processInfo;
|
|
46
49
|
}
|
|
47
50
|
async generateDiagnosticInfo() {
|
|
@@ -58,7 +61,7 @@ export class DiagnosticInfoBuilder {
|
|
|
58
61
|
platform,
|
|
59
62
|
arch,
|
|
60
63
|
path: mainModule?.path,
|
|
61
|
-
config:
|
|
64
|
+
config: getConfigFilePath(),
|
|
62
65
|
defaultAccountOverrideFile: getDefaultAccountOverrideFilePath(),
|
|
63
66
|
configSettings: this.configSettings,
|
|
64
67
|
versions: {
|
package/lib/doctor/Doctor.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { uiLogger } from '../ui/logger.js';
|
|
2
|
-
import {
|
|
2
|
+
import { getConfigDefaultAccountIfExists } from '@hubspot/local-dev-lib/config';
|
|
3
|
+
import { getDefaultAccountOverrideAccountId } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
|
|
3
4
|
import SpinniesManager from '../ui/SpinniesManager.js';
|
|
4
5
|
import { hasMissingPackages } from '../dependencyManagement.js';
|
|
5
6
|
import { getLatestCliVersion } from '../npm.js';
|
|
@@ -25,7 +26,7 @@ export class Doctor {
|
|
|
25
26
|
diagnosticInfoBuilder;
|
|
26
27
|
constructor(diagnosticInfoBuilder = new DiagnosticInfoBuilder(process)) {
|
|
27
28
|
SpinniesManager.init();
|
|
28
|
-
this.accountId =
|
|
29
|
+
this.accountId = getConfigDefaultAccountIfExists()?.accountId ?? null;
|
|
29
30
|
this.diagnosticInfoBuilder = diagnosticInfoBuilder;
|
|
30
31
|
}
|
|
31
32
|
async diagnose() {
|
|
@@ -88,7 +89,7 @@ export class Doctor {
|
|
|
88
89
|
});
|
|
89
90
|
this.diagnosis?.addDefaultAccountOverrideFileSection({
|
|
90
91
|
type: 'warning',
|
|
91
|
-
message: lib.doctor.defaultAccountOverrideFileChecks.overrideAccountId(
|
|
92
|
+
message: lib.doctor.defaultAccountOverrideFileChecks.overrideAccountId(getDefaultAccountOverrideAccountId()),
|
|
92
93
|
});
|
|
93
94
|
}
|
|
94
95
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
2
2
|
import { Diagnosis } from '../Diagnosis.js';
|
|
3
|
-
import {
|
|
3
|
+
import { getConfigAccountIfExists as __getConfigAccountIfExists } from '@hubspot/local-dev-lib/config';
|
|
4
4
|
import stripAnsi from 'strip-ansi';
|
|
5
|
-
const
|
|
5
|
+
const getConfigAccountIfExists = __getConfigAccountIfExists;
|
|
6
6
|
describe('lib/doctor/Diagnosis', () => {
|
|
7
7
|
const diagnosticInfo = {
|
|
8
8
|
account: {},
|
|
@@ -31,7 +31,8 @@ describe('lib/doctor/Diagnosis', () => {
|
|
|
31
31
|
};
|
|
32
32
|
const accountId = 123456;
|
|
33
33
|
beforeEach(() => {
|
|
34
|
-
|
|
34
|
+
getConfigAccountIfExists.mockReturnValue({
|
|
35
|
+
accountId,
|
|
35
36
|
accountType: 'STANDARD',
|
|
36
37
|
name: 'Standard Account',
|
|
37
38
|
});
|
|
@@ -2,6 +2,7 @@ import util from 'util';
|
|
|
2
2
|
import { vi } from 'vitest';
|
|
3
3
|
vi.mock('@hubspot/local-dev-lib/fs');
|
|
4
4
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
5
|
+
vi.mock('@hubspot/local-dev-lib/config/defaultAccountOverride');
|
|
5
6
|
vi.mock('@hubspot/local-dev-lib/personalAccessKey');
|
|
6
7
|
vi.mock('../../projects/config');
|
|
7
8
|
vi.mock('@hubspot/local-dev-lib/api/projects');
|
|
@@ -16,17 +17,19 @@ vi.mock('../../jsonLoader.js', () => {
|
|
|
16
17
|
};
|
|
17
18
|
});
|
|
18
19
|
import { DiagnosticInfoBuilder, } from '../DiagnosticInfoBuilder.js';
|
|
19
|
-
import {
|
|
20
|
+
import { getConfigAccountIfExists as _getConfigAccountIfExists, getConfigAccountById as _getConfigAccountById, getConfigFilePath as _getConfigFilePath, isConfigFlagEnabled as _isConfigFlagEnabled, getConfigDefaultAccountIfExists as _getConfigDefaultAccountIfExists, } from '@hubspot/local-dev-lib/config';
|
|
21
|
+
import { getDefaultAccountOverrideFilePath as _getDefaultAccountOverrideFilePath } from '@hubspot/local-dev-lib/config/defaultAccountOverride';
|
|
20
22
|
import { getAccessToken as _getAccessToken } from '@hubspot/local-dev-lib/personalAccessKey';
|
|
21
23
|
import { walk as _walk } from '@hubspot/local-dev-lib/fs';
|
|
22
24
|
import { getProjectConfig as _getProjectConfig } from '../../projects/config.js';
|
|
23
25
|
import { fetchProject as _fetchProject } from '@hubspot/local-dev-lib/api/projects';
|
|
24
26
|
const walk = _walk;
|
|
25
27
|
const getAccessToken = _getAccessToken;
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
+
const getConfigAccountById = _getConfigAccountById;
|
|
29
|
+
const getConfigAccountIfExists = _getConfigAccountIfExists;
|
|
30
|
+
const getConfigDefaultAccountIfExists = _getConfigDefaultAccountIfExists;
|
|
31
|
+
const getConfigFilePath = _getConfigFilePath;
|
|
28
32
|
const getDefaultAccountOverrideFilePath = _getDefaultAccountOverrideFilePath;
|
|
29
|
-
const getAccountId = _getAccountId;
|
|
30
33
|
const getProjectConfig = _getProjectConfig;
|
|
31
34
|
const isConfigFlagEnabled = _isConfigFlagEnabled;
|
|
32
35
|
const fetchProject = _fetchProject;
|
|
@@ -36,6 +39,8 @@ util.promisify = utilPromisify;
|
|
|
36
39
|
describe('lib/doctor/DiagnosticInfo', () => {
|
|
37
40
|
const accountId = 898989;
|
|
38
41
|
const accountConfig = {
|
|
42
|
+
name: 'test-account',
|
|
43
|
+
accountId: accountId,
|
|
39
44
|
env: 'prod',
|
|
40
45
|
authType: 'personalaccesskey',
|
|
41
46
|
accountType: 'STANDARD',
|
|
@@ -73,16 +78,19 @@ describe('lib/doctor/DiagnosticInfo', () => {
|
|
|
73
78
|
const configPath = '/path/to/config';
|
|
74
79
|
const defaultAccountOverrideFile = 'path/to/default/account/override/.hsaccount';
|
|
75
80
|
beforeEach(() => {
|
|
76
|
-
|
|
77
|
-
|
|
81
|
+
getConfigAccountIfExists.mockReturnValue({
|
|
82
|
+
accountId,
|
|
83
|
+
name: 'test',
|
|
84
|
+
});
|
|
85
|
+
getConfigAccountById.mockReturnValue(accountConfig);
|
|
86
|
+
getConfigDefaultAccountIfExists.mockReturnValue(accountConfig);
|
|
78
87
|
walk.mockResolvedValue(projectFiles);
|
|
79
88
|
isConfigFlagEnabled.mockReturnValue(false);
|
|
80
89
|
mockPromisifyImpl.mockResolvedValue(npmVersion);
|
|
81
90
|
});
|
|
82
91
|
it('should initialize the required state on creation', () => {
|
|
83
92
|
const builder = new DiagnosticInfoBuilder(processInfo);
|
|
84
|
-
expect(
|
|
85
|
-
expect(getAccountConfig).toHaveBeenCalledTimes(1);
|
|
93
|
+
expect(getConfigDefaultAccountIfExists).toHaveBeenCalledTimes(1);
|
|
86
94
|
expect(builder.accountId).toEqual(accountId);
|
|
87
95
|
expect(builder.env).toEqual(accountConfig.env);
|
|
88
96
|
expect(builder.authType).toEqual(accountConfig.authType);
|
|
@@ -131,7 +139,7 @@ describe('lib/doctor/DiagnosticInfo', () => {
|
|
|
131
139
|
data: projectDetails,
|
|
132
140
|
});
|
|
133
141
|
getAccessToken.mockResolvedValue(accessToken);
|
|
134
|
-
|
|
142
|
+
getConfigFilePath.mockReturnValue(configPath);
|
|
135
143
|
getDefaultAccountOverrideFilePath.mockReturnValue(defaultAccountOverrideFile);
|
|
136
144
|
});
|
|
137
145
|
it('should gather the required data and generate the diagnostic', async () => {
|
|
@@ -6,6 +6,7 @@ import { HubSpotHttpError } from '@hubspot/local-dev-lib/models/HubSpotHttpError
|
|
|
6
6
|
import { AxiosError } from 'axios';
|
|
7
7
|
import { isSpecifiedError as _isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
|
|
8
8
|
import { promisify as _promisify } from 'util';
|
|
9
|
+
import { getConfigDefaultAccount as _getConfigDefaultAccount, getConfigDefaultAccountIfExists as _getConfigDefaultAccountIfExists, } from '@hubspot/local-dev-lib/config';
|
|
9
10
|
vi.mock('../../ui/logger.js');
|
|
10
11
|
vi.mock('../Diagnosis');
|
|
11
12
|
vi.mock('../../ui/SpinniesManager');
|
|
@@ -15,6 +16,7 @@ vi.mock('../../npm');
|
|
|
15
16
|
vi.mock('@hubspot/local-dev-lib/portManager');
|
|
16
17
|
vi.mock('@hubspot/local-dev-lib/personalAccessKey');
|
|
17
18
|
vi.mock('@hubspot/local-dev-lib/errors/index');
|
|
19
|
+
vi.mock('@hubspot/local-dev-lib/config');
|
|
18
20
|
vi.mock('util');
|
|
19
21
|
const hasMissingPackages = vi.mocked(_hasMissingPackages);
|
|
20
22
|
const isPortManagerPortAvailable = vi.mocked(_isPortManagerPortAvailable);
|
|
@@ -23,6 +25,8 @@ const accessTokenForPersonalAccessKey = vi.mocked(_accessTokenForPersonalAccessK
|
|
|
23
25
|
const authorizedScopesForPortalAndUser = vi.mocked(_authorizedScopesForPortalAndUser);
|
|
24
26
|
const scopesOnAccessToken = vi.mocked(_scopesOnAccessToken);
|
|
25
27
|
const isSpecifiedError = vi.mocked(_isSpecifiedError);
|
|
28
|
+
const getConfigDefaultAccount = vi.mocked(_getConfigDefaultAccount);
|
|
29
|
+
const getConfigDefaultAccountIfExists = vi.mocked(_getConfigDefaultAccountIfExists);
|
|
26
30
|
describe('lib/doctor/Doctor', () => {
|
|
27
31
|
let doctor;
|
|
28
32
|
// @ts-ignore
|
|
@@ -57,6 +61,16 @@ describe('lib/doctor/Doctor', () => {
|
|
|
57
61
|
},
|
|
58
62
|
};
|
|
59
63
|
beforeEach(() => {
|
|
64
|
+
// Mock config functions
|
|
65
|
+
const mockAccount = {
|
|
66
|
+
accountId: 123456,
|
|
67
|
+
accountType: 'STANDARD',
|
|
68
|
+
name: 'Test Account',
|
|
69
|
+
authType: 'personalaccesskey',
|
|
70
|
+
personalAccessKey: 'test-key',
|
|
71
|
+
};
|
|
72
|
+
getConfigDefaultAccount.mockReturnValue(mockAccount);
|
|
73
|
+
getConfigDefaultAccountIfExists.mockReturnValue(mockAccount);
|
|
60
74
|
doctor = new Doctor({
|
|
61
75
|
generateDiagnosticInfo: vi.fn().mockResolvedValue({
|
|
62
76
|
...diagnosticInfo,
|
package/lib/importData.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getConfigAccountById, getConfigAccountEnvironment, getConfigAccountIfExists, } from '@hubspot/local-dev-lib/config';
|
|
2
2
|
import { createImport } from '@hubspot/local-dev-lib/api/crm';
|
|
3
3
|
import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
|
|
4
4
|
import { importDataTestAccountSelectPrompt } from './prompts/importDataTestAccountSelectPrompt.js';
|
|
@@ -7,7 +7,7 @@ import { isAppDeveloperAccount, isDeveloperTestAccount, isStandardAccount, } fro
|
|
|
7
7
|
import { uiLogger } from './ui/logger.js';
|
|
8
8
|
export async function handleImportData(targetAccountId, dataFileNames, importRequest) {
|
|
9
9
|
try {
|
|
10
|
-
const baseUrl = getHubSpotWebsiteOrigin(
|
|
10
|
+
const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(targetAccountId));
|
|
11
11
|
const response = await createImport(targetAccountId, importRequest, dataFileNames);
|
|
12
12
|
const importId = response.data.id;
|
|
13
13
|
uiLogger.info(lib.importData.viewImportLink(baseUrl, targetAccountId, importId));
|
|
@@ -18,19 +18,20 @@ export async function handleImportData(targetAccountId, dataFileNames, importReq
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
export async function handleTargetTestAccountSelectionFlow(derivedAccountId, userProvidedAccount) {
|
|
21
|
-
let targetAccountId
|
|
21
|
+
let targetAccountId;
|
|
22
|
+
let testAccount;
|
|
22
23
|
if (userProvidedAccount) {
|
|
23
|
-
|
|
24
|
+
testAccount = getConfigAccountIfExists(userProvidedAccount);
|
|
25
|
+
targetAccountId = testAccount?.accountId;
|
|
24
26
|
}
|
|
25
27
|
// Only allow users to pass in test accounts
|
|
26
28
|
if (targetAccountId) {
|
|
27
|
-
|
|
28
|
-
if (!testAccount || !isDeveloperTestAccount(testAccount)) {
|
|
29
|
+
if (testAccount && !isDeveloperTestAccount(testAccount)) {
|
|
29
30
|
throw new Error(lib.importData.errors.notDeveloperTestAccount);
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
else {
|
|
33
|
-
const targetProjectAccountConfig =
|
|
34
|
+
const targetProjectAccountConfig = getConfigAccountById(derivedAccountId);
|
|
34
35
|
if (!targetProjectAccountConfig) {
|
|
35
36
|
throw new Error(lib.importData.errors.noAccountConfig(derivedAccountId));
|
|
36
37
|
}
|
package/lib/links.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import open from 'open';
|
|
2
|
-
import {
|
|
3
|
-
import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
|
|
2
|
+
import { getConfigAccountEnvironment } from '@hubspot/local-dev-lib/config';
|
|
4
3
|
import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
|
|
4
|
+
import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments';
|
|
5
5
|
import { uiLogger } from './ui/logger.js';
|
|
6
6
|
import { getTableContents, getTableHeader } from './ui/table.js';
|
|
7
7
|
const COMMON_SITE_LINKS = {
|
|
@@ -75,7 +75,7 @@ const COMMON_SITE_LINKS = {
|
|
|
75
75
|
},
|
|
76
76
|
};
|
|
77
77
|
export function getSiteLinksAsArray(accountId) {
|
|
78
|
-
const baseUrl = getHubSpotWebsiteOrigin(
|
|
78
|
+
const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
|
|
79
79
|
return Object.values(COMMON_SITE_LINKS)
|
|
80
80
|
.sort((a, b) => (a.shortcut < b.shortcut ? -1 : 1))
|
|
81
81
|
.map(l => ({ ...l, url: l.getUrl(accountId, baseUrl) }));
|
|
@@ -95,12 +95,12 @@ export function openLink(accountId, shortcut) {
|
|
|
95
95
|
uiLogger.error(`We couldn't find a shortcut matching ${shortcut}. Type 'hs open list' to see a list of available shortcuts`);
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
|
-
const baseUrl = getHubSpotWebsiteOrigin(
|
|
98
|
+
const baseUrl = getHubSpotWebsiteOrigin(getConfigAccountEnvironment(accountId));
|
|
99
99
|
open(match.getUrl(accountId, baseUrl), { url: true });
|
|
100
100
|
uiLogger.success(`We opened ${match.getUrl(accountId, baseUrl)} in your browser`);
|
|
101
101
|
}
|
|
102
102
|
export function getProductUpdatesUrl(rolloutId, accountId) {
|
|
103
|
-
const baseUrl = getHubSpotWebsiteOrigin(
|
|
103
|
+
const baseUrl = getHubSpotWebsiteOrigin(accountId ? getConfigAccountEnvironment(accountId) : ENVIRONMENTS.PROD);
|
|
104
104
|
if (accountId) {
|
|
105
105
|
return `${baseUrl}/product-updates/${accountId}/in-beta?rollout=${rolloutId}`;
|
|
106
106
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as cliConfig from '@hubspot/local-dev-lib/config';
|
|
2
2
|
import { isTargetedCommand, shouldLoadConfigForCommand, shouldRunAccountValidationForCommand, shouldRunConfigValidationForCommand, } from '../commandTargetingUtils.js';
|
|
3
3
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
4
|
-
const
|
|
4
|
+
const globalConfigFileExistsSpy = vi.spyOn(cliConfig, 'globalConfigFileExists');
|
|
5
5
|
const targetCommandMap = {
|
|
6
6
|
init: true,
|
|
7
7
|
account: {
|
|
@@ -56,12 +56,12 @@ describe('lib/middleware/commandTargetingUtils', () => {
|
|
|
56
56
|
expect(result).toBe(false);
|
|
57
57
|
});
|
|
58
58
|
it('should return false when the user is trying to migrate the global config', () => {
|
|
59
|
-
|
|
59
|
+
globalConfigFileExistsSpy.mockReturnValue(false);
|
|
60
60
|
const result = shouldLoadConfigForCommand(['config', 'migrate']);
|
|
61
61
|
expect(result).toBe(false);
|
|
62
62
|
});
|
|
63
63
|
it('should return true when the global config file does exist', () => {
|
|
64
|
-
|
|
64
|
+
globalConfigFileExistsSpy.mockReturnValue(true);
|
|
65
65
|
const result = shouldLoadConfigForCommand(['account', 'use']);
|
|
66
66
|
expect(result).toBe(true);
|
|
67
67
|
});
|
|
@@ -2,7 +2,7 @@ import { uiLogger } from '../../ui/logger.js';
|
|
|
2
2
|
import * as cliConfig from '@hubspot/local-dev-lib/config';
|
|
3
3
|
import * as validation from '../../validation.js';
|
|
4
4
|
import { EXIT_CODES } from '../../enums/exitCodes.js';
|
|
5
|
-
import { handleDeprecatedEnvVariables, injectAccountIdMiddleware,
|
|
5
|
+
import { handleDeprecatedEnvVariables, injectAccountIdMiddleware, validateConfigMiddleware, validateAccountOptions, } from '../configMiddleware.js';
|
|
6
6
|
vi.mock('../../ui/logger.js', () => ({
|
|
7
7
|
uiLogger: {
|
|
8
8
|
error: vi.fn(),
|
|
@@ -12,10 +12,10 @@ vi.mock('../../ui/logger.js', () => ({
|
|
|
12
12
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
13
13
|
vi.mock('../../validation');
|
|
14
14
|
const validateAccountSpy = vi.spyOn(validation, 'validateAccount');
|
|
15
|
-
const
|
|
16
|
-
const
|
|
15
|
+
const getConfigAccountIfExistsSpy = vi.spyOn(cliConfig, 'getConfigAccountIfExists');
|
|
16
|
+
const globalConfigFileExistsSpy = vi.spyOn(cliConfig, 'globalConfigFileExists');
|
|
17
17
|
const configFileExistsSpy = vi.spyOn(cliConfig, 'configFileExists');
|
|
18
|
-
const
|
|
18
|
+
const getConfigFilePathSpy = vi.spyOn(cliConfig, 'getConfigFilePath');
|
|
19
19
|
const validateConfigSpy = vi.spyOn(cliConfig, 'validateConfig');
|
|
20
20
|
const processExitSpy = vi.spyOn(process, 'exit');
|
|
21
21
|
describe('lib/middleware/configMiddleware', () => {
|
|
@@ -23,7 +23,7 @@ describe('lib/middleware/configMiddleware', () => {
|
|
|
23
23
|
processExitSpy.mockImplementation(code => {
|
|
24
24
|
throw new Error(`Process.exit called with code ${code}`);
|
|
25
25
|
});
|
|
26
|
-
|
|
26
|
+
getConfigFilePathSpy.mockReturnValue('/path/to/config');
|
|
27
27
|
});
|
|
28
28
|
describe('handleDeprecatedEnvVariables()', () => {
|
|
29
29
|
it('should handle deprecated HUBSPOT_PORTAL_ID environment variable', () => {
|
|
@@ -76,11 +76,13 @@ describe('lib/middleware/configMiddleware', () => {
|
|
|
76
76
|
await injectAccountIdMiddleware(argv);
|
|
77
77
|
expect(argv.userProvidedAccount).toBeUndefined();
|
|
78
78
|
expect(argv.derivedAccountId).toBe(123);
|
|
79
|
-
expect(
|
|
79
|
+
expect(getConfigAccountIfExistsSpy).not.toHaveBeenCalled();
|
|
80
80
|
process.env = originalEnv;
|
|
81
81
|
});
|
|
82
82
|
it('should use getAccountId when useEnv is false', async () => {
|
|
83
|
-
|
|
83
|
+
getConfigAccountIfExistsSpy.mockReturnValue({
|
|
84
|
+
accountId: 456,
|
|
85
|
+
});
|
|
84
86
|
const argv = {
|
|
85
87
|
_: ['some-command'],
|
|
86
88
|
account: 'test-account',
|
|
@@ -90,41 +92,40 @@ describe('lib/middleware/configMiddleware', () => {
|
|
|
90
92
|
await injectAccountIdMiddleware(argv);
|
|
91
93
|
expect(argv.userProvidedAccount).toBe('test-account');
|
|
92
94
|
expect(argv.derivedAccountId).toBe(456);
|
|
93
|
-
expect(
|
|
95
|
+
expect(getConfigAccountIfExistsSpy).toHaveBeenCalledWith('test-account');
|
|
94
96
|
});
|
|
95
97
|
});
|
|
96
|
-
describe('
|
|
97
|
-
it('should
|
|
98
|
+
describe('validateConfigMiddleware()', () => {
|
|
99
|
+
it('should allow using --config flag', async () => {
|
|
98
100
|
configFileExistsSpy.mockReturnValue(true);
|
|
101
|
+
validateConfigSpy.mockReturnValue({ isValid: true, errors: [] });
|
|
99
102
|
const argv = {
|
|
100
103
|
_: ['some-command'],
|
|
101
104
|
config: 'custom-config.json',
|
|
102
105
|
$0: 'hs',
|
|
103
106
|
};
|
|
104
|
-
await
|
|
105
|
-
|
|
106
|
-
expect(
|
|
107
|
+
await validateConfigMiddleware(argv);
|
|
108
|
+
// Should not throw or exit - this is now allowed
|
|
109
|
+
expect(processExitSpy).not.toHaveBeenCalled();
|
|
110
|
+
expect(uiLogger.error).not.toHaveBeenCalled();
|
|
107
111
|
});
|
|
108
|
-
it('should
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
validateConfigSpy.mockReturnValue(true);
|
|
112
|
+
it('should validate config for non-init commands', async () => {
|
|
113
|
+
globalConfigFileExistsSpy.mockReturnValue(true);
|
|
114
|
+
validateConfigSpy.mockReturnValue({ isValid: true, errors: [] });
|
|
112
115
|
const argv = {
|
|
113
116
|
_: ['some-command'],
|
|
114
117
|
$0: 'hs',
|
|
115
118
|
};
|
|
116
|
-
await
|
|
117
|
-
expect(loadConfigSpy).toHaveBeenCalled();
|
|
119
|
+
await validateConfigMiddleware(argv);
|
|
118
120
|
expect(validateConfigSpy).toHaveBeenCalled();
|
|
119
121
|
});
|
|
120
122
|
it('should skip validation for init command', async () => {
|
|
121
|
-
|
|
123
|
+
globalConfigFileExistsSpy.mockReturnValue(false);
|
|
122
124
|
const argv = {
|
|
123
125
|
_: ['init'],
|
|
124
126
|
$0: 'hs',
|
|
125
127
|
};
|
|
126
|
-
await
|
|
127
|
-
expect(loadConfigSpy).not.toHaveBeenCalled();
|
|
128
|
+
await validateConfigMiddleware(argv);
|
|
128
129
|
expect(validateConfigSpy).not.toHaveBeenCalled();
|
|
129
130
|
});
|
|
130
131
|
});
|
|
@@ -3,19 +3,19 @@ import * as gitUI from '../../ui/git.js';
|
|
|
3
3
|
import { checkAndWarnGitInclusionMiddleware } from '../gitMiddleware.js';
|
|
4
4
|
vi.mock('@hubspot/local-dev-lib/config');
|
|
5
5
|
vi.mock('../../ui/git');
|
|
6
|
-
const
|
|
6
|
+
const getConfigFilePathSpy = vi.spyOn(config, 'getConfigFilePath');
|
|
7
7
|
const checkAndWarnGitInclusionSpy = vi.spyOn(gitUI, 'checkAndWarnGitInclusion');
|
|
8
8
|
describe('lib/middleware/gitMiddleware', () => {
|
|
9
9
|
describe('checkAndWarnGitInclusionMiddleware()', () => {
|
|
10
10
|
it('should call checkAndWarnGitInclusion when command is provided and config path exists', () => {
|
|
11
11
|
const mockConfigPath = '/path/to/config.js';
|
|
12
|
-
|
|
12
|
+
getConfigFilePathSpy.mockReturnValue(mockConfigPath);
|
|
13
13
|
const argv = {
|
|
14
14
|
_: ['some-command'],
|
|
15
15
|
$0: 'hs',
|
|
16
16
|
};
|
|
17
17
|
checkAndWarnGitInclusionMiddleware(argv);
|
|
18
|
-
expect(
|
|
18
|
+
expect(getConfigFilePathSpy).toHaveBeenCalledTimes(1);
|
|
19
19
|
expect(checkAndWarnGitInclusionSpy).toHaveBeenCalledWith(mockConfigPath);
|
|
20
20
|
});
|
|
21
21
|
it('should not call checkAndWarnGitInclusion when no command is provided', () => {
|
|
@@ -24,17 +24,19 @@ describe('lib/middleware/gitMiddleware', () => {
|
|
|
24
24
|
$0: 'hs',
|
|
25
25
|
};
|
|
26
26
|
checkAndWarnGitInclusionMiddleware(argv);
|
|
27
|
-
expect(
|
|
27
|
+
expect(getConfigFilePathSpy).not.toHaveBeenCalled();
|
|
28
28
|
expect(checkAndWarnGitInclusionSpy).not.toHaveBeenCalled();
|
|
29
29
|
});
|
|
30
|
-
it('should not call checkAndWarnGitInclusion when config path
|
|
31
|
-
|
|
30
|
+
it('should not call checkAndWarnGitInclusion when config path does not exist', () => {
|
|
31
|
+
getConfigFilePathSpy.mockImplementation(() => {
|
|
32
|
+
throw new Error('Config path does not exist');
|
|
33
|
+
});
|
|
32
34
|
const argv = {
|
|
33
35
|
_: ['some-command'],
|
|
34
36
|
$0: 'hs',
|
|
35
37
|
};
|
|
36
38
|
checkAndWarnGitInclusionMiddleware(argv);
|
|
37
|
-
expect(
|
|
39
|
+
expect(getConfigFilePathSpy).toHaveBeenCalledTimes(1);
|
|
38
40
|
expect(checkAndWarnGitInclusionSpy).not.toHaveBeenCalled();
|
|
39
41
|
});
|
|
40
42
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import updateNotifier from 'update-notifier';
|
|
2
|
-
import {
|
|
2
|
+
import { getConfig } from '@hubspot/local-dev-lib/config';
|
|
3
3
|
import { pkg } from '../jsonLoader.js';
|
|
4
4
|
import { UI_COLORS } from '../ui/index.js';
|
|
5
5
|
import SpinniesManager from '../ui/SpinniesManager.js';
|
|
@@ -16,7 +16,7 @@ const notifier = updateNotifier({
|
|
|
16
16
|
shouldNotifyInNpmScript: true,
|
|
17
17
|
});
|
|
18
18
|
const CMS_CLI_PACKAGE_NAME = '@hubspot/cms-cli';
|
|
19
|
-
function updateNotification() {
|
|
19
|
+
async function updateNotification() {
|
|
20
20
|
notifier.notify({
|
|
21
21
|
message: pkg.name === CMS_CLI_PACKAGE_NAME
|
|
22
22
|
? lib.middleware.updateNotification.cmsUpdateNotification(CMS_CLI_PACKAGE_NAME)
|
|
@@ -32,6 +32,7 @@ function updateNotification() {
|
|
|
32
32
|
? undefined
|
|
33
33
|
: lib.middleware.updateNotification.notifyTitle,
|
|
34
34
|
},
|
|
35
|
+
isGlobal: await isGloballyInstalled('hs'),
|
|
35
36
|
});
|
|
36
37
|
}
|
|
37
38
|
const SKIP_AUTO_UPDATE_COMMANDS = {
|
|
@@ -45,11 +46,18 @@ const preventAutoUpdateForCommand = (commandParts) => {
|
|
|
45
46
|
export async function autoUpdateCLI(argv) {
|
|
46
47
|
// This lets us back to default update-notifier behavior
|
|
47
48
|
let showManualInstallHelp = true;
|
|
49
|
+
let config;
|
|
50
|
+
try {
|
|
51
|
+
config = getConfig();
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
debugError(e);
|
|
55
|
+
}
|
|
48
56
|
if (notifier &&
|
|
49
57
|
notifier.update &&
|
|
50
58
|
!argv.useEnv &&
|
|
51
59
|
!process.env.SKIP_HUBSPOT_CLI_AUTO_UPDATES &&
|
|
52
|
-
|
|
60
|
+
config?.allowAutoUpdates !== false &&
|
|
53
61
|
!preventAutoUpdateForCommand(argv._)) {
|
|
54
62
|
// Ignore all update notifications if the current version is a pre-release
|
|
55
63
|
if (!notifier.update.current.includes('-')) {
|
|
@@ -88,6 +96,6 @@ export async function autoUpdateCLI(argv) {
|
|
|
88
96
|
}
|
|
89
97
|
}
|
|
90
98
|
if (showManualInstallHelp) {
|
|
91
|
-
updateNotification();
|
|
99
|
+
await updateNotification();
|
|
92
100
|
}
|
|
93
101
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { globalConfigFileExists } from '@hubspot/local-dev-lib/config';
|
|
2
2
|
export function isTargetedCommand(commandParts, targetCommandMap) {
|
|
3
3
|
const currentCommandPart = commandParts[0];
|
|
4
4
|
if (!targetCommandMap[currentCommandPart]) {
|
|
@@ -20,10 +20,11 @@ export function isTargetedCommand(commandParts, targetCommandMap) {
|
|
|
20
20
|
const SKIP_CONFIG_LOADING_COMMANDS = {
|
|
21
21
|
init: true,
|
|
22
22
|
feedback: true,
|
|
23
|
+
mcp: { start: true },
|
|
23
24
|
};
|
|
24
25
|
// Returns true if the command requires a config file to be present
|
|
25
26
|
export function shouldLoadConfigForCommand(commandParts) {
|
|
26
|
-
const globalConfigExists =
|
|
27
|
+
const globalConfigExists = globalConfigFileExists();
|
|
27
28
|
// the user is trying to migrate the global config
|
|
28
29
|
const isGlobalConfigMigration = !globalConfigExists &&
|
|
29
30
|
isTargetedCommand(commandParts, {
|
|
@@ -3,11 +3,16 @@ import { CLIOptions } from '@hubspot/local-dev-lib/types/CLIOptions';
|
|
|
3
3
|
export declare function handleDeprecatedEnvVariables(argv: Arguments<{
|
|
4
4
|
useEnv?: boolean;
|
|
5
5
|
}>): void;
|
|
6
|
+
export declare function handleCustomConfigLocationMiddleware(argv: Arguments<{
|
|
7
|
+
useEnv?: boolean;
|
|
8
|
+
config?: string;
|
|
9
|
+
}>): void;
|
|
6
10
|
/**
|
|
7
11
|
* Auto-injects the derivedAccountId flag into all commands
|
|
8
12
|
*/
|
|
9
13
|
export declare function injectAccountIdMiddleware(argv: Arguments<{
|
|
10
14
|
account?: string;
|
|
15
|
+
config?: string;
|
|
11
16
|
}>): Promise<void>;
|
|
12
|
-
export declare function
|
|
17
|
+
export declare function validateConfigMiddleware(argv: Arguments<CLIOptions>): Promise<void>;
|
|
13
18
|
export declare function validateAccountOptions(argv: Arguments): Promise<void>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { getConfigAccountIfExists, validateConfig, getConfigDefaultAccountIfExists, configFileExists, } from '@hubspot/local-dev-lib/config';
|
|
3
|
+
import { getCwd } from '@hubspot/local-dev-lib/path';
|
|
2
4
|
import { validateAccount } from '../validation.js';
|
|
3
5
|
import { EXIT_CODES } from '../enums/exitCodes.js';
|
|
4
6
|
import { commands } from '../../lang/en.js';
|
|
5
7
|
import { uiDeprecatedTag } from '../ui/index.js';
|
|
6
|
-
import {
|
|
8
|
+
import { shouldLoadConfigForCommand, shouldRunAccountValidationForCommand, shouldRunConfigValidationForCommand, } from './commandTargetingUtils.js';
|
|
7
9
|
import { parseStringToNumber } from '../parsing.js';
|
|
8
10
|
import { uiLogger } from '../ui/logger.js';
|
|
9
11
|
import { lib } from '../../lang/en.js';
|
|
@@ -17,6 +19,18 @@ export function handleDeprecatedEnvVariables(argv) {
|
|
|
17
19
|
process.env.HUBSPOT_ACCOUNT_ID = process.env.HUBSPOT_PORTAL_ID;
|
|
18
20
|
}
|
|
19
21
|
}
|
|
22
|
+
export function handleCustomConfigLocationMiddleware(argv) {
|
|
23
|
+
const { useEnv, config } = argv;
|
|
24
|
+
if (useEnv) {
|
|
25
|
+
process.env.USE_ENVIRONMENT_HUBSPOT_CONFIG = 'true';
|
|
26
|
+
}
|
|
27
|
+
else if (config && typeof config === 'string') {
|
|
28
|
+
const absoluteConfigPath = path.isAbsolute(config)
|
|
29
|
+
? config
|
|
30
|
+
: path.join(getCwd(), config);
|
|
31
|
+
process.env.HUBSPOT_CONFIG_PATH = absoluteConfigPath;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
20
34
|
/**
|
|
21
35
|
* Auto-injects the derivedAccountId flag into all commands
|
|
22
36
|
*/
|
|
@@ -33,10 +47,23 @@ export async function injectAccountIdMiddleware(argv) {
|
|
|
33
47
|
}
|
|
34
48
|
}
|
|
35
49
|
else {
|
|
36
|
-
|
|
50
|
+
// Wrap in try-catch to handle cases where config file doesn't exist yet (e.g., during hs init)
|
|
51
|
+
try {
|
|
52
|
+
let accountInConfig = account
|
|
53
|
+
? getConfigAccountIfExists(account)
|
|
54
|
+
: undefined;
|
|
55
|
+
if (!accountInConfig) {
|
|
56
|
+
accountInConfig = getConfigDefaultAccountIfExists();
|
|
57
|
+
}
|
|
58
|
+
argv.derivedAccountId = accountInConfig?.accountId;
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// Config file doesn't exist yet, which is fine for commands like hs init
|
|
62
|
+
argv.derivedAccountId = undefined;
|
|
63
|
+
}
|
|
37
64
|
}
|
|
38
65
|
}
|
|
39
|
-
export async function
|
|
66
|
+
export async function validateConfigMiddleware(argv) {
|
|
40
67
|
// Skip this when no command is provided
|
|
41
68
|
if (!argv._.length || argv.help) {
|
|
42
69
|
return;
|
|
@@ -45,23 +72,17 @@ export async function loadAndValidateConfigMiddleware(argv) {
|
|
|
45
72
|
if (!shouldLoadConfigForCommand(argv._)) {
|
|
46
73
|
return;
|
|
47
74
|
}
|
|
48
|
-
// If the config file exists and the --config flag is used, exit with an error
|
|
49
|
-
if (configFileExists(true) &&
|
|
50
|
-
argv.config &&
|
|
51
|
-
!isTargetedCommand(argv._, { config: { migrate: true } })) {
|
|
52
|
-
uiLogger.error(commands.generalErrors.loadConfigMiddleware.configFileExists(getConfigPath()));
|
|
53
|
-
process.exit(EXIT_CODES.ERROR);
|
|
54
|
-
}
|
|
55
|
-
const config = loadConfig(argv.config, argv);
|
|
56
75
|
// We don't run validation for auth because users should be able to run it when
|
|
57
76
|
// no accounts are configured, but we still want to exit if the config file is not found
|
|
58
|
-
if (
|
|
77
|
+
if (!process.env.USE_ENVIRONMENT_HUBSPOT_CONFIG && !configFileExists()) {
|
|
78
|
+
console.error('Config file not found, run hs account auth to configure your account');
|
|
59
79
|
process.exit(EXIT_CODES.ERROR);
|
|
60
80
|
}
|
|
61
81
|
// Only validate the config if the command requires it
|
|
62
82
|
if (shouldRunConfigValidationForCommand(argv._)) {
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
83
|
+
const { isValid, errors } = validateConfig();
|
|
84
|
+
if (!isValid) {
|
|
85
|
+
uiLogger.error(commands.generalErrors.validateConfigMiddleware.configValidationFailed(errors));
|
|
65
86
|
process.exit(EXIT_CODES.ERROR);
|
|
66
87
|
}
|
|
67
88
|
}
|