@hubspot/cli 6.4.0-beta.1 → 7.0.0-experimental.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.js +36 -15
- package/commands/{accounts → account}/clean.js +10 -9
- package/commands/{accounts → account}/info.js +10 -14
- package/commands/{accounts → account}/list.js +16 -13
- package/commands/{accounts → account}/remove.js +8 -8
- package/commands/{accounts → account}/rename.js +4 -5
- package/commands/{accounts → account}/use.js +5 -8
- package/commands/account.js +26 -0
- package/commands/auth.js +30 -23
- package/commands/cms/getReactModule.js +70 -0
- package/commands/cms/lighthouseScore.js +19 -19
- package/commands/cms.js +4 -3
- package/commands/completion.js +22 -0
- package/commands/config/set.js +22 -22
- package/commands/config.js +2 -2
- package/commands/create.js +5 -3
- package/commands/customObject/create.js +18 -13
- package/commands/customObject/schema/create.js +14 -14
- package/commands/customObject/schema/delete.js +29 -9
- package/commands/customObject/schema/fetch-all.js +14 -9
- package/commands/customObject/schema/fetch.js +22 -12
- package/commands/customObject/schema/list.js +3 -4
- package/commands/customObject/schema/update.js +27 -16
- package/commands/customObject/schema.js +1 -1
- package/commands/customObject.js +3 -4
- package/commands/doctor.js +2 -0
- package/commands/feedback.js +2 -0
- package/commands/fetch.js +13 -12
- package/commands/filemanager/fetch.js +6 -5
- package/commands/filemanager/upload.js +10 -10
- package/commands/filemanager.js +0 -4
- package/commands/{functions → function}/deploy.js +13 -11
- package/commands/{functions → function}/list.js +7 -7
- package/commands/{functions → function}/server.js +5 -6
- package/commands/function.js +20 -0
- package/commands/hubdb/clear.js +14 -8
- package/commands/hubdb/create.js +36 -11
- package/commands/hubdb/delete.js +31 -8
- package/commands/hubdb/fetch.js +14 -7
- package/commands/hubdb.js +2 -3
- package/commands/init.js +37 -14
- package/commands/lint.js +6 -5
- package/commands/list.js +5 -5
- package/commands/logs.js +24 -13
- package/commands/module/marketplace-validate.js +6 -7
- package/commands/module.js +2 -1
- package/commands/mv.js +11 -11
- package/commands/open.js +11 -10
- package/commands/project/add.js +2 -3
- package/commands/project/cloneApp.js +28 -30
- package/commands/project/create.js +8 -8
- package/commands/project/deploy.js +16 -13
- package/commands/project/dev.js +14 -14
- package/commands/project/download.js +18 -13
- package/commands/project/listBuilds.js +34 -29
- package/commands/project/logs.js +5 -5
- package/commands/project/migrateApp.js +27 -25
- package/commands/project/open.js +7 -8
- package/commands/project/upload.js +27 -29
- package/commands/project/watch.js +12 -19
- package/commands/project.js +3 -4
- package/commands/remove.js +14 -11
- package/commands/sandbox/create.js +12 -13
- package/commands/sandbox/delete.js +15 -13
- package/commands/sandbox.js +3 -4
- package/commands/{secrets → secret}/addSecret.js +24 -9
- package/commands/secret/deleteSecret.js +71 -0
- package/commands/{secrets → secret}/listSecrets.js +6 -6
- package/commands/secret/updateSecret.d.ts +1 -0
- package/commands/{secrets → secret}/updateSecret.js +20 -10
- package/commands/secret.js +22 -0
- package/commands/theme/generate-selectors.js +8 -8
- package/commands/theme/marketplace-validate.js +10 -11
- package/commands/theme/preview.js +6 -7
- package/commands/theme.js +3 -1
- package/commands/upload.js +28 -24
- package/commands/watch.js +19 -19
- package/lang/en.lyaml +177 -111
- package/lib/buildAccount.js +3 -1
- package/lib/commonOpts.d.ts +15 -6
- package/lib/commonOpts.js +53 -38
- package/lib/configOptions.js +19 -18
- package/lib/developerTestAccounts.js +8 -5
- package/lib/oauth.js +3 -1
- package/lib/projects.js +10 -5
- package/lib/prompts/accountsPrompt.js +9 -5
- package/lib/prompts/createModulePrompt.js +17 -2
- package/lib/prompts/createProjectPrompt.js +5 -5
- package/lib/prompts/projectDevTargetAccountPrompt.js +3 -2
- package/lib/prompts/promptUtils.d.ts +3 -0
- package/lib/prompts/promptUtils.js +14 -2
- package/lib/prompts/sandboxesPrompt.js +10 -7
- package/lib/prompts/secretPrompt.d.ts +3 -1
- package/lib/prompts/secretPrompt.js +32 -19
- package/lib/prompts/selectHubDBTablePrompt.d.ts +8 -0
- package/lib/prompts/selectHubDBTablePrompt.js +69 -0
- package/lib/prompts/setAsDefaultAccountPrompt.js +4 -2
- package/lib/sandboxSync.js +5 -2
- package/lib/sandboxes.js +12 -7
- package/lib/validation.js +14 -13
- package/package.json +5 -4
- 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/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/commands/{secrets/addSecret.d.ts → secret.d.ts} +0 -0
package/commands/project/add.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
5
|
-
const { getAccountId } = require('@hubspot/local-dev-lib/config');
|
|
6
5
|
const { logError } = require('../../lib/errorHandlers/index');
|
|
7
6
|
const { fetchReleaseData } = require('@hubspot/local-dev-lib/github');
|
|
8
7
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
@@ -17,10 +16,10 @@ exports.command = 'add';
|
|
|
17
16
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
18
17
|
exports.handler = async (options) => {
|
|
19
18
|
await loadAndValidateOptions(options);
|
|
19
|
+
const { derivedAccountId } = options;
|
|
20
20
|
logger.log('');
|
|
21
21
|
logger.log(i18n(`${i18nKey}.creatingComponent.message`));
|
|
22
22
|
logger.log('');
|
|
23
|
-
const accountId = getAccountId(options);
|
|
24
23
|
const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
|
|
25
24
|
const projectComponentsVersion = releaseData.tag_name;
|
|
26
25
|
const components = await getProjectComponentsByVersion(projectComponentsVersion);
|
|
@@ -29,7 +28,7 @@ exports.handler = async (options) => {
|
|
|
29
28
|
if (!component) {
|
|
30
29
|
component = components.find(t => t.path === options.type);
|
|
31
30
|
}
|
|
32
|
-
trackCommandUsage('project-add', null,
|
|
31
|
+
trackCommandUsage('project-add', null, derivedAccountId);
|
|
33
32
|
try {
|
|
34
33
|
await createProjectComponent(component, name, projectComponentsVersion);
|
|
35
34
|
logger.log('');
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const path = require('path');
|
|
5
5
|
const fs = require('fs');
|
|
6
|
-
const { addAccountOptions, addConfigOptions,
|
|
6
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
7
7
|
const { trackCommandUsage, trackCommandMetadataUsage, } = require('../../lib/usageTracking');
|
|
8
8
|
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
9
9
|
const { i18n } = require('../../lib/lang');
|
|
@@ -27,10 +27,10 @@ exports.command = 'clone-app';
|
|
|
27
27
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
28
28
|
exports.handler = async (options) => {
|
|
29
29
|
await loadAndValidateOptions(options);
|
|
30
|
-
const
|
|
31
|
-
const accountConfig = getAccountConfig(
|
|
32
|
-
const accountName = uiAccountDescription(
|
|
33
|
-
trackCommandUsage('clone-app', {},
|
|
30
|
+
const { derivedAccountId } = options;
|
|
31
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
32
|
+
const accountName = uiAccountDescription(derivedAccountId);
|
|
33
|
+
trackCommandUsage('clone-app', {}, derivedAccountId);
|
|
34
34
|
if (!isAppDeveloperAccount(accountConfig)) {
|
|
35
35
|
uiLine();
|
|
36
36
|
logger.error(i18n(`${i18nKey}.errors.invalidAccountTypeTitle`));
|
|
@@ -42,58 +42,54 @@ exports.handler = async (options) => {
|
|
|
42
42
|
process.exit(EXIT_CODES.SUCCESS);
|
|
43
43
|
}
|
|
44
44
|
let appId;
|
|
45
|
-
let
|
|
46
|
-
let
|
|
45
|
+
let projectName;
|
|
46
|
+
let projectDest;
|
|
47
47
|
try {
|
|
48
48
|
appId = options.appId;
|
|
49
49
|
if (!appId) {
|
|
50
50
|
const appIdResponse = await selectPublicAppPrompt({
|
|
51
|
-
accountId,
|
|
51
|
+
accountId: derivedAccountId,
|
|
52
52
|
accountName,
|
|
53
53
|
options,
|
|
54
54
|
isMigratingApp: false,
|
|
55
55
|
});
|
|
56
56
|
appId = appIdResponse.appId;
|
|
57
57
|
}
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
const { name, dest } = await createProjectPrompt('', options, true);
|
|
59
|
+
projectName = name;
|
|
60
|
+
projectDest = options.dest || dest;
|
|
61
61
|
}
|
|
62
62
|
catch (error) {
|
|
63
|
-
logError(error, new ApiErrorContext({ accountId }));
|
|
63
|
+
logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
|
|
64
64
|
process.exit(EXIT_CODES.ERROR);
|
|
65
65
|
}
|
|
66
|
+
await trackCommandMetadataUsage('clone-app', { status: 'STARTED' }, derivedAccountId);
|
|
66
67
|
try {
|
|
67
68
|
SpinniesManager.init();
|
|
68
69
|
SpinniesManager.add('cloneApp', {
|
|
69
70
|
text: i18n(`${i18nKey}.cloneStatus.inProgress`),
|
|
70
71
|
});
|
|
71
|
-
const { data: { exportId }, } = await cloneApp(
|
|
72
|
-
const { status } = await poll(checkCloneStatus,
|
|
72
|
+
const { data: { exportId }, } = await cloneApp(derivedAccountId, appId);
|
|
73
|
+
const { status } = await poll(checkCloneStatus, derivedAccountId, exportId);
|
|
73
74
|
if (status === 'SUCCESS') {
|
|
74
75
|
// Ensure correct project folder structure exists
|
|
75
|
-
const baseDestPath = path.resolve(getCwd(),
|
|
76
|
+
const baseDestPath = path.resolve(getCwd(), projectDest);
|
|
76
77
|
const absoluteDestPath = path.resolve(baseDestPath, 'src', 'app');
|
|
77
78
|
fs.mkdirSync(absoluteDestPath, { recursive: true });
|
|
78
79
|
// Extract zipped app files and place them in correct directory
|
|
79
|
-
const { data: zippedApp } = await downloadClonedProject(
|
|
80
|
-
await extractZipArchive(zippedApp, sanitizeFileName(
|
|
80
|
+
const { data: zippedApp } = await downloadClonedProject(derivedAccountId, exportId);
|
|
81
|
+
await extractZipArchive(zippedApp, sanitizeFileName(projectName), absoluteDestPath, {
|
|
81
82
|
includesRootDir: true,
|
|
82
83
|
hideLogs: true,
|
|
83
84
|
});
|
|
84
85
|
// Create hsproject.json file
|
|
85
86
|
const configPath = path.join(baseDestPath, PROJECT_CONFIG_FILE);
|
|
86
87
|
const configContent = {
|
|
87
|
-
name,
|
|
88
|
+
name: projectName,
|
|
88
89
|
srcDir: 'src',
|
|
89
90
|
platformVersion: '2023.2',
|
|
90
91
|
};
|
|
91
92
|
const success = writeProjectConfig(configPath, configContent);
|
|
92
|
-
trackCommandMetadataUsage('clone-app', {
|
|
93
|
-
type: name,
|
|
94
|
-
assetType: appId,
|
|
95
|
-
successful: success,
|
|
96
|
-
}, accountId);
|
|
97
93
|
SpinniesManager.succeed('cloneApp', {
|
|
98
94
|
text: i18n(`${i18nKey}.cloneStatus.done`),
|
|
99
95
|
succeedColor: 'white',
|
|
@@ -103,33 +99,35 @@ exports.handler = async (options) => {
|
|
|
103
99
|
}
|
|
104
100
|
logger.log('');
|
|
105
101
|
uiLine();
|
|
106
|
-
logger.success(i18n(`${i18nKey}.cloneStatus.success`, {
|
|
102
|
+
logger.success(i18n(`${i18nKey}.cloneStatus.success`, { dest }));
|
|
107
103
|
logger.log('');
|
|
108
104
|
process.exit(EXIT_CODES.SUCCESS);
|
|
109
105
|
}
|
|
110
106
|
}
|
|
111
107
|
catch (error) {
|
|
112
|
-
trackCommandMetadataUsage('clone-app', {
|
|
108
|
+
await trackCommandMetadataUsage('clone-app', { status: 'FAILURE' }, derivedAccountId);
|
|
113
109
|
SpinniesManager.fail('cloneApp', {
|
|
114
110
|
text: i18n(`${i18nKey}.cloneStatus.failure`),
|
|
115
111
|
failColor: 'white',
|
|
116
112
|
});
|
|
117
113
|
// Migrations endpoints return a response object with an errors property. The errors property contains an array of errors.
|
|
118
114
|
if (error.errors && Array.isArray(error.errors)) {
|
|
119
|
-
error.errors.forEach(e => logError(e, new ApiErrorContext({ accountId })));
|
|
115
|
+
error.errors.forEach(e => logError(e, new ApiErrorContext({ accountId: derivedAccountId })));
|
|
120
116
|
}
|
|
121
117
|
else {
|
|
122
|
-
logError(error, new ApiErrorContext({ accountId }));
|
|
118
|
+
logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
|
|
123
119
|
}
|
|
124
120
|
}
|
|
121
|
+
await trackCommandMetadataUsage('clone-app', { status: 'SUCCESS' }, derivedAccountId);
|
|
122
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
125
123
|
};
|
|
126
124
|
exports.builder = yargs => {
|
|
127
125
|
yargs.options({
|
|
128
|
-
|
|
129
|
-
describe: i18n(`${i18nKey}.options.
|
|
126
|
+
dest: {
|
|
127
|
+
describe: i18n(`${i18nKey}.options.dest.describe`),
|
|
130
128
|
type: 'string',
|
|
131
129
|
},
|
|
132
|
-
|
|
130
|
+
'app-id': {
|
|
133
131
|
describe: i18n(`${i18nKey}.options.appId.describe`),
|
|
134
132
|
type: 'number',
|
|
135
133
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
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, } = require('../../lib/commonOpts');
|
|
5
5
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
6
6
|
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
7
7
|
const { getCwd } = require('@hubspot/local-dev-lib/path');
|
|
@@ -19,16 +19,16 @@ exports.command = 'create';
|
|
|
19
19
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
20
20
|
exports.handler = async (options) => {
|
|
21
21
|
await loadAndValidateOptions(options);
|
|
22
|
-
const
|
|
22
|
+
const { derivedAccountId } = options;
|
|
23
23
|
const hasCustomTemplateSource = Boolean(options.templateSource);
|
|
24
24
|
let githubRef = '';
|
|
25
25
|
if (!hasCustomTemplateSource) {
|
|
26
26
|
const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
|
|
27
27
|
githubRef = releaseData.tag_name;
|
|
28
28
|
}
|
|
29
|
-
const { name, template,
|
|
30
|
-
trackCommandUsage('project-create', { type: template.name },
|
|
31
|
-
await createProjectConfig(path.resolve(getCwd(), options.
|
|
29
|
+
const { name, template, dest } = await createProjectPrompt(githubRef, options);
|
|
30
|
+
trackCommandUsage('project-create', { type: template.name }, derivedAccountId);
|
|
31
|
+
await createProjectConfig(path.resolve(getCwd(), options.dest || dest), options.name || name, template, options.templateSource, githubRef);
|
|
32
32
|
logger.log('');
|
|
33
33
|
logger.log(chalk.bold(i18n(`${i18nKey}.logs.welcomeMessage`)));
|
|
34
34
|
uiFeatureHighlight([
|
|
@@ -44,15 +44,15 @@ exports.builder = yargs => {
|
|
|
44
44
|
describe: i18n(`${i18nKey}.options.name.describe`),
|
|
45
45
|
type: 'string',
|
|
46
46
|
},
|
|
47
|
-
|
|
48
|
-
describe: i18n(`${i18nKey}.options.
|
|
47
|
+
dest: {
|
|
48
|
+
describe: i18n(`${i18nKey}.options.dest.describe`),
|
|
49
49
|
type: 'string',
|
|
50
50
|
},
|
|
51
51
|
template: {
|
|
52
52
|
describe: i18n(`${i18nKey}.options.template.describe`),
|
|
53
53
|
type: 'string',
|
|
54
54
|
},
|
|
55
|
-
|
|
55
|
+
'template-source': {
|
|
56
56
|
describe: i18n(`${i18nKey}.options.templateSource.describe`),
|
|
57
57
|
type: 'string',
|
|
58
58
|
},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const chalk = require('chalk');
|
|
5
|
-
const { addAccountOptions, addConfigOptions,
|
|
5
|
+
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
6
6
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
7
7
|
const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index');
|
|
8
8
|
const { logger } = require('@hubspot/local-dev-lib/logger');
|
|
@@ -38,17 +38,17 @@ const validateBuildId = (buildId, deployedBuildId, latestBuildId, projectName, a
|
|
|
38
38
|
};
|
|
39
39
|
exports.handler = async (options) => {
|
|
40
40
|
await loadAndValidateOptions(options);
|
|
41
|
-
const
|
|
42
|
-
const accountConfig = getAccountConfig(
|
|
41
|
+
const { derivedAccountId } = options;
|
|
42
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
43
43
|
const { project: projectOption, buildId: buildIdOption } = options;
|
|
44
44
|
const accountType = accountConfig && accountConfig.accountType;
|
|
45
|
-
trackCommandUsage('project-deploy', { type: accountType },
|
|
45
|
+
trackCommandUsage('project-deploy', { type: accountType }, derivedAccountId);
|
|
46
46
|
const { projectConfig } = await getProjectConfig();
|
|
47
47
|
let projectName = projectOption;
|
|
48
48
|
if (!projectOption && projectConfig) {
|
|
49
49
|
projectName = projectConfig.name;
|
|
50
50
|
}
|
|
51
|
-
const namePromptResponse = await projectNamePrompt(
|
|
51
|
+
const namePromptResponse = await projectNamePrompt(derivedAccountId, {
|
|
52
52
|
project: projectName,
|
|
53
53
|
});
|
|
54
54
|
if (!projectName && namePromptResponse.projectName) {
|
|
@@ -56,13 +56,13 @@ exports.handler = async (options) => {
|
|
|
56
56
|
}
|
|
57
57
|
let buildIdToDeploy = buildIdOption;
|
|
58
58
|
try {
|
|
59
|
-
const { data: { latestBuild, deployedBuildId }, } = await fetchProject(
|
|
59
|
+
const { data: { latestBuild, deployedBuildId }, } = await fetchProject(derivedAccountId, projectName);
|
|
60
60
|
if (!latestBuild || !latestBuild.buildId) {
|
|
61
61
|
logger.error(i18n(`${i18nKey}.errors.noBuilds`));
|
|
62
62
|
return process.exit(EXIT_CODES.ERROR);
|
|
63
63
|
}
|
|
64
64
|
if (buildIdToDeploy) {
|
|
65
|
-
const validationResult = validateBuildId(buildIdToDeploy, deployedBuildId, latestBuild.buildId, projectName,
|
|
65
|
+
const validationResult = validateBuildId(buildIdToDeploy, deployedBuildId, latestBuild.buildId, projectName, derivedAccountId);
|
|
66
66
|
if (validationResult !== true) {
|
|
67
67
|
logger.error(validationResult);
|
|
68
68
|
return process.exit(EXIT_CODES.ERROR);
|
|
@@ -75,7 +75,7 @@ exports.handler = async (options) => {
|
|
|
75
75
|
default: latestBuild.buildId === deployedBuildId
|
|
76
76
|
? undefined
|
|
77
77
|
: latestBuild.buildId,
|
|
78
|
-
validate: () => validateBuildId(buildId, deployedBuildId, latestBuild.buildId, projectName,
|
|
78
|
+
validate: () => validateBuildId(buildId, deployedBuildId, latestBuild.buildId, projectName, derivedAccountId),
|
|
79
79
|
});
|
|
80
80
|
buildIdToDeploy = deployBuildIdPromptResponse.buildId;
|
|
81
81
|
}
|
|
@@ -83,20 +83,20 @@ exports.handler = async (options) => {
|
|
|
83
83
|
logger.error(i18n(`${i18nKey}.errors.noBuildId`));
|
|
84
84
|
return process.exit(EXIT_CODES.ERROR);
|
|
85
85
|
}
|
|
86
|
-
const { data: deployResp } = await deployProject(
|
|
86
|
+
const { data: deployResp } = await deployProject(derivedAccountId, projectName, buildIdToDeploy);
|
|
87
87
|
if (!deployResp || deployResp.error) {
|
|
88
88
|
logger.error(i18n(`${i18nKey}.errors.deploy`, {
|
|
89
89
|
details: deployResp.error.message,
|
|
90
90
|
}));
|
|
91
91
|
return process.exit(EXIT_CODES.ERROR);
|
|
92
92
|
}
|
|
93
|
-
await pollDeployStatus(
|
|
93
|
+
await pollDeployStatus(derivedAccountId, projectName, deployResp.id, buildIdToDeploy);
|
|
94
94
|
}
|
|
95
95
|
catch (e) {
|
|
96
96
|
if (isHubSpotHttpError(e) && e.status === 404) {
|
|
97
97
|
logger.error(i18n(`${i18nKey}.errors.projectNotFound`, {
|
|
98
98
|
projectName: chalk.bold(projectName),
|
|
99
|
-
accountIdentifier: uiAccountDescription(
|
|
99
|
+
accountIdentifier: uiAccountDescription(derivedAccountId),
|
|
100
100
|
command: uiCommandReference('hs project upload'),
|
|
101
101
|
}));
|
|
102
102
|
}
|
|
@@ -104,7 +104,10 @@ exports.handler = async (options) => {
|
|
|
104
104
|
logger.error(e.message);
|
|
105
105
|
}
|
|
106
106
|
else {
|
|
107
|
-
logError(e, new ApiErrorContext({
|
|
107
|
+
logError(e, new ApiErrorContext({
|
|
108
|
+
accountId: derivedAccountId,
|
|
109
|
+
request: 'project deploy',
|
|
110
|
+
}));
|
|
108
111
|
}
|
|
109
112
|
return process.exit(EXIT_CODES.ERROR);
|
|
110
113
|
}
|
|
@@ -116,7 +119,7 @@ exports.builder = yargs => {
|
|
|
116
119
|
type: 'string',
|
|
117
120
|
},
|
|
118
121
|
build: {
|
|
119
|
-
alias: ['
|
|
122
|
+
alias: ['build-id'],
|
|
120
123
|
describe: i18n(`${i18nKey}.options.build.describe`),
|
|
121
124
|
type: 'number',
|
|
122
125
|
},
|
package/commands/project/dev.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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
6
|
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
7
7
|
const { handleExit } = require('../../lib/process');
|
|
@@ -18,14 +18,14 @@ const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
|
|
|
18
18
|
const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, } = require('../../lib/projectStructure');
|
|
19
19
|
const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, createNewProjectForLocalDev, createInitialBuildForNewProject, useExistingDevTestAccount, checkIfAccountFlagIsSupported, checkIfParentAccountIsAuthed, } = require('../../lib/localDev');
|
|
20
20
|
const i18nKey = 'commands.project.subcommands.dev';
|
|
21
|
-
exports.command = 'dev
|
|
21
|
+
exports.command = 'dev';
|
|
22
22
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
23
23
|
exports.handler = async (options) => {
|
|
24
24
|
await loadAndValidateOptions(options);
|
|
25
|
-
const
|
|
26
|
-
const accountConfig = getAccountConfig(
|
|
27
|
-
const env = getValidEnv(getEnv(
|
|
28
|
-
trackCommandUsage('project-dev', null,
|
|
25
|
+
const { derivedAccountId } = options;
|
|
26
|
+
const accountConfig = getAccountConfig(derivedAccountId);
|
|
27
|
+
const env = getValidEnv(getEnv(derivedAccountId));
|
|
28
|
+
trackCommandUsage('project-dev', null, derivedAccountId);
|
|
29
29
|
const { projectConfig, projectDir } = await getProjectConfig();
|
|
30
30
|
uiBetaTag(i18n(`${i18nKey}.logs.betaMessage`));
|
|
31
31
|
logger.log(uiLink(i18n(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
|
|
@@ -54,11 +54,11 @@ exports.handler = async (options) => {
|
|
|
54
54
|
const defaultAccountIsRecommendedType = isDeveloperTestAccount(accountConfig) ||
|
|
55
55
|
(!hasPublicApps && isSandbox(accountConfig));
|
|
56
56
|
// The account that the project must exist in
|
|
57
|
-
let targetProjectAccountId =
|
|
57
|
+
let targetProjectAccountId = derivedAccountId;
|
|
58
58
|
// The account that we are locally testing against
|
|
59
|
-
let targetTestingAccountId =
|
|
59
|
+
let targetTestingAccountId = derivedAccountId;
|
|
60
60
|
// Check that the default account or flag option is valid for the type of app in this project
|
|
61
|
-
if (
|
|
61
|
+
if (derivedAccountId) {
|
|
62
62
|
checkIfAccountFlagIsSupported(accountConfig, hasPublicApps);
|
|
63
63
|
if (hasPublicApps) {
|
|
64
64
|
targetProjectAccountId = accountConfig.parentAccountId;
|
|
@@ -69,14 +69,14 @@ exports.handler = async (options) => {
|
|
|
69
69
|
}
|
|
70
70
|
// The user is targeting an account type that we recommend developing on
|
|
71
71
|
if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
|
|
72
|
-
targetTestingAccountId =
|
|
72
|
+
targetTestingAccountId = derivedAccountId;
|
|
73
73
|
await confirmDefaultAccountIsTarget(accountConfig, hasPublicApps);
|
|
74
74
|
if (hasPublicApps) {
|
|
75
75
|
checkIfParentAccountIsAuthed(accountConfig);
|
|
76
76
|
targetProjectAccountId = accountConfig.parentAccountId;
|
|
77
77
|
}
|
|
78
78
|
else {
|
|
79
|
-
targetProjectAccountId =
|
|
79
|
+
targetProjectAccountId = derivedAccountId;
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
let createNewSandbox = false;
|
|
@@ -94,13 +94,13 @@ exports.handler = async (options) => {
|
|
|
94
94
|
isAppDeveloperAccount(accountConfig) && createNestedAccount;
|
|
95
95
|
}
|
|
96
96
|
if (createNewSandbox) {
|
|
97
|
-
targetProjectAccountId = await createSandboxForLocalDev(
|
|
97
|
+
targetProjectAccountId = await createSandboxForLocalDev(derivedAccountId, accountConfig, env);
|
|
98
98
|
// We will be running our tests against this new sandbox account
|
|
99
99
|
targetTestingAccountId = targetProjectAccountId;
|
|
100
100
|
}
|
|
101
101
|
if (createNewDeveloperTestAccount) {
|
|
102
|
-
targetTestingAccountId = await createDeveloperTestAccountForLocalDev(
|
|
103
|
-
targetProjectAccountId =
|
|
102
|
+
targetTestingAccountId = await createDeveloperTestAccountForLocalDev(derivedAccountId, accountConfig, env);
|
|
103
|
+
targetProjectAccountId = derivedAccountId;
|
|
104
104
|
}
|
|
105
105
|
// eslint-disable-next-line prefer-const
|
|
106
106
|
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');
|
|
@@ -17,7 +17,7 @@ const { i18n } = require('../../lib/lang');
|
|
|
17
17
|
const { uiBetaTag } = require('../../lib/ui');
|
|
18
18
|
const i18nKey = 'commands.project.subcommands.download';
|
|
19
19
|
const { EXIT_CODES } = require('../../lib/enums/exitCodes');
|
|
20
|
-
exports.command = 'download
|
|
20
|
+
exports.command = 'download';
|
|
21
21
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
22
22
|
exports.handler = async (options) => {
|
|
23
23
|
await loadAndValidateOptions(options);
|
|
@@ -26,35 +26,34 @@ exports.handler = async (options) => {
|
|
|
26
26
|
logger.error(i18n(`${i18nKey}.warnings.cannotDownloadWithinProject`));
|
|
27
27
|
process.exit(EXIT_CODES.ERROR);
|
|
28
28
|
}
|
|
29
|
-
const { project, dest,
|
|
29
|
+
const { project, dest, build, derivedAccountId } = options;
|
|
30
30
|
const { project: promptedProjectName } = await downloadProjectPrompt(options);
|
|
31
31
|
let projectName = promptedProjectName || project;
|
|
32
|
-
|
|
33
|
-
trackCommandUsage('project-download', null, accountId);
|
|
32
|
+
trackCommandUsage('project-download', null, derivedAccountId);
|
|
34
33
|
try {
|
|
35
|
-
const { projectExists } = await ensureProjectExists(
|
|
34
|
+
const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
|
|
36
35
|
allowCreate: false,
|
|
37
36
|
noLogs: true,
|
|
38
37
|
});
|
|
39
38
|
if (!projectExists) {
|
|
40
39
|
logger.error(i18n(`${i18nKey}.errors.projectNotFound`, {
|
|
41
40
|
projectName: chalk.bold(projectName),
|
|
42
|
-
accountId: chalk.bold(
|
|
41
|
+
accountId: chalk.bold(derivedAccountId),
|
|
43
42
|
}));
|
|
44
43
|
const { name: promptedProjectName } = await downloadProjectPrompt(options);
|
|
45
44
|
projectName = promptedProjectName || project;
|
|
46
45
|
}
|
|
47
46
|
const absoluteDestPath = dest ? path.resolve(getCwd(), dest) : getCwd();
|
|
48
|
-
let buildNumberToDownload =
|
|
47
|
+
let buildNumberToDownload = build;
|
|
49
48
|
if (!buildNumberToDownload) {
|
|
50
|
-
const { data: projectBuildsResult } = await fetchProjectBuilds(
|
|
49
|
+
const { data: projectBuildsResult } = await fetchProjectBuilds(derivedAccountId, projectName);
|
|
51
50
|
const { results: projectBuilds } = projectBuildsResult;
|
|
52
51
|
if (projectBuilds && projectBuilds.length) {
|
|
53
52
|
const latestBuild = projectBuilds[0];
|
|
54
53
|
buildNumberToDownload = latestBuild.buildId;
|
|
55
54
|
}
|
|
56
55
|
}
|
|
57
|
-
const { data: zippedProject } = await downloadProject(
|
|
56
|
+
const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, buildNumberToDownload);
|
|
58
57
|
await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: false });
|
|
59
58
|
logger.log(i18n(`${i18nKey}.logs.downloadSucceeded`, {
|
|
60
59
|
buildId: buildNumberToDownload,
|
|
@@ -63,11 +62,16 @@ exports.handler = async (options) => {
|
|
|
63
62
|
process.exit(EXIT_CODES.SUCCESS);
|
|
64
63
|
}
|
|
65
64
|
catch (e) {
|
|
66
|
-
logError(e, new ApiErrorContext({
|
|
65
|
+
logError(e, new ApiErrorContext({
|
|
66
|
+
accountId: derivedAccountId,
|
|
67
|
+
request: 'project download',
|
|
68
|
+
}));
|
|
67
69
|
process.exit(EXIT_CODES.ERROR);
|
|
68
70
|
}
|
|
69
71
|
};
|
|
70
72
|
exports.builder = yargs => {
|
|
73
|
+
addAccountOptions(yargs);
|
|
74
|
+
addConfigOptions(yargs);
|
|
71
75
|
addUseEnvironmentOptions(yargs);
|
|
72
76
|
yargs.options({
|
|
73
77
|
project: {
|
|
@@ -78,8 +82,9 @@ exports.builder = yargs => {
|
|
|
78
82
|
describe: i18n(`${i18nKey}.options.dest.describe`),
|
|
79
83
|
type: 'string',
|
|
80
84
|
},
|
|
81
|
-
|
|
82
|
-
describe: i18n(`${i18nKey}.options.
|
|
85
|
+
build: {
|
|
86
|
+
describe: i18n(`${i18nKey}.options.build.describe`),
|
|
87
|
+
alias: ['build-id'],
|
|
83
88
|
type: 'number',
|
|
84
89
|
},
|
|
85
90
|
});
|
|
@@ -1,15 +1,13 @@
|
|
|
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
12
|
const { loadAndValidateOptions } = require('../../lib/validation');
|
|
15
13
|
const { getProjectConfig, getProjectDetailUrl, validateProjectConfig, } = require('../../lib/projects');
|
|
@@ -17,29 +15,36 @@ 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
21
|
await loadAndValidateOptions(options);
|
|
24
|
-
const {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
const { project: projectFlagValue, limit, derivedAccountId } = options;
|
|
23
|
+
trackCommandUsage('project-list-builds', null, derivedAccountId);
|
|
24
|
+
let projectName = projectFlagValue;
|
|
25
|
+
if (!projectName) {
|
|
26
|
+
const { projectConfig, projectDir } = await getProjectConfig();
|
|
27
|
+
validateProjectConfig(projectConfig, projectDir);
|
|
28
|
+
projectName = projectConfig.name;
|
|
29
|
+
}
|
|
31
30
|
const fetchAndDisplayBuilds = async (project, options) => {
|
|
32
|
-
const { data: { results, paging }, } = await fetchProjectBuilds(
|
|
31
|
+
const { data: { results, paging }, } = await fetchProjectBuilds(derivedAccountId, project.name, options);
|
|
33
32
|
const currentDeploy = project.deployedBuildId;
|
|
34
33
|
if (options && options.after) {
|
|
35
|
-
logger.log(
|
|
34
|
+
logger.log(i18n(`${i18nKey}.logs.showingNextBuilds`, {
|
|
35
|
+
count: results.length,
|
|
36
|
+
projectName: project.name,
|
|
37
|
+
}));
|
|
36
38
|
}
|
|
37
39
|
else {
|
|
38
|
-
logger.log(
|
|
39
|
-
|
|
40
|
+
logger.log(i18n(`${i18nKey}.logs.showingRecentBuilds`, {
|
|
41
|
+
count: results.length,
|
|
42
|
+
projectName: project.name,
|
|
43
|
+
viewBuildsLink: uiLink(i18n(`${i18nKey}.logs.viewAllBuildsLink`), getProjectDetailUrl(project.name, derivedAccountId)),
|
|
44
|
+
}));
|
|
40
45
|
}
|
|
41
46
|
if (results.length === 0) {
|
|
42
|
-
logger.log(
|
|
47
|
+
logger.log(i18n(`${i18nKey}.errors.noBuilds`));
|
|
43
48
|
}
|
|
44
49
|
else {
|
|
45
50
|
const builds = results.map(build => {
|
|
@@ -75,40 +80,40 @@ exports.handler = async (options) => {
|
|
|
75
80
|
if (paging && paging.next) {
|
|
76
81
|
await promptUser({
|
|
77
82
|
name: 'more',
|
|
78
|
-
message:
|
|
83
|
+
message: i18n(`${i18nKey}.continueOrExitPrompt`),
|
|
79
84
|
});
|
|
80
85
|
await fetchAndDisplayBuilds(project, { limit, after: paging.next.after });
|
|
81
86
|
}
|
|
82
87
|
};
|
|
83
88
|
try {
|
|
84
|
-
const { data: project } = await fetchProject(
|
|
89
|
+
const { data: project } = await fetchProject(derivedAccountId, projectName);
|
|
85
90
|
await fetchAndDisplayBuilds(project, { limit });
|
|
86
91
|
}
|
|
87
92
|
catch (e) {
|
|
88
93
|
if (isHubSpotHttpError(e) && e.status === 404) {
|
|
89
|
-
logger.error(
|
|
94
|
+
logger.error(i18n(`${i18nKey}.errors.projectNotFound`, { projectName }));
|
|
90
95
|
}
|
|
91
96
|
else {
|
|
92
|
-
logError(e, new ApiErrorContext({
|
|
97
|
+
logError(e, new ApiErrorContext({
|
|
98
|
+
accountId: derivedAccountId,
|
|
99
|
+
projectName,
|
|
100
|
+
}));
|
|
93
101
|
}
|
|
94
102
|
}
|
|
95
103
|
};
|
|
96
104
|
exports.builder = yargs => {
|
|
97
|
-
yargs.positional('path', {
|
|
98
|
-
describe: 'Path to a project folder',
|
|
99
|
-
type: 'string',
|
|
100
|
-
});
|
|
101
105
|
yargs.options({
|
|
106
|
+
project: {
|
|
107
|
+
describe: i18n(`${i18nKey}.options.project.describe`),
|
|
108
|
+
type: 'string',
|
|
109
|
+
},
|
|
102
110
|
limit: {
|
|
103
|
-
describe:
|
|
111
|
+
describe: i18n(`${i18nKey}.options.limit.describe`),
|
|
104
112
|
type: 'string',
|
|
105
113
|
},
|
|
106
114
|
});
|
|
107
115
|
yargs.example([
|
|
108
|
-
[
|
|
109
|
-
'$0 project list-builds myProjectFolder',
|
|
110
|
-
'Fetch a list of builds for a project within the myProjectFolder folder',
|
|
111
|
-
],
|
|
116
|
+
['$0 project list-builds', i18n(`${i18nKey}.examples.default`)],
|
|
112
117
|
]);
|
|
113
118
|
addConfigOptions(yargs);
|
|
114
119
|
addAccountOptions(yargs);
|
package/commands/project/logs.js
CHANGED
|
@@ -4,7 +4,7 @@ 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');
|
|
@@ -50,11 +50,11 @@ function logPreamble() {
|
|
|
50
50
|
exports.command = 'logs';
|
|
51
51
|
exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
|
|
52
52
|
exports.handler = async (options) => {
|
|
53
|
-
const
|
|
54
|
-
trackCommandUsage('project-logs', null,
|
|
53
|
+
const { derivedAccountId } = options;
|
|
54
|
+
trackCommandUsage('project-logs', null, derivedAccountId);
|
|
55
55
|
await loadAndValidateOptions(options);
|
|
56
56
|
try {
|
|
57
|
-
await ProjectLogsManager.init(
|
|
57
|
+
await ProjectLogsManager.init(derivedAccountId);
|
|
58
58
|
const { functionName } = await projectLogsPrompt({
|
|
59
59
|
functionChoices: ProjectLogsManager.getFunctionNames(),
|
|
60
60
|
promptOptions: options,
|
|
@@ -65,7 +65,7 @@ exports.handler = async (options) => {
|
|
|
65
65
|
}
|
|
66
66
|
catch (e) {
|
|
67
67
|
logError(e, {
|
|
68
|
-
accountId,
|
|
68
|
+
accountId: derivedAccountId,
|
|
69
69
|
projectName: ProjectLogsManager.projectName,
|
|
70
70
|
});
|
|
71
71
|
return process.exit(EXIT_CODES.ERROR);
|