@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.
Files changed (61) hide show
  1. package/commands/account/auth.js +59 -39
  2. package/commands/app/migrate.js +2 -2
  3. package/commands/create/website-theme.js +1 -1
  4. package/commands/project/add.js +2 -2
  5. package/commands/project/cloneApp.js +8 -8
  6. package/commands/project/create.js +1 -1
  7. package/commands/project/deploy.js +2 -2
  8. package/commands/project/dev/deprecatedFlow.js +15 -15
  9. package/commands/project/dev/index.js +3 -3
  10. package/commands/project/dev/unifiedFlow.js +8 -8
  11. package/commands/project/download.js +2 -2
  12. package/commands/project/installDeps.js +2 -2
  13. package/commands/project/listBuilds.js +3 -3
  14. package/commands/project/migrate.js +5 -5
  15. package/commands/project/open.js +4 -3
  16. package/commands/project/upload.js +7 -5
  17. package/commands/project/watch.js +3 -1
  18. package/commands/theme/preview.js +2 -2
  19. package/lang/en.d.ts +40 -35
  20. package/lang/en.js +40 -36
  21. package/lang/en.lyaml +2 -1
  22. package/lib/app/migrate.d.ts +1 -1
  23. package/lib/app/migrate.js +23 -19
  24. package/lib/app/migrate_legacy.js +2 -2
  25. package/lib/buildAccount.d.ts +1 -2
  26. package/lib/buildAccount.js +7 -5
  27. package/lib/commonOpts.d.ts +2 -3
  28. package/lib/commonOpts.js +12 -2
  29. package/lib/configMigrate.d.ts +2 -2
  30. package/lib/configMigrate.js +5 -5
  31. package/lib/dependencyManagement.js +2 -2
  32. package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
  33. package/lib/doctor/DiagnosticInfoBuilder.js +10 -10
  34. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +3 -3
  35. package/lib/middleware/yargsChecksMiddleware.js +2 -2
  36. package/lib/projects/ProjectLogsManager.js +14 -19
  37. package/lib/projects/buildAndDeploy.js +15 -26
  38. package/lib/projects/{index.d.ts → config.d.ts} +0 -12
  39. package/lib/projects/config.js +79 -0
  40. package/lib/projects/create.js +4 -5
  41. package/lib/projects/ensureProjectExists.d.ts +11 -0
  42. package/lib/projects/ensureProjectExists.js +97 -0
  43. package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
  44. package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +5 -6
  45. package/lib/{DevServerManagerV2.d.ts → projects/localDev/DevServerManagerV2.d.ts} +1 -1
  46. package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +3 -4
  47. package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
  48. package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +42 -76
  49. package/lib/{LocalDevManagerV2.d.ts → projects/localDev/LocalDevManagerV2.d.ts} +2 -2
  50. package/lib/{LocalDevManagerV2.js → projects/localDev/LocalDevManagerV2.js} +37 -70
  51. package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +2 -2
  52. package/lib/{localDev.js → projects/localDev/helpers.js} +51 -96
  53. package/lib/projects/ui.d.ts +1 -0
  54. package/lib/projects/ui.js +15 -0
  55. package/lib/projects/upload.js +9 -30
  56. package/lib/projects/urls.d.ts +1 -0
  57. package/lib/projects/urls.js +6 -0
  58. package/lib/projects/watch.js +18 -15
  59. package/lib/prompts/projectNamePrompt.js +2 -2
  60. package/package.json +2 -2
  61. package/lib/projects/index.js +0 -194
@@ -60,49 +60,56 @@ async function updateConfig(env, doesConfigExist, disableTracking, authType, acc
60
60
  return null;
61
61
  }
62
62
  }
63
- exports.describe = (0, lang_1.i18n)('commands.account.subcommands.auth.describe');
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
- if (globalConfigExists) {
72
- try {
73
- await (0, configMigrate_1.handleMerge)(providedAccountId);
74
- }
75
- catch (error) {
76
- (0, index_2.logError)(error);
77
- (0, usageTracking_2.trackCommandMetadataUsage)('account-auth', {
78
- command: 'hs account auth',
79
- type: 'Merge configs',
80
- successful: false,
81
- }, providedAccountId);
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
- else {
86
- try {
87
- await (0, configMigrate_1.handleMigration)(providedAccountId);
88
- }
89
- catch (error) {
90
- (0, index_2.logError)(error);
91
- (0, usageTracking_2.trackCommandMetadataUsage)('account-auth', {
92
- command: 'hs account auth',
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
- if (!disableTracking) {
101
- (0, usageTracking_1.trackCommandUsage)('account-auth', {}, providedAccountId);
102
- await (0, usageTracking_1.trackAuthAction)('account-auth', authType, TRACKING_STATUS.STARTED);
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
- const env = args.qa ? environments_1.ENVIRONMENTS.QA : environments_1.ENVIRONMENTS.PROD;
105
- const configAlreadyExists = (0, migrate_1.configFileExists)(true);
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, config_1.getConfigPath)('', true),
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: {
@@ -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 projects_2 = require("../../lib/projects");
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, projects_2.getIsInProject)()) {
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,
@@ -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 projects_1 = require("../../lib/projects");
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, projects_1.getProjectConfig)();
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 projects_1 = require("../../lib/projects");
20
+ const config_1 = require("../../lib/projects/config");
21
21
  const constants_1 = require("../../lib/constants");
22
- const projects_2 = require("@hubspot/local-dev-lib/api/projects");
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 config_1 = require("@hubspot/local-dev-lib/config");
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, config_1.getAccountConfig)(derivedAccountId);
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, projects_2.cloneApp)(derivedAccountId, appId);
73
- const { status } = await (0, polling_1.poll)(() => (0, projects_2.checkCloneStatus)(derivedAccountId, exportId));
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, projects_2.downloadClonedProject)(derivedAccountId, exportId);
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, projects_1.writeProjectConfig)(configPath, configContent);
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 projects_2 = require("../../lib/projects");
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, projects_2.getProjectConfig)();
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 localDev_1 = require("../../../lib/localDev");
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 projects_1 = require("../../../lib/projects");
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, localDev_1.hasSandboxes)(accountConfig);
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, localDev_1.checkIfAccountFlagIsSupported)(accountConfig, hasPublicApps);
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, localDev_1.checkIfDefaultAccountIsSupported)(accountConfig, hasPublicApps);
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, localDev_1.confirmDefaultAccountIsTarget)(accountConfig);
76
+ await (0, helpers_1.confirmDefaultAccountIsTarget)(accountConfig);
77
77
  if (hasPublicApps) {
78
- (0, localDev_1.checkIfParentAccountIsAuthed)(accountConfig);
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, localDev_1.suggestRecommendedNestedAccount)(accounts, accountConfig, hasPublicApps);
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, localDev_1.useExistingDevTestAccount)(env, notInConfigAccount);
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, localDev_1.createSandboxForLocalDev)(derivedAccountId, accountConfig, env);
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, localDev_1.createDeveloperTestAccountForLocalDev)(derivedAccountId, accountConfig, env);
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, projects_1.ensureProjectExists)(targetProjectAccountId, projectConfig.name, {
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, localDev_1.createNewProjectForLocalDev)(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
128
- deployedBuild = await (0, localDev_1.createInitialBuildForNewProject)(projectConfig, projectDir, targetProjectAccountId);
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 projects_1 = require("../../../lib/projects");
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, projects_1.getProjectConfig)();
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, projects_1.validateProjectConfig)(projectConfig, projectDir);
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 projects_1 = require("../../../lib/projects");
17
- const localDev_1 = require("../../../lib/localDev");
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, localDev_1.useExistingDevTestAccount)(env, devAccountPromptResponse.notInConfigAccount);
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, localDev_1.createDeveloperTestAccountForLocalDev)(targetProjectAccountId, accountConfig, env);
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, projects_1.ensureProjectExists)(targetProjectAccountId, projectConfig.name, {
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, localDev_1.createNewProjectForLocalDev)(projectConfig, targetProjectAccountId, false, false);
95
- deployedBuild = await (0, localDev_1.createInitialBuildForNewProject)(projectConfig, projectDir, targetProjectAccountId, true);
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 projects_2 = require("../../lib/projects");
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, projects_2.getProjectConfig)();
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 projects_1 = require("../../lib/projects");
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, projects_1.getProjectConfig)();
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 projects_2 = require("../../lib/projects");
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, projects_2.getProjectConfig)();
86
- (0, projects_2.validateProjectConfig)(projectConfig, projectDir);
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 projects_1 = require("../../lib/projects");
10
- const projects_2 = require("@hubspot/local-dev-lib/constants/projects");
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 } = projects_2.PLATFORM_VERSIONS;
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, projects_1.getProjectConfig)();
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
- ? projects_2.PLATFORM_VERSIONS.unstable
33
+ ? projects_1.PLATFORM_VERSIONS.unstable
34
34
  : platformVersion,
35
35
  }, projectConfig);
36
36
  }
@@ -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 projects_1 = require("../../lib/projects");
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, projects_1.getProjectConfig)();
25
+ const { projectConfig } = await (0, config_1.getProjectConfig)();
25
26
  let projectName = project;
26
27
  if (projectName) {
27
- const { projectExists } = await (0, projects_1.ensureProjectExists)(derivedAccountId, projectName, {
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 projects_1 = require("../../lib/projects");
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, projects_1.getProjectConfig)();
31
+ const { projectConfig, projectDir } = await (0, config_2.getProjectConfig)();
30
32
  (0, usageTracking_1.trackCommandUsage)('project-upload', { type: accountType }, derivedAccountId);
31
- (0, projects_1.validateProjectConfig)(projectConfig, projectDir);
32
- await (0, projects_1.ensureProjectExists)(derivedAccountId, projectConfig.name, {
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, projects_1.logFeedbackMessage)(result.buildId);
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 { ensureProjectExists, getProjectConfig, validateProjectConfig, logFeedbackMessage, } = require('../../lib/projects');
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 projects_1 = require("../../lib/projects");
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, projects_1.getProjectConfig)();
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);