@hubspot/cli 6.4.0 → 7.0.0-beta.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 +110 -16
- package/bin/hs +2 -0
- package/bin/hscms +2 -0
- package/bin/silenceErrors.d.ts +2 -0
- package/bin/silenceErrors.js +12 -0
- package/commands/{accounts → account}/clean.js +10 -11
- package/commands/{accounts → account}/info.js +10 -16
- package/commands/{accounts → account}/list.js +16 -16
- package/commands/{accounts → account}/remove.js +12 -15
- package/commands/{accounts → account}/rename.js +4 -7
- package/commands/{accounts → account}/use.js +8 -14
- package/commands/account.js +26 -0
- package/commands/auth.js +30 -24
- package/commands/cms/getReactModule.js +70 -0
- package/commands/cms/lighthouseScore.js +19 -21
- package/commands/cms.js +4 -3
- package/commands/completion.js +22 -0
- package/commands/config/set.js +22 -24
- package/commands/config.js +2 -2
- package/commands/create.js +6 -3
- package/commands/customObject/create.js +19 -15
- package/commands/customObject/schema/create.js +15 -16
- package/commands/customObject/schema/delete.js +29 -11
- package/commands/customObject/schema/fetch-all.js +14 -11
- package/commands/customObject/schema/fetch.js +22 -14
- package/commands/customObject/schema/list.js +3 -6
- package/commands/customObject/schema/update.js +28 -18
- package/commands/customObject/schema.js +1 -1
- package/commands/customObject.js +3 -4
- package/commands/doctor.js +4 -2
- package/commands/feedback.js +2 -0
- package/commands/fetch.js +13 -13
- package/commands/filemanager/fetch.js +6 -7
- package/commands/filemanager/upload.js +10 -12
- package/commands/filemanager.js +1 -8
- package/commands/{functions → function}/deploy.js +13 -13
- package/commands/{functions → function}/list.js +7 -9
- package/commands/{functions → function}/server.js +5 -8
- package/commands/function.js +16 -0
- package/commands/hubdb/clear.js +14 -10
- package/commands/hubdb/create.js +37 -13
- package/commands/hubdb/delete.js +31 -10
- package/commands/hubdb/fetch.js +14 -9
- package/commands/hubdb.js +2 -3
- package/commands/init.js +37 -14
- package/commands/lint.js +6 -7
- package/commands/list.js +5 -7
- package/commands/logs.js +24 -15
- package/commands/module/marketplace-validate.js +6 -9
- package/commands/module.js +2 -1
- package/commands/mv.js +11 -13
- package/commands/open.js +11 -10
- package/commands/project/add.js +2 -5
- package/commands/project/cloneApp.js +28 -32
- package/commands/project/create.js +8 -10
- package/commands/project/deploy.js +19 -16
- package/commands/project/dev.js +17 -18
- package/commands/project/download.js +18 -15
- package/commands/project/listBuilds.js +36 -32
- package/commands/project/logs.js +6 -8
- package/commands/project/migrateApp.js +27 -27
- package/commands/project/open.js +9 -11
- package/commands/project/upload.js +30 -32
- package/commands/project/watch.js +17 -24
- package/commands/project.js +3 -4
- package/commands/remove.js +14 -13
- package/commands/sandbox/create.js +12 -15
- package/commands/sandbox/delete.js +19 -20
- package/commands/sandbox.js +4 -8
- package/commands/{secrets → secret}/addSecret.js +25 -12
- package/commands/secret/deleteSecret.js +71 -0
- package/commands/{secrets → secret}/listSecrets.js +7 -9
- package/commands/{secrets → secret}/updateSecret.js +21 -13
- package/commands/secret.js +22 -0
- package/commands/theme/generate-selectors.js +8 -8
- package/commands/theme/marketplace-validate.js +10 -13
- package/commands/theme/preview.js +7 -10
- package/commands/theme.js +3 -1
- package/commands/upload.js +32 -26
- package/commands/watch.js +19 -20
- package/lang/en.lyaml +200 -126
- package/lib/DevServerManager.js +1 -1
- package/lib/LocalDevManager.js +4 -4
- package/lib/buildAccount.js +5 -11
- package/lib/commonOpts.d.ts +15 -6
- package/lib/commonOpts.js +53 -39
- package/lib/configOptions.d.ts +13 -1
- package/lib/configOptions.js +54 -57
- package/lib/constants.d.ts +1 -4
- package/lib/dependencyManagement.d.ts +4 -1
- package/lib/dependencyManagement.js +2 -2
- package/lib/developerTestAccounts.d.ts +5 -1
- package/lib/developerTestAccounts.js +45 -39
- package/lib/doctor/DiagnosticInfoBuilder.js +8 -4
- package/lib/doctor/Doctor.js +11 -6
- package/lib/generateSelectors.d.ts +19 -0
- package/lib/generateSelectors.js +23 -23
- package/lib/localDev.js +3 -2
- package/lib/marketplaceValidate.d.ts +6 -1
- package/lib/marketplaceValidate.js +76 -77
- package/lib/oauth.d.ts +2 -1
- package/lib/oauth.js +49 -37
- package/lib/polling.d.ts +8 -0
- package/lib/polling.js +9 -12
- package/lib/projects/ProjectLogsManager.d.ts +20 -0
- package/lib/projects/ProjectLogsManager.js +105 -0
- package/lib/projects/buildAndDeploy.d.ts +16 -0
- package/lib/projects/buildAndDeploy.js +342 -0
- package/lib/projects/index.d.ts +24 -0
- package/lib/projects/index.js +256 -0
- package/lib/projects/structure.d.ts +78 -0
- package/lib/projects/structure.js +151 -0
- package/lib/projects/upload.d.ts +8 -0
- package/lib/projects/upload.js +107 -0
- package/lib/projects/urls.d.ts +4 -0
- package/lib/projects/urls.js +27 -0
- package/lib/{projectsWatch.js → projects/watch.js} +3 -3
- package/lib/prompts/accountNamePrompt.d.ts +11 -0
- package/lib/prompts/accountNamePrompt.js +45 -46
- package/lib/prompts/accountsPrompt.d.ts +1 -1
- package/lib/prompts/accountsPrompt.js +21 -19
- package/lib/prompts/cmsFieldPrompt.d.ts +1 -1
- package/lib/prompts/cmsFieldPrompt.js +23 -24
- package/lib/prompts/createApiSamplePrompt.d.ts +17 -0
- package/lib/prompts/createApiSamplePrompt.js +47 -44
- package/lib/prompts/createFunctionPrompt.d.ts +7 -0
- package/lib/prompts/createFunctionPrompt.js +17 -20
- package/lib/prompts/createModulePrompt.d.ts +8 -0
- package/lib/prompts/createModulePrompt.js +29 -17
- package/lib/prompts/createProjectPrompt.d.ts +13 -0
- package/lib/prompts/createProjectPrompt.js +48 -49
- package/lib/prompts/createTemplatePrompt.d.ts +8 -0
- package/lib/prompts/createTemplatePrompt.js +15 -17
- package/lib/prompts/downloadProjectPrompt.d.ts +8 -0
- package/lib/prompts/downloadProjectPrompt.js +25 -23
- package/lib/prompts/installPublicAppPrompt.d.ts +1 -1
- package/lib/prompts/installPublicAppPrompt.js +21 -19
- package/lib/prompts/personalAccessKeyPrompt.d.ts +28 -0
- package/lib/prompts/personalAccessKeyPrompt.js +46 -52
- package/lib/prompts/previewPrompt.d.ts +14 -0
- package/lib/prompts/previewPrompt.js +24 -24
- package/lib/prompts/projectAddPrompt.d.ts +9 -0
- package/lib/prompts/projectAddPrompt.js +11 -14
- package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
- package/lib/prompts/projectDevTargetAccountPrompt.js +87 -69
- package/lib/prompts/projectsLogsPrompt.d.ts +11 -0
- package/lib/prompts/projectsLogsPrompt.js +8 -11
- package/lib/prompts/promptUtils.d.ts +7 -6
- package/lib/prompts/promptUtils.js +21 -8
- package/lib/prompts/sandboxesPrompt.d.ts +8 -0
- package/lib/prompts/sandboxesPrompt.js +43 -45
- package/lib/prompts/secretPrompt.d.ts +12 -0
- package/lib/prompts/secretPrompt.js +32 -19
- package/lib/prompts/selectHubDBTablePrompt.d.ts +12 -0
- package/lib/prompts/selectHubDBTablePrompt.js +69 -0
- package/lib/prompts/selectPublicAppPrompt.d.ts +8 -0
- package/lib/prompts/selectPublicAppPrompt.js +28 -27
- package/lib/prompts/setAsDefaultAccountPrompt.d.ts +1 -1
- package/lib/prompts/setAsDefaultAccountPrompt.js +12 -14
- package/lib/prompts/uploadPrompt.d.ts +8 -0
- package/lib/prompts/uploadPrompt.js +18 -18
- package/lib/sandboxSync.js +5 -2
- package/lib/sandboxes.js +12 -7
- package/lib/ui/index.d.ts +1 -1
- package/lib/ui/index.js +1 -1
- package/lib/usageTracking.d.ts +21 -2
- package/lib/usageTracking.js +53 -81
- package/lib/validation.d.ts +11 -1
- package/lib/validation.js +98 -91
- package/package.json +12 -6
- package/types/Projects.d.ts +43 -0
- package/types/Projects.js +2 -0
- package/types/Prompts.d.ts +25 -0
- package/types/Prompts.js +2 -0
- package/commands/accounts.js +0 -30
- package/commands/cms/reactModules.js +0 -60
- package/commands/functions.js +0 -24
- package/commands/secrets/deleteSecret.js +0 -46
- package/commands/secrets.js +0 -23
- package/lib/ProjectLogsManager.js +0 -91
- package/lib/projectStructure.js +0 -116
- package/lib/projects.d.ts +0 -4
- package/lib/projects.js +0 -681
- package/lib/projectsWatch.d.ts +0 -1
- package/lib/prompts/cleanUploadPrompt.d.ts +0 -1
- package/lib/prompts/cleanUploadPrompt.js +0 -20
- /package/commands/{accounts → account}/clean.d.ts +0 -0
- /package/commands/{accounts → account}/info.d.ts +0 -0
- /package/commands/{accounts → account}/list.d.ts +0 -0
- /package/commands/{accounts → account}/remove.d.ts +0 -0
- /package/commands/{accounts → account}/rename.d.ts +0 -0
- /package/commands/{accounts → account}/use.d.ts +0 -0
- /package/commands/{accounts.d.ts → account.d.ts} +0 -0
- /package/commands/cms/{reactModules.d.ts → getReactModule.d.ts} +0 -0
- /package/commands/{functions.d.ts → completion.d.ts} +0 -0
- /package/commands/{functions/list.d.ts → function/deploy.d.ts} +0 -0
- /package/commands/{functions/server.d.ts → function/list.d.ts} +0 -0
- /package/commands/{secrets.d.ts → function/server.d.ts} +0 -0
- /package/commands/{functions/deploy.d.ts → function.d.ts} +0 -0
- /package/commands/{secrets/deleteSecret.d.ts → secret/addSecret.d.ts} +0 -0
- /package/commands/{secrets/listSecrets.d.ts → secret/deleteSecret.d.ts} +0 -0
- /package/commands/{secrets/updateSecret.d.ts → secret/listSecrets.d.ts} +0 -0
- /package/{lib/ProjectLogsManager.d.ts → commands/secret/updateSecret.d.ts} +0 -0
- /package/commands/{secrets/addSecret.d.ts → secret.d.ts} +0 -0
- /package/lib/{projectStructure.d.ts → projects/watch.d.ts} +0 -0
package/commands/project/dev.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
|
-
const { addAccountOptions, addConfigOptions,
|
|
4
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
|
|
5
5
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
6
|
-
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
7
6
|
const { handleExit } = require('../../lib/process');
|
|
8
7
|
const { i18n } = require('../../lib/lang');
|
|
9
8
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
@@ -15,17 +14,16 @@ const SpinniesManager = require('../../lib/ui/SpinniesManager');
|
|
|
15
14
|
const LocalDevManager = require('../../lib/LocalDevManager');
|
|
16
15
|
const { isSandbox, isDeveloperTestAccount, isStandardAccount, isAppDeveloperAccount, } = require('../../lib/accountTypes');
|
|
17
16
|
const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
|
|
18
|
-
const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, } = require('../../lib/
|
|
17
|
+
const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, } = require('../../lib/projects/structure');
|
|
19
18
|
const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, createNewProjectForLocalDev, createInitialBuildForNewProject, useExistingDevTestAccount, checkIfAccountFlagIsSupported, checkIfParentAccountIsAuthed, } = require('../../lib/localDev');
|
|
20
19
|
const i18nKey = 'commands.project.subcommands.dev';
|
|
21
|
-
exports.command = 'dev
|
|
20
|
+
exports.command = 'dev';
|
|
22
21
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
23
22
|
exports.handler = async (options) => {
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
trackCommandUsage('project-dev', null, accountId);
|
|
23
|
+
const { derivedAccountId, providedAccountId } = options;
|
|
24
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
25
|
+
const env = getValidEnv(getEnv(derivedAccountId));
|
|
26
|
+
trackCommandUsage('project-dev', null, derivedAccountId);
|
|
29
27
|
const { projectConfig, projectDir } = await getProjectConfig();
|
|
30
28
|
uiBetaTag(i18n(`${i18nKey}.logs.betaMessage`));
|
|
31
29
|
logger.log(uiLink(i18n(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
|
|
@@ -53,12 +51,13 @@ exports.handler = async (options) => {
|
|
|
53
51
|
const accounts = getConfigAccounts();
|
|
54
52
|
const defaultAccountIsRecommendedType = isDeveloperTestAccount(accountConfig) ||
|
|
55
53
|
(!hasPublicApps && isSandbox(accountConfig));
|
|
56
|
-
//
|
|
57
|
-
|
|
54
|
+
// targetProjectAccountId and targetTestingAccountId are set to null if --account flag is not provided.
|
|
55
|
+
// 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.
|
|
56
|
+
let targetProjectAccountId = providedAccountId ? derivedAccountId : null;
|
|
58
57
|
// The account that we are locally testing against
|
|
59
|
-
let targetTestingAccountId =
|
|
58
|
+
let targetTestingAccountId = providedAccountId ? derivedAccountId : null;
|
|
60
59
|
// Check that the default account or flag option is valid for the type of app in this project
|
|
61
|
-
if (
|
|
60
|
+
if (providedAccountId) {
|
|
62
61
|
checkIfAccountFlagIsSupported(accountConfig, hasPublicApps);
|
|
63
62
|
if (hasPublicApps) {
|
|
64
63
|
targetProjectAccountId = accountConfig.parentAccountId;
|
|
@@ -69,14 +68,14 @@ exports.handler = async (options) => {
|
|
|
69
68
|
}
|
|
70
69
|
// The user is targeting an account type that we recommend developing on
|
|
71
70
|
if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
|
|
72
|
-
targetTestingAccountId =
|
|
71
|
+
targetTestingAccountId = derivedAccountId;
|
|
73
72
|
await confirmDefaultAccountIsTarget(accountConfig, hasPublicApps);
|
|
74
73
|
if (hasPublicApps) {
|
|
75
74
|
checkIfParentAccountIsAuthed(accountConfig);
|
|
76
75
|
targetProjectAccountId = accountConfig.parentAccountId;
|
|
77
76
|
}
|
|
78
77
|
else {
|
|
79
|
-
targetProjectAccountId =
|
|
78
|
+
targetProjectAccountId = derivedAccountId;
|
|
80
79
|
}
|
|
81
80
|
}
|
|
82
81
|
let createNewSandbox = false;
|
|
@@ -94,13 +93,13 @@ exports.handler = async (options) => {
|
|
|
94
93
|
isAppDeveloperAccount(accountConfig) && createNestedAccount;
|
|
95
94
|
}
|
|
96
95
|
if (createNewSandbox) {
|
|
97
|
-
targetProjectAccountId = await createSandboxForLocalDev(
|
|
96
|
+
targetProjectAccountId = await createSandboxForLocalDev(derivedAccountId, accountConfig, env);
|
|
98
97
|
// We will be running our tests against this new sandbox account
|
|
99
98
|
targetTestingAccountId = targetProjectAccountId;
|
|
100
99
|
}
|
|
101
100
|
if (createNewDeveloperTestAccount) {
|
|
102
|
-
targetTestingAccountId = await createDeveloperTestAccountForLocalDev(
|
|
103
|
-
targetProjectAccountId =
|
|
101
|
+
targetTestingAccountId = await createDeveloperTestAccountForLocalDev(derivedAccountId, accountConfig, env);
|
|
102
|
+
targetProjectAccountId = derivedAccountId;
|
|
104
103
|
}
|
|
105
104
|
// eslint-disable-next-line prefer-const
|
|
106
105
|
let { projectExists, project } = await ensureProjectExists(targetProjectAccountId, projectConfig.name, {
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const chalk = require('chalk');
|
|
6
|
-
const {
|
|
6
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
7
7
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
8
8
|
const { getCwd, sanitizeFileName } = require('@hubspot/local-dev-lib/path');
|
|
9
9
|
const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
|
|
@@ -11,50 +11,47 @@ const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
|
11
11
|
const { extractZipArchive } = require('@hubspot/local-dev-lib/archive');
|
|
12
12
|
const { downloadProject, fetchProjectBuilds, } = require('@hubspot/local-dev-lib/api/projects');
|
|
13
13
|
const { ensureProjectExists, getProjectConfig } = require('../../lib/projects');
|
|
14
|
-
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
15
14
|
const { downloadProjectPrompt, } = require('../../lib/prompts/downloadProjectPrompt');
|
|
16
15
|
const { i18n } = require('../../lib/lang');
|
|
17
16
|
const { uiBetaTag } = require('../../lib/ui');
|
|
18
17
|
const i18nKey = 'commands.project.subcommands.download';
|
|
19
18
|
const { EXIT_CODES } = require('../../lib/enums/exitCodes');
|
|
20
|
-
exports.command = 'download
|
|
19
|
+
exports.command = 'download';
|
|
21
20
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
22
21
|
exports.handler = async (options) => {
|
|
23
|
-
await loadAndValidateOptions(options);
|
|
24
22
|
const { projectConfig } = await getProjectConfig();
|
|
25
23
|
if (projectConfig) {
|
|
26
24
|
logger.error(i18n(`${i18nKey}.warnings.cannotDownloadWithinProject`));
|
|
27
25
|
process.exit(EXIT_CODES.ERROR);
|
|
28
26
|
}
|
|
29
|
-
const { project, dest,
|
|
27
|
+
const { project, dest, build, derivedAccountId } = options;
|
|
30
28
|
const { project: promptedProjectName } = await downloadProjectPrompt(options);
|
|
31
29
|
let projectName = promptedProjectName || project;
|
|
32
|
-
|
|
33
|
-
trackCommandUsage('project-download', null, accountId);
|
|
30
|
+
trackCommandUsage('project-download', null, derivedAccountId);
|
|
34
31
|
try {
|
|
35
|
-
const { projectExists } = await ensureProjectExists(
|
|
32
|
+
const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
|
|
36
33
|
allowCreate: false,
|
|
37
34
|
noLogs: true,
|
|
38
35
|
});
|
|
39
36
|
if (!projectExists) {
|
|
40
37
|
logger.error(i18n(`${i18nKey}.errors.projectNotFound`, {
|
|
41
38
|
projectName: chalk.bold(projectName),
|
|
42
|
-
accountId: chalk.bold(
|
|
39
|
+
accountId: chalk.bold(derivedAccountId),
|
|
43
40
|
}));
|
|
44
41
|
const { name: promptedProjectName } = await downloadProjectPrompt(options);
|
|
45
42
|
projectName = promptedProjectName || project;
|
|
46
43
|
}
|
|
47
44
|
const absoluteDestPath = dest ? path.resolve(getCwd(), dest) : getCwd();
|
|
48
|
-
let buildNumberToDownload =
|
|
45
|
+
let buildNumberToDownload = build;
|
|
49
46
|
if (!buildNumberToDownload) {
|
|
50
|
-
const { data: projectBuildsResult } = await fetchProjectBuilds(
|
|
47
|
+
const { data: projectBuildsResult } = await fetchProjectBuilds(derivedAccountId, projectName);
|
|
51
48
|
const { results: projectBuilds } = projectBuildsResult;
|
|
52
49
|
if (projectBuilds && projectBuilds.length) {
|
|
53
50
|
const latestBuild = projectBuilds[0];
|
|
54
51
|
buildNumberToDownload = latestBuild.buildId;
|
|
55
52
|
}
|
|
56
53
|
}
|
|
57
|
-
const { data: zippedProject } = await downloadProject(
|
|
54
|
+
const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, buildNumberToDownload);
|
|
58
55
|
await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: false });
|
|
59
56
|
logger.log(i18n(`${i18nKey}.logs.downloadSucceeded`, {
|
|
60
57
|
buildId: buildNumberToDownload,
|
|
@@ -63,11 +60,16 @@ exports.handler = async (options) => {
|
|
|
63
60
|
process.exit(EXIT_CODES.SUCCESS);
|
|
64
61
|
}
|
|
65
62
|
catch (e) {
|
|
66
|
-
logError(e, new ApiErrorContext({
|
|
63
|
+
logError(e, new ApiErrorContext({
|
|
64
|
+
accountId: derivedAccountId,
|
|
65
|
+
request: 'project download',
|
|
66
|
+
}));
|
|
67
67
|
process.exit(EXIT_CODES.ERROR);
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
70
|
exports.builder = yargs => {
|
|
71
|
+
addAccountOptions(yargs);
|
|
72
|
+
addConfigOptions(yargs);
|
|
71
73
|
addUseEnvironmentOptions(yargs);
|
|
72
74
|
yargs.options({
|
|
73
75
|
project: {
|
|
@@ -78,8 +80,9 @@ exports.builder = yargs => {
|
|
|
78
80
|
describe: i18n(`${i18nKey}.options.dest.describe`),
|
|
79
81
|
type: 'string',
|
|
80
82
|
},
|
|
81
|
-
|
|
82
|
-
describe: i18n(`${i18nKey}.options.
|
|
83
|
+
build: {
|
|
84
|
+
describe: i18n(`${i18nKey}.options.build.describe`),
|
|
85
|
+
alias: ['build-id'],
|
|
83
86
|
type: 'number',
|
|
84
87
|
},
|
|
85
88
|
});
|
|
@@ -1,45 +1,49 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
|
-
const
|
|
5
|
-
const { addAccountOptions, addConfigOptions, getAccountId, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
4
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
6
5
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
7
6
|
const { i18n } = require('../../lib/lang');
|
|
8
7
|
const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
|
|
9
8
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
10
9
|
const { fetchProject, fetchProjectBuilds, } = require('@hubspot/local-dev-lib/api/projects');
|
|
11
10
|
const { getTableContents, getTableHeader } = require('../../lib/ui/table');
|
|
12
|
-
const { getCwd } = require('@hubspot/local-dev-lib/path');
|
|
13
11
|
const { uiBetaTag, uiLink } = require('../../lib/ui');
|
|
14
|
-
const {
|
|
15
|
-
const {
|
|
12
|
+
const { getProjectConfig, validateProjectConfig, } = require('../../lib/projects');
|
|
13
|
+
const { getProjectDetailUrl } = require('../../lib/projects/urls');
|
|
16
14
|
const moment = require('moment');
|
|
17
15
|
const { promptUser } = require('../../lib/prompts/promptUtils');
|
|
18
16
|
const { isHubSpotHttpError } = require('@hubspot/local-dev-lib/errors/index');
|
|
19
17
|
const i18nKey = 'commands.project.subcommands.listBuilds';
|
|
20
|
-
exports.command = 'list-builds
|
|
18
|
+
exports.command = 'list-builds';
|
|
21
19
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
22
20
|
exports.handler = async (options) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
const { project: projectFlagValue, limit, derivedAccountId } = options;
|
|
22
|
+
trackCommandUsage('project-list-builds', null, derivedAccountId);
|
|
23
|
+
let projectName = projectFlagValue;
|
|
24
|
+
if (!projectName) {
|
|
25
|
+
const { projectConfig, projectDir } = await getProjectConfig();
|
|
26
|
+
validateProjectConfig(projectConfig, projectDir);
|
|
27
|
+
projectName = projectConfig.name;
|
|
28
|
+
}
|
|
31
29
|
const fetchAndDisplayBuilds = async (project, options) => {
|
|
32
|
-
const { data: { results, paging }, } = await fetchProjectBuilds(
|
|
30
|
+
const { data: { results, paging }, } = await fetchProjectBuilds(derivedAccountId, project.name, options);
|
|
33
31
|
const currentDeploy = project.deployedBuildId;
|
|
34
32
|
if (options && options.after) {
|
|
35
|
-
logger.log(
|
|
33
|
+
logger.log(i18n(`${i18nKey}.logs.showingNextBuilds`, {
|
|
34
|
+
count: results.length,
|
|
35
|
+
projectName: project.name,
|
|
36
|
+
}));
|
|
36
37
|
}
|
|
37
38
|
else {
|
|
38
|
-
logger.log(
|
|
39
|
-
|
|
39
|
+
logger.log(i18n(`${i18nKey}.logs.showingRecentBuilds`, {
|
|
40
|
+
count: results.length,
|
|
41
|
+
projectName: project.name,
|
|
42
|
+
viewBuildsLink: uiLink(i18n(`${i18nKey}.logs.viewAllBuildsLink`), getProjectDetailUrl(project.name, derivedAccountId)),
|
|
43
|
+
}));
|
|
40
44
|
}
|
|
41
45
|
if (results.length === 0) {
|
|
42
|
-
logger.log(
|
|
46
|
+
logger.log(i18n(`${i18nKey}.errors.noBuilds`));
|
|
43
47
|
}
|
|
44
48
|
else {
|
|
45
49
|
const builds = results.map(build => {
|
|
@@ -75,40 +79,40 @@ exports.handler = async (options) => {
|
|
|
75
79
|
if (paging && paging.next) {
|
|
76
80
|
await promptUser({
|
|
77
81
|
name: 'more',
|
|
78
|
-
message:
|
|
82
|
+
message: i18n(`${i18nKey}.continueOrExitPrompt`),
|
|
79
83
|
});
|
|
80
84
|
await fetchAndDisplayBuilds(project, { limit, after: paging.next.after });
|
|
81
85
|
}
|
|
82
86
|
};
|
|
83
87
|
try {
|
|
84
|
-
const { data: project } = await fetchProject(
|
|
88
|
+
const { data: project } = await fetchProject(derivedAccountId, projectName);
|
|
85
89
|
await fetchAndDisplayBuilds(project, { limit });
|
|
86
90
|
}
|
|
87
91
|
catch (e) {
|
|
88
92
|
if (isHubSpotHttpError(e) && e.status === 404) {
|
|
89
|
-
logger.error(
|
|
93
|
+
logger.error(i18n(`${i18nKey}.errors.projectNotFound`, { projectName }));
|
|
90
94
|
}
|
|
91
95
|
else {
|
|
92
|
-
logError(e, new ApiErrorContext({
|
|
96
|
+
logError(e, new ApiErrorContext({
|
|
97
|
+
accountId: derivedAccountId,
|
|
98
|
+
projectName,
|
|
99
|
+
}));
|
|
93
100
|
}
|
|
94
101
|
}
|
|
95
102
|
};
|
|
96
103
|
exports.builder = yargs => {
|
|
97
|
-
yargs.positional('path', {
|
|
98
|
-
describe: 'Path to a project folder',
|
|
99
|
-
type: 'string',
|
|
100
|
-
});
|
|
101
104
|
yargs.options({
|
|
105
|
+
project: {
|
|
106
|
+
describe: i18n(`${i18nKey}.options.project.describe`),
|
|
107
|
+
type: 'string',
|
|
108
|
+
},
|
|
102
109
|
limit: {
|
|
103
|
-
describe:
|
|
110
|
+
describe: i18n(`${i18nKey}.options.limit.describe`),
|
|
104
111
|
type: 'string',
|
|
105
112
|
},
|
|
106
113
|
});
|
|
107
114
|
yargs.example([
|
|
108
|
-
[
|
|
109
|
-
'$0 project list-builds myProjectFolder',
|
|
110
|
-
'Fetch a list of builds for a project within the myProjectFolder folder',
|
|
111
|
-
],
|
|
115
|
+
['$0 project list-builds', i18n(`${i18nKey}.examples.default`)],
|
|
112
116
|
]);
|
|
113
117
|
addConfigOptions(yargs);
|
|
114
118
|
addAccountOptions(yargs);
|
package/commands/project/logs.js
CHANGED
|
@@ -4,17 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const { getEnv } = require('@hubspot/local-dev-lib/config');
|
|
5
5
|
const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls');
|
|
6
6
|
const { ENVIRONMENTS, } = require('@hubspot/local-dev-lib/constants/environments');
|
|
7
|
-
const {
|
|
7
|
+
const { addUseEnvironmentOptions } = require('../../lib/commonOpts');
|
|
8
8
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
9
9
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
10
10
|
const { getTableContents, getTableHeader } = require('../../lib/ui/table');
|
|
11
11
|
const { logError } = require('../../lib/errorHandlers/');
|
|
12
|
-
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
13
12
|
const { uiBetaTag, uiLine, uiLink } = require('../../lib/ui');
|
|
14
13
|
const { projectLogsPrompt } = require('../../lib/prompts/projectsLogsPrompt');
|
|
15
14
|
const { i18n } = require('../../lib/lang');
|
|
16
15
|
const { EXIT_CODES } = require('../../lib/enums/exitCodes');
|
|
17
|
-
const ProjectLogsManager = require('../../lib/ProjectLogsManager');
|
|
16
|
+
const { ProjectLogsManager } = require('../../lib/projects/ProjectLogsManager');
|
|
18
17
|
const i18nKey = 'commands.project.subcommands.logs';
|
|
19
18
|
const getPrivateAppsUrl = accountId => {
|
|
20
19
|
const baseUrl = getHubSpotWebsiteOrigin(getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD);
|
|
@@ -50,11 +49,10 @@ function logPreamble() {
|
|
|
50
49
|
exports.command = 'logs';
|
|
51
50
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
52
51
|
exports.handler = async (options) => {
|
|
53
|
-
const
|
|
54
|
-
trackCommandUsage('project-logs', null,
|
|
55
|
-
await loadAndValidateOptions(options);
|
|
52
|
+
const { derivedAccountId } = options;
|
|
53
|
+
trackCommandUsage('project-logs', null, derivedAccountId);
|
|
56
54
|
try {
|
|
57
|
-
await ProjectLogsManager.init(
|
|
55
|
+
await ProjectLogsManager.init(derivedAccountId);
|
|
58
56
|
const { functionName } = await projectLogsPrompt({
|
|
59
57
|
functionChoices: ProjectLogsManager.getFunctionNames(),
|
|
60
58
|
promptOptions: options,
|
|
@@ -65,7 +63,7 @@ exports.handler = async (options) => {
|
|
|
65
63
|
}
|
|
66
64
|
catch (e) {
|
|
67
65
|
logError(e, {
|
|
68
|
-
accountId,
|
|
66
|
+
accountId: derivedAccountId,
|
|
69
67
|
projectName: ProjectLogsManager.projectName,
|
|
70
68
|
});
|
|
71
69
|
return process.exit(EXIT_CODES.ERROR);
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const path = require('path');
|
|
5
|
-
const { addAccountOptions, addConfigOptions,
|
|
5
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
6
6
|
const { trackCommandUsage, trackCommandMetadataUsage, } = require('../../lib/usageTracking');
|
|
7
|
-
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
8
7
|
const { createProjectPrompt, } = require('../../lib/prompts/createProjectPrompt');
|
|
9
8
|
const { i18n } = require('../../lib/lang');
|
|
10
9
|
const { selectPublicAppPrompt, } = require('../../lib/prompts/selectPublicAppPrompt');
|
|
@@ -29,11 +28,10 @@ const i18nKey = 'commands.project.subcommands.migrateApp';
|
|
|
29
28
|
exports.command = 'migrate-app';
|
|
30
29
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
31
30
|
exports.handler = async (options) => {
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
trackCommandUsage('migrate-app', {}, accountId);
|
|
31
|
+
const { derivedAccountId } = options;
|
|
32
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
33
|
+
const accountName = uiAccountDescription(derivedAccountId);
|
|
34
|
+
trackCommandUsage('migrate-app', {}, derivedAccountId);
|
|
37
35
|
logger.log('');
|
|
38
36
|
logger.log(uiBetaTag(i18n(`${i18nKey}.header.text`), false));
|
|
39
37
|
logger.log(uiLink(i18n(`${i18nKey}.header.link`), 'https://developers.hubspot.com/docs/platform/migrate-a-public-app-to-projects'));
|
|
@@ -51,12 +49,12 @@ exports.handler = async (options) => {
|
|
|
51
49
|
const { appId } = 'appId' in options
|
|
52
50
|
? options
|
|
53
51
|
: await selectPublicAppPrompt({
|
|
54
|
-
accountId,
|
|
52
|
+
accountId: derivedAccountId,
|
|
55
53
|
accountName,
|
|
56
54
|
isMigratingApp: true,
|
|
57
55
|
});
|
|
58
56
|
try {
|
|
59
|
-
const { data: selectedApp } = await fetchPublicAppMetadata(appId,
|
|
57
|
+
const { data: selectedApp } = await fetchPublicAppMetadata(appId, derivedAccountId);
|
|
60
58
|
// preventProjectMigrations returns true if we have not added app to allowlist config.
|
|
61
59
|
// listingInfo will only exist for marketplace apps
|
|
62
60
|
const preventProjectMigrations = selectedApp.preventProjectMigrations;
|
|
@@ -67,16 +65,16 @@ exports.handler = async (options) => {
|
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
67
|
catch (error) {
|
|
70
|
-
logError(error, new ApiErrorContext({ accountId }));
|
|
68
|
+
logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
|
|
71
69
|
process.exit(EXIT_CODES.ERROR);
|
|
72
70
|
}
|
|
73
71
|
let projectName;
|
|
74
|
-
let
|
|
72
|
+
let projectDest;
|
|
75
73
|
try {
|
|
76
|
-
const { name,
|
|
74
|
+
const { name, dest } = await createProjectPrompt('', options, true);
|
|
77
75
|
projectName = options.name || name;
|
|
78
|
-
|
|
79
|
-
const { projectExists } = await ensureProjectExists(
|
|
76
|
+
projectDest = options.dest || dest;
|
|
77
|
+
const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
|
|
80
78
|
allowCreate: false,
|
|
81
79
|
noLogs: true,
|
|
82
80
|
});
|
|
@@ -88,9 +86,10 @@ exports.handler = async (options) => {
|
|
|
88
86
|
}
|
|
89
87
|
}
|
|
90
88
|
catch (error) {
|
|
91
|
-
logError(error, new ApiErrorContext({ accountId }));
|
|
89
|
+
logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
|
|
92
90
|
process.exit(EXIT_CODES.ERROR);
|
|
93
91
|
}
|
|
92
|
+
await trackCommandMetadataUsage('migrate-app', { status: 'STARTED' }, derivedAccountId);
|
|
94
93
|
logger.log('');
|
|
95
94
|
uiLine();
|
|
96
95
|
logger.warn(i18n(`${i18nKey}.warning.title`));
|
|
@@ -125,17 +124,16 @@ exports.handler = async (options) => {
|
|
|
125
124
|
process.exit(EXIT_CODES.SUCCESS);
|
|
126
125
|
}
|
|
127
126
|
});
|
|
128
|
-
const { data: migrateResponse } = await migrateApp(
|
|
127
|
+
const { data: migrateResponse } = await migrateApp(derivedAccountId, appId, projectName);
|
|
129
128
|
const { id } = migrateResponse;
|
|
130
|
-
const pollResponse = await poll(checkMigrationStatus,
|
|
129
|
+
const pollResponse = await poll(checkMigrationStatus, derivedAccountId, id);
|
|
131
130
|
const { status, project } = pollResponse;
|
|
132
131
|
if (status === 'SUCCESS') {
|
|
133
|
-
const absoluteDestPath = path.resolve(getCwd(),
|
|
134
|
-
const { env } =
|
|
132
|
+
const absoluteDestPath = path.resolve(getCwd(), projectDest);
|
|
133
|
+
const { env } = accountConfig;
|
|
135
134
|
const baseUrl = getHubSpotWebsiteOrigin(env);
|
|
136
|
-
const { data: zippedProject } = await downloadProject(
|
|
135
|
+
const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, 1);
|
|
137
136
|
await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: true, hideLogs: true });
|
|
138
|
-
trackCommandMetadataUsage('migrate-app', { type: projectName, assetType: appId, successful: status }, accountId);
|
|
139
137
|
SpinniesManager.succeed('migrateApp', {
|
|
140
138
|
text: i18n(`${i18nKey}.migrationStatus.done`),
|
|
141
139
|
succeedColor: 'white',
|
|
@@ -144,12 +142,12 @@ exports.handler = async (options) => {
|
|
|
144
142
|
uiLine();
|
|
145
143
|
logger.success(i18n(`${i18nKey}.migrationStatus.success`));
|
|
146
144
|
logger.log('');
|
|
147
|
-
logger.log(uiLink(i18n(`${i18nKey}.projectDetailsLink`), `${baseUrl}/developer-projects/${
|
|
145
|
+
logger.log(uiLink(i18n(`${i18nKey}.projectDetailsLink`), `${baseUrl}/developer-projects/${derivedAccountId}/project/${encodeURIComponent(project.name)}`));
|
|
148
146
|
process.exit(EXIT_CODES.SUCCESS);
|
|
149
147
|
}
|
|
150
148
|
}
|
|
151
149
|
catch (error) {
|
|
152
|
-
trackCommandMetadataUsage('migrate-app', {
|
|
150
|
+
await trackCommandMetadataUsage('migrate-app', { status: 'FAILURE' }, derivedAccountId);
|
|
153
151
|
SpinniesManager.fail('migrateApp', {
|
|
154
152
|
text: i18n(`${i18nKey}.migrationStatus.failure`),
|
|
155
153
|
failColor: 'white',
|
|
@@ -158,10 +156,12 @@ exports.handler = async (options) => {
|
|
|
158
156
|
error.errors.forEach(logError);
|
|
159
157
|
}
|
|
160
158
|
else {
|
|
161
|
-
logError(error, new ApiErrorContext({ accountId }));
|
|
159
|
+
logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
|
|
162
160
|
}
|
|
163
161
|
process.exit(EXIT_CODES.ERROR);
|
|
164
162
|
}
|
|
163
|
+
await trackCommandMetadataUsage('migrate-app', { status: 'SUCCESS' }, derivedAccountId);
|
|
164
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
165
165
|
};
|
|
166
166
|
exports.builder = yargs => {
|
|
167
167
|
yargs.options({
|
|
@@ -169,11 +169,11 @@ exports.builder = yargs => {
|
|
|
169
169
|
describe: i18n(`${i18nKey}.options.name.describe`),
|
|
170
170
|
type: 'string',
|
|
171
171
|
},
|
|
172
|
-
|
|
173
|
-
describe: i18n(`${i18nKey}.options.
|
|
172
|
+
dest: {
|
|
173
|
+
describe: i18n(`${i18nKey}.options.dest.describe`),
|
|
174
174
|
type: 'string',
|
|
175
175
|
},
|
|
176
|
-
|
|
176
|
+
'app-id': {
|
|
177
177
|
describe: i18n(`${i18nKey}.options.appId.describe`),
|
|
178
178
|
type: 'number',
|
|
179
179
|
},
|
package/commands/project/open.js
CHANGED
|
@@ -2,27 +2,25 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const open = require('open');
|
|
5
|
-
const { addAccountOptions, addConfigOptions,
|
|
5
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
|
|
6
6
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
7
|
-
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
8
7
|
const { i18n } = require('../../lib/lang');
|
|
9
8
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
10
|
-
const { getProjectConfig,
|
|
9
|
+
const { getProjectConfig, ensureProjectExists } = require('../../lib/projects');
|
|
10
|
+
const { getProjectDetailUrl } = require('../../lib/projects/urls');
|
|
11
11
|
const { projectNamePrompt } = require('../../lib/prompts/projectNamePrompt');
|
|
12
12
|
const { uiBetaTag } = require('../../lib/ui');
|
|
13
13
|
const { EXIT_CODES } = require('../../lib/enums/exitCodes');
|
|
14
14
|
const i18nKey = 'commands.project.subcommands.open';
|
|
15
|
-
exports.command = 'open
|
|
15
|
+
exports.command = 'open';
|
|
16
16
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
17
17
|
exports.handler = async (options) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const { project } = options;
|
|
21
|
-
trackCommandUsage('project-open', null, accountId);
|
|
18
|
+
const { project, derivedAccountId } = options;
|
|
19
|
+
trackCommandUsage('project-open', null, derivedAccountId);
|
|
22
20
|
const { projectConfig } = await getProjectConfig();
|
|
23
21
|
let projectName = project;
|
|
24
22
|
if (projectName) {
|
|
25
|
-
const { projectExists } = await ensureProjectExists(
|
|
23
|
+
const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
|
|
26
24
|
allowCreate: false,
|
|
27
25
|
});
|
|
28
26
|
if (!projectExists) {
|
|
@@ -33,13 +31,13 @@ exports.handler = async (options) => {
|
|
|
33
31
|
projectName = projectConfig.name;
|
|
34
32
|
}
|
|
35
33
|
else if (!projectName && !projectConfig) {
|
|
36
|
-
const namePrompt = await projectNamePrompt(
|
|
34
|
+
const namePrompt = await projectNamePrompt(derivedAccountId);
|
|
37
35
|
if (!namePrompt.projectName) {
|
|
38
36
|
process.exit(EXIT_CODES.ERROR);
|
|
39
37
|
}
|
|
40
38
|
projectName = namePrompt.projectName;
|
|
41
39
|
}
|
|
42
|
-
const url = getProjectDetailUrl(projectName,
|
|
40
|
+
const url = getProjectDetailUrl(projectName, derivedAccountId);
|
|
43
41
|
open(url, { url: true });
|
|
44
42
|
logger.success(i18n(`${i18nKey}.success`, { projectName }));
|
|
45
43
|
process.exit(EXIT_CODES.SUCCESS);
|