@hubspot/cli 7.4.4-beta.0 → 7.4.5-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/commands/account/auth.js +59 -39
- package/commands/app/migrate.js +2 -2
- package/commands/create/website-theme.js +1 -1
- package/commands/project/add.js +2 -2
- package/commands/project/cloneApp.js +8 -8
- package/commands/project/create.js +1 -1
- package/commands/project/deploy.js +2 -2
- package/commands/project/dev/deprecatedFlow.js +15 -15
- package/commands/project/dev/index.js +3 -3
- package/commands/project/dev/unifiedFlow.js +8 -8
- package/commands/project/download.js +2 -2
- package/commands/project/installDeps.js +2 -2
- package/commands/project/listBuilds.js +3 -3
- package/commands/project/migrate.js +5 -5
- package/commands/project/open.js +4 -3
- package/commands/project/upload.js +7 -5
- package/commands/project/watch.js +3 -1
- package/commands/theme/preview.js +2 -2
- package/lang/en.d.ts +40 -35
- package/lang/en.js +40 -36
- package/lang/en.lyaml +2 -1
- package/lib/app/migrate.d.ts +1 -1
- package/lib/app/migrate.js +23 -19
- package/lib/app/migrate_legacy.js +2 -2
- package/lib/buildAccount.d.ts +1 -2
- package/lib/buildAccount.js +7 -5
- package/lib/commonOpts.d.ts +2 -3
- package/lib/commonOpts.js +12 -2
- package/lib/configMigrate.d.ts +2 -2
- package/lib/configMigrate.js +5 -5
- package/lib/dependencyManagement.js +2 -2
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
- package/lib/doctor/DiagnosticInfoBuilder.js +10 -10
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +3 -3
- package/lib/middleware/yargsChecksMiddleware.js +2 -2
- package/lib/projects/ProjectLogsManager.js +14 -19
- package/lib/projects/buildAndDeploy.js +15 -26
- package/lib/projects/{index.d.ts → config.d.ts} +0 -12
- package/lib/projects/config.js +79 -0
- package/lib/projects/create.js +4 -5
- package/lib/projects/ensureProjectExists.d.ts +11 -0
- package/lib/projects/ensureProjectExists.js +97 -0
- package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
- package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +5 -6
- package/lib/{DevServerManagerV2.d.ts → projects/localDev/DevServerManagerV2.d.ts} +1 -1
- package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +3 -4
- package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
- package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +42 -76
- package/lib/{LocalDevManagerV2.d.ts → projects/localDev/LocalDevManagerV2.d.ts} +2 -2
- package/lib/{LocalDevManagerV2.js → projects/localDev/LocalDevManagerV2.js} +37 -70
- package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +2 -2
- package/lib/{localDev.js → projects/localDev/helpers.js} +51 -96
- package/lib/projects/ui.d.ts +1 -0
- package/lib/projects/ui.js +15 -0
- package/lib/projects/upload.js +9 -30
- package/lib/projects/urls.d.ts +1 -0
- package/lib/projects/urls.js +6 -0
- package/lib/projects/watch.js +18 -15
- package/lib/prompts/projectNamePrompt.js +2 -2
- package/package.json +2 -2
- package/lib/projects/index.js +0 -194
package/commands/account/auth.js
CHANGED
|
@@ -60,49 +60,56 @@ async function updateConfig(env, doesConfigExist, disableTracking, authType, acc
|
|
|
60
60
|
return null;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
|
|
64
|
-
exports.command = 'auth';
|
|
65
|
-
async function handler(args) {
|
|
66
|
-
const { providedAccountId, disableTracking } = args;
|
|
67
|
-
const authType = auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.value;
|
|
63
|
+
async function handleConfigMigration(providedAccountId) {
|
|
68
64
|
const deprecatedConfigExists = (0, migrate_1.configFileExists)(false);
|
|
69
65
|
const globalConfigExists = (0, migrate_1.configFileExists)(true);
|
|
70
|
-
if (deprecatedConfigExists) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
(0,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
66
|
+
if (!deprecatedConfigExists) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (globalConfigExists) {
|
|
70
|
+
try {
|
|
71
|
+
const mergeConfirmed = await (0, configMigrate_1.handleMerge)(providedAccountId);
|
|
72
|
+
if (!mergeConfirmed) {
|
|
73
|
+
logger_1.logger.log((0, lang_1.i18n)('commands.account.subcommands.auth.errors.mergeNotConfirmed', {
|
|
74
|
+
authCommand: (0, ui_1.uiCommandReference)('hs account auth'),
|
|
75
|
+
migrateCommand: (0, ui_1.uiCommandReference)('hs config migrate'),
|
|
76
|
+
}));
|
|
77
|
+
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
83
78
|
}
|
|
79
|
+
return mergeConfirmed;
|
|
84
80
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
type: 'Migrate a single config',
|
|
94
|
-
successful: false,
|
|
95
|
-
}, providedAccountId);
|
|
96
|
-
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
97
|
-
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
(0, index_2.logError)(error);
|
|
83
|
+
(0, usageTracking_2.trackCommandMetadataUsage)('account-auth', {
|
|
84
|
+
command: 'hs account auth',
|
|
85
|
+
type: 'Merge configs',
|
|
86
|
+
successful: false,
|
|
87
|
+
}, providedAccountId);
|
|
88
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
98
89
|
}
|
|
99
90
|
}
|
|
100
|
-
|
|
101
|
-
(0,
|
|
102
|
-
|
|
91
|
+
try {
|
|
92
|
+
const migrationConfirmed = await (0, configMigrate_1.handleMigration)(providedAccountId);
|
|
93
|
+
if (!migrationConfirmed) {
|
|
94
|
+
logger_1.logger.log((0, lang_1.i18n)('commands.account.subcommands.auth.errors.migrationNotConfirmed', {
|
|
95
|
+
authCommand: (0, ui_1.uiCommandReference)('hs auth'),
|
|
96
|
+
deprecatedConfigPath: (0, migrate_1.getConfigPath)('', false),
|
|
97
|
+
}));
|
|
98
|
+
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
99
|
+
}
|
|
100
|
+
return migrationConfirmed;
|
|
103
101
|
}
|
|
104
|
-
|
|
105
|
-
|
|
102
|
+
catch (error) {
|
|
103
|
+
(0, index_2.logError)(error);
|
|
104
|
+
(0, usageTracking_2.trackCommandMetadataUsage)('account-auth', {
|
|
105
|
+
command: 'hs account auth',
|
|
106
|
+
type: 'Migrate a single config',
|
|
107
|
+
successful: false,
|
|
108
|
+
}, providedAccountId);
|
|
109
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function handleConfigUpdate(env, configAlreadyExists, disableTracking, authType, providedAccountId) {
|
|
106
113
|
if (!configAlreadyExists) {
|
|
107
114
|
(0, config_1.createEmptyConfigFile)({}, true);
|
|
108
115
|
}
|
|
@@ -115,14 +122,13 @@ async function handler(args) {
|
|
|
115
122
|
}
|
|
116
123
|
const { name } = updatedConfig;
|
|
117
124
|
const accountId = (0, getAccountIdentifier_1.getAccountIdentifier)(updatedConfig);
|
|
118
|
-
// If the config file was just created, we don't need to prompt the user to set as default
|
|
119
125
|
if (!configAlreadyExists) {
|
|
120
126
|
logger_1.logger.log('');
|
|
121
127
|
logger_1.logger.success((0, lang_1.i18n)('commands.account.subcommands.auth.success.configFileCreated', {
|
|
122
|
-
configPath: (0,
|
|
128
|
+
configPath: (0, migrate_1.getConfigPath)('', true),
|
|
123
129
|
}));
|
|
124
130
|
logger_1.logger.success((0, lang_1.i18n)('commands.account.subcommands.auth.success.configFileUpdated', {
|
|
125
|
-
account: name || accountId || '',
|
|
131
|
+
account: name || accountId?.toString() || '',
|
|
126
132
|
}));
|
|
127
133
|
}
|
|
128
134
|
else {
|
|
@@ -149,6 +155,20 @@ async function handler(args) {
|
|
|
149
155
|
}
|
|
150
156
|
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
151
157
|
}
|
|
158
|
+
exports.describe = (0, lang_1.i18n)('commands.account.subcommands.auth.describe');
|
|
159
|
+
exports.command = 'auth';
|
|
160
|
+
async function handler(args) {
|
|
161
|
+
const { providedAccountId, disableTracking } = args;
|
|
162
|
+
const authType = auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.value;
|
|
163
|
+
await handleConfigMigration(providedAccountId);
|
|
164
|
+
if (!disableTracking) {
|
|
165
|
+
(0, usageTracking_1.trackCommandUsage)('account-auth', {}, providedAccountId);
|
|
166
|
+
await (0, usageTracking_1.trackAuthAction)('account-auth', authType, TRACKING_STATUS.STARTED);
|
|
167
|
+
}
|
|
168
|
+
const env = args.qa ? environments_1.ENVIRONMENTS.QA : environments_1.ENVIRONMENTS.PROD;
|
|
169
|
+
const configAlreadyExists = (0, migrate_1.configFileExists)(true);
|
|
170
|
+
await handleConfigUpdate(env, configAlreadyExists, disableTracking, authType, providedAccountId);
|
|
171
|
+
}
|
|
152
172
|
function builder(yargs) {
|
|
153
173
|
yargs.options({
|
|
154
174
|
account: {
|
package/commands/app/migrate.js
CHANGED
|
@@ -13,7 +13,7 @@ const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
|
13
13
|
const migrate_1 = require("../../lib/app/migrate");
|
|
14
14
|
const ui_1 = require("../../lib/ui");
|
|
15
15
|
const migrate_legacy_1 = require("../../lib/app/migrate_legacy");
|
|
16
|
-
const
|
|
16
|
+
const config_2 = require("../../lib/projects/config");
|
|
17
17
|
const { v2023_2, v2025_2 } = projects_1.PLATFORM_VERSIONS;
|
|
18
18
|
const command = 'migrate';
|
|
19
19
|
const describe = undefined; // uiBetaTag(i18n(`commands.project.subcommands.migrateApp.header.text.describe`), false);
|
|
@@ -31,7 +31,7 @@ async function handler(options) {
|
|
|
31
31
|
logger_1.logger.log('');
|
|
32
32
|
try {
|
|
33
33
|
if (platformVersion === v2025_2 || unstable) {
|
|
34
|
-
if ((0,
|
|
34
|
+
if ((0, config_2.getIsInProject)()) {
|
|
35
35
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.migrateApp.errors.notAllowedWithinProject`, { command: (0, ui_1.uiCommandReference)('hs project migrate') }));
|
|
36
36
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
37
37
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
// @ts-nocheck
|
|
4
4
|
const { cloneGithubRepo } = require('@hubspot/local-dev-lib/github');
|
|
5
|
-
const { getIsInProject } = require('../../lib/projects');
|
|
5
|
+
const { getIsInProject } = require('../../lib/projects/config');
|
|
6
6
|
const PROJECT_BOILERPLATE_BRANCH = 'cms-boilerplate-developer-projects';
|
|
7
7
|
module.exports = {
|
|
8
8
|
dest: ({ name, assetType }) => name || assetType,
|
package/commands/project/add.js
CHANGED
|
@@ -12,7 +12,7 @@ const errorHandlers_1 = require("../../lib/errorHandlers");
|
|
|
12
12
|
const usageTracking_1 = require("../../lib/usageTracking");
|
|
13
13
|
const lang_1 = require("../../lib/lang");
|
|
14
14
|
const projectAddPrompt_1 = require("../../lib/prompts/projectAddPrompt");
|
|
15
|
-
const
|
|
15
|
+
const config_1 = require("../../lib/projects/config");
|
|
16
16
|
const create_1 = require("../../lib/projects/create");
|
|
17
17
|
const structure_1 = require("../../lib/projects/structure");
|
|
18
18
|
const Projects_1 = require("../../types/Projects");
|
|
@@ -25,7 +25,7 @@ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcom
|
|
|
25
25
|
async function handler(args) {
|
|
26
26
|
const { derivedAccountId } = args;
|
|
27
27
|
(0, usageTracking_1.trackCommandUsage)('project-add', undefined, derivedAccountId);
|
|
28
|
-
const { projectConfig, projectDir } = await (0,
|
|
28
|
+
const { projectConfig, projectDir } = await (0, config_1.getProjectConfig)();
|
|
29
29
|
if (!projectDir || !projectConfig) {
|
|
30
30
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.add.error.locationInProject`));
|
|
31
31
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
@@ -17,13 +17,13 @@ const ui_2 = require("../../lib/ui");
|
|
|
17
17
|
const errorHandlers_1 = require("../../lib/errorHandlers");
|
|
18
18
|
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
19
19
|
const accountTypes_1 = require("../../lib/accountTypes");
|
|
20
|
-
const
|
|
20
|
+
const config_1 = require("../../lib/projects/config");
|
|
21
21
|
const constants_1 = require("../../lib/constants");
|
|
22
|
-
const
|
|
22
|
+
const projects_1 = require("@hubspot/local-dev-lib/api/projects");
|
|
23
23
|
const path_2 = require("@hubspot/local-dev-lib/path");
|
|
24
24
|
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
25
25
|
const archive_1 = require("@hubspot/local-dev-lib/archive");
|
|
26
|
-
const
|
|
26
|
+
const config_2 = require("@hubspot/local-dev-lib/config");
|
|
27
27
|
const SpinniesManager_1 = __importDefault(require("../../lib/ui/SpinniesManager"));
|
|
28
28
|
const migrate_1 = require("../../lib/app/migrate");
|
|
29
29
|
exports.command = 'clone-app';
|
|
@@ -32,7 +32,7 @@ exports.deprecated = true;
|
|
|
32
32
|
const handler = async (options) => {
|
|
33
33
|
const { derivedAccountId } = options;
|
|
34
34
|
await (0, usageTracking_1.trackCommandUsage)('clone-app', {}, derivedAccountId);
|
|
35
|
-
const accountConfig = (0,
|
|
35
|
+
const accountConfig = (0, config_2.getAccountConfig)(derivedAccountId);
|
|
36
36
|
const accountName = (0, ui_2.uiAccountDescription)(derivedAccountId);
|
|
37
37
|
if (!accountConfig) {
|
|
38
38
|
throw new Error((0, lang_1.i18n)(`commands.projects.subcommands.cloneApp.errors.noAccountConfig`));
|
|
@@ -69,15 +69,15 @@ const handler = async (options) => {
|
|
|
69
69
|
SpinniesManager_1.default.add('cloneApp', {
|
|
70
70
|
text: (0, lang_1.i18n)(`commands.project.subcommands.cloneApp.cloneStatus.inProgress`),
|
|
71
71
|
});
|
|
72
|
-
const { data: { exportId }, } = await (0,
|
|
73
|
-
const { status } = await (0, polling_1.poll)(() => (0,
|
|
72
|
+
const { data: { exportId }, } = await (0, projects_1.cloneApp)(derivedAccountId, appId);
|
|
73
|
+
const { status } = await (0, polling_1.poll)(() => (0, projects_1.checkCloneStatus)(derivedAccountId, exportId));
|
|
74
74
|
if (status === 'SUCCESS') {
|
|
75
75
|
// Ensure correct project folder structure exists
|
|
76
76
|
const baseDestPath = path_1.default.resolve((0, path_2.getCwd)(), projectDest);
|
|
77
77
|
const absoluteDestPath = path_1.default.resolve(baseDestPath, 'src', 'app');
|
|
78
78
|
fs_1.default.mkdirSync(absoluteDestPath, { recursive: true });
|
|
79
79
|
// Extract zipped app files and place them in correct directory
|
|
80
|
-
const { data: zippedApp } = await (0,
|
|
80
|
+
const { data: zippedApp } = await (0, projects_1.downloadClonedProject)(derivedAccountId, exportId);
|
|
81
81
|
await (0, archive_1.extractZipArchive)(zippedApp, (0, path_2.sanitizeFileName)(projectName), absoluteDestPath, {
|
|
82
82
|
includesRootDir: true,
|
|
83
83
|
hideLogs: true,
|
|
@@ -89,7 +89,7 @@ const handler = async (options) => {
|
|
|
89
89
|
srcDir: 'src',
|
|
90
90
|
platformVersion: '2023.2',
|
|
91
91
|
};
|
|
92
|
-
const success = (0,
|
|
92
|
+
const success = (0, config_1.writeProjectConfig)(configPath, configContent);
|
|
93
93
|
SpinniesManager_1.default.succeed('cloneApp', {
|
|
94
94
|
text: (0, lang_1.i18n)(`commands.project.subcommands.cloneApp.cloneStatus.done`),
|
|
95
95
|
succeedColor: 'white',
|
|
@@ -10,7 +10,7 @@ const { getCwd } = require('@hubspot/local-dev-lib/path');
|
|
|
10
10
|
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
11
11
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
12
12
|
const { createProjectPrompt, } = require('../../lib/prompts/createProjectPrompt');
|
|
13
|
-
const { writeProjectConfig, getProjectConfig } = require('../../lib/projects');
|
|
13
|
+
const { writeProjectConfig, getProjectConfig, } = require('../../lib/projects/config');
|
|
14
14
|
const { getProjectTemplateListFromRepo, EMPTY_PROJECT_TEMPLATE_NAME, } = require('../../lib/projects/create');
|
|
15
15
|
const { i18n } = require('../../lib/lang');
|
|
16
16
|
const { uiBetaTag, uiFeatureHighlight } = require('../../lib/ui');
|
|
@@ -13,7 +13,7 @@ const index_1 = require("@hubspot/local-dev-lib/errors/index");
|
|
|
13
13
|
const buildAndDeploy_1 = require("../../lib/projects/buildAndDeploy");
|
|
14
14
|
const usageTracking_1 = require("../../lib/usageTracking");
|
|
15
15
|
const index_2 = require("../../lib/errorHandlers/index");
|
|
16
|
-
const
|
|
16
|
+
const config_2 = require("../../lib/projects/config");
|
|
17
17
|
const buildAndDeploy_2 = require("../../lib/projects/buildAndDeploy");
|
|
18
18
|
const urls_1 = require("../../lib/projects/urls");
|
|
19
19
|
const projectNamePrompt_1 = require("../../lib/prompts/projectNamePrompt");
|
|
@@ -47,7 +47,7 @@ async function handler(args) {
|
|
|
47
47
|
const { project: projectOption, buildId: buildIdOption } = args;
|
|
48
48
|
const accountType = accountConfig && accountConfig.accountType;
|
|
49
49
|
(0, usageTracking_1.trackCommandUsage)('project-deploy', accountType ? { type: accountType } : undefined, derivedAccountId);
|
|
50
|
-
const { projectConfig } = await (0,
|
|
50
|
+
const { projectConfig } = await (0, config_2.getProjectConfig)();
|
|
51
51
|
let projectName = projectOption;
|
|
52
52
|
if (!projectOption && projectConfig) {
|
|
53
53
|
projectName = projectConfig.name;
|
|
@@ -13,11 +13,11 @@ const lang_1 = require("../../../lib/lang");
|
|
|
13
13
|
const exitCodes_1 = require("../../../lib/enums/exitCodes");
|
|
14
14
|
const ui_1 = require("../../../lib/ui");
|
|
15
15
|
const SpinniesManager_1 = __importDefault(require("../../../lib/ui/SpinniesManager"));
|
|
16
|
-
const LocalDevManager_1 = __importDefault(require("../../../lib/LocalDevManager"));
|
|
17
|
-
const
|
|
16
|
+
const LocalDevManager_1 = __importDefault(require("../../../lib/projects/localDev/LocalDevManager"));
|
|
17
|
+
const helpers_1 = require("../../../lib/projects/localDev/helpers");
|
|
18
18
|
const process_1 = require("../../../lib/process");
|
|
19
19
|
const accountTypes_1 = require("../../../lib/accountTypes");
|
|
20
|
-
const
|
|
20
|
+
const ensureProjectExists_1 = require("../../../lib/projects/ensureProjectExists");
|
|
21
21
|
async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, projectDir) {
|
|
22
22
|
const { providedAccountId, derivedAccountId } = args;
|
|
23
23
|
const env = (0, environment_1.getValidEnv)((0, config_1.getEnv)(derivedAccountId));
|
|
@@ -52,7 +52,7 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
|
|
|
52
52
|
bypassRecommendedAccountPrompt = true;
|
|
53
53
|
}
|
|
54
54
|
else if (!hasPublicApps) {
|
|
55
|
-
const defaultAccountHasSandboxes = await (0,
|
|
55
|
+
const defaultAccountHasSandboxes = await (0, helpers_1.hasSandboxes)(accountConfig);
|
|
56
56
|
bypassRecommendedAccountPrompt = !defaultAccountHasSandboxes;
|
|
57
57
|
}
|
|
58
58
|
// targetProjectAccountId and targetTestingAccountId are set to null if --account flag is not provided.
|
|
@@ -62,20 +62,20 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
|
|
|
62
62
|
let targetTestingAccountId = providedAccountId ? derivedAccountId : null;
|
|
63
63
|
// Check that the default account or flag option is valid for the type of app in this project
|
|
64
64
|
if (providedAccountId) {
|
|
65
|
-
(0,
|
|
65
|
+
(0, helpers_1.checkIfAccountFlagIsSupported)(accountConfig, hasPublicApps);
|
|
66
66
|
if (hasPublicApps) {
|
|
67
67
|
targetProjectAccountId = accountConfig.parentAccountId || null;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
else {
|
|
71
|
-
await (0,
|
|
71
|
+
await (0, helpers_1.checkIfDefaultAccountIsSupported)(accountConfig, hasPublicApps);
|
|
72
72
|
}
|
|
73
73
|
// The user is targeting an account type that we recommend developing on
|
|
74
74
|
if (!targetProjectAccountId && bypassRecommendedAccountPrompt) {
|
|
75
75
|
targetTestingAccountId = derivedAccountId;
|
|
76
|
-
await (0,
|
|
76
|
+
await (0, helpers_1.confirmDefaultAccountIsTarget)(accountConfig);
|
|
77
77
|
if (hasPublicApps) {
|
|
78
|
-
(0,
|
|
78
|
+
(0, helpers_1.checkIfParentAccountIsAuthed)(accountConfig);
|
|
79
79
|
targetProjectAccountId = accountConfig.parentAccountId || null;
|
|
80
80
|
}
|
|
81
81
|
else {
|
|
@@ -85,25 +85,25 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
|
|
|
85
85
|
let createNewSandbox = false;
|
|
86
86
|
let createNewDeveloperTestAccount = false;
|
|
87
87
|
if (!targetProjectAccountId) {
|
|
88
|
-
const { targetAccountId, parentAccountId, createNestedAccount, notInConfigAccount, } = await (0,
|
|
88
|
+
const { targetAccountId, parentAccountId, createNestedAccount, notInConfigAccount, } = await (0, helpers_1.suggestRecommendedNestedAccount)(accounts, accountConfig, hasPublicApps);
|
|
89
89
|
targetProjectAccountId = hasPublicApps
|
|
90
90
|
? parentAccountId || null
|
|
91
91
|
: targetAccountId;
|
|
92
92
|
targetTestingAccountId = targetAccountId;
|
|
93
93
|
// Only used for developer test accounts that are not yet in the config
|
|
94
94
|
if (notInConfigAccount) {
|
|
95
|
-
await (0,
|
|
95
|
+
await (0, helpers_1.useExistingDevTestAccount)(env, notInConfigAccount);
|
|
96
96
|
}
|
|
97
97
|
createNewSandbox = hasPrivateApps && createNestedAccount;
|
|
98
98
|
createNewDeveloperTestAccount = hasPublicApps && createNestedAccount;
|
|
99
99
|
}
|
|
100
100
|
if (createNewSandbox) {
|
|
101
|
-
targetProjectAccountId = await (0,
|
|
101
|
+
targetProjectAccountId = await (0, helpers_1.createSandboxForLocalDev)(derivedAccountId, accountConfig, env);
|
|
102
102
|
// We will be running our tests against this new sandbox account
|
|
103
103
|
targetTestingAccountId = targetProjectAccountId;
|
|
104
104
|
}
|
|
105
105
|
if (createNewDeveloperTestAccount) {
|
|
106
|
-
targetTestingAccountId = await (0,
|
|
106
|
+
targetTestingAccountId = await (0, helpers_1.createDeveloperTestAccountForLocalDev)(derivedAccountId, accountConfig, env);
|
|
107
107
|
targetProjectAccountId = derivedAccountId;
|
|
108
108
|
}
|
|
109
109
|
if (!targetProjectAccountId || !targetTestingAccountId) {
|
|
@@ -111,7 +111,7 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
|
|
|
111
111
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
112
112
|
}
|
|
113
113
|
// eslint-disable-next-line prefer-const
|
|
114
|
-
let { projectExists, project } = await (0,
|
|
114
|
+
let { projectExists, project } = await (0, ensureProjectExists_1.ensureProjectExists)(targetProjectAccountId, projectConfig.name, {
|
|
115
115
|
allowCreate: false,
|
|
116
116
|
noLogs: true,
|
|
117
117
|
withPolling: createNewSandbox,
|
|
@@ -124,8 +124,8 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
|
|
|
124
124
|
isGithubLinked = Boolean(project.sourceIntegration && project.sourceIntegration.source === 'GITHUB');
|
|
125
125
|
}
|
|
126
126
|
else {
|
|
127
|
-
project = await (0,
|
|
128
|
-
deployedBuild = await (0,
|
|
127
|
+
project = await (0, helpers_1.createNewProjectForLocalDev)(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
|
|
128
|
+
deployedBuild = await (0, helpers_1.createInitialBuildForNewProject)(projectConfig, projectDir, targetProjectAccountId);
|
|
129
129
|
}
|
|
130
130
|
const LocalDev = new LocalDevManager_1.default({
|
|
131
131
|
runnableComponents,
|
|
@@ -8,7 +8,7 @@ const usageTracking_1 = require("../../../lib/usageTracking");
|
|
|
8
8
|
const lang_1 = require("../../../lib/lang");
|
|
9
9
|
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
10
10
|
const config_1 = require("@hubspot/local-dev-lib/config");
|
|
11
|
-
const
|
|
11
|
+
const config_2 = require("../../../lib/projects/config");
|
|
12
12
|
const exitCodes_1 = require("../../../lib/enums/exitCodes");
|
|
13
13
|
const ui_1 = require("../../../lib/ui");
|
|
14
14
|
const deprecatedFlow_1 = require("./deprecatedFlow");
|
|
@@ -20,7 +20,7 @@ async function handler(args) {
|
|
|
20
20
|
const { derivedAccountId } = args;
|
|
21
21
|
const accountConfig = (0, config_1.getAccountConfig)(derivedAccountId);
|
|
22
22
|
(0, usageTracking_1.trackCommandUsage)('project-dev', {}, derivedAccountId);
|
|
23
|
-
const { projectConfig, projectDir } = await (0,
|
|
23
|
+
const { projectConfig, projectDir } = await (0, config_2.getProjectConfig)();
|
|
24
24
|
(0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.betaMessage`));
|
|
25
25
|
logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
|
|
26
26
|
if (!projectConfig || !projectDir) {
|
|
@@ -34,7 +34,7 @@ async function handler(args) {
|
|
|
34
34
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noAccount`));
|
|
35
35
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
36
36
|
}
|
|
37
|
-
(0,
|
|
37
|
+
(0, config_2.validateProjectConfig)(projectConfig, projectDir);
|
|
38
38
|
if ((0, buildAndDeploy_1.useV3Api)(projectConfig.platformVersion)) {
|
|
39
39
|
await (0, unifiedFlow_1.unifiedProjectDevFlow)(args, accountConfig, projectConfig, projectDir);
|
|
40
40
|
}
|
|
@@ -13,11 +13,11 @@ const config_1 = require("@hubspot/local-dev-lib/config");
|
|
|
13
13
|
const environment_1 = require("@hubspot/local-dev-lib/environment");
|
|
14
14
|
const errorHandlers_1 = require("../../../lib/errorHandlers");
|
|
15
15
|
const exitCodes_1 = require("../../../lib/enums/exitCodes");
|
|
16
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const ensureProjectExists_1 = require("../../../lib/projects/ensureProjectExists");
|
|
17
|
+
const helpers_1 = require("../../../lib/projects/localDev/helpers");
|
|
18
18
|
const projectDevTargetAccountPrompt_1 = require("../../../lib/prompts/projectDevTargetAccountPrompt");
|
|
19
19
|
const SpinniesManager_1 = __importDefault(require("../../../lib/ui/SpinniesManager"));
|
|
20
|
-
const LocalDevManagerV2_1 = __importDefault(require("../../../lib/LocalDevManagerV2"));
|
|
20
|
+
const LocalDevManagerV2_1 = __importDefault(require("../../../lib/projects/localDev/LocalDevManagerV2"));
|
|
21
21
|
const process_1 = require("../../../lib/process");
|
|
22
22
|
const accountTypes_1 = require("../../../lib/accountTypes");
|
|
23
23
|
const ui_1 = require("../../../lib/ui");
|
|
@@ -71,14 +71,14 @@ async function unifiedProjectDevFlow(args, accountConfig, projectConfig, project
|
|
|
71
71
|
if (!!devAccountPromptResponse.notInConfigAccount) {
|
|
72
72
|
// When the developer test account isn't configured in the CLI config yet
|
|
73
73
|
// Walk the user through adding the account's PAK to the config
|
|
74
|
-
await (0,
|
|
74
|
+
await (0, helpers_1.useExistingDevTestAccount)(env, devAccountPromptResponse.notInConfigAccount);
|
|
75
75
|
}
|
|
76
76
|
else if (devAccountPromptResponse.createNestedAccount) {
|
|
77
77
|
// Create a new developer test account and automatically add it to the CLI config
|
|
78
|
-
targetTestingAccountId = await (0,
|
|
78
|
+
targetTestingAccountId = await (0, helpers_1.createDeveloperTestAccountForLocalDev)(targetProjectAccountId, accountConfig, env);
|
|
79
79
|
}
|
|
80
80
|
// Check if project exists in HubSpot
|
|
81
|
-
const { projectExists, project: uploadedProject } = await (0,
|
|
81
|
+
const { projectExists, project: uploadedProject } = await (0, ensureProjectExists_1.ensureProjectExists)(targetProjectAccountId, projectConfig.name, {
|
|
82
82
|
allowCreate: false,
|
|
83
83
|
noLogs: true,
|
|
84
84
|
});
|
|
@@ -91,8 +91,8 @@ async function unifiedProjectDevFlow(args, accountConfig, projectConfig, project
|
|
|
91
91
|
isGithubLinked = Boolean(project.sourceIntegration && project.sourceIntegration.source === 'GITHUB');
|
|
92
92
|
}
|
|
93
93
|
else {
|
|
94
|
-
project = await (0,
|
|
95
|
-
deployedBuild = await (0,
|
|
94
|
+
project = await (0, helpers_1.createNewProjectForLocalDev)(projectConfig, targetProjectAccountId, false, false);
|
|
95
|
+
deployedBuild = await (0, helpers_1.createInitialBuildForNewProject)(projectConfig, projectDir, targetProjectAccountId, true);
|
|
96
96
|
}
|
|
97
97
|
const LocalDev = new LocalDevManagerV2_1.default({
|
|
98
98
|
projectNodes,
|
|
@@ -11,7 +11,7 @@ const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
|
11
11
|
const archive_1 = require("@hubspot/local-dev-lib/archive");
|
|
12
12
|
const projects_1 = require("@hubspot/local-dev-lib/api/projects");
|
|
13
13
|
const index_1 = require("../../lib/errorHandlers/index");
|
|
14
|
-
const
|
|
14
|
+
const config_1 = require("../../lib/projects/config");
|
|
15
15
|
const downloadProjectPrompt_1 = require("../../lib/prompts/downloadProjectPrompt");
|
|
16
16
|
const lang_1 = require("../../lib/lang");
|
|
17
17
|
const ui_1 = require("../../lib/ui");
|
|
@@ -21,7 +21,7 @@ const yargsUtils_1 = require("../../lib/yargsUtils");
|
|
|
21
21
|
exports.command = 'download';
|
|
22
22
|
exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.download.describe`), false);
|
|
23
23
|
async function handler(args) {
|
|
24
|
-
const { projectConfig } = await (0,
|
|
24
|
+
const { projectConfig } = await (0, config_1.getProjectConfig)();
|
|
25
25
|
if (projectConfig) {
|
|
26
26
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.download.warnings.cannotDownloadWithinProject`));
|
|
27
27
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
@@ -8,7 +8,7 @@ exports.handler = handler;
|
|
|
8
8
|
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
9
9
|
const dependencyManagement_1 = require("../../lib/dependencyManagement");
|
|
10
10
|
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
11
|
-
const
|
|
11
|
+
const config_1 = require("../../lib/projects/config");
|
|
12
12
|
const promptUtils_1 = require("../../lib/prompts/promptUtils");
|
|
13
13
|
const path_1 = __importDefault(require("path"));
|
|
14
14
|
const lang_1 = require("../../lib/lang");
|
|
@@ -22,7 +22,7 @@ async function handler(args) {
|
|
|
22
22
|
const { derivedAccountId, packages } = args;
|
|
23
23
|
try {
|
|
24
24
|
(0, usageTracking_1.trackCommandUsage)('project-install-deps', undefined, derivedAccountId);
|
|
25
|
-
const projectConfig = await (0,
|
|
25
|
+
const projectConfig = await (0, config_1.getProjectConfig)();
|
|
26
26
|
if (!projectConfig || !projectConfig.projectDir) {
|
|
27
27
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.installDeps.noProjectConfig`));
|
|
28
28
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
@@ -11,7 +11,7 @@ const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
|
11
11
|
const projects_1 = require("@hubspot/local-dev-lib/api/projects");
|
|
12
12
|
const table_1 = require("../../lib/ui/table");
|
|
13
13
|
const ui_1 = require("../../lib/ui");
|
|
14
|
-
const
|
|
14
|
+
const config_1 = require("../../lib/projects/config");
|
|
15
15
|
const urls_1 = require("../../lib/projects/urls");
|
|
16
16
|
const moment_1 = __importDefault(require("moment"));
|
|
17
17
|
const promptUtils_1 = require("../../lib/prompts/promptUtils");
|
|
@@ -82,8 +82,8 @@ async function handler(args) {
|
|
|
82
82
|
(0, usageTracking_1.trackCommandUsage)('project-list-builds', undefined, derivedAccountId);
|
|
83
83
|
let projectName = projectFlagValue;
|
|
84
84
|
if (!projectName) {
|
|
85
|
-
const { projectConfig, projectDir } = await (0,
|
|
86
|
-
(0,
|
|
85
|
+
const { projectConfig, projectDir } = await (0, config_1.getProjectConfig)();
|
|
86
|
+
(0, config_1.validateProjectConfig)(projectConfig, projectDir);
|
|
87
87
|
projectName = projectConfig.name;
|
|
88
88
|
}
|
|
89
89
|
try {
|
|
@@ -6,18 +6,18 @@ exports.builder = builder;
|
|
|
6
6
|
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
7
7
|
const commonOpts_1 = require("../../lib/commonOpts");
|
|
8
8
|
const migrate_1 = require("../../lib/app/migrate");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
9
|
+
const config_1 = require("../../lib/projects/config");
|
|
10
|
+
const projects_1 = require("@hubspot/local-dev-lib/constants/projects");
|
|
11
11
|
const errorHandlers_1 = require("../../lib/errorHandlers");
|
|
12
12
|
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
13
13
|
const ui_1 = require("../../lib/ui");
|
|
14
14
|
const en_1 = require("../../lang/en");
|
|
15
|
-
const { v2025_2 } =
|
|
15
|
+
const { v2025_2 } = projects_1.PLATFORM_VERSIONS;
|
|
16
16
|
exports.command = 'migrate';
|
|
17
17
|
exports.describe = undefined;
|
|
18
18
|
async function handler(options) {
|
|
19
19
|
const { platformVersion, unstable } = options;
|
|
20
|
-
const projectConfig = await (0,
|
|
20
|
+
const projectConfig = await (0, config_1.getProjectConfig)();
|
|
21
21
|
if (!projectConfig.projectConfig) {
|
|
22
22
|
logger_1.logger.error(en_1.commands.project.migrate.errors.noProjectConfig((0, ui_1.uiCommandReference)('hs app migrate')));
|
|
23
23
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
@@ -30,7 +30,7 @@ async function handler(options) {
|
|
|
30
30
|
...options,
|
|
31
31
|
name: projectConfig?.projectConfig?.name,
|
|
32
32
|
platformVersion: unstable
|
|
33
|
-
?
|
|
33
|
+
? projects_1.PLATFORM_VERSIONS.unstable
|
|
34
34
|
: platformVersion,
|
|
35
35
|
}, projectConfig);
|
|
36
36
|
}
|
package/commands/project/open.js
CHANGED
|
@@ -11,7 +11,8 @@ const commonOpts_1 = require("../../lib/commonOpts");
|
|
|
11
11
|
const usageTracking_1 = require("../../lib/usageTracking");
|
|
12
12
|
const lang_1 = require("../../lib/lang");
|
|
13
13
|
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
14
|
-
const
|
|
14
|
+
const config_1 = require("../../lib/projects/config");
|
|
15
|
+
const ensureProjectExists_1 = require("../../lib/projects/ensureProjectExists");
|
|
15
16
|
const urls_1 = require("../../lib/projects/urls");
|
|
16
17
|
const projectNamePrompt_1 = require("../../lib/prompts/projectNamePrompt");
|
|
17
18
|
const ui_1 = require("../../lib/ui");
|
|
@@ -21,10 +22,10 @@ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcom
|
|
|
21
22
|
async function handler(args) {
|
|
22
23
|
const { project, derivedAccountId } = args;
|
|
23
24
|
(0, usageTracking_1.trackCommandUsage)('project-open', undefined, derivedAccountId);
|
|
24
|
-
const { projectConfig } = await (0,
|
|
25
|
+
const { projectConfig } = await (0, config_1.getProjectConfig)();
|
|
25
26
|
let projectName = project;
|
|
26
27
|
if (projectName) {
|
|
27
|
-
const { projectExists } = await (0,
|
|
28
|
+
const { projectExists } = await (0, ensureProjectExists_1.ensureProjectExists)(derivedAccountId, projectName, {
|
|
28
29
|
allowCreate: false,
|
|
29
30
|
});
|
|
30
31
|
if (!projectExists) {
|
|
@@ -12,7 +12,9 @@ const index_1 = require("@hubspot/local-dev-lib/errors/index");
|
|
|
12
12
|
const buildAndDeploy_1 = require("../../lib/projects/buildAndDeploy");
|
|
13
13
|
const ui_1 = require("../../lib/ui");
|
|
14
14
|
const usageTracking_1 = require("../../lib/usageTracking");
|
|
15
|
-
const
|
|
15
|
+
const config_2 = require("../../lib/projects/config");
|
|
16
|
+
const ensureProjectExists_1 = require("../../lib/projects/ensureProjectExists");
|
|
17
|
+
const ui_2 = require("../../lib/projects/ui");
|
|
16
18
|
const upload_1 = require("../../lib/projects/upload");
|
|
17
19
|
const buildAndDeploy_2 = require("../../lib/projects/buildAndDeploy");
|
|
18
20
|
const lang_1 = require("../../lib/lang");
|
|
@@ -26,10 +28,10 @@ async function handler(args) {
|
|
|
26
28
|
const { forceCreate, message, derivedAccountId, skipValidation } = args;
|
|
27
29
|
const accountConfig = (0, config_1.getAccountConfig)(derivedAccountId);
|
|
28
30
|
const accountType = accountConfig && accountConfig.accountType;
|
|
29
|
-
const { projectConfig, projectDir } = await (0,
|
|
31
|
+
const { projectConfig, projectDir } = await (0, config_2.getProjectConfig)();
|
|
30
32
|
(0, usageTracking_1.trackCommandUsage)('project-upload', { type: accountType }, derivedAccountId);
|
|
31
|
-
(0,
|
|
32
|
-
await (0,
|
|
33
|
+
(0, config_2.validateProjectConfig)(projectConfig, projectDir);
|
|
34
|
+
await (0, ensureProjectExists_1.ensureProjectExists)(derivedAccountId, projectConfig.name, {
|
|
33
35
|
forceCreate,
|
|
34
36
|
uploadCommand: true,
|
|
35
37
|
});
|
|
@@ -58,7 +60,7 @@ async function handler(args) {
|
|
|
58
60
|
logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.upload.logs.autoDeployDisabled`, {
|
|
59
61
|
deployCommand: (0, ui_1.uiCommandReference)(`hs project deploy --build=${result.buildId}`),
|
|
60
62
|
}));
|
|
61
|
-
(0,
|
|
63
|
+
(0, ui_2.logFeedbackMessage)(result.buildId);
|
|
62
64
|
await (0, buildAndDeploy_2.displayWarnLogs)(derivedAccountId, projectConfig.name, result.buildId);
|
|
63
65
|
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
64
66
|
}
|
|
@@ -12,7 +12,9 @@ const { PROJECT_ERROR_TYPES } = require('../../lib/constants');
|
|
|
12
12
|
const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
|
|
13
13
|
const { trackCommandUsage } = require('../../lib/usageTracking');
|
|
14
14
|
const { uiBetaTag } = require('../../lib/ui');
|
|
15
|
-
const {
|
|
15
|
+
const { getProjectConfig, validateProjectConfig, } = require('../../lib/projects/config');
|
|
16
|
+
const { ensureProjectExists, } = require('../../lib/projects/ensureProjectExists');
|
|
17
|
+
const { logFeedbackMessage } = require('../../lib/projects/ui');
|
|
16
18
|
const { handleProjectUpload } = require('../../lib/projects/upload');
|
|
17
19
|
const { pollBuildStatus, pollDeployStatus, } = require('../../lib/projects/buildAndDeploy');
|
|
18
20
|
const { cancelStagedBuild, fetchProjectBuilds, } = require('@hubspot/local-dev-lib/api/projects');
|
|
@@ -22,7 +22,7 @@ const previewPrompt_1 = require("../../lib/prompts/previewPrompt");
|
|
|
22
22
|
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
23
23
|
const index_1 = require("../../lib/errorHandlers/index");
|
|
24
24
|
const process_1 = require("../../lib/process");
|
|
25
|
-
const
|
|
25
|
+
const config_1 = require("../../lib/projects/config");
|
|
26
26
|
const structure_1 = require("../../lib/projects/structure");
|
|
27
27
|
const Projects_1 = require("../../types/Projects");
|
|
28
28
|
const hasFeature_1 = require("../../lib/hasFeature");
|
|
@@ -63,7 +63,7 @@ function handleUserInput() {
|
|
|
63
63
|
async function determineSrcAndDest(args) {
|
|
64
64
|
let absoluteSrc;
|
|
65
65
|
let dest;
|
|
66
|
-
const { projectDir, projectConfig } = await (0,
|
|
66
|
+
const { projectDir, projectConfig } = await (0, config_1.getProjectConfig)();
|
|
67
67
|
if (!(projectDir && projectConfig)) {
|
|
68
68
|
// Not in a project, prompt for src and dest of traditional theme
|
|
69
69
|
const previewPromptAnswers = await (0, previewPrompt_1.previewPrompt)(args);
|