@hubspot/cli 7.4.6-beta.0 → 7.4.7-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 (69) hide show
  1. package/commands/app/migrate.d.ts +2 -1
  2. package/commands/app/migrate.js +45 -41
  3. package/commands/cms/lighthouseScore.js +1 -1
  4. package/commands/project/migrate.js +9 -4
  5. package/commands/project/migrateApp.js +2 -1
  6. package/commands/project/upload.js +11 -6
  7. package/commands/project/watch.js +8 -3
  8. package/lang/en.d.ts +16 -11
  9. package/lang/en.js +16 -13
  10. package/lang/en.lyaml +0 -3
  11. package/lib/app/migrate.js +15 -16
  12. package/lib/buildAccount.js +4 -5
  13. package/lib/commonOpts.js +7 -8
  14. package/lib/configOptions.js +11 -10
  15. package/lib/doctor/Diagnosis.js +10 -11
  16. package/lib/doctor/Doctor.js +42 -47
  17. package/lib/errorHandlers/index.js +6 -7
  18. package/lib/errorHandlers/suppressError.js +6 -7
  19. package/lib/generateSelectors.js +1 -2
  20. package/lib/middleware/fireAlarmMiddleware.js +7 -21
  21. package/lib/oauth.js +1 -2
  22. package/lib/process.js +1 -2
  23. package/lib/projects/ProjectLogsManager.js +2 -2
  24. package/lib/projects/buildAndDeploy.js +17 -17
  25. package/lib/projects/config.js +8 -8
  26. package/lib/projects/create.js +4 -4
  27. package/lib/projects/ensureProjectExists.js +3 -3
  28. package/lib/projects/localDev/DevServerManager.js +2 -1
  29. package/lib/projects/localDev/LocalDevManager.js +26 -25
  30. package/lib/projects/localDev/LocalDevManagerV2.js +24 -23
  31. package/lib/projects/localDev/helpers.d.ts +1 -1
  32. package/lib/projects/localDev/helpers.js +46 -36
  33. package/lib/projects/ui.js +3 -3
  34. package/lib/projects/upload.d.ts +12 -1
  35. package/lib/projects/upload.js +14 -9
  36. package/lib/projects/watch.js +16 -16
  37. package/lib/prompts/accountNamePrompt.js +16 -13
  38. package/lib/prompts/accountsPrompt.js +1 -2
  39. package/lib/prompts/cmsFieldPrompt.js +1 -2
  40. package/lib/prompts/createApiSamplePrompt.js +4 -5
  41. package/lib/prompts/createFunctionPrompt.js +13 -14
  42. package/lib/prompts/createModulePrompt.js +8 -9
  43. package/lib/prompts/createProjectPrompt.js +9 -10
  44. package/lib/prompts/createTemplatePrompt.js +1 -2
  45. package/lib/prompts/downloadProjectPrompt.js +3 -4
  46. package/lib/prompts/installPublicAppPrompt.js +6 -5
  47. package/lib/prompts/personalAccessKeyPrompt.js +17 -18
  48. package/lib/prompts/previewPrompt.js +5 -6
  49. package/lib/prompts/projectAddPrompt.js +4 -5
  50. package/lib/prompts/projectDevTargetAccountPrompt.js +11 -12
  51. package/lib/prompts/projectNamePrompt.js +3 -4
  52. package/lib/prompts/projectsLogsPrompt.js +3 -2
  53. package/lib/prompts/sandboxesPrompt.js +5 -6
  54. package/lib/prompts/secretPrompt.js +2 -3
  55. package/lib/prompts/selectHubDBTablePrompt.js +11 -8
  56. package/lib/prompts/selectPublicAppPrompt.js +6 -7
  57. package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
  58. package/lib/prompts/uploadPrompt.js +4 -5
  59. package/lib/sandboxSync.js +15 -14
  60. package/lib/sandboxes.js +12 -13
  61. package/lib/serverlessLogs.js +4 -6
  62. package/lib/ui/boxen.d.ts +5 -0
  63. package/lib/ui/boxen.js +30 -0
  64. package/lib/ui/git.js +8 -9
  65. package/lib/ui/index.js +10 -16
  66. package/lib/ui/logger.d.ts +10 -0
  67. package/lib/ui/logger.js +15 -0
  68. package/lib/ui/serverlessFunctionLogs.js +2 -3
  69. package/package.json +1 -1
@@ -15,7 +15,6 @@ exports.createNewProjectForLocalDev = createNewProjectForLocalDev;
15
15
  exports.createInitialBuildForNewProject = createInitialBuildForNewProject;
16
16
  exports.getAccountHomeUrl = getAccountHomeUrl;
17
17
  exports.hasSandboxes = hasSandboxes;
18
- const logger_1 = require("@hubspot/local-dev-lib/logger");
19
18
  const config_1 = require("@hubspot/local-dev-lib/constants/config");
20
19
  const index_1 = require("@hubspot/local-dev-lib/errors/index");
21
20
  const urls_1 = require("@hubspot/local-dev-lib/urls");
@@ -42,17 +41,18 @@ const index_2 = require("../../errorHandlers/index");
42
41
  const buildAccount_1 = require("../../buildAccount");
43
42
  const accountNamePrompt_1 = require("../../prompts/accountNamePrompt");
44
43
  const en_1 = require("../../../lang/en");
44
+ const logger_1 = require("../../ui/logger");
45
45
  // If the user passed in the --account flag, confirm they want to use that account as
46
46
  // their target account, otherwise exit
47
47
  async function confirmDefaultAccountIsTarget(accountConfig) {
48
48
  if (!accountConfig.name || !accountConfig.accountType) {
49
- logger_1.logger.error(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget.configError);
49
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget.configError);
50
50
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
51
51
  }
52
- logger_1.logger.log();
52
+ logger_1.uiLogger.log('');
53
53
  const useDefaultAccount = await (0, projectDevTargetAccountPrompt_1.confirmDefaultAccountPrompt)(accountConfig.name, config_1.HUBSPOT_ACCOUNT_TYPE_STRINGS[accountConfig.accountType]);
54
54
  if (!useDefaultAccount) {
55
- logger_1.logger.log(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget
55
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget
56
56
  .declineDefaultAccountExplanation);
57
57
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
58
58
  }
@@ -64,18 +64,18 @@ async function checkIfDefaultAccountIsSupported(accountConfig, hasPublicApps) {
64
64
  !((0, accountTypes_1.isAppDeveloperAccount)(accountConfig) ||
65
65
  (0, accountTypes_1.isDeveloperTestAccount)(accountConfig) ||
66
66
  defaultAccountIsUnified)) {
67
- logger_1.logger.error(en_1.lib.localDevHelpers.checkIfDefaultAccountIsSupported.publicApp);
67
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.checkIfDefaultAccountIsSupported.publicApp);
68
68
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
69
69
  }
70
70
  else if (!hasPublicApps && (0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
71
- logger_1.logger.error(en_1.lib.localDevHelpers.checkIfDefaultAccountIsSupported.privateApp);
71
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.checkIfDefaultAccountIsSupported.privateApp);
72
72
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
73
73
  }
74
74
  }
75
75
  function checkIfParentAccountIsAuthed(accountConfig) {
76
76
  if (!accountConfig.parentAccountId ||
77
77
  !(0, config_2.getAccountConfig)(accountConfig.parentAccountId)) {
78
- logger_1.logger.error(en_1.lib.localDevHelpers.checkIfParentAccountIsAuthed.notAuthedError(accountConfig.parentAccountId || '', (0, ui_1.uiAccountDescription)((0, getAccountIdentifier_1.getAccountIdentifier)(accountConfig))));
78
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.checkIfParentAccountIsAuthed.notAuthedError(accountConfig.parentAccountId || '', (0, ui_1.uiAccountDescription)((0, getAccountIdentifier_1.getAccountIdentifier)(accountConfig))));
79
79
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
80
80
  }
81
81
  }
@@ -83,29 +83,29 @@ function checkIfParentAccountIsAuthed(accountConfig) {
83
83
  function checkIfAccountFlagIsSupported(accountConfig, hasPublicApps) {
84
84
  if (hasPublicApps) {
85
85
  if (!(0, accountTypes_1.isDeveloperTestAccount)(accountConfig)) {
86
- logger_1.logger.error(en_1.lib.localDevHelpers.validateAccountOption.invalidPublicAppAccount);
86
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.validateAccountOption.invalidPublicAppAccount);
87
87
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
88
88
  }
89
89
  checkIfParentAccountIsAuthed(accountConfig);
90
90
  }
91
91
  else if ((0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
92
- logger_1.logger.error(en_1.lib.localDevHelpers.validateAccountOption.invalidPrivateAppAccount);
92
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.validateAccountOption.invalidPrivateAppAccount);
93
93
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
94
94
  }
95
95
  }
96
96
  // If the user isn't using the recommended account type, prompt them to use or create one
97
97
  async function suggestRecommendedNestedAccount(accounts, accountConfig, hasPublicApps) {
98
- logger_1.logger.log();
98
+ logger_1.uiLogger.log('');
99
99
  (0, ui_1.uiLine)();
100
100
  if (hasPublicApps) {
101
- logger_1.logger.log(en_1.lib.localDevHelpers.validateAccountOption
101
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.validateAccountOption
102
102
  .publicAppNonDeveloperTestAccountWarning);
103
103
  }
104
104
  else {
105
- logger_1.logger.log(en_1.lib.localDevHelpers.validateAccountOption.nonSandboxWarning);
105
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.validateAccountOption.nonSandboxWarning);
106
106
  }
107
107
  (0, ui_1.uiLine)();
108
- logger_1.logger.log();
108
+ logger_1.uiLogger.log('');
109
109
  const targetAccountPrompt = hasPublicApps
110
110
  ? projectDevTargetAccountPrompt_1.selectDeveloperTestTargetAccountPrompt
111
111
  : projectDevTargetAccountPrompt_1.selectSandboxTargetAccountPrompt;
@@ -118,10 +118,10 @@ async function createSandboxForLocalDev(accountId, accountConfig, env) {
118
118
  }
119
119
  catch (err) {
120
120
  if ((0, index_1.isMissingScopeError)(err)) {
121
- logger_1.logger.error(en_1.lib.sandbox.create.developer.failure.scopes.message);
121
+ logger_1.uiLogger.error(en_1.lib.sandbox.create.developer.failure.scopes.message);
122
122
  const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
123
123
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
124
- logger_1.logger.info(en_1.lib.sandbox.create.developer.failure.scopes.instructions(accountConfig.name || accountId, url));
124
+ logger_1.uiLogger.info(en_1.lib.sandbox.create.developer.failure.scopes.instructions(accountConfig.name || accountId, url));
125
125
  }
126
126
  else {
127
127
  (0, index_2.logError)(err);
@@ -137,7 +137,7 @@ async function createSandboxForLocalDev(accountId, accountConfig, env) {
137
137
  const targetAccountId = result.sandbox.sandboxHubId;
138
138
  const sandboxAccountConfig = (0, config_2.getAccountConfig)(result.sandbox.sandboxHubId);
139
139
  if (!sandboxAccountConfig) {
140
- logger_1.logger.error(en_1.lib.sandbox.create.developer.failure.generic);
140
+ logger_1.uiLogger.error(en_1.lib.sandbox.create.developer.failure.generic);
141
141
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
142
142
  }
143
143
  const syncTasks = await (0, sandboxes_1.getAvailableSyncTypes)(accountConfig, sandboxAccountConfig);
@@ -165,10 +165,10 @@ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, e
165
165
  }
166
166
  catch (err) {
167
167
  if ((0, index_1.isMissingScopeError)(err)) {
168
- logger_1.logger.error(en_1.lib.developerTestAccount.create.failure.scopes.message);
168
+ logger_1.uiLogger.error(en_1.lib.developerTestAccount.create.failure.scopes.message);
169
169
  const websiteOrigin = (0, urls_1.getHubSpotWebsiteOrigin)(env);
170
170
  const url = `${websiteOrigin}/personal-access-key/${accountId}`;
171
- logger_1.logger.info(en_1.lib.developerTestAccount.create.failure.scopes.instructions(accountConfig.name || accountId, url));
171
+ logger_1.uiLogger.info(en_1.lib.developerTestAccount.create.failure.scopes.instructions(accountConfig.name || accountId, url));
172
172
  }
173
173
  else {
174
174
  (0, index_2.logError)(err);
@@ -193,14 +193,14 @@ async function createDeveloperTestAccountForLocalDev(accountId, accountConfig, e
193
193
  async function useExistingDevTestAccount(env, account) {
194
194
  const useExistingDevTestAcct = await (0, projectDevTargetAccountPrompt_1.confirmUseExistingDeveloperTestAccountPrompt)(account);
195
195
  if (!useExistingDevTestAcct) {
196
- logger_1.logger.log('');
197
- logger_1.logger.log(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget
196
+ logger_1.uiLogger.log('');
197
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.confirmDefaultAccountIsTarget
198
198
  .declineDefaultAccountExplanation);
199
- logger_1.logger.log('');
199
+ logger_1.uiLogger.log('');
200
200
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
201
201
  }
202
202
  const devTestAcctConfigName = await (0, buildAccount_1.saveAccountToConfig)(account.id, account.accountName, env);
203
- logger_1.logger.success(en_1.lib.developerTestAccount.create.success.configFileUpdated(devTestAcctConfigName, auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.name));
203
+ logger_1.uiLogger.success(en_1.lib.developerTestAccount.create.success.configFileUpdated(devTestAcctConfigName, auth_1.PERSONAL_ACCESS_KEY_AUTH_METHOD.name));
204
204
  }
205
205
  // Prompt the user to create a new project if one doesn't exist on their target account
206
206
  async function createNewProjectForLocalDev(projectConfig, targetAccountId, shouldCreateWithoutConfirmation, hasPublicApps) {
@@ -213,9 +213,9 @@ async function createNewProjectForLocalDev(projectConfig, targetAccountId, shoul
213
213
  : en_1.lib.localDevHelpers.createNewProjectForLocalDev
214
214
  .projectMustExistExplanation;
215
215
  const explanationString = explanationLangFunction((0, ui_1.uiAccountDescription)(targetAccountId), projectConfig.name);
216
- logger_1.logger.log();
216
+ logger_1.uiLogger.log('');
217
217
  (0, ui_1.uiLine)();
218
- logger_1.logger.log(explanationString);
218
+ logger_1.uiLogger.log(explanationString);
219
219
  (0, ui_1.uiLine)();
220
220
  shouldCreateProject = await (0, promptUtils_1.confirmPrompt)(en_1.lib.localDevHelpers.createNewProjectForLocalDev.createProject(projectConfig.name, (0, ui_1.uiAccountDescription)(targetAccountId)));
221
221
  }
@@ -233,35 +233,45 @@ async function createNewProjectForLocalDev(projectConfig, targetAccountId, shoul
233
233
  }
234
234
  catch (err) {
235
235
  SpinniesManager_1.default.fail('createProject');
236
- logger_1.logger.log(en_1.lib.localDevHelpers.createNewProjectForLocalDev.failedToCreateProject);
236
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.createNewProjectForLocalDev.failedToCreateProject);
237
237
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
238
238
  }
239
239
  }
240
240
  else {
241
241
  // We cannot continue if the project does not exist in the target account
242
- logger_1.logger.log();
243
- logger_1.logger.log(en_1.lib.localDevHelpers.createNewProjectForLocalDev.choseNotToCreateProject);
242
+ logger_1.uiLogger.log('');
243
+ logger_1.uiLogger.log(en_1.lib.localDevHelpers.createNewProjectForLocalDev.choseNotToCreateProject);
244
244
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
245
245
  }
246
246
  }
247
247
  function projectUploadCallback(accountId, projectConfig, tempFile, buildId) {
248
248
  if (!buildId) {
249
- logger_1.logger.error(en_1.lib.localDevHelpers.createInitialBuildForNewProject.genericError);
249
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.createInitialBuildForNewProject.genericError);
250
250
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
251
251
  }
252
252
  return (0, buildAndDeploy_1.pollProjectBuildAndDeploy)(accountId, projectConfig, tempFile, buildId, true);
253
253
  }
254
254
  // Create an initial build if the project was newly created in the account
255
255
  // Return the newly deployed build
256
- async function createInitialBuildForNewProject(projectConfig, projectDir, targetAccountId, sendIr) {
257
- const { result: initialUploadResult, uploadError } = await (0, upload_1.handleProjectUpload)(targetAccountId, projectConfig, projectDir, projectUploadCallback, en_1.lib.localDevHelpers.createInitialBuildForNewProject.initialUploadMessage, sendIr);
256
+ async function createInitialBuildForNewProject(projectConfig, projectDir, targetAccountId, sendIR) {
257
+ const { result: initialUploadResult, uploadError } = await (0, upload_1.handleProjectUpload)({
258
+ accountId: targetAccountId,
259
+ projectConfig,
260
+ projectDir,
261
+ callbackFunc: projectUploadCallback,
262
+ uploadMessage: en_1.lib.localDevHelpers.createInitialBuildForNewProject
263
+ .initialUploadMessage,
264
+ forceCreate: true,
265
+ skipValidation: true,
266
+ sendIR,
267
+ });
258
268
  if (uploadError) {
259
269
  if ((0, index_1.isSpecifiedError)(uploadError, {
260
270
  subCategory: constants_1.PROJECT_ERROR_TYPES.PROJECT_LOCKED,
261
271
  })) {
262
- logger_1.logger.log();
263
- logger_1.logger.error(en_1.lib.localDevHelpers.createInitialBuildForNewProject.projectLockedError);
264
- logger_1.logger.log();
272
+ logger_1.uiLogger.log('');
273
+ logger_1.uiLogger.error(en_1.lib.localDevHelpers.createInitialBuildForNewProject.projectLockedError);
274
+ logger_1.uiLogger.log('');
265
275
  }
266
276
  else {
267
277
  (0, index_2.logError)(uploadError, new index_2.ApiErrorContext({
@@ -282,11 +292,11 @@ async function createInitialBuildForNewProject(projectConfig, projectDir, target
282
292
  initialUploadResult.deployResult[constants_1.PROJECT_DEPLOY_TEXT.SUBTASK_KEY];
283
293
  }
284
294
  const failedSubTasks = subTasks.filter(task => task.status === 'FAILURE');
285
- logger_1.logger.log();
295
+ logger_1.uiLogger.log('');
286
296
  failedSubTasks.forEach(failedSubTask => {
287
- logger_1.logger.error(failedSubTask.errorMessage);
297
+ logger_1.uiLogger.error(failedSubTask.errorMessage);
288
298
  });
289
- logger_1.logger.log();
299
+ logger_1.uiLogger.log('');
290
300
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
291
301
  }
292
302
  return initialUploadResult.buildResult;
@@ -1,15 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.logFeedbackMessage = logFeedbackMessage;
4
- const logger_1 = require("@hubspot/local-dev-lib/logger");
4
+ const logger_1 = require("../ui/logger");
5
5
  const constants_1 = require("../constants");
6
6
  const ui_1 = require("../ui");
7
7
  const en_1 = require("../../lang/en");
8
8
  function logFeedbackMessage(buildId) {
9
9
  if (buildId > 0 && buildId % constants_1.FEEDBACK_INTERVAL === 0) {
10
10
  (0, ui_1.uiLine)();
11
- logger_1.logger.log(en_1.lib.projects.logFeedbackMessage.feedbackHeader);
11
+ logger_1.uiLogger.log(en_1.lib.projects.logFeedbackMessage.feedbackHeader);
12
12
  (0, ui_1.uiLine)();
13
- logger_1.logger.log(en_1.lib.projects.logFeedbackMessage.feedbackMessage);
13
+ logger_1.uiLogger.log(en_1.lib.projects.logFeedbackMessage.feedbackMessage);
14
14
  }
15
15
  }
@@ -5,5 +5,16 @@ type ProjectUploadResult<T> = {
5
5
  result?: T;
6
6
  uploadError?: unknown;
7
7
  };
8
- export declare function handleProjectUpload<T>(accountId: number, projectConfig: ProjectConfig, projectDir: string, callbackFunc: ProjectUploadCallbackFunction<T>, uploadMessage?: string, sendIR?: boolean, skipValidation?: boolean): Promise<ProjectUploadResult<T>>;
8
+ type HandleProjectUploadArg<T> = {
9
+ accountId: number;
10
+ projectConfig: ProjectConfig;
11
+ projectDir: string;
12
+ callbackFunc: ProjectUploadCallbackFunction<T>;
13
+ uploadMessage?: string;
14
+ forceCreate?: boolean;
15
+ isUploadCommand?: boolean;
16
+ sendIR?: boolean;
17
+ skipValidation?: boolean;
18
+ };
19
+ export declare function handleProjectUpload<T>({ accountId, projectConfig, projectDir, callbackFunc, uploadMessage, forceCreate, isUploadCommand, sendIR, skipValidation, }: HandleProjectUploadArg<T>): Promise<ProjectUploadResult<T>>;
9
20
  export {};
@@ -10,7 +10,6 @@ const fs_extra_1 = __importDefault(require("fs-extra"));
10
10
  const path_1 = __importDefault(require("path"));
11
11
  const projects_1 = require("@hubspot/local-dev-lib/api/projects");
12
12
  const ignoreRules_1 = require("@hubspot/local-dev-lib/ignoreRules");
13
- const logger_1 = require("@hubspot/local-dev-lib/logger");
14
13
  const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
15
14
  const ui_1 = require("../ui");
16
15
  const exitCodes_1 = require("../enums/exitCodes");
@@ -18,6 +17,8 @@ const project_parsing_lib_1 = require("@hubspot/project-parsing-lib");
18
17
  const errorHandlers_1 = require("../errorHandlers");
19
18
  const node_util_1 = __importDefault(require("node:util"));
20
19
  const en_1 = require("../../lang/en");
20
+ const ensureProjectExists_1 = require("./ensureProjectExists");
21
+ const logger_1 = require("../ui/logger");
21
22
  async function uploadProjectFiles(accountId, projectName, filePath, uploadMessage, platformVersion, intermediateRepresentation) {
22
23
  SpinniesManager_1.default.init({});
23
24
  const accountIdentifier = (0, ui_1.uiAccountDescription)(accountId);
@@ -34,7 +35,7 @@ async function uploadProjectFiles(accountId, projectName, filePath, uploadMessag
34
35
  text: en_1.lib.projectUpload.uploadProjectFiles.succeed(projectName, accountIdentifier),
35
36
  });
36
37
  if (buildId) {
37
- logger_1.logger.debug(en_1.lib.projectUpload.uploadProjectFiles.buildCreated(projectName, buildId));
38
+ logger_1.uiLogger.debug(en_1.lib.projectUpload.uploadProjectFiles.buildCreated(projectName, buildId));
38
39
  }
39
40
  }
40
41
  catch (err) {
@@ -45,19 +46,19 @@ async function uploadProjectFiles(accountId, projectName, filePath, uploadMessag
45
46
  }
46
47
  return { buildId, error };
47
48
  }
48
- async function handleProjectUpload(accountId, projectConfig, projectDir, callbackFunc, uploadMessage = '', sendIR = false, skipValidation = false) {
49
+ async function handleProjectUpload({ accountId, projectConfig, projectDir, callbackFunc, uploadMessage = '', forceCreate = false, isUploadCommand = false, sendIR = false, skipValidation = false, }) {
49
50
  const srcDir = path_1.default.resolve(projectDir, projectConfig.srcDir);
50
51
  const filenames = fs_extra_1.default.readdirSync(srcDir);
51
52
  if (!filenames || filenames.length === 0) {
52
- logger_1.logger.log(en_1.lib.projectUpload.handleProjectUpload.emptySource(projectConfig.srcDir));
53
+ logger_1.uiLogger.log(en_1.lib.projectUpload.handleProjectUpload.emptySource(projectConfig.srcDir));
53
54
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
54
55
  }
55
56
  const tempFile = tmp_1.default.fileSync({ postfix: '.zip' });
56
- logger_1.logger.debug(en_1.lib.projectUpload.handleProjectUpload.compressing(tempFile.name));
57
+ logger_1.uiLogger.debug(en_1.lib.projectUpload.handleProjectUpload.compressing(tempFile.name));
57
58
  const output = fs_extra_1.default.createWriteStream(tempFile.name);
58
59
  const archive = (0, archiver_1.default)('zip');
59
60
  const result = new Promise(resolve => output.on('close', async function () {
60
- logger_1.logger.debug(en_1.lib.projectUpload.handleProjectUpload.compressed(archive.pointer()));
61
+ logger_1.uiLogger.debug(en_1.lib.projectUpload.handleProjectUpload.compressed(archive.pointer()));
61
62
  let intermediateRepresentation;
62
63
  if (sendIR) {
63
64
  try {
@@ -66,11 +67,11 @@ async function handleProjectUpload(accountId, projectConfig, projectDir, callbac
66
67
  platformVersion: projectConfig.platformVersion,
67
68
  accountId,
68
69
  }, { skipValidation });
69
- logger_1.logger.debug(node_util_1.default.inspect(intermediateRepresentation, false, null, true));
70
+ logger_1.uiLogger.debug(node_util_1.default.inspect(intermediateRepresentation, false, null, true));
70
71
  }
71
72
  catch (e) {
72
73
  if ((0, project_parsing_lib_1.isTranslationError)(e)) {
73
- logger_1.logger.error(e.toString());
74
+ logger_1.uiLogger.error(e.toString());
74
75
  }
75
76
  else {
76
77
  (0, errorHandlers_1.logError)(e);
@@ -78,6 +79,10 @@ async function handleProjectUpload(accountId, projectConfig, projectDir, callbac
78
79
  return process.exit(exitCodes_1.EXIT_CODES.ERROR);
79
80
  }
80
81
  }
82
+ await (0, ensureProjectExists_1.ensureProjectExists)(accountId, projectConfig.name, {
83
+ forceCreate,
84
+ uploadCommand: isUploadCommand,
85
+ });
81
86
  const { buildId, error } = await uploadProjectFiles(accountId, projectConfig.name, tempFile.name, uploadMessage, projectConfig.platformVersion, intermediateRepresentation);
82
87
  if (error) {
83
88
  resolve({ uploadError: error });
@@ -94,7 +99,7 @@ async function handleProjectUpload(accountId, projectConfig, projectDir, callbac
94
99
  if (ignored) {
95
100
  const isNodeModule = file.name.includes('node_modules');
96
101
  if (!isNodeModule || !loggedIgnoredNodeModule) {
97
- logger_1.logger.debug(en_1.lib.projectUpload.handleProjectUpload.fileFiltered(file.name));
102
+ logger_1.uiLogger.debug(en_1.lib.projectUpload.handleProjectUpload.fileFiltered(file.name));
98
103
  }
99
104
  if (isNodeModule && !loggedIgnoredNodeModule) {
100
105
  loggedIgnoredNodeModule = true;
@@ -8,7 +8,6 @@ const chokidar_1 = __importDefault(require("chokidar"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const chalk_1 = __importDefault(require("chalk"));
10
10
  const p_queue_1 = __importDefault(require("p-queue"));
11
- const logger_1 = require("@hubspot/local-dev-lib/logger");
12
11
  const path_2 = require("@hubspot/local-dev-lib/path");
13
12
  const extensions_1 = require("@hubspot/local-dev-lib/constants/extensions");
14
13
  const ignoreRules_1 = require("@hubspot/local-dev-lib/ignoreRules");
@@ -17,6 +16,7 @@ const index_1 = require("@hubspot/local-dev-lib/errors/index");
17
16
  const errorHandlers_1 = require("../errorHandlers");
18
17
  const constants_1 = require("../constants");
19
18
  const en_1 = require("../../lang/en");
19
+ const logger_1 = require("../ui/logger");
20
20
  const queue = new p_queue_1.default({
21
21
  concurrency: 10,
22
22
  });
@@ -43,18 +43,18 @@ function debounceQueueBuild(accountId, projectName, platformVersion) {
43
43
  clearTimeout(timer);
44
44
  }
45
45
  timer = setTimeout(async () => {
46
- logger_1.logger.debug(en_1.commands.project.watch.debug.pause);
46
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.pause);
47
47
  queue.pause();
48
48
  await queue.onIdle();
49
49
  try {
50
50
  await (0, projects_1.queueBuild)(accountId, projectName, platformVersion);
51
- logger_1.logger.debug(en_1.commands.project.watch.debug.buildStarted);
51
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.buildStarted);
52
52
  }
53
53
  catch (err) {
54
54
  if ((0, index_1.isSpecifiedError)(err, {
55
55
  subCategory: constants_1.PROJECT_ERROR_TYPES.MISSING_PROJECT_PROVISION,
56
56
  })) {
57
- logger_1.logger.log(en_1.commands.project.watch.logs.watchCancelledFromUi);
57
+ logger_1.uiLogger.log(en_1.commands.project.watch.logs.watchCancelledFromUi);
58
58
  process.exit(0);
59
59
  }
60
60
  else {
@@ -68,24 +68,24 @@ function debounceQueueBuild(accountId, projectName, platformVersion) {
68
68
  await processStandByQueue(accountId, projectName, platformVersion);
69
69
  }
70
70
  queue.start();
71
- logger_1.logger.log(en_1.commands.project.watch.logs.resuming);
72
- logger_1.logger.log(`\n> Press ${chalk_1.default.bold('q')} to quit watching\n`);
71
+ logger_1.uiLogger.log(en_1.commands.project.watch.logs.resuming);
72
+ logger_1.uiLogger.log(`\n> Press ${chalk_1.default.bold('q')} to quit watching\n`);
73
73
  }, 2000);
74
74
  }
75
75
  async function queueFileOrFolder(accountId, projectName, platformVersion, filePath, remotePath, action) {
76
76
  if (action === 'upload' &&
77
77
  !(0, path_2.isAllowedExtension)(filePath, Array.from(extensions_1.JSR_ALLOWED_EXTENSIONS))) {
78
- logger_1.logger.debug(en_1.commands.project.watch.debug.extensionNotAllowed(filePath));
78
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.extensionNotAllowed(filePath));
79
79
  return;
80
80
  }
81
81
  if ((0, ignoreRules_1.shouldIgnoreFile)(filePath, true)) {
82
- logger_1.logger.debug(en_1.commands.project.watch.debug.ignored(filePath));
82
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.ignored(filePath));
83
83
  return;
84
84
  }
85
85
  if (!queue.isPaused) {
86
86
  debounceQueueBuild(accountId, projectName, platformVersion);
87
87
  }
88
- logger_1.logger.debug(en_1.commands.project.watch.debug.uploading(filePath, remotePath));
88
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.uploading(filePath, remotePath));
89
89
  return queue.add(async () => {
90
90
  try {
91
91
  if (action === 'upload') {
@@ -94,12 +94,12 @@ async function queueFileOrFolder(accountId, projectName, platformVersion, filePa
94
94
  else if (action === 'deleteFile' || action === 'deleteFolder') {
95
95
  await (0, projects_1.deleteFileFromBuild)(accountId, projectName, remotePath);
96
96
  }
97
- logger_1.logger.log(
97
+ logger_1.uiLogger.log(
98
98
  // @ts-expect-error
99
99
  en_1.commands.project.watch.logs[`${action}Succeeded`](remotePath, filePath));
100
100
  }
101
101
  catch (err) {
102
- logger_1.logger.debug(
102
+ logger_1.uiLogger.debug(
103
103
  // @ts-expect-error
104
104
  en_1.commands.project.watch.errors[`${action}Failed`](remotePath, filePath));
105
105
  }
@@ -107,7 +107,7 @@ async function queueFileOrFolder(accountId, projectName, platformVersion, filePa
107
107
  }
108
108
  async function createNewBuild(accountId, projectName, platformVersion) {
109
109
  try {
110
- logger_1.logger.debug(en_1.commands.project.watch.debug.attemptNewBuild);
110
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.attemptNewBuild);
111
111
  const { data: { buildId }, } = await (0, projects_1.provisionBuild)(accountId, projectName, platformVersion);
112
112
  return buildId;
113
113
  }
@@ -115,7 +115,7 @@ async function createNewBuild(accountId, projectName, platformVersion) {
115
115
  (0, errorHandlers_1.logError)(err, new errorHandlers_1.ApiErrorContext({ accountId }));
116
116
  if ((0, index_1.isSpecifiedError)(err, { subCategory: constants_1.PROJECT_ERROR_TYPES.PROJECT_LOCKED })) {
117
117
  await (0, projects_1.cancelStagedBuild)(accountId, projectName);
118
- logger_1.logger.log(en_1.commands.project.watch.logs.previousStagingBuildCancelled);
118
+ logger_1.uiLogger.log(en_1.commands.project.watch.logs.previousStagingBuildCancelled);
119
119
  }
120
120
  process.exit(1);
121
121
  }
@@ -124,7 +124,7 @@ async function handleWatchEvent(accountId, projectName, platformVersion, project
124
124
  const remotePath = path_1.default.relative(projectSourceDir, filePath);
125
125
  if (queue.isPaused) {
126
126
  if (standbyQueue.find(file => file.filePath === filePath)) {
127
- logger_1.logger.debug(en_1.commands.project.watch.debug.fileAlreadyQueued(filePath));
127
+ logger_1.uiLogger.debug(en_1.commands.project.watch.debug.fileAlreadyQueued(filePath));
128
128
  }
129
129
  else {
130
130
  standbyQueue.push({
@@ -148,8 +148,8 @@ async function createWatcher(accountId, projectConfig, projectDir, handleBuildSt
148
148
  ignored: file => (0, ignoreRules_1.shouldIgnoreFile)(file),
149
149
  });
150
150
  watcher.on('ready', async () => {
151
- logger_1.logger.log(en_1.commands.project.watch.logs.watching(projectDir));
152
- logger_1.logger.log(`\n> Press ${chalk_1.default.bold('q')} to quit watching\n`);
151
+ logger_1.uiLogger.log(en_1.commands.project.watch.logs.watching(projectDir));
152
+ logger_1.uiLogger.log(`\n> Press ${chalk_1.default.bold('q')} to quit watching\n`);
153
153
  });
154
154
  watcher.on('add', async (path) => {
155
155
  handleWatchEvent(accountId, projectConfig.name, projectConfig.platformVersion, projectSourceDir, path);
@@ -7,24 +7,25 @@ const config_1 = require("@hubspot/local-dev-lib/config");
7
7
  const promptUtils_1 = require("./promptUtils");
8
8
  const lang_1 = require("../lang");
9
9
  const config_2 = require("@hubspot/local-dev-lib/constants/config");
10
- const i18nKey = 'lib.prompts.accountNamePrompt';
11
10
  function getCliAccountNamePromptConfig(defaultName) {
12
11
  return {
13
12
  name: 'name',
14
- message: (0, lang_1.i18n)(`${i18nKey}.enterAccountName`),
13
+ message: (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.enterAccountName`),
15
14
  default: defaultName,
16
15
  validate(val) {
17
16
  if (typeof val !== 'string') {
18
- return (0, lang_1.i18n)(`${i18nKey}.errors.invalidName`);
17
+ return (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.invalidName`);
19
18
  }
20
19
  else if (!val.length) {
21
- return (0, lang_1.i18n)(`${i18nKey}.errors.nameRequired`);
20
+ return (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.nameRequired`);
22
21
  }
23
22
  else if (val.indexOf(' ') >= 0) {
24
- return (0, lang_1.i18n)(`${i18nKey}.errors.spacesInName`);
23
+ return (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.spacesInName`);
25
24
  }
26
25
  return (0, config_1.accountNameExistsInConfig)(val)
27
- ? (0, lang_1.i18n)(`${i18nKey}.errors.accountNameExists`, { name: val })
26
+ ? (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.accountNameExists`, {
27
+ name: val,
28
+ })
28
29
  : true;
29
30
  },
30
31
  };
@@ -41,12 +42,12 @@ function hubspotAccountNamePrompt({ accountType, currentPortalCount = 0, }) {
41
42
  let defaultName;
42
43
  if (isSandbox) {
43
44
  promptMessageString = isDevelopmentSandbox
44
- ? (0, lang_1.i18n)(`${i18nKey}.enterDevelopmentSandboxName`)
45
- : (0, lang_1.i18n)(`${i18nKey}.enterStandardSandboxName`);
45
+ ? (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.enterDevelopmentSandboxName`)
46
+ : (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.enterStandardSandboxName`);
46
47
  }
47
48
  else if (isDeveloperTestAccount) {
48
- promptMessageString = (0, lang_1.i18n)(`${i18nKey}.enterDeveloperTestAccountName`);
49
- defaultName = (0, lang_1.i18n)(`${i18nKey}.developerTestAccountDefaultName`, {
49
+ promptMessageString = (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.enterDeveloperTestAccountName`);
50
+ defaultName = (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.developerTestAccountDefaultName`, {
50
51
  count: currentPortalCount + 1,
51
52
  });
52
53
  }
@@ -56,13 +57,15 @@ function hubspotAccountNamePrompt({ accountType, currentPortalCount = 0, }) {
56
57
  message: promptMessageString,
57
58
  validate(val) {
58
59
  if (typeof val !== 'string') {
59
- return (0, lang_1.i18n)(`${i18nKey}.errors.invalidName`);
60
+ return (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.invalidName`);
60
61
  }
61
62
  else if (!val.trim().length) {
62
- return (0, lang_1.i18n)(`${i18nKey}.errors.nameRequired`);
63
+ return (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.nameRequired`);
63
64
  }
64
65
  return (0, config_1.accountNameExistsInConfig)(val)
65
- ? (0, lang_1.i18n)(`${i18nKey}.errors.accountNameExists`, { name: val })
66
+ ? (0, lang_1.i18n)(`lib.prompts.accountNamePrompt.errors.accountNameExists`, {
67
+ name: val,
68
+ })
66
69
  : true;
67
70
  },
68
71
  default: defaultName,
@@ -12,7 +12,6 @@ function mapAccountChoices(portals) {
12
12
  value: String(p.name || (0, getAccountIdentifier_1.getAccountIdentifier)(p)),
13
13
  })) || []);
14
14
  }
15
- const i18nKey = 'commands.account.subcommands.use';
16
15
  async function selectAccountFromConfig(prompt = '') {
17
16
  const accountsList = (0, config_1.getConfigAccounts)();
18
17
  const defaultAccount = (0, config_1.getConfigDefaultAccount)();
@@ -21,7 +20,7 @@ async function selectAccountFromConfig(prompt = '') {
21
20
  type: 'list',
22
21
  name: 'default',
23
22
  pageSize: 20,
24
- message: prompt || (0, lang_1.i18n)(`${i18nKey}.promptMessage`),
23
+ message: prompt || (0, lang_1.i18n)(`commands.account.subcommands.use.promptMessage`),
25
24
  choices: mapAccountChoices(accountsList),
26
25
  default: defaultAccount ?? undefined,
27
26
  },
@@ -9,7 +9,6 @@ const fs_1 = __importDefault(require("fs"));
9
9
  const promptUtils_1 = require("./promptUtils");
10
10
  const lang_1 = require("../lang");
11
11
  const escapeRegExp_1 = require("@hubspot/local-dev-lib/escapeRegExp");
12
- const i18nKey = 'lib.prompts.uploadPrompt';
13
12
  const FIELDS_FILES = ['fields.json', 'fields.js', 'fields.cjs', 'fields.mjs'];
14
13
  async function fieldsJsPrompt(filePath, projectDir, skipFiles = []) {
15
14
  const dirName = path_1.default.dirname(filePath);
@@ -33,7 +32,7 @@ async function fieldsJsPrompt(filePath, projectDir, skipFiles = []) {
33
32
  }));
34
33
  const promptVal = await (0, promptUtils_1.promptUser)([
35
34
  {
36
- message: (0, lang_1.i18n)(`${i18nKey}.fieldsPrompt`, { dir: fileDir }),
35
+ message: (0, lang_1.i18n)(`lib.prompts.uploadPrompt.fieldsPrompt`, { dir: fileDir }),
37
36
  type: 'list',
38
37
  name: 'filePathChoice',
39
38
  choices: selection,
@@ -3,12 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createApiSamplePrompt = createApiSamplePrompt;
4
4
  const promptUtils_1 = require("./promptUtils");
5
5
  const lang_1 = require("../lang");
6
- const i18nKey = 'lib.prompts.createApiSamplePrompt';
7
6
  function getSampleTypesPrompt(choices) {
8
7
  return {
9
8
  type: 'rawlist',
10
9
  name: 'sampleType',
11
- message: (0, lang_1.i18n)(`${i18nKey}.selectApiSampleApp`),
10
+ message: (0, lang_1.i18n)(`lib.prompts.createApiSamplePrompt.selectApiSampleApp`),
12
11
  choices: choices.map(choice => ({
13
12
  name: `${choice.name} - ${choice.description}`,
14
13
  value: choice.id,
@@ -19,7 +18,7 @@ function getSampleTypesPrompt(choices) {
19
18
  resolve(true);
20
19
  }
21
20
  else {
22
- reject((0, lang_1.i18n)(`${i18nKey}.errors.apiSampleAppRequired`));
21
+ reject((0, lang_1.i18n)(`lib.prompts.createApiSamplePrompt.errors.apiSampleAppRequired`));
23
22
  }
24
23
  });
25
24
  },
@@ -29,7 +28,7 @@ function getLanguagesPrompt(choices) {
29
28
  return {
30
29
  type: 'rawlist',
31
30
  name: 'sampleLanguage',
32
- message: (0, lang_1.i18n)(`${i18nKey}.selectLanguage`),
31
+ message: (0, lang_1.i18n)(`lib.prompts.createApiSamplePrompt.selectLanguage`),
33
32
  choices: choices.map(choice => ({
34
33
  name: choice,
35
34
  value: choice,
@@ -39,7 +38,7 @@ function getLanguagesPrompt(choices) {
39
38
  if (input && input.length > 0) {
40
39
  resolve(true);
41
40
  }
42
- reject((0, lang_1.i18n)(`${i18nKey}.errors.languageRequired`));
41
+ reject((0, lang_1.i18n)(`lib.prompts.createApiSamplePrompt.errors.languageRequired`));
43
42
  });
44
43
  },
45
44
  };