@hubspot/cli 7.2.1-experimental.0 → 7.2.2-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 +52 -3
- package/commands/account/auth.d.ts +10 -0
- package/commands/account/auth.js +154 -0
- package/commands/account/createOverride.d.ts +10 -0
- package/commands/account/createOverride.js +62 -0
- package/commands/account/list.js +4 -0
- package/commands/account.js +4 -0
- package/commands/auth.js +9 -5
- package/commands/config/migrate.d.ts +10 -0
- package/commands/config/migrate.js +86 -0
- package/commands/config/set.d.ts +12 -0
- package/commands/config/set.js +30 -29
- package/commands/config.d.ts +4 -1
- package/commands/config.js +45 -10
- package/commands/create/api-sample.js +4 -14
- package/commands/customObject/create.d.ts +0 -11
- package/commands/customObject/create.js +28 -37
- package/commands/customObject/schema/create.d.ts +0 -10
- package/commands/customObject/schema/create.js +42 -40
- package/commands/customObject/schema/delete.d.ts +0 -11
- package/commands/customObject/schema/delete.js +27 -34
- package/commands/customObject/schema/fetch-all.d.ts +0 -10
- package/commands/customObject/schema/fetch-all.js +24 -31
- package/commands/customObject/schema/fetch.d.ts +0 -11
- package/commands/customObject/schema/fetch.js +42 -34
- package/commands/customObject/schema/list.d.ts +0 -7
- package/commands/customObject/schema/list.js +14 -23
- package/commands/customObject/schema/update.d.ts +0 -11
- package/commands/customObject/schema/update.js +46 -44
- package/commands/customObject/schema.d.ts +1 -5
- package/commands/customObject/schema.js +11 -49
- package/commands/customObject.d.ts +1 -4
- package/commands/customObject.js +21 -54
- package/commands/filemanager/fetch.d.ts +0 -12
- package/commands/filemanager/fetch.js +30 -33
- package/commands/filemanager/upload.d.ts +0 -11
- package/commands/filemanager/upload.js +47 -53
- package/commands/filemanager.d.ts +1 -4
- package/commands/filemanager.js +7 -41
- package/commands/init.js +15 -26
- package/commands/project/add.js +16 -62
- package/commands/project/cloneApp.js +3 -3
- package/commands/project/create.js +15 -70
- package/commands/project/dev.d.ts +1 -0
- package/commands/project/dev.js +146 -0
- package/commands/project/migrateApp.js +3 -3
- package/commands/project/upload.js +2 -7
- package/commands/sandbox/create.d.ts +0 -12
- package/commands/sandbox/create.js +72 -90
- package/commands/sandbox/delete.d.ts +0 -11
- package/commands/sandbox/delete.js +95 -112
- package/commands/sandbox.d.ts +1 -4
- package/commands/sandbox.js +10 -44
- package/commands/theme/generate-selectors.d.ts +0 -9
- package/commands/theme/generate-selectors.js +43 -61
- package/commands/theme/marketplace-validate.d.ts +0 -10
- package/commands/theme/marketplace-validate.js +26 -32
- package/commands/theme/preview.d.ts +0 -16
- package/commands/theme/preview.js +97 -104
- package/commands/theme.d.ts +1 -4
- package/commands/theme.js +10 -44
- package/lang/en.lyaml +67 -40
- package/lib/LocalDevManager.d.ts +2 -2
- package/lib/buildAccount.d.ts +3 -2
- package/lib/configMigrate.d.ts +2 -0
- package/lib/configMigrate.js +83 -0
- package/lib/constants.d.ts +3 -12
- package/lib/constants.js +4 -13
- package/lib/doctor/Diagnosis.d.ts +1 -0
- package/lib/doctor/Diagnosis.js +7 -0
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -6
- package/lib/doctor/DiagnosticInfoBuilder.js +1 -5
- package/lib/doctor/Doctor.d.ts +1 -1
- package/lib/doctor/Doctor.js +14 -6
- package/lib/localDev.d.ts +1 -2
- package/lib/marketplaceValidate.d.ts +2 -2
- package/lib/projects/buildAndDeploy.js +1 -4
- package/lib/projects/index.d.ts +5 -1
- package/lib/projects/index.js +62 -1
- package/lib/projects/structure.d.ts +0 -4
- package/lib/projects/structure.js +0 -9
- package/lib/projects/upload.d.ts +1 -1
- package/lib/projects/upload.js +2 -2
- package/lib/prompts/accountNamePrompt.d.ts +1 -1
- package/lib/prompts/createProjectPrompt.d.ts +8 -6
- package/lib/prompts/createProjectPrompt.js +54 -26
- package/lib/prompts/projectAddPrompt.d.ts +3 -3
- package/lib/prompts/projectAddPrompt.js +6 -16
- package/lib/prompts/projectDevTargetAccountPrompt.d.ts +2 -3
- package/lib/prompts/sandboxesPrompt.d.ts +2 -3
- package/lib/prompts/sandboxesPrompt.js +1 -1
- package/lib/sandboxSync.js +2 -6
- package/lib/sandboxes.d.ts +5 -2
- package/lib/ui/index.d.ts +1 -1
- package/lib/ui/index.js +0 -1
- package/lib/upload.d.ts +1 -1
- package/lib/upload.js +20 -20
- package/lib/usageTracking.d.ts +1 -1
- package/lib/validation.d.ts +1 -1
- package/package.json +4 -5
- package/types/Projects.d.ts +6 -1
- package/types/Prompts.d.ts +0 -7
- package/types/Sandboxes.d.ts +0 -2
- package/types/Yargs.d.ts +0 -8
- package/commands/project/dev/deprecatedFlow.d.ts +0 -5
- package/commands/project/dev/deprecatedFlow.js +0 -137
- package/commands/project/dev/index.d.ts +0 -6
- package/commands/project/dev/index.js +0 -52
- package/commands/project/dev/unifiedFlow.d.ts +0 -5
- package/commands/project/dev/unifiedFlow.js +0 -112
- package/lib/DevServerManagerV2.d.ts +0 -34
- package/lib/DevServerManagerV2.js +0 -85
- package/lib/LocalDevManagerV2.d.ts +0 -64
- package/lib/LocalDevManagerV2.js +0 -382
- package/lib/customObject.d.ts +0 -3
- package/lib/customObject.js +0 -15
- package/lib/projects/create.d.ts +0 -5
- package/lib/projects/create.js +0 -51
- package/lib/testUtils.d.ts +0 -12
- package/lib/testUtils.js +0 -10
- package/types/ProjectComponents.d.ts +0 -38
- package/types/ProjectComponents.js +0 -3
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
|
|
5
|
+
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
6
|
+
const { handleExit } = require('../../lib/process');
|
|
7
|
+
const { i18n } = require('../../lib/lang');
|
|
8
|
+
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
9
|
+
const { getConfigAccounts, getAccountConfig, getEnv, } = require('@hubspot/local-dev-lib/config');
|
|
10
|
+
const { getProjectConfig, ensureProjectExists, validateProjectConfig, } = require('../../lib/projects');
|
|
11
|
+
const { EXIT_CODES } = require('../../lib/enums/exitCodes');
|
|
12
|
+
const { uiBetaTag, uiCommandReference, uiLink } = require('../../lib/ui');
|
|
13
|
+
const SpinniesManager = require('../../lib/ui/SpinniesManager');
|
|
14
|
+
const LocalDevManager = require('../../lib/LocalDevManager');
|
|
15
|
+
const { isSandbox, isDeveloperTestAccount, isStandardAccount, isAppDeveloperAccount, } = require('../../lib/accountTypes');
|
|
16
|
+
const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
|
|
17
|
+
const { ComponentTypes } = require('../../types/Projects');
|
|
18
|
+
const { findProjectComponents, getProjectComponentTypes, } = require('../../lib/projects/structure');
|
|
19
|
+
const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, createNewProjectForLocalDev, createInitialBuildForNewProject, useExistingDevTestAccount, checkIfAccountFlagIsSupported, checkIfParentAccountIsAuthed, } = require('../../lib/localDev');
|
|
20
|
+
const i18nKey = 'commands.project.subcommands.dev';
|
|
21
|
+
exports.command = 'dev';
|
|
22
|
+
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
23
|
+
exports.handler = async (options) => {
|
|
24
|
+
const { derivedAccountId, providedAccountId } = options;
|
|
25
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
26
|
+
const env = getValidEnv(getEnv(derivedAccountId));
|
|
27
|
+
trackCommandUsage('project-dev', null, derivedAccountId);
|
|
28
|
+
const { projectConfig, projectDir } = await getProjectConfig();
|
|
29
|
+
uiBetaTag(i18n(`${i18nKey}.logs.betaMessage`));
|
|
30
|
+
logger.log(uiLink(i18n(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
|
|
31
|
+
if (!projectConfig) {
|
|
32
|
+
logger.error(i18n(`${i18nKey}.errors.noProjectConfig`));
|
|
33
|
+
process.exit(EXIT_CODES.ERROR);
|
|
34
|
+
}
|
|
35
|
+
validateProjectConfig(projectConfig, projectDir);
|
|
36
|
+
const components = await findProjectComponents(projectDir);
|
|
37
|
+
const runnableComponents = components.filter(component => component.runnable);
|
|
38
|
+
const componentTypes = getProjectComponentTypes(runnableComponents);
|
|
39
|
+
const hasPrivateApps = !!componentTypes[ComponentTypes.PrivateApp];
|
|
40
|
+
const hasPublicApps = !!componentTypes[ComponentTypes.PublicApp];
|
|
41
|
+
if (runnableComponents.length === 0) {
|
|
42
|
+
logger.error(i18n(`${i18nKey}.errors.noRunnableComponents`, {
|
|
43
|
+
projectDir,
|
|
44
|
+
command: uiCommandReference('hs project add'),
|
|
45
|
+
}));
|
|
46
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
47
|
+
}
|
|
48
|
+
else if (hasPrivateApps && hasPublicApps) {
|
|
49
|
+
logger.error(i18n(`${i18nKey}.errors.invalidProjectComponents`));
|
|
50
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
51
|
+
}
|
|
52
|
+
const accounts = getConfigAccounts();
|
|
53
|
+
const defaultAccountIsRecommendedType = isDeveloperTestAccount(accountConfig) ||
|
|
54
|
+
(!hasPublicApps && isSandbox(accountConfig));
|
|
55
|
+
// targetProjectAccountId and targetTestingAccountId are set to null if --account flag is not provided.
|
|
56
|
+
// By setting them to null, we can later check if they need to be assigned based on the default account configuration and the type of app.
|
|
57
|
+
let targetProjectAccountId = providedAccountId ? derivedAccountId : null;
|
|
58
|
+
// The account that we are locally testing against
|
|
59
|
+
let targetTestingAccountId = providedAccountId ? derivedAccountId : null;
|
|
60
|
+
// Check that the default account or flag option is valid for the type of app in this project
|
|
61
|
+
if (providedAccountId) {
|
|
62
|
+
checkIfAccountFlagIsSupported(accountConfig, hasPublicApps);
|
|
63
|
+
if (hasPublicApps) {
|
|
64
|
+
targetProjectAccountId = accountConfig.parentAccountId;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
checkIfDefaultAccountIsSupported(accountConfig, hasPublicApps);
|
|
69
|
+
}
|
|
70
|
+
// The user is targeting an account type that we recommend developing on
|
|
71
|
+
if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
|
|
72
|
+
targetTestingAccountId = derivedAccountId;
|
|
73
|
+
await confirmDefaultAccountIsTarget(accountConfig, hasPublicApps);
|
|
74
|
+
if (hasPublicApps) {
|
|
75
|
+
checkIfParentAccountIsAuthed(accountConfig);
|
|
76
|
+
targetProjectAccountId = accountConfig.parentAccountId;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
targetProjectAccountId = derivedAccountId;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let createNewSandbox = false;
|
|
83
|
+
let createNewDeveloperTestAccount = false;
|
|
84
|
+
if (!targetProjectAccountId) {
|
|
85
|
+
const { targetAccountId, parentAccountId, createNestedAccount, notInConfigAccount, } = await suggestRecommendedNestedAccount(accounts, accountConfig, hasPublicApps);
|
|
86
|
+
targetProjectAccountId = hasPublicApps ? parentAccountId : targetAccountId;
|
|
87
|
+
targetTestingAccountId = targetAccountId;
|
|
88
|
+
// Only used for developer test accounts that are not yet in the config
|
|
89
|
+
if (notInConfigAccount) {
|
|
90
|
+
await useExistingDevTestAccount(env, notInConfigAccount);
|
|
91
|
+
}
|
|
92
|
+
createNewSandbox = isStandardAccount(accountConfig) && createNestedAccount;
|
|
93
|
+
createNewDeveloperTestAccount =
|
|
94
|
+
isAppDeveloperAccount(accountConfig) && createNestedAccount;
|
|
95
|
+
}
|
|
96
|
+
if (createNewSandbox) {
|
|
97
|
+
targetProjectAccountId = await createSandboxForLocalDev(derivedAccountId, accountConfig, env);
|
|
98
|
+
// We will be running our tests against this new sandbox account
|
|
99
|
+
targetTestingAccountId = targetProjectAccountId;
|
|
100
|
+
}
|
|
101
|
+
if (createNewDeveloperTestAccount) {
|
|
102
|
+
targetTestingAccountId = await createDeveloperTestAccountForLocalDev(derivedAccountId, accountConfig, env);
|
|
103
|
+
targetProjectAccountId = derivedAccountId;
|
|
104
|
+
}
|
|
105
|
+
// eslint-disable-next-line prefer-const
|
|
106
|
+
let { projectExists, project } = await ensureProjectExists(targetProjectAccountId, projectConfig.name, {
|
|
107
|
+
allowCreate: false,
|
|
108
|
+
noLogs: true,
|
|
109
|
+
withPolling: createNewSandbox,
|
|
110
|
+
});
|
|
111
|
+
let deployedBuild;
|
|
112
|
+
let isGithubLinked;
|
|
113
|
+
SpinniesManager.init();
|
|
114
|
+
if (projectExists) {
|
|
115
|
+
deployedBuild = project.deployedBuild;
|
|
116
|
+
isGithubLinked =
|
|
117
|
+
project.sourceIntegration &&
|
|
118
|
+
project.sourceIntegration.source === 'GITHUB';
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
project = await createNewProjectForLocalDev(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
|
|
122
|
+
deployedBuild = await createInitialBuildForNewProject(projectConfig, projectDir, targetProjectAccountId);
|
|
123
|
+
}
|
|
124
|
+
const LocalDev = new LocalDevManager({
|
|
125
|
+
runnableComponents,
|
|
126
|
+
debug: options.debug,
|
|
127
|
+
deployedBuild,
|
|
128
|
+
isGithubLinked,
|
|
129
|
+
parentAccountId: targetProjectAccountId,
|
|
130
|
+
projectConfig,
|
|
131
|
+
projectDir,
|
|
132
|
+
projectId: project.id,
|
|
133
|
+
targetAccountId: targetTestingAccountId,
|
|
134
|
+
env,
|
|
135
|
+
});
|
|
136
|
+
await LocalDev.start();
|
|
137
|
+
handleExit(({ isSIGHUP }) => LocalDev.stop(!isSIGHUP));
|
|
138
|
+
};
|
|
139
|
+
exports.builder = yargs => {
|
|
140
|
+
addConfigOptions(yargs);
|
|
141
|
+
addAccountOptions(yargs);
|
|
142
|
+
addUseEnvironmentOptions(yargs);
|
|
143
|
+
addTestingOptions(yargs);
|
|
144
|
+
yargs.example([['$0 project dev', i18n(`${i18nKey}.examples.default`)]]);
|
|
145
|
+
return yargs;
|
|
146
|
+
};
|
|
@@ -71,9 +71,9 @@ exports.handler = async (options) => {
|
|
|
71
71
|
let projectName;
|
|
72
72
|
let projectDest;
|
|
73
73
|
try {
|
|
74
|
-
const
|
|
75
|
-
projectName =
|
|
76
|
-
projectDest =
|
|
74
|
+
const { name, dest } = await createProjectPrompt('', options, true);
|
|
75
|
+
projectName = options.name || name;
|
|
76
|
+
projectDest = options.dest || dest;
|
|
77
77
|
const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
|
|
78
78
|
allowCreate: false,
|
|
79
79
|
noLogs: true,
|
|
@@ -20,7 +20,7 @@ const i18nKey = 'commands.project.subcommands.upload';
|
|
|
20
20
|
exports.command = 'upload';
|
|
21
21
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
22
22
|
exports.handler = async (options) => {
|
|
23
|
-
const { forceCreate, message, derivedAccountId
|
|
23
|
+
const { forceCreate, message, derivedAccountId } = options;
|
|
24
24
|
const accountConfig = getAccountConfig(derivedAccountId);
|
|
25
25
|
const accountType = accountConfig && accountConfig.accountType;
|
|
26
26
|
const { projectConfig, projectDir } = await getProjectConfig();
|
|
@@ -31,7 +31,7 @@ exports.handler = async (options) => {
|
|
|
31
31
|
uploadCommand: true,
|
|
32
32
|
});
|
|
33
33
|
try {
|
|
34
|
-
const { result, uploadError } = await handleProjectUpload(derivedAccountId, projectConfig, projectDir, pollProjectBuildAndDeploy, message, useV3Api(projectConfig?.platformVersion)
|
|
34
|
+
const { result, uploadError } = await handleProjectUpload(derivedAccountId, projectConfig, projectDir, pollProjectBuildAndDeploy, message, useV3Api(projectConfig?.platformVersion));
|
|
35
35
|
if (uploadError) {
|
|
36
36
|
if (isSpecifiedError(uploadError, {
|
|
37
37
|
subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
|
|
@@ -81,11 +81,6 @@ exports.builder = yargs => {
|
|
|
81
81
|
type: 'string',
|
|
82
82
|
default: '',
|
|
83
83
|
},
|
|
84
|
-
'skip-validation': {
|
|
85
|
-
type: 'boolean',
|
|
86
|
-
hidden: true,
|
|
87
|
-
default: false,
|
|
88
|
-
},
|
|
89
84
|
});
|
|
90
85
|
yargs.example([['$0 project upload', i18n(`${i18nKey}.examples.default`)]]);
|
|
91
86
|
addConfigOptions(yargs);
|
|
@@ -1,13 +1 @@
|
|
|
1
|
-
import { Argv, ArgumentsCamelCase } from 'yargs';
|
|
2
|
-
import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, TestingArgs } from '../../types/Yargs';
|
|
3
|
-
export declare const command = "create";
|
|
4
|
-
export declare const describe: string | undefined;
|
|
5
|
-
type CombinedArgs = ConfigArgs & AccountArgs & EnvironmentArgs & TestingArgs;
|
|
6
|
-
type SandboxCreateArgs = CommonArgs & CombinedArgs & {
|
|
7
|
-
name?: string;
|
|
8
|
-
force?: boolean;
|
|
9
|
-
type?: string;
|
|
10
|
-
};
|
|
11
|
-
export declare function handler(args: ArgumentsCamelCase<SandboxCreateArgs>): Promise<void>;
|
|
12
|
-
export declare function builder(yargs: Argv): Argv<SandboxCreateArgs>;
|
|
13
1
|
export {};
|
|
@@ -1,175 +1,157 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
const buildAccount_1 = require("../../lib/buildAccount");
|
|
23
|
-
const accountNamePrompt_1 = require("../../lib/prompts/accountNamePrompt");
|
|
3
|
+
// @ts-nocheck
|
|
4
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
|
|
5
|
+
const { i18n } = require('../../lib/lang');
|
|
6
|
+
const { EXIT_CODES } = require('../../lib/enums/exitCodes');
|
|
7
|
+
const { getAccountConfig, getEnv } = require('@hubspot/local-dev-lib/config');
|
|
8
|
+
const { uiFeatureHighlight, uiBetaTag } = require('../../lib/ui');
|
|
9
|
+
const { SANDBOX_TYPE_MAP, getAvailableSyncTypes, SYNC_TYPES, validateSandboxUsageLimits, } = require('../../lib/sandboxes');
|
|
10
|
+
const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
|
|
11
|
+
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
12
|
+
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
13
|
+
const { sandboxTypePrompt } = require('../../lib/prompts/sandboxesPrompt');
|
|
14
|
+
const { promptUser } = require('../../lib/prompts/promptUtils');
|
|
15
|
+
const { syncSandbox } = require('../../lib/sandboxSync');
|
|
16
|
+
const { logError } = require('../../lib/errorHandlers/index');
|
|
17
|
+
const { isMissingScopeError } = require('@hubspot/local-dev-lib/errors/index');
|
|
18
|
+
const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
|
|
19
|
+
const { HUBSPOT_ACCOUNT_TYPES, HUBSPOT_ACCOUNT_TYPE_STRINGS, } = require('@hubspot/local-dev-lib/constants/config');
|
|
20
|
+
const { buildSandbox } = require('../../lib/buildAccount');
|
|
21
|
+
const { hubspotAccountNamePrompt, } = require('../../lib/prompts/accountNamePrompt');
|
|
24
22
|
const i18nKey = 'commands.sandbox.subcommands.create';
|
|
25
23
|
exports.command = 'create';
|
|
26
|
-
exports.describe =
|
|
27
|
-
async
|
|
28
|
-
const { name, type, force, derivedAccountId } =
|
|
29
|
-
const accountConfig =
|
|
30
|
-
const env =
|
|
31
|
-
|
|
32
|
-
// Check if account config exists
|
|
33
|
-
if (!accountConfig) {
|
|
34
|
-
logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.failure.noAccountConfig`, {
|
|
35
|
-
accountId: derivedAccountId,
|
|
36
|
-
authCommand: (0, ui_1.uiCommandReference)('hs auth'),
|
|
37
|
-
}));
|
|
38
|
-
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
39
|
-
}
|
|
24
|
+
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
25
|
+
exports.handler = async (options) => {
|
|
26
|
+
const { name, type, force, derivedAccountId } = options;
|
|
27
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
28
|
+
const env = getValidEnv(getEnv(derivedAccountId));
|
|
29
|
+
trackCommandUsage('sandbox-create', null, derivedAccountId);
|
|
40
30
|
// Default account is not a production portal
|
|
41
31
|
if (accountConfig.accountType &&
|
|
42
|
-
accountConfig.accountType !==
|
|
43
|
-
|
|
44
|
-
accountType:
|
|
45
|
-
accountName: accountConfig.name
|
|
32
|
+
accountConfig.accountType !== HUBSPOT_ACCOUNT_TYPES.STANDARD) {
|
|
33
|
+
logger.error(i18n(`${i18nKey}.failure.invalidAccountType`, {
|
|
34
|
+
accountType: HUBSPOT_ACCOUNT_TYPE_STRINGS[HUBSPOT_ACCOUNT_TYPES[accountConfig.accountType]],
|
|
35
|
+
accountName: accountConfig.name,
|
|
46
36
|
}));
|
|
47
|
-
process.exit(
|
|
37
|
+
process.exit(EXIT_CODES.ERROR);
|
|
48
38
|
}
|
|
49
39
|
let typePrompt;
|
|
50
40
|
let namePrompt;
|
|
51
|
-
if ((type && !
|
|
41
|
+
if ((type && !SANDBOX_TYPE_MAP[type.toLowerCase()]) || !type) {
|
|
52
42
|
if (!force) {
|
|
53
|
-
typePrompt = await
|
|
43
|
+
typePrompt = await sandboxTypePrompt();
|
|
54
44
|
}
|
|
55
45
|
else {
|
|
56
|
-
|
|
57
|
-
process.exit(
|
|
46
|
+
logger.error(i18n(`${i18nKey}.failure.optionMissing.type`));
|
|
47
|
+
process.exit(EXIT_CODES.ERROR);
|
|
58
48
|
}
|
|
59
49
|
}
|
|
60
50
|
const sandboxType = type
|
|
61
|
-
?
|
|
51
|
+
? SANDBOX_TYPE_MAP[type.toLowerCase()]
|
|
62
52
|
: typePrompt.type;
|
|
63
53
|
// Check usage limits and exit if parent portal has no available sandboxes for the selected type
|
|
64
54
|
try {
|
|
65
|
-
await
|
|
55
|
+
await validateSandboxUsageLimits(accountConfig, sandboxType, env);
|
|
66
56
|
}
|
|
67
57
|
catch (err) {
|
|
68
|
-
if (
|
|
69
|
-
|
|
58
|
+
if (isMissingScopeError(err)) {
|
|
59
|
+
logger.error(i18n('lib.sandbox.create.failure.scopes.message', {
|
|
70
60
|
accountName: accountConfig.name || derivedAccountId,
|
|
71
61
|
}));
|
|
72
|
-
const websiteOrigin =
|
|
62
|
+
const websiteOrigin = getHubSpotWebsiteOrigin(env);
|
|
73
63
|
const url = `${websiteOrigin}/personal-access-key/${derivedAccountId}`;
|
|
74
|
-
|
|
64
|
+
logger.info(i18n('lib.sandbox.create.failure.scopes.instructions', {
|
|
75
65
|
accountName: accountConfig.name || derivedAccountId,
|
|
76
66
|
url,
|
|
77
67
|
}));
|
|
78
68
|
}
|
|
79
69
|
else {
|
|
80
|
-
|
|
70
|
+
logError(err);
|
|
81
71
|
}
|
|
82
|
-
process.exit(
|
|
72
|
+
process.exit(EXIT_CODES.ERROR);
|
|
83
73
|
}
|
|
84
74
|
if (!name) {
|
|
85
75
|
if (!force) {
|
|
86
|
-
namePrompt = await
|
|
76
|
+
namePrompt = await hubspotAccountNamePrompt({ accountType: sandboxType });
|
|
87
77
|
}
|
|
88
78
|
else {
|
|
89
|
-
|
|
90
|
-
process.exit(
|
|
79
|
+
logger.error(i18n(`${i18nKey}.failure.optionMissing.name`));
|
|
80
|
+
process.exit(EXIT_CODES.ERROR);
|
|
91
81
|
}
|
|
92
82
|
}
|
|
93
83
|
const sandboxName = name || namePrompt.name;
|
|
94
84
|
let contactRecordsSyncPromptResult = false;
|
|
95
85
|
if (!force) {
|
|
96
|
-
const isStandardSandbox = sandboxType ===
|
|
86
|
+
const isStandardSandbox = sandboxType === HUBSPOT_ACCOUNT_TYPES.STANDARD_SANDBOX;
|
|
97
87
|
// Prompt to sync contact records for standard sandboxes only
|
|
98
88
|
if (isStandardSandbox) {
|
|
99
|
-
const { contactRecordsSyncPrompt } = await
|
|
89
|
+
const { contactRecordsSyncPrompt } = await promptUser([
|
|
100
90
|
{
|
|
101
91
|
name: 'contactRecordsSyncPrompt',
|
|
102
92
|
type: 'confirm',
|
|
103
|
-
message:
|
|
93
|
+
message: i18n('lib.sandbox.sync.confirm.syncContactRecords.standard'),
|
|
104
94
|
},
|
|
105
95
|
]);
|
|
106
96
|
contactRecordsSyncPromptResult = contactRecordsSyncPrompt;
|
|
107
97
|
}
|
|
108
98
|
}
|
|
109
99
|
try {
|
|
110
|
-
const result = await
|
|
111
|
-
const sandboxAccountConfig =
|
|
112
|
-
// Check if sandbox account config exists
|
|
113
|
-
if (!sandboxAccountConfig) {
|
|
114
|
-
logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.failure.noSandboxAccountConfig`, {
|
|
115
|
-
accountId: result.sandbox.sandboxHubId,
|
|
116
|
-
authCommand: (0, ui_1.uiCommandReference)('hs auth'),
|
|
117
|
-
}));
|
|
118
|
-
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
119
|
-
}
|
|
100
|
+
const result = await buildSandbox(sandboxName, accountConfig, sandboxType, env, force);
|
|
101
|
+
const sandboxAccountConfig = getAccountConfig(result.sandbox.sandboxHubId);
|
|
120
102
|
// For v1 sandboxes, keep sync here. Once we migrate to v2, this will be handled by BE automatically
|
|
121
|
-
async
|
|
122
|
-
await
|
|
123
|
-
}
|
|
103
|
+
const handleSyncSandbox = async (syncTasks) => {
|
|
104
|
+
await syncSandbox(sandboxAccountConfig, accountConfig, env, syncTasks);
|
|
105
|
+
};
|
|
124
106
|
try {
|
|
125
|
-
let availableSyncTasks = await
|
|
107
|
+
let availableSyncTasks = await getAvailableSyncTypes(accountConfig, sandboxAccountConfig);
|
|
126
108
|
if (!contactRecordsSyncPromptResult) {
|
|
127
|
-
availableSyncTasks = availableSyncTasks.filter(t => t.type !==
|
|
109
|
+
availableSyncTasks = availableSyncTasks.filter(t => t.type !== SYNC_TYPES.OBJECT_RECORDS);
|
|
128
110
|
}
|
|
129
111
|
await handleSyncSandbox(availableSyncTasks);
|
|
130
112
|
}
|
|
131
113
|
catch (err) {
|
|
132
|
-
|
|
114
|
+
logError(err);
|
|
133
115
|
throw err;
|
|
134
116
|
}
|
|
135
117
|
const highlightItems = ['accountsUseCommand', 'projectCreateCommand'];
|
|
136
|
-
if (sandboxType ===
|
|
118
|
+
if (sandboxType === HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX) {
|
|
137
119
|
highlightItems.push('projectDevCommand');
|
|
138
120
|
}
|
|
139
121
|
else {
|
|
140
122
|
highlightItems.push('projectUploadCommand');
|
|
141
123
|
}
|
|
142
|
-
|
|
143
|
-
process.exit(
|
|
124
|
+
uiFeatureHighlight(highlightItems);
|
|
125
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
144
126
|
}
|
|
145
127
|
catch (error) {
|
|
146
128
|
// Errors are logged in util functions
|
|
147
|
-
process.exit(
|
|
129
|
+
process.exit(EXIT_CODES.ERROR);
|
|
148
130
|
}
|
|
149
|
-
}
|
|
150
|
-
|
|
131
|
+
};
|
|
132
|
+
exports.builder = yargs => {
|
|
151
133
|
yargs.option('force', {
|
|
152
134
|
type: 'boolean',
|
|
153
135
|
alias: 'f',
|
|
154
|
-
describe:
|
|
136
|
+
describe: i18n(`${i18nKey}.options.force.describe`),
|
|
155
137
|
});
|
|
156
138
|
yargs.option('name', {
|
|
157
|
-
describe:
|
|
139
|
+
describe: i18n(`${i18nKey}.options.name.describe`),
|
|
158
140
|
type: 'string',
|
|
159
141
|
});
|
|
160
142
|
yargs.option('type', {
|
|
161
|
-
describe:
|
|
162
|
-
|
|
143
|
+
describe: i18n(`${i18nKey}.options.type.describe`),
|
|
144
|
+
type: 'string',
|
|
163
145
|
});
|
|
164
146
|
yargs.example([
|
|
165
147
|
[
|
|
166
148
|
'$0 sandbox create --name=MySandboxAccount --type=STANDARD',
|
|
167
|
-
|
|
149
|
+
i18n(`${i18nKey}.examples.default`),
|
|
168
150
|
],
|
|
169
151
|
]);
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
152
|
+
addConfigOptions(yargs);
|
|
153
|
+
addAccountOptions(yargs);
|
|
154
|
+
addUseEnvironmentOptions(yargs);
|
|
155
|
+
addTestingOptions(yargs);
|
|
174
156
|
return yargs;
|
|
175
|
-
}
|
|
157
|
+
};
|
|
@@ -1,12 +1 @@
|
|
|
1
|
-
import { Argv, ArgumentsCamelCase } from 'yargs';
|
|
2
|
-
import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, TestingArgs } from '../../types/Yargs';
|
|
3
|
-
export declare const command = "delete";
|
|
4
|
-
export declare const describe: string | undefined;
|
|
5
|
-
type CombinedArgs = ConfigArgs & AccountArgs & EnvironmentArgs & TestingArgs;
|
|
6
|
-
type SandboxDeleteArgs = CommonArgs & CombinedArgs & {
|
|
7
|
-
account?: string;
|
|
8
|
-
force?: boolean;
|
|
9
|
-
};
|
|
10
|
-
export declare function handler(args: ArgumentsCamelCase<SandboxDeleteArgs>): Promise<void>;
|
|
11
|
-
export declare function builder(yargs: Argv): Argv<SandboxDeleteArgs>;
|
|
12
1
|
export {};
|