@hubspot/cli 7.7.35-experimental.0 → 7.8.0-beta.1
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 +31 -25
- package/commands/__tests__/auth.test.js +5 -0
- package/commands/__tests__/doctor.test.js +16 -16
- package/commands/__tests__/getStarted.test.js +2 -2
- package/commands/__tests__/mcp.test.js +1 -1
- package/commands/__tests__/project.test.js +2 -3
- package/commands/account/auth.js +1 -0
- package/commands/account/clean.js +18 -27
- package/commands/account/createOverride.js +13 -31
- package/commands/account/info.js +20 -31
- package/commands/account/list.js +16 -22
- package/commands/account/remove.js +12 -20
- package/commands/account/removeOverride.js +11 -21
- package/commands/account/rename.js +6 -9
- package/commands/account/use.js +12 -26
- package/commands/account.js +2 -2
- package/commands/app/__tests__/migrate.test.js +5 -6
- package/commands/app/migrate.js +13 -19
- package/commands/app/secret/add.js +2 -1
- package/commands/app/secret/delete.js +2 -1
- package/commands/app/secret/list.js +2 -1
- package/commands/app/secret/update.js +2 -1
- package/commands/app/secret.js +2 -1
- package/commands/app.js +2 -2
- package/commands/auth.d.ts +1 -0
- package/commands/auth.js +17 -7
- package/commands/cms/convertFields.js +7 -9
- package/commands/cms/getReactModule.js +9 -14
- package/commands/cms/lighthouseScore.js +33 -36
- package/commands/cms.js +2 -2
- package/commands/completion.js +3 -3
- package/commands/config/set.d.ts +1 -1
- package/commands/config/set.js +64 -37
- package/commands/config.js +2 -2
- package/commands/create.js +2 -2
- package/commands/customObject/create.js +10 -12
- package/commands/customObject/schema/create.js +9 -11
- package/commands/customObject/schema/delete.js +16 -16
- package/commands/customObject/schema/fetch-all.js +12 -11
- package/commands/customObject/schema/fetch.js +15 -15
- package/commands/customObject/schema/list.js +4 -4
- package/commands/customObject/schema/update.js +13 -13
- package/commands/customObject/schema.js +2 -2
- package/commands/customObject.js +6 -7
- package/commands/doctor.js +8 -11
- package/commands/feedback.js +8 -13
- package/commands/fetch.js +8 -8
- package/commands/filemanager/fetch.js +7 -7
- package/commands/filemanager/upload.js +15 -34
- package/commands/filemanager.js +2 -2
- package/commands/function/deploy.js +11 -29
- package/commands/function/list.js +8 -8
- package/commands/function/server.js +9 -11
- package/commands/function.d.ts +1 -1
- package/commands/function.js +2 -2
- package/commands/getStarted.d.ts +0 -2
- package/commands/getStarted.js +4 -4
- package/commands/hubdb/clear.js +7 -15
- package/commands/hubdb/create.js +9 -15
- package/commands/hubdb/delete.js +8 -15
- package/commands/hubdb/fetch.js +6 -9
- package/commands/hubdb.d.ts +1 -1
- package/commands/hubdb.js +2 -2
- package/commands/init.js +2 -3
- package/commands/lint.js +16 -16
- package/commands/list.js +8 -14
- package/commands/logs.js +14 -20
- package/commands/mcp/__tests__/setup.test.js +2 -2
- package/commands/mcp/setup.js +11 -2
- package/commands/mcp.js +3 -3
- package/commands/mv.js +6 -17
- package/commands/open.js +5 -5
- package/commands/project/__tests__/add.test.js +15 -13
- package/commands/project/__tests__/create.test.js +6 -6
- package/commands/project/__tests__/deploy.test.js +3 -7
- package/commands/project/__tests__/devUnifiedFlow.test.js +2 -4
- package/commands/project/__tests__/installDeps.test.js +8 -8
- package/commands/project/__tests__/list.test.js +31 -0
- package/commands/project/__tests__/logs.test.js +1 -4
- package/commands/project/__tests__/migrate.test.js +7 -7
- package/commands/project/__tests__/migrateApp.test.js +3 -7
- package/commands/project/__tests__/profile.test.js +1 -1
- package/commands/project/__tests__/validate.test.js +98 -0
- package/commands/project/add.d.ts +2 -2
- package/commands/project/add.js +7 -10
- package/commands/project/cloneApp.js +14 -19
- package/commands/project/create.js +3 -10
- package/commands/project/deploy.js +5 -5
- package/commands/project/dev/deprecatedFlow.js +9 -18
- package/commands/project/dev/index.js +21 -18
- package/commands/project/dev/unifiedFlow.js +14 -7
- package/commands/project/download.js +15 -16
- package/commands/project/installDeps.d.ts +2 -2
- package/commands/project/installDeps.js +9 -9
- package/commands/project/list.d.ts +4 -0
- package/commands/project/list.js +62 -0
- package/commands/project/listBuilds.js +12 -21
- package/commands/project/logs.js +21 -24
- package/commands/project/migrate.js +46 -15
- package/commands/project/migrateApp.js +10 -17
- package/commands/project/open.js +6 -14
- package/commands/project/profile/add.js +3 -3
- package/commands/project/profile/delete.js +1 -2
- package/commands/project/profile.js +2 -3
- package/commands/project/upload.js +16 -25
- package/commands/project/validate.js +7 -7
- package/commands/project/watch.js +13 -22
- package/commands/project.js +4 -3
- package/commands/sandbox/__tests__/create.test.js +5 -5
- package/commands/sandbox/create.js +22 -32
- package/commands/sandbox/delete.js +39 -64
- package/commands/sandbox.js +2 -2
- package/commands/secret/addSecret.js +7 -17
- package/commands/secret/deleteSecret.js +10 -20
- package/commands/secret/listSecret.js +8 -10
- package/commands/secret/updateSecret.js +9 -17
- package/commands/secret.js +2 -2
- package/commands/testAccount/__tests__/delete.test.js +2 -4
- package/commands/testAccount/create.js +2 -2
- package/commands/testAccount/delete.d.ts +4 -3
- package/commands/testAccount/delete.js +155 -14
- package/commands/testAccount/importData.d.ts +1 -1
- package/commands/testAccount/importData.js +1 -1
- package/commands/testAccount.js +1 -1
- package/commands/theme/preview.js +1 -4
- package/lang/en.d.ts +364 -110
- package/lang/en.js +409 -158
- package/lang/en.lyaml +4 -4
- package/lib/__tests__/buildAccount.test.js +4 -3
- package/lib/__tests__/commonOpts.test.js +1 -1
- package/lib/__tests__/dependencyManagement.test.js +1 -1
- package/lib/__tests__/developerTestAccounts.test.js +3 -3
- package/lib/__tests__/npm.test.js +1 -1
- package/lib/__tests__/oauth.test.js +4 -4
- package/lib/__tests__/process.test.js +10 -5
- package/lib/__tests__/sandboxSync.test.js +8 -8
- package/lib/__tests__/sandboxes.test.js +8 -8
- package/lib/__tests__/serverlessLogs.test.js +1 -1
- package/lib/__tests__/usageTracking.test.js +5 -5
- package/lib/__tests__/validation.test.js +2 -1
- package/lib/__tests__/yargsUtils.test.js +83 -9
- package/lib/app/__tests__/migrate.test.js +19 -56
- package/lib/app/__tests__/migrate_legacy.test.js +1 -1
- package/lib/app/migrate.d.ts +2 -8
- package/lib/app/migrate.js +6 -81
- package/lib/app/migrate_legacy.js +20 -24
- package/lib/buildAccount.d.ts +2 -2
- package/lib/buildAccount.js +32 -64
- package/lib/commonOpts.d.ts +1 -1
- package/lib/commonOpts.js +25 -22
- package/lib/configMigrate.js +88 -9
- package/lib/configOptions.js +7 -0
- package/lib/constants.d.ts +21 -1
- package/lib/constants.js +25 -1
- package/lib/dependencyManagement.js +9 -27
- package/lib/developerTestAccounts.js +9 -23
- package/lib/doctor/Diagnosis.js +11 -23
- package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
- package/lib/doctor/Doctor.js +42 -90
- package/lib/doctor/__tests__/Doctor.test.js +4 -4
- package/lib/errorHandlers/index.js +12 -20
- package/lib/errorHandlers/suppressError.js +11 -18
- package/lib/lang.js +6 -5
- package/lib/links.d.ts +1 -0
- package/lib/links.js +14 -7
- package/lib/mcp/setup.js +1 -1
- package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
- package/lib/middleware/__test__/configMiddleware.test.js +11 -11
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
- package/lib/middleware/commandTargetingUtils.d.ts +8 -0
- package/lib/middleware/commandTargetingUtils.js +74 -0
- package/lib/middleware/configMiddleware.d.ts +1 -1
- package/lib/middleware/configMiddleware.js +21 -81
- package/lib/middleware/fireAlarmMiddleware.js +15 -5
- package/lib/middleware/gitMiddleware.js +5 -1
- package/lib/middleware/notificationsMiddleware.js +5 -11
- package/lib/middleware/yargsChecksMiddleware.js +6 -9
- package/lib/npm.js +2 -2
- package/lib/oauth.js +5 -5
- package/lib/process.js +5 -4
- package/lib/projects/__tests__/AppDevModeInterface.test.js +87 -90
- package/lib/projects/__tests__/LocalDevProcess.test.js +231 -19
- package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +89 -63
- package/lib/projects/__tests__/deploy.test.js +73 -8
- package/lib/projects/__tests__/localDevProjectHelpers.test.js +6 -2
- package/lib/projects/__tests__/platformVersion.test.js +8 -8
- package/lib/projects/__tests__/projects.test.js +12 -12
- package/lib/projects/__tests__/structure.test.js +3 -3
- package/lib/projects/__tests__/upload.test.d.ts +1 -0
- package/lib/projects/__tests__/upload.test.js +82 -0
- package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
- package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
- package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +39 -39
- package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
- package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
- package/lib/projects/create/__tests__/legacy.test.js +5 -5
- package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
- package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +82 -7
- package/lib/projects/create/index.js +4 -4
- package/lib/projects/create/legacy.js +2 -2
- package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
- package/lib/projects/create/{v3.js → v2.js} +13 -11
- package/lib/projects/deploy.d.ts +1 -1
- package/lib/projects/deploy.js +2 -2
- package/lib/projects/localDev/AppDevModeInterface.d.ts +10 -1
- package/lib/projects/localDev/AppDevModeInterface.js +118 -89
- package/lib/projects/localDev/DevServerManager.d.ts +11 -29
- package/lib/projects/localDev/DevServerManager.js +19 -61
- package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
- package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
- package/lib/projects/localDev/LocalDevLogger.d.ts +4 -0
- package/lib/projects/localDev/LocalDevLogger.js +27 -6
- package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +10 -11
- package/lib/projects/localDev/LocalDevProcess.d.ts +7 -5
- package/lib/projects/localDev/LocalDevProcess.js +93 -21
- package/lib/projects/localDev/LocalDevState.d.ts +12 -8
- package/lib/projects/localDev/LocalDevState.js +27 -17
- package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +6 -1
- package/lib/projects/localDev/LocalDevWebsocketServer.js +94 -33
- package/lib/projects/localDev/helpers/account.d.ts +1 -1
- package/lib/projects/localDev/helpers/account.js +2 -2
- package/lib/projects/localDev/helpers/project.d.ts +1 -0
- package/lib/projects/localDev/helpers/project.js +44 -4
- package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +7 -0
- package/lib/projects/localDev/localDevWebsocketServerUtils.js +19 -0
- package/lib/projects/platformVersion.d.ts +1 -1
- package/lib/projects/platformVersion.js +1 -1
- package/lib/projects/pollProjectBuildAndDeploy.js +4 -4
- package/lib/projects/structure.js +6 -6
- package/lib/projects/upload.d.ts +1 -1
- package/lib/projects/upload.js +17 -8
- package/lib/projects/urls.d.ts +0 -1
- package/lib/projects/urls.js +0 -3
- package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
- package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
- package/lib/prompts/accountNamePrompt.js +14 -19
- package/lib/prompts/accountsPrompt.js +2 -2
- package/lib/prompts/cmsFieldPrompt.js +2 -2
- package/lib/prompts/createApiSamplePrompt.js +5 -5
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
- package/lib/prompts/createFunctionPrompt.js +14 -14
- package/lib/prompts/createModulePrompt.js +9 -9
- package/lib/prompts/createTemplatePrompt.js +2 -2
- package/lib/prompts/downloadProjectPrompt.js +5 -8
- package/lib/prompts/installAppPrompt.d.ts +1 -6
- package/lib/prompts/installAppPrompt.js +1 -6
- package/lib/prompts/personalAccessKeyPrompt.js +3 -3
- package/lib/prompts/previewPrompt.js +6 -6
- package/lib/prompts/projectAddPrompt.d.ts +2 -2
- package/lib/prompts/projectAddPrompt.js +9 -2
- package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
- package/lib/prompts/projectNamePrompt.js +4 -8
- package/lib/prompts/projectsLogsPrompt.js +2 -4
- package/lib/prompts/promptUtils.js +30 -9
- package/lib/prompts/sandboxesPrompt.js +7 -7
- package/lib/prompts/secretPrompt.js +3 -3
- package/lib/prompts/selectAppPrompt.js +3 -3
- package/lib/prompts/selectHubDBTablePrompt.js +9 -13
- package/lib/prompts/selectProjectTemplatePrompt.js +2 -0
- package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
- package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
- package/lib/prompts/uploadPrompt.js +5 -5
- package/lib/sandboxSync.js +24 -41
- package/lib/sandboxes.js +19 -47
- package/lib/schema.js +3 -3
- package/lib/serverlessLogs.js +11 -13
- package/lib/theme/__tests__/migrate.test.d.ts +1 -0
- package/lib/theme/__tests__/migrate.test.js +233 -0
- package/lib/theme/migrate.d.ts +13 -0
- package/lib/theme/migrate.js +90 -0
- package/lib/ui/SpinniesManager.d.ts +2 -0
- package/lib/ui/SpinniesManager.js +7 -0
- package/lib/ui/boxen.js +1 -2
- package/lib/ui/git.js +13 -10
- package/lib/ui/index.d.ts +4 -0
- package/lib/ui/index.js +47 -38
- package/lib/ui/serverlessFunctionLogs.js +9 -7
- package/lib/ui/uiMessages.d.ts +72 -0
- package/lib/ui/uiMessages.js +75 -0
- package/lib/usageTracking.js +8 -8
- package/lib/validation.js +20 -23
- package/lib/yargsUtils.d.ts +1 -1
- package/lib/yargsUtils.js +12 -5
- package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
- package/mcp-server/tools/index.js +4 -0
- package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +2 -2
- package/mcp-server/tools/project/CreateProjectTool.d.ts +2 -2
- package/mcp-server/tools/project/DocsSearchTool.d.ts +4 -1
- package/mcp-server/tools/project/DocsSearchTool.js +5 -5
- package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
- package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
- package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
- package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
- package/mcp-server/tools/project/GetConfigValuesTool.d.ts +4 -1
- package/mcp-server/tools/project/GetConfigValuesTool.js +12 -6
- package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
- package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +1 -1
- package/mcp-server/tools/project/__tests__/DocsSearchTool.test.js +12 -10
- package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
- package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
- package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +8 -7
- package/mcp-server/utils/__tests__/cliConfig.test.d.ts +1 -0
- package/mcp-server/utils/__tests__/cliConfig.test.js +110 -0
- package/mcp-server/utils/cliConfig.d.ts +1 -0
- package/mcp-server/utils/cliConfig.js +12 -0
- package/mcp-server/utils/toolUsageTracking.js +2 -2
- package/package.json +8 -7
- package/types/LocalDev.d.ts +19 -3
- package/ui/index.js +1 -1
- package/lib/middleware/__test__/utils.test.js +0 -51
- package/lib/middleware/utils.d.ts +0 -8
- package/lib/middleware/utils.js +0 -14
- package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
- package/lib/projects/localDev/DevServerManagerV2.js +0 -81
- /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/list.test.d.ts} +0 -0
- /package/{lib/projects/add/__tests__/v3AddComponent.test.d.ts → commands/project/__tests__/validate.test.d.ts} +0 -0
- /package/lib/{projects/create/__tests__/v3.test.d.ts → middleware/__test__/commandTargetingUtils.test.d.ts} +0 -0
- /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
package/lib/commonOpts.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import yargsParser from 'yargs-parser';
|
|
3
|
-
import { LOG_LEVEL,
|
|
3
|
+
import { LOG_LEVEL, setLogLevel } from '@hubspot/local-dev-lib/logger';
|
|
4
|
+
import { uiLogger } from './ui/logger.js';
|
|
4
5
|
import { DEFAULT_CMS_PUBLISH_MODE, CMS_PUBLISH_MODE, } from '@hubspot/local-dev-lib/constants/files';
|
|
5
6
|
import { getAccountConfig, getAndLoadConfigIfNeeded, } from '@hubspot/local-dev-lib/config';
|
|
6
7
|
import { debugError } from './errorHandlers/index.js';
|
|
7
8
|
import { EXIT_CODES } from './enums/exitCodes.js';
|
|
8
9
|
import { uiCommandReference } from './ui/index.js';
|
|
9
|
-
import {
|
|
10
|
+
import { lib } from '../lang/en.js';
|
|
10
11
|
import { getTerminalUISupport, UI_COLORS } from './ui/index.js';
|
|
12
|
+
import SpinniesManager from './ui/SpinniesManager.js';
|
|
11
13
|
export function addGlobalOptions(yargs) {
|
|
12
14
|
yargs.version(false);
|
|
13
15
|
yargs.option('debug', {
|
|
14
16
|
alias: 'd',
|
|
15
17
|
default: false,
|
|
16
|
-
describe:
|
|
18
|
+
describe: lib.commonOpts.options.debug,
|
|
17
19
|
type: 'boolean',
|
|
18
20
|
});
|
|
19
21
|
yargs.option('network-debug', {
|
|
@@ -26,21 +28,21 @@ export function addGlobalOptions(yargs) {
|
|
|
26
28
|
export function addAccountOptions(yargs) {
|
|
27
29
|
return yargs.option('account', {
|
|
28
30
|
alias: 'a',
|
|
29
|
-
describe:
|
|
31
|
+
describe: lib.commonOpts.options.account,
|
|
30
32
|
type: 'string',
|
|
31
33
|
});
|
|
32
34
|
}
|
|
33
35
|
export function addConfigOptions(yargs) {
|
|
34
36
|
return yargs.option('config', {
|
|
35
37
|
alias: 'c',
|
|
36
|
-
describe:
|
|
38
|
+
describe: lib.commonOpts.options.config,
|
|
37
39
|
type: 'string',
|
|
38
40
|
});
|
|
39
41
|
}
|
|
40
42
|
export function addOverwriteOptions(yargs) {
|
|
41
43
|
return yargs.option('overwrite', {
|
|
42
44
|
alias: 'o',
|
|
43
|
-
describe:
|
|
45
|
+
describe: lib.commonOpts.options.overwrite,
|
|
44
46
|
type: 'boolean',
|
|
45
47
|
default: false,
|
|
46
48
|
});
|
|
@@ -49,13 +51,13 @@ export function addCmsPublishModeOptions(yargs, { read, write }) {
|
|
|
49
51
|
const cmsPublishModes = `<${Object.values(CMS_PUBLISH_MODE).join(' | ')}>`;
|
|
50
52
|
return yargs.option('cms-publish-mode', {
|
|
51
53
|
alias: 'm',
|
|
52
|
-
describe:
|
|
54
|
+
describe: lib.commonOpts.options.modes[read ? 'read' : write ? 'write' : 'default'](cmsPublishModes),
|
|
53
55
|
type: 'string',
|
|
54
56
|
});
|
|
55
57
|
}
|
|
56
58
|
export function addTestingOptions(yargs) {
|
|
57
59
|
return yargs.option('qa', {
|
|
58
|
-
describe:
|
|
60
|
+
describe: lib.commonOpts.options.qa,
|
|
59
61
|
type: 'boolean',
|
|
60
62
|
default: false,
|
|
61
63
|
hidden: true,
|
|
@@ -63,7 +65,7 @@ export function addTestingOptions(yargs) {
|
|
|
63
65
|
}
|
|
64
66
|
export function addUseEnvironmentOptions(yargs) {
|
|
65
67
|
yargs.option('use-env', {
|
|
66
|
-
describe:
|
|
68
|
+
describe: lib.commonOpts.options.useEnv,
|
|
67
69
|
type: 'boolean',
|
|
68
70
|
});
|
|
69
71
|
yargs.conflicts('use-env', 'account');
|
|
@@ -72,7 +74,7 @@ export function addUseEnvironmentOptions(yargs) {
|
|
|
72
74
|
export function addJSONOutputOptions(yargs) {
|
|
73
75
|
return yargs.option('json', {
|
|
74
76
|
alias: 'format-output-as-json',
|
|
75
|
-
describe:
|
|
77
|
+
describe: lib.commonOpts.options.jsonOutput,
|
|
76
78
|
type: 'boolean',
|
|
77
79
|
hidden: true,
|
|
78
80
|
});
|
|
@@ -80,27 +82,27 @@ export function addJSONOutputOptions(yargs) {
|
|
|
80
82
|
// Remove this once we've upgraded to yargs 18.0.0
|
|
81
83
|
function uiBetaTagWithColor(message) {
|
|
82
84
|
const terminalUISupport = getTerminalUISupport();
|
|
83
|
-
const tag =
|
|
85
|
+
const tag = lib.ui.betaTagWithStyle;
|
|
84
86
|
const result = `${terminalUISupport.color ? chalk.hex(UI_COLORS.SORBET)(tag) : tag} ${message}`;
|
|
85
87
|
return result;
|
|
86
88
|
}
|
|
87
89
|
// Remove this once we've upgraded to yargs 18.0.0
|
|
88
90
|
function uiDeprecatedTagWithColor(message) {
|
|
89
91
|
const terminalUISupport = getTerminalUISupport();
|
|
90
|
-
const tag =
|
|
92
|
+
const tag = lib.ui.deprecatedTagWithStyle;
|
|
91
93
|
const result = `${terminalUISupport.color ? chalk.yellow(tag) : tag} ${message}`;
|
|
92
94
|
return result;
|
|
93
95
|
}
|
|
94
96
|
export async function addCustomHelpOutput(yargs, command, describe) {
|
|
95
97
|
try {
|
|
96
98
|
// Remove this once we've upgraded to yargs 18.0.0
|
|
97
|
-
if (describe && describe.includes(
|
|
98
|
-
describe = describe.replace(
|
|
99
|
+
if (describe && describe.includes(lib.ui.betaTag)) {
|
|
100
|
+
describe = describe.replace(lib.ui.betaTag + ' ', '');
|
|
99
101
|
describe = uiBetaTagWithColor(describe);
|
|
100
102
|
}
|
|
101
103
|
// Remove this once we've upgraded to yargs 18.0.0
|
|
102
|
-
if (describe && describe.includes(
|
|
103
|
-
describe = describe.replace(
|
|
104
|
+
if (describe && describe.includes(lib.ui.deprecatedTag)) {
|
|
105
|
+
describe = describe.replace(lib.ui.deprecatedTag + ' ', '');
|
|
104
106
|
describe = uiDeprecatedTagWithColor(describe);
|
|
105
107
|
}
|
|
106
108
|
const parsedArgv = yargsParser(process.argv.slice(2));
|
|
@@ -132,7 +134,7 @@ export async function addCustomHelpOutput(yargs, command, describe) {
|
|
|
132
134
|
if (commandHelp.startsWith('\n')) {
|
|
133
135
|
commandHelp = commandHelp.slice(1);
|
|
134
136
|
}
|
|
135
|
-
|
|
137
|
+
uiLogger.log(`${uiCommandReference(fullCommand, false)}\n\n${describe ? `${describe}\n\n` : ''}${commandHelp}`);
|
|
136
138
|
process.exit(EXIT_CODES.SUCCESS);
|
|
137
139
|
}
|
|
138
140
|
}
|
|
@@ -141,20 +143,21 @@ export async function addCustomHelpOutput(yargs, command, describe) {
|
|
|
141
143
|
debugError(e);
|
|
142
144
|
}
|
|
143
145
|
}
|
|
144
|
-
export function
|
|
146
|
+
export function setCLILogLevel(options) {
|
|
145
147
|
const { debug, networkDebug, json } = options;
|
|
146
148
|
if (json) {
|
|
147
|
-
|
|
149
|
+
setLogLevel(LOG_LEVEL.ERROR);
|
|
150
|
+
SpinniesManager.setDisableOutput(true);
|
|
148
151
|
}
|
|
149
152
|
else if (debug) {
|
|
150
|
-
|
|
153
|
+
setLogLevel(LOG_LEVEL.DEBUG);
|
|
151
154
|
}
|
|
152
155
|
else {
|
|
153
|
-
|
|
156
|
+
setLogLevel(LOG_LEVEL.LOG);
|
|
154
157
|
}
|
|
155
158
|
if (networkDebug) {
|
|
156
159
|
process.env.HUBSPOT_NETWORK_LOGGING = 'true';
|
|
157
|
-
|
|
160
|
+
setLogLevel(LOG_LEVEL.DEBUG);
|
|
158
161
|
}
|
|
159
162
|
}
|
|
160
163
|
export function getCommandName(argv) {
|
package/lib/configMigrate.js
CHANGED
|
@@ -3,6 +3,37 @@ import { ARCHIVED_HUBSPOT_CONFIG_YAML_FILE_NAME } from '@hubspot/local-dev-lib/c
|
|
|
3
3
|
import { promptUser } from './prompts/promptUtils.js';
|
|
4
4
|
import { lib } from '../lang/en.js';
|
|
5
5
|
import { uiLogger } from './ui/logger.js';
|
|
6
|
+
async function promptRenameOrOmitAccount(accountName, accountId) {
|
|
7
|
+
const { shouldRename } = await promptUser({
|
|
8
|
+
name: 'shouldRename',
|
|
9
|
+
type: 'confirm',
|
|
10
|
+
message: lib.configMigrate.handleAccountNameConflicts.prompts.renameOrOmitAccountPrompt(accountName, accountId),
|
|
11
|
+
});
|
|
12
|
+
return shouldRename;
|
|
13
|
+
}
|
|
14
|
+
async function promptNewAccountName(account, globalConfig, renamedAccounts) {
|
|
15
|
+
const { newAccountName } = await promptUser({
|
|
16
|
+
name: 'newAccountName',
|
|
17
|
+
type: 'input',
|
|
18
|
+
default: `${account.name}_${account.portalId}`,
|
|
19
|
+
message: lib.configMigrate.handleAccountNameConflicts.prompts.newAccountNamePrompt(account.name, account.portalId),
|
|
20
|
+
validate: value => {
|
|
21
|
+
if (!value) {
|
|
22
|
+
return lib.configMigrate.handleAccountNameConflicts.errors.nameRequired;
|
|
23
|
+
}
|
|
24
|
+
if (value === account.name) {
|
|
25
|
+
return lib.configMigrate.handleAccountNameConflicts.errors.sameName;
|
|
26
|
+
}
|
|
27
|
+
const existingAccount = globalConfig.accounts.some(acc => acc.name === value);
|
|
28
|
+
const renamedAccount = renamedAccounts.some(acc => acc.name === value);
|
|
29
|
+
if (existingAccount || renamedAccount) {
|
|
30
|
+
return lib.configMigrate.handleAccountNameConflicts.errors.nameAlreadyInConfig(value);
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
return newAccountName;
|
|
36
|
+
}
|
|
6
37
|
export async function handleMigration(deprecatedConfigPath, hideWarning) {
|
|
7
38
|
if (!hideWarning) {
|
|
8
39
|
uiLogger.warn(lib.configMigrate.deprecatedConfigWarning(deprecatedConfigPath || getConfigPath(undefined, false)));
|
|
@@ -47,20 +78,67 @@ async function handleMergeConfigProperties(globalConfig, deprecatedConfig, force
|
|
|
47
78
|
}
|
|
48
79
|
return initialConfig;
|
|
49
80
|
}
|
|
81
|
+
async function handleAccountNameConflicts(globalConfig, deprecatedConfig, force) {
|
|
82
|
+
if (!deprecatedConfig.portals?.length || !globalConfig.accounts?.length) {
|
|
83
|
+
return deprecatedConfig;
|
|
84
|
+
}
|
|
85
|
+
const accountsWithConflictsToRemove = new Set();
|
|
86
|
+
const renamedAccounts = [];
|
|
87
|
+
const accountsNotYetInGlobal = deprecatedConfig.portals.filter(portal => portal.portalId &&
|
|
88
|
+
!globalConfig.accounts.some(acc => acc.accountId === portal.portalId));
|
|
89
|
+
const accountsWithConflicts = accountsNotYetInGlobal.filter(localAccount => globalConfig.accounts.some(globalAccount => globalAccount.name === localAccount.name));
|
|
90
|
+
if (accountsWithConflicts.length > 0) {
|
|
91
|
+
uiLogger.log('');
|
|
92
|
+
uiLogger.warn(lib.configMigrate.handleAccountNameConflicts.warnings.accountNameConflictMessage(accountsWithConflicts.length));
|
|
93
|
+
if (force) {
|
|
94
|
+
const renameDetails = [];
|
|
95
|
+
for (const account of accountsWithConflicts) {
|
|
96
|
+
accountsWithConflictsToRemove.add(account);
|
|
97
|
+
const newAccountName = `${account.name}_${account.portalId}`;
|
|
98
|
+
renamedAccounts.push({
|
|
99
|
+
...account,
|
|
100
|
+
name: newAccountName,
|
|
101
|
+
});
|
|
102
|
+
renameDetails.push(` "${account.name}" → "${newAccountName}" (ID: ${account.portalId})`);
|
|
103
|
+
}
|
|
104
|
+
uiLogger.warn(lib.configMigrate.handleAccountNameConflicts.warnings.forceFlagDetected(accountsWithConflicts.length, renameDetails.join('\n')));
|
|
105
|
+
uiLogger.log('');
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
for (const account of accountsWithConflicts) {
|
|
109
|
+
uiLogger.log('');
|
|
110
|
+
const shouldRename = await promptRenameOrOmitAccount(account.name, account.portalId);
|
|
111
|
+
accountsWithConflictsToRemove.add(account);
|
|
112
|
+
if (shouldRename) {
|
|
113
|
+
const newAccountName = await promptNewAccountName(account, globalConfig, renamedAccounts);
|
|
114
|
+
renamedAccounts.push({
|
|
115
|
+
...account,
|
|
116
|
+
name: newAccountName,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
deprecatedConfig.portals.push(...renamedAccounts);
|
|
122
|
+
}
|
|
123
|
+
const cleanedPortals = deprecatedConfig.portals.filter(portal => !accountsWithConflictsToRemove.has(portal));
|
|
124
|
+
return { ...deprecatedConfig, portals: cleanedPortals };
|
|
125
|
+
}
|
|
50
126
|
export async function handleMerge(deprecatedConfigPath, force, hideWarning) {
|
|
51
127
|
if (!hideWarning) {
|
|
52
128
|
uiLogger.warn(lib.configMigrate.deprecatedConfigWarning(deprecatedConfigPath || getConfigPath(undefined, false)));
|
|
53
129
|
uiLogger.log('');
|
|
54
130
|
}
|
|
55
131
|
uiLogger.log(lib.configMigrate.handleMerge.description(ARCHIVED_HUBSPOT_CONFIG_YAML_FILE_NAME));
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
132
|
+
if (!force) {
|
|
133
|
+
uiLogger.log('');
|
|
134
|
+
const { shouldMergeConfigs } = await promptUser({
|
|
135
|
+
name: 'shouldMergeConfigs',
|
|
136
|
+
type: 'confirm',
|
|
137
|
+
message: lib.configMigrate.handleMerge.confirmPrompt,
|
|
138
|
+
});
|
|
139
|
+
if (shouldMergeConfigs === false) {
|
|
140
|
+
return true; // exit with "true" so the user is shown a success message instead of an error
|
|
141
|
+
}
|
|
64
142
|
}
|
|
65
143
|
const deprecatedConfig = getDeprecatedConfig(deprecatedConfigPath);
|
|
66
144
|
const globalConfig = getGlobalConfig();
|
|
@@ -68,7 +146,8 @@ export async function handleMerge(deprecatedConfigPath, force, hideWarning) {
|
|
|
68
146
|
return true;
|
|
69
147
|
}
|
|
70
148
|
const mergedConfig = await handleMergeConfigProperties(globalConfig, deprecatedConfig, force);
|
|
71
|
-
const
|
|
149
|
+
const cleanedDeprecatedConfig = await handleAccountNameConflicts(mergedConfig, deprecatedConfig, force);
|
|
150
|
+
const { skippedAccountIds } = mergeExistingConfigs(mergedConfig, cleanedDeprecatedConfig);
|
|
72
151
|
if (skippedAccountIds.length > 0) {
|
|
73
152
|
uiLogger.log('');
|
|
74
153
|
uiLogger.log(lib.configMigrate.handleMerge.skippedExistingAccounts(skippedAccountIds));
|
package/lib/configOptions.js
CHANGED
|
@@ -79,6 +79,13 @@ async function enterTimeout() {
|
|
|
79
79
|
message: lib.configOptions.setHttpTimeout.promptMessage,
|
|
80
80
|
type: 'input',
|
|
81
81
|
default: 30000,
|
|
82
|
+
validate: (timeout) => {
|
|
83
|
+
const timeoutNum = parseInt(timeout, 10);
|
|
84
|
+
if (isNaN(timeoutNum) || timeoutNum < 3000) {
|
|
85
|
+
return lib.configOptions.setHttpTimeout.error(timeout);
|
|
86
|
+
}
|
|
87
|
+
return true;
|
|
88
|
+
},
|
|
82
89
|
},
|
|
83
90
|
]);
|
|
84
91
|
return timeout;
|
package/lib/constants.d.ts
CHANGED
|
@@ -76,29 +76,40 @@ export declare const APP_AUTH_TYPES: {
|
|
|
76
76
|
readonly STATIC: "static";
|
|
77
77
|
};
|
|
78
78
|
export declare const FEATURES: {
|
|
79
|
-
readonly UNIFIED_THEME_PREVIEW: "cms:react:unifiedThemePreview";
|
|
80
79
|
readonly UNIFIED_APPS: "Developers:UnifiedApps:PrivateBeta";
|
|
81
80
|
readonly SANDBOXES_V2: "sandboxes:v2:enabled";
|
|
82
81
|
readonly SANDBOXES_V2_CLI: "sandboxes:v2:cliEnabled";
|
|
83
82
|
readonly APP_EVENTS: "Developers:UnifiedApps:AppEventsAccess";
|
|
84
83
|
readonly APPS_HOME: "UIE:AppHome";
|
|
84
|
+
readonly MCP_ACCESS: "Developers:CLIMCPAccess";
|
|
85
|
+
readonly THEME_MIGRATION_2025_2: "Developers:ProjectThemeMigrations:2025.2";
|
|
86
|
+
readonly AGENT_TOOLS: "ThirdPartyAgentTools";
|
|
85
87
|
};
|
|
86
88
|
export declare const LOCAL_DEV_UI_MESSAGE_SEND_TYPES: {
|
|
87
89
|
UPLOAD_SUCCESS: string;
|
|
88
90
|
UPLOAD_FAILURE: string;
|
|
91
|
+
DEPLOY_SUCCESS: string;
|
|
92
|
+
DEPLOY_FAILURE: string;
|
|
89
93
|
UPDATE_PROJECT_NODES: string;
|
|
90
94
|
UPDATE_APP_DATA: string;
|
|
91
95
|
UPDATE_PROJECT_DATA: string;
|
|
92
96
|
UPDATE_UPLOAD_WARNINGS: string;
|
|
97
|
+
CLI_METADATA: string;
|
|
98
|
+
DEV_SERVERS_STARTED: string;
|
|
93
99
|
};
|
|
94
100
|
export declare const LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES: {
|
|
95
101
|
UPLOAD: string;
|
|
102
|
+
DEPLOY: string;
|
|
96
103
|
VIEWED_WELCOME_SCREEN: string;
|
|
104
|
+
APP_INSTALL_SUCCESS: string;
|
|
105
|
+
APP_INSTALL_INITIATED: string;
|
|
106
|
+
APP_INSTALL_FAILURE: string;
|
|
97
107
|
};
|
|
98
108
|
export declare const APP_INSTALLATION_STATES: {
|
|
99
109
|
readonly NOT_INSTALLED: "NOT_INSTALLED";
|
|
100
110
|
readonly INSTALLED: "INSTALLED";
|
|
101
111
|
readonly INSTALLED_WITH_OUTDATED_SCOPES: "INSTALLED_WITH_OUTDATED_SCOPES";
|
|
112
|
+
readonly UNKNOWN: "UNKNOWN";
|
|
102
113
|
};
|
|
103
114
|
export declare const staticAuth = "static";
|
|
104
115
|
export declare const oAuth = "oauth";
|
|
@@ -112,9 +123,18 @@ export declare const GET_STARTED_OPTIONS: {
|
|
|
112
123
|
export declare const LOCAL_DEV_SERVER_MESSAGE_TYPES: {
|
|
113
124
|
readonly INITIAL: "INITIAL";
|
|
114
125
|
readonly WEBSOCKET_SERVER_CONNECTED: "WEBSOCKET_SERVER_CONNECTED";
|
|
126
|
+
readonly STATIC_AUTH_APP_INSTALL_SUCCESS: "APP_INSTALL_SUCCESS";
|
|
127
|
+
readonly STATIC_AUTH_APP_INSTALL_FAILURE: "APP_INSTALL_FAILURE";
|
|
128
|
+
readonly OAUTH_APP_INSTALL_INITIATED: "APP_INSTALL_INITIATED";
|
|
115
129
|
};
|
|
116
130
|
export declare const CONFIG_LOCAL_STATE_FLAGS: {
|
|
117
131
|
readonly LOCAL_DEV_UI_WELCOME: "LOCAL_DEV_UI_WELCOME";
|
|
118
132
|
};
|
|
119
133
|
export declare const EMPTY_PROJECT = "empty";
|
|
120
134
|
export declare const PROJECT_WITH_APP = "app";
|
|
135
|
+
export declare const LEGACY_SERVERLESS_FILE = "serverless.json";
|
|
136
|
+
export declare const LEGACY_PUBLIC_APP_FILE = "public-app.json";
|
|
137
|
+
export declare const LEGACY_PRIVATE_APP_FILE = "app.json";
|
|
138
|
+
export declare const THEME_FILE = "theme.json";
|
|
139
|
+
export declare const CMS_ASSETS_FILE = "cms-assets.json";
|
|
140
|
+
export declare const LEGACY_CONFIG_FILES: string[];
|
package/lib/constants.js
CHANGED
|
@@ -68,29 +68,40 @@ export const APP_AUTH_TYPES = {
|
|
|
68
68
|
STATIC: 'static',
|
|
69
69
|
};
|
|
70
70
|
export const FEATURES = {
|
|
71
|
-
UNIFIED_THEME_PREVIEW: 'cms:react:unifiedThemePreview',
|
|
72
71
|
UNIFIED_APPS: 'Developers:UnifiedApps:PrivateBeta',
|
|
73
72
|
SANDBOXES_V2: 'sandboxes:v2:enabled',
|
|
74
73
|
SANDBOXES_V2_CLI: 'sandboxes:v2:cliEnabled',
|
|
75
74
|
APP_EVENTS: 'Developers:UnifiedApps:AppEventsAccess',
|
|
76
75
|
APPS_HOME: 'UIE:AppHome',
|
|
76
|
+
MCP_ACCESS: 'Developers:CLIMCPAccess',
|
|
77
|
+
THEME_MIGRATION_2025_2: 'Developers:ProjectThemeMigrations:2025.2',
|
|
78
|
+
AGENT_TOOLS: 'ThirdPartyAgentTools',
|
|
77
79
|
};
|
|
78
80
|
export const LOCAL_DEV_UI_MESSAGE_SEND_TYPES = {
|
|
79
81
|
UPLOAD_SUCCESS: 'server:uploadSuccess',
|
|
80
82
|
UPLOAD_FAILURE: 'server:uploadFailure',
|
|
83
|
+
DEPLOY_SUCCESS: 'server:deploySuccess',
|
|
84
|
+
DEPLOY_FAILURE: 'server:deployFailure',
|
|
81
85
|
UPDATE_PROJECT_NODES: 'server:updateProjectNodes',
|
|
82
86
|
UPDATE_APP_DATA: 'server:updateAppData',
|
|
83
87
|
UPDATE_PROJECT_DATA: 'server:updateProjectData',
|
|
84
88
|
UPDATE_UPLOAD_WARNINGS: 'server:updateUploadWarnings',
|
|
89
|
+
CLI_METADATA: 'server:cliMetadata',
|
|
90
|
+
DEV_SERVERS_STARTED: 'server:devServersStarted',
|
|
85
91
|
};
|
|
86
92
|
export const LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES = {
|
|
87
93
|
UPLOAD: 'client:upload',
|
|
94
|
+
DEPLOY: 'client:deploy',
|
|
88
95
|
VIEWED_WELCOME_SCREEN: 'client:viewedWelcomeScreen',
|
|
96
|
+
APP_INSTALL_SUCCESS: 'client:installSuccess',
|
|
97
|
+
APP_INSTALL_INITIATED: 'client:installInitiated',
|
|
98
|
+
APP_INSTALL_FAILURE: 'client:installFailure',
|
|
89
99
|
};
|
|
90
100
|
export const APP_INSTALLATION_STATES = {
|
|
91
101
|
NOT_INSTALLED: 'NOT_INSTALLED',
|
|
92
102
|
INSTALLED: 'INSTALLED',
|
|
93
103
|
INSTALLED_WITH_OUTDATED_SCOPES: 'INSTALLED_WITH_OUTDATED_SCOPES',
|
|
104
|
+
UNKNOWN: 'UNKNOWN',
|
|
94
105
|
};
|
|
95
106
|
export const staticAuth = 'static';
|
|
96
107
|
export const oAuth = 'oauth';
|
|
@@ -104,9 +115,22 @@ export const GET_STARTED_OPTIONS = {
|
|
|
104
115
|
export const LOCAL_DEV_SERVER_MESSAGE_TYPES = {
|
|
105
116
|
INITIAL: 'INITIAL',
|
|
106
117
|
WEBSOCKET_SERVER_CONNECTED: 'WEBSOCKET_SERVER_CONNECTED',
|
|
118
|
+
STATIC_AUTH_APP_INSTALL_SUCCESS: 'APP_INSTALL_SUCCESS',
|
|
119
|
+
STATIC_AUTH_APP_INSTALL_FAILURE: 'APP_INSTALL_FAILURE',
|
|
120
|
+
OAUTH_APP_INSTALL_INITIATED: 'APP_INSTALL_INITIATED',
|
|
107
121
|
};
|
|
108
122
|
export const CONFIG_LOCAL_STATE_FLAGS = {
|
|
109
123
|
LOCAL_DEV_UI_WELCOME: 'LOCAL_DEV_UI_WELCOME',
|
|
110
124
|
};
|
|
111
125
|
export const EMPTY_PROJECT = 'empty';
|
|
112
126
|
export const PROJECT_WITH_APP = 'app';
|
|
127
|
+
export const LEGACY_SERVERLESS_FILE = 'serverless.json';
|
|
128
|
+
export const LEGACY_PUBLIC_APP_FILE = 'public-app.json';
|
|
129
|
+
export const LEGACY_PRIVATE_APP_FILE = 'app.json';
|
|
130
|
+
export const THEME_FILE = 'theme.json';
|
|
131
|
+
export const CMS_ASSETS_FILE = 'cms-assets.json';
|
|
132
|
+
export const LEGACY_CONFIG_FILES = [
|
|
133
|
+
LEGACY_SERVERLESS_FILE,
|
|
134
|
+
LEGACY_PRIVATE_APP_FILE,
|
|
135
|
+
LEGACY_PUBLIC_APP_FILE,
|
|
136
|
+
];
|
|
@@ -4,16 +4,12 @@ import path from 'path';
|
|
|
4
4
|
import { exec as execAsync } from 'node:child_process';
|
|
5
5
|
import { walk } from '@hubspot/local-dev-lib/fs';
|
|
6
6
|
import { getProjectConfig } from './projects/config.js';
|
|
7
|
-
import {
|
|
8
|
-
import { i18n } from './lang.js';
|
|
7
|
+
import { commands } from '../lang/en.js';
|
|
9
8
|
import SpinniesManager from './ui/SpinniesManager.js';
|
|
10
9
|
import { isGloballyInstalled, executeInstall, DEFAULT_PACKAGE_MANAGER, } from './npm.js';
|
|
11
10
|
class NoPackageJsonFilesError extends Error {
|
|
12
11
|
constructor(projectName) {
|
|
13
|
-
super(
|
|
14
|
-
projectName,
|
|
15
|
-
link: uiLink('Learn how to create a project from scratch.', 'https://developers.hubspot.com/beta-docs/guides/crm/intro/create-a-project'),
|
|
16
|
-
}));
|
|
12
|
+
super(commands.project.installDeps.noPackageJsonInProject(projectName));
|
|
17
13
|
}
|
|
18
14
|
}
|
|
19
15
|
export async function installPackages({ packages, installLocations, }) {
|
|
@@ -28,31 +24,20 @@ async function installPackagesInDirectory(directory, packages) {
|
|
|
28
24
|
SpinniesManager.init();
|
|
29
25
|
SpinniesManager.add(spinner, {
|
|
30
26
|
text: packages && packages.length
|
|
31
|
-
?
|
|
32
|
-
|
|
33
|
-
directory: relativeDir,
|
|
34
|
-
})
|
|
35
|
-
: i18n(`commands.project.subcommands.installDeps.installingDependencies`, {
|
|
36
|
-
directory: relativeDir,
|
|
37
|
-
}),
|
|
27
|
+
? commands.project.installDeps.addingDependenciesToLocation(`[${packages.join(', ')}]`, relativeDir)
|
|
28
|
+
: commands.project.installDeps.installingDependencies(relativeDir),
|
|
38
29
|
});
|
|
39
30
|
try {
|
|
40
31
|
await executeInstall(packages, null, { cwd: directory });
|
|
41
32
|
SpinniesManager.succeed(spinner, {
|
|
42
|
-
text:
|
|
43
|
-
directory: relativeDir,
|
|
44
|
-
}),
|
|
33
|
+
text: commands.project.installDeps.installationSuccessful(relativeDir),
|
|
45
34
|
});
|
|
46
35
|
}
|
|
47
36
|
catch (e) {
|
|
48
37
|
SpinniesManager.fail(spinner, {
|
|
49
|
-
text:
|
|
50
|
-
directory: relativeDir,
|
|
51
|
-
}),
|
|
38
|
+
text: commands.project.installDeps.installingDependenciesFailed(relativeDir),
|
|
52
39
|
});
|
|
53
|
-
throw new Error(
|
|
54
|
-
directory: relativeDir,
|
|
55
|
-
}), {
|
|
40
|
+
throw new Error(commands.project.installDeps.installingDependenciesFailed(relativeDir), {
|
|
56
41
|
cause: e,
|
|
57
42
|
});
|
|
58
43
|
}
|
|
@@ -62,14 +47,11 @@ export async function getProjectPackageJsonLocations(dir) {
|
|
|
62
47
|
if (!projectConfig ||
|
|
63
48
|
!projectConfig.projectDir ||
|
|
64
49
|
!projectConfig.projectConfig) {
|
|
65
|
-
throw new Error(
|
|
50
|
+
throw new Error(commands.project.installDeps.noProjectConfig);
|
|
66
51
|
}
|
|
67
52
|
const { projectDir, projectConfig: { srcDir, name }, } = projectConfig;
|
|
68
53
|
if (!(await isGloballyInstalled(DEFAULT_PACKAGE_MANAGER))) {
|
|
69
|
-
throw new Error(
|
|
70
|
-
packageManager: DEFAULT_PACKAGE_MANAGER,
|
|
71
|
-
link: uiLink(DEFAULT_PACKAGE_MANAGER, 'https://docs.npmjs.com/downloading-and-installing-node-js-and-npm'),
|
|
72
|
-
}));
|
|
54
|
+
throw new Error(commands.project.installDeps.packageManagerNotInstalled(DEFAULT_PACKAGE_MANAGER));
|
|
73
55
|
}
|
|
74
56
|
if (!fs.existsSync(projectConfig.projectDir) ||
|
|
75
57
|
!fs.existsSync(path.join(projectDir, srcDir))) {
|
|
@@ -3,9 +3,9 @@ import { getAccountId, getConfigAccounts } from '@hubspot/local-dev-lib/config';
|
|
|
3
3
|
import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
|
|
4
4
|
import { fetchDeveloperTestAccounts } from '@hubspot/local-dev-lib/api/developerTestAccounts';
|
|
5
5
|
import { isMissingScopeError, isSpecifiedError, } from '@hubspot/local-dev-lib/errors/index';
|
|
6
|
-
import {
|
|
6
|
+
import { uiLogger } from './ui/logger.js';
|
|
7
7
|
import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls';
|
|
8
|
-
import {
|
|
8
|
+
import { lib } from '../lang/en.js';
|
|
9
9
|
import { uiAccountDescription } from './ui/index.js';
|
|
10
10
|
import { logError } from './errorHandlers/index.js';
|
|
11
11
|
export function getHasDevTestAccounts(appDeveloperAccountConfig) {
|
|
@@ -39,42 +39,28 @@ export async function validateDevTestAccountUsageLimits(accountConfig) {
|
|
|
39
39
|
if (count >= limit) {
|
|
40
40
|
const hasDevTestAccounts = getHasDevTestAccounts(accountConfig);
|
|
41
41
|
if (hasDevTestAccounts) {
|
|
42
|
-
throw new Error(
|
|
43
|
-
accountName: accountConfig.name || accountId,
|
|
44
|
-
limit,
|
|
45
|
-
}));
|
|
42
|
+
throw new Error(lib.developerTestAccount.create.failure.alreadyInConfig(accountConfig.name || accountId, limit));
|
|
46
43
|
}
|
|
47
44
|
else {
|
|
48
|
-
throw new Error(
|
|
49
|
-
accountName: accountConfig.name || accountId,
|
|
50
|
-
limit,
|
|
51
|
-
}));
|
|
45
|
+
throw new Error(lib.developerTestAccount.create.failure.limit(accountConfig.name || accountId, limit));
|
|
52
46
|
}
|
|
53
47
|
}
|
|
54
48
|
return data;
|
|
55
49
|
}
|
|
56
50
|
export function handleDeveloperTestAccountCreateError(err, accountId, env, portalLimit) {
|
|
57
51
|
if (isMissingScopeError(err)) {
|
|
58
|
-
|
|
59
|
-
accountName: uiAccountDescription(accountId),
|
|
60
|
-
}));
|
|
52
|
+
uiLogger.error(lib.developerTestAccount.create.failure.scopes.message);
|
|
61
53
|
const websiteOrigin = getHubSpotWebsiteOrigin(env);
|
|
62
54
|
const url = `${websiteOrigin}/personal-access-key/${accountId}`;
|
|
63
|
-
|
|
64
|
-
accountName: uiAccountDescription(accountId),
|
|
65
|
-
url,
|
|
66
|
-
}));
|
|
55
|
+
uiLogger.info(lib.developerTestAccount.create.failure.scopes.instructions(uiAccountDescription(accountId), url));
|
|
67
56
|
}
|
|
68
57
|
else if (isSpecifiedError(err, {
|
|
69
58
|
statusCode: 400,
|
|
70
59
|
errorType: 'TEST_PORTAL_LIMIT_REACHED',
|
|
71
60
|
})) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
limit: portalLimit,
|
|
76
|
-
}));
|
|
77
|
-
logger.log('');
|
|
61
|
+
uiLogger.log('');
|
|
62
|
+
uiLogger.error(lib.developerTestAccount.create.failure.limit(uiAccountDescription(accountId), portalLimit));
|
|
63
|
+
uiLogger.log('');
|
|
78
64
|
}
|
|
79
65
|
else {
|
|
80
66
|
logError(err);
|
package/lib/doctor/Diagnosis.js
CHANGED
|
@@ -3,7 +3,7 @@ import chalk from 'chalk';
|
|
|
3
3
|
import { helpers } from '../interpolation.js';
|
|
4
4
|
import { uiAccountDescription } from '../ui/index.js';
|
|
5
5
|
import { indent } from '../ui/index.js';
|
|
6
|
-
import {
|
|
6
|
+
import { lib } from '../../lang/en.js';
|
|
7
7
|
export class Diagnosis {
|
|
8
8
|
prefixes;
|
|
9
9
|
diagnosis;
|
|
@@ -18,38 +18,30 @@ export class Diagnosis {
|
|
|
18
18
|
};
|
|
19
19
|
this.diagnosis = {
|
|
20
20
|
cli: {
|
|
21
|
-
header:
|
|
21
|
+
header: lib.doctor.diagnosis.cli.header,
|
|
22
22
|
sections: [],
|
|
23
23
|
},
|
|
24
24
|
cliConfig: {
|
|
25
|
-
header:
|
|
25
|
+
header: lib.doctor.diagnosis.cliConfig.header,
|
|
26
26
|
sections: [],
|
|
27
27
|
},
|
|
28
28
|
defaultAccountOverrideFile: {
|
|
29
|
-
header:
|
|
29
|
+
header: lib.doctor.diagnosis.defaultAccountOverrideFile.header,
|
|
30
30
|
sections: [],
|
|
31
31
|
},
|
|
32
32
|
project: {
|
|
33
|
-
header:
|
|
33
|
+
header: lib.doctor.diagnosis.projectConfig.header,
|
|
34
34
|
subheaders: [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}),
|
|
38
|
-
i18n(`lib.doctor.diagnosis.projectConfig.projectNameSubHeader`, {
|
|
39
|
-
projectName: diagnosticInfo.project?.config?.projectConfig?.name,
|
|
40
|
-
}),
|
|
35
|
+
lib.doctor.diagnosis.projectConfig.projectDirSubHeader(diagnosticInfo.project?.config?.projectDir || ''),
|
|
36
|
+
lib.doctor.diagnosis.projectConfig.projectNameSubHeader(diagnosticInfo.project?.config?.projectConfig?.name || ''),
|
|
41
37
|
],
|
|
42
38
|
sections: [],
|
|
43
39
|
},
|
|
44
40
|
};
|
|
45
41
|
if (diagnosticInfo.config) {
|
|
46
42
|
this.diagnosis.cliConfig.subheaders = [
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}),
|
|
50
|
-
i18n(`lib.doctor.diagnosis.cliConfig.defaultAccountSubHeader`, {
|
|
51
|
-
accountDetails: uiAccountDescription(accountId),
|
|
52
|
-
}),
|
|
43
|
+
lib.doctor.diagnosis.cliConfig.configFileSubHeader(diagnosticInfo.config),
|
|
44
|
+
lib.doctor.diagnosis.cliConfig.defaultAccountSubHeader(uiAccountDescription(accountId)),
|
|
53
45
|
];
|
|
54
46
|
}
|
|
55
47
|
}
|
|
@@ -83,12 +75,8 @@ export class Diagnosis {
|
|
|
83
75
|
return '';
|
|
84
76
|
}
|
|
85
77
|
output.push('');
|
|
86
|
-
output.push(
|
|
87
|
-
|
|
88
|
-
}));
|
|
89
|
-
output.push(i18n(`lib.doctor.diagnosis.counts.warnings`, {
|
|
90
|
-
count: this.warningCount,
|
|
91
|
-
}));
|
|
78
|
+
output.push(lib.doctor.diagnosis.counts.errors(this.errorCount));
|
|
79
|
+
output.push(lib.doctor.diagnosis.counts.warnings(this.warningCount));
|
|
92
80
|
output.push('');
|
|
93
81
|
return output.join('\n');
|
|
94
82
|
}
|