@hubspot/cli 7.4.8-experimental.0 → 7.4.8

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 (225) hide show
  1. package/api/migrate.d.ts +14 -4
  2. package/api/migrate.js +16 -2
  3. package/bin/cli.js +8 -183
  4. package/commands/account/auth.d.ts +10 -0
  5. package/commands/account/auth.js +188 -0
  6. package/commands/account/clean.js +38 -5
  7. package/commands/account/createOverride.d.ts +10 -0
  8. package/commands/account/createOverride.js +104 -0
  9. package/commands/account/info.js +38 -4
  10. package/commands/account/list.js +23 -5
  11. package/commands/account/remove.js +36 -2
  12. package/commands/account/removeOverride.d.ts +10 -0
  13. package/commands/account/removeOverride.js +76 -0
  14. package/commands/account/use.js +25 -3
  15. package/commands/account.js +7 -2
  16. package/commands/app/migrate.d.ts +6 -6
  17. package/commands/app/migrate.js +62 -45
  18. package/commands/app.js +0 -2
  19. package/commands/auth.js +15 -12
  20. package/commands/cms/lighthouseScore.js +7 -3
  21. package/commands/cms.js +1 -2
  22. package/commands/completion.js +2 -3
  23. package/commands/config/migrate.d.ts +10 -0
  24. package/commands/config/migrate.js +84 -0
  25. package/commands/config/set.d.ts +10 -0
  26. package/commands/config/set.js +34 -29
  27. package/commands/config.d.ts +4 -1
  28. package/commands/config.js +45 -11
  29. package/commands/create/api-sample.js +3 -1
  30. package/commands/create/website-theme.js +1 -1
  31. package/commands/create.js +7 -8
  32. package/commands/customObject/schema/delete.js +4 -1
  33. package/commands/customObject/schema/fetch-all.js +2 -1
  34. package/commands/customObject/schema/fetch.js +2 -1
  35. package/commands/customObject.js +3 -4
  36. package/commands/doctor.js +5 -6
  37. package/commands/feedback.js +7 -8
  38. package/commands/fetch.js +6 -7
  39. package/commands/filemanager.js +1 -2
  40. package/commands/function.js +1 -2
  41. package/commands/hubdb/clear.js +5 -6
  42. package/commands/hubdb/create.js +7 -8
  43. package/commands/hubdb/delete.js +8 -7
  44. package/commands/hubdb/fetch.js +4 -5
  45. package/commands/hubdb.js +1 -2
  46. package/commands/init.js +18 -20
  47. package/commands/lint.js +3 -4
  48. package/commands/list.js +5 -6
  49. package/commands/logs.js +12 -13
  50. package/commands/module/marketplace-validate.js +5 -6
  51. package/commands/module.js +1 -3
  52. package/commands/mv.js +4 -5
  53. package/commands/open.js +4 -5
  54. package/commands/project/add.d.ts +3 -7
  55. package/commands/project/add.js +28 -23
  56. package/commands/project/cloneApp.d.ts +6 -8
  57. package/commands/project/cloneApp.js +49 -45
  58. package/commands/project/create.d.ts +10 -1
  59. package/commands/project/create.js +85 -63
  60. package/commands/project/deploy.d.ts +3 -6
  61. package/commands/project/deploy.js +27 -25
  62. package/commands/project/dev/deprecatedFlow.js +32 -25
  63. package/commands/project/dev/index.d.ts +4 -2
  64. package/commands/project/dev/index.js +31 -18
  65. package/commands/project/dev/unifiedFlow.js +10 -11
  66. package/commands/project/download.d.ts +3 -7
  67. package/commands/project/download.js +18 -19
  68. package/commands/project/installDeps.d.ts +6 -1
  69. package/commands/project/installDeps.js +48 -32
  70. package/commands/project/listBuilds.d.ts +3 -7
  71. package/commands/project/listBuilds.js +32 -27
  72. package/commands/project/logs.d.ts +10 -1
  73. package/commands/project/logs.js +73 -65
  74. package/commands/project/migrate.d.ts +6 -0
  75. package/commands/project/migrate.js +71 -0
  76. package/commands/project/migrateApp.d.ts +3 -8
  77. package/commands/project/migrateApp.js +23 -20
  78. package/commands/project/open.d.ts +3 -7
  79. package/commands/project/open.js +29 -21
  80. package/commands/project/upload.d.ts +9 -1
  81. package/commands/project/upload.js +78 -54
  82. package/commands/project/watch.d.ts +6 -1
  83. package/commands/project/watch.js +95 -61
  84. package/commands/project.d.ts +3 -1
  85. package/commands/project.js +47 -35
  86. package/commands/remove.js +7 -5
  87. package/commands/sandbox/create.js +10 -11
  88. package/commands/sandbox/delete.js +18 -19
  89. package/commands/sandbox.js +1 -2
  90. package/commands/secret/addSecret.js +5 -6
  91. package/commands/secret/deleteSecret.js +12 -9
  92. package/commands/secret/listSecret.js +3 -4
  93. package/commands/secret/updateSecret.js +9 -8
  94. package/commands/secret.js +1 -2
  95. package/commands/theme/generate-selectors.js +5 -6
  96. package/commands/theme/marketplace-validate.js +5 -6
  97. package/commands/theme/preview.js +16 -16
  98. package/commands/theme.js +1 -2
  99. package/commands/upload.js +23 -24
  100. package/commands/watch.js +18 -19
  101. package/lang/en.d.ts +2806 -0
  102. package/lang/en.js +2659 -3300
  103. package/lang/en.lyaml +98 -41
  104. package/lib/accountTypes.d.ts +1 -0
  105. package/lib/accountTypes.js +12 -0
  106. package/lib/app/migrate.d.ts +10 -4
  107. package/lib/app/migrate.js +208 -94
  108. package/lib/app/migrate_legacy.d.ts +2 -2
  109. package/lib/app/migrate_legacy.js +10 -7
  110. package/lib/buildAccount.d.ts +1 -2
  111. package/lib/buildAccount.js +11 -10
  112. package/lib/commonOpts.d.ts +3 -4
  113. package/lib/commonOpts.js +46 -18
  114. package/lib/configMigrate.d.ts +2 -0
  115. package/lib/configMigrate.js +104 -0
  116. package/lib/configOptions.js +11 -10
  117. package/lib/constants.d.ts +4 -0
  118. package/lib/constants.js +5 -1
  119. package/lib/dependencyManagement.js +2 -2
  120. package/lib/doctor/Diagnosis.d.ts +1 -2
  121. package/lib/doctor/Diagnosis.js +19 -16
  122. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
  123. package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
  124. package/lib/doctor/Doctor.d.ts +1 -0
  125. package/lib/doctor/Doctor.js +57 -44
  126. package/lib/errorHandlers/index.js +6 -7
  127. package/lib/errorHandlers/suppressError.js +6 -7
  128. package/lib/generateSelectors.js +1 -2
  129. package/lib/hasFeature.d.ts +3 -1
  130. package/lib/middleware/__test__/configMiddleware.test.d.ts +1 -0
  131. package/lib/middleware/__test__/configMiddleware.test.js +194 -0
  132. package/lib/middleware/__test__/gitMiddleware.test.d.ts +1 -0
  133. package/lib/middleware/__test__/gitMiddleware.test.js +76 -0
  134. package/lib/middleware/__test__/notificationsMiddleware.test.d.ts +1 -0
  135. package/lib/middleware/__test__/notificationsMiddleware.test.js +10 -0
  136. package/lib/middleware/__test__/requestMiddleware.test.d.ts +1 -0
  137. package/lib/middleware/__test__/requestMiddleware.test.js +20 -0
  138. package/lib/middleware/__test__/utils.test.d.ts +1 -0
  139. package/lib/middleware/__test__/utils.test.js +53 -0
  140. package/lib/middleware/__test__/yargsChecksMiddleware.test.d.ts +1 -0
  141. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +81 -0
  142. package/lib/middleware/configMiddleware.d.ts +13 -0
  143. package/lib/middleware/configMiddleware.js +116 -0
  144. package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
  145. package/lib/middleware/fireAlarmMiddleware.js +123 -0
  146. package/lib/middleware/gitMiddleware.d.ts +2 -0
  147. package/lib/middleware/gitMiddleware.js +14 -0
  148. package/lib/middleware/notificationsMiddleware.d.ts +1 -0
  149. package/lib/middleware/notificationsMiddleware.js +38 -0
  150. package/lib/middleware/requestMiddleware.d.ts +1 -0
  151. package/lib/middleware/requestMiddleware.js +11 -0
  152. package/lib/middleware/utils.d.ts +8 -0
  153. package/lib/middleware/utils.js +17 -0
  154. package/lib/middleware/yargsChecksMiddleware.d.ts +4 -0
  155. package/lib/middleware/yargsChecksMiddleware.js +24 -0
  156. package/lib/oauth.js +1 -2
  157. package/lib/process.js +1 -2
  158. package/lib/projects/ProjectLogsManager.d.ts +1 -1
  159. package/lib/projects/ProjectLogsManager.js +16 -21
  160. package/lib/projects/buildAndDeploy.js +28 -39
  161. package/lib/projects/config.d.ts +9 -0
  162. package/lib/projects/config.js +79 -0
  163. package/lib/projects/create.js +5 -6
  164. package/lib/projects/ensureProjectExists.d.ts +11 -0
  165. package/lib/projects/ensureProjectExists.js +97 -0
  166. package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
  167. package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
  168. package/lib/{DevServerManagerV2.d.ts → projects/localDev/DevServerManagerV2.d.ts} +1 -1
  169. package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +3 -4
  170. package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
  171. package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +49 -82
  172. package/lib/{LocalDevManagerV2.d.ts → projects/localDev/LocalDevManagerV2.d.ts} +2 -2
  173. package/lib/{LocalDevManagerV2.js → projects/localDev/LocalDevManagerV2.js} +43 -75
  174. package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +5 -4
  175. package/lib/{localDev.js → projects/localDev/helpers.js} +97 -114
  176. package/lib/projects/ui.d.ts +1 -0
  177. package/lib/projects/ui.js +15 -0
  178. package/lib/projects/upload.d.ts +13 -2
  179. package/lib/projects/upload.js +18 -34
  180. package/lib/projects/urls.d.ts +1 -0
  181. package/lib/projects/urls.js +6 -0
  182. package/lib/projects/watch.d.ts +1 -1
  183. package/lib/projects/watch.js +21 -18
  184. package/lib/prompts/accountNamePrompt.js +16 -13
  185. package/lib/prompts/accountsPrompt.js +1 -2
  186. package/lib/prompts/cmsFieldPrompt.js +1 -2
  187. package/lib/prompts/createApiSamplePrompt.js +4 -5
  188. package/lib/prompts/createFunctionPrompt.js +13 -14
  189. package/lib/prompts/createModulePrompt.js +8 -9
  190. package/lib/prompts/createProjectPrompt.d.ts +11 -4
  191. package/lib/prompts/createProjectPrompt.js +14 -9
  192. package/lib/prompts/createTemplatePrompt.js +1 -2
  193. package/lib/prompts/downloadProjectPrompt.js +3 -4
  194. package/lib/prompts/installPublicAppPrompt.js +6 -5
  195. package/lib/prompts/personalAccessKeyPrompt.js +17 -18
  196. package/lib/prompts/previewPrompt.js +5 -6
  197. package/lib/prompts/projectAddPrompt.js +4 -5
  198. package/lib/prompts/projectDevTargetAccountPrompt.js +11 -12
  199. package/lib/prompts/projectNamePrompt.js +5 -6
  200. package/lib/prompts/projectsLogsPrompt.js +3 -2
  201. package/lib/prompts/promptUtils.d.ts +1 -1
  202. package/lib/prompts/sandboxesPrompt.js +5 -6
  203. package/lib/prompts/secretPrompt.js +2 -3
  204. package/lib/prompts/selectHubDBTablePrompt.js +11 -8
  205. package/lib/prompts/selectPublicAppPrompt.js +6 -7
  206. package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
  207. package/lib/prompts/uploadPrompt.js +4 -5
  208. package/lib/sandboxSync.js +15 -14
  209. package/lib/sandboxes.js +12 -13
  210. package/lib/serverlessLogs.js +4 -6
  211. package/lib/ui/SpinniesManager.d.ts +1 -1
  212. package/lib/ui/boxen.d.ts +5 -0
  213. package/lib/ui/boxen.js +30 -0
  214. package/lib/ui/git.js +8 -9
  215. package/lib/ui/index.d.ts +4 -2
  216. package/lib/ui/index.js +16 -16
  217. package/lib/ui/logger.d.ts +10 -0
  218. package/lib/ui/logger.js +15 -0
  219. package/lib/ui/serverlessFunctionLogs.js +2 -3
  220. package/lib/ui/spinniesUtils.d.ts +5 -5
  221. package/lib/yargsUtils.d.ts +1 -1
  222. package/package.json +7 -6
  223. package/types/Yargs.d.ts +5 -11
  224. package/lib/projects/index.d.ts +0 -20
  225. package/lib/projects/index.js +0 -194
package/api/migrate.d.ts CHANGED
@@ -10,10 +10,14 @@ interface BaseMigrationApp {
10
10
  }
11
11
  export interface MigratableApp extends BaseMigrationApp {
12
12
  isMigratable: true;
13
+ unmigratableReason?: undefined;
13
14
  }
15
+ export declare const CLI_UNMIGRATABLE_REASONS: {
16
+ readonly PART_OF_PROJECT_ALREADY: "PART_OF_PROJECT_ALREADY";
17
+ };
14
18
  export interface UnmigratableApp extends BaseMigrationApp {
15
19
  isMigratable: false;
16
- unmigratableReason: keyof typeof UNMIGRATABLE_REASONS;
20
+ unmigratableReason: keyof typeof UNMIGRATABLE_REASONS | keyof typeof CLI_UNMIGRATABLE_REASONS;
17
21
  }
18
22
  export type MigrationApp = MigratableApp | UnmigratableApp;
19
23
  export interface ListAppsResponse {
@@ -48,13 +52,19 @@ export interface MigrationSuccess extends MigrationBaseStatus {
48
52
  status: typeof MIGRATION_STATUS.SUCCESS;
49
53
  buildId: number;
50
54
  }
55
+ interface ComponentError {
56
+ componentType: string;
57
+ developerSymbol?: string;
58
+ errorMessage: string;
59
+ }
51
60
  export interface MigrationFailed extends MigrationBaseStatus {
52
61
  status: typeof MIGRATION_STATUS.FAILURE;
53
- projectErrorsDetail?: string;
54
- componentErrorDetails: Record<string, string>;
62
+ projectErrorDetail: string;
63
+ componentErrors: ComponentError[];
55
64
  }
56
65
  export type MigrationStatus = MigrationInProgress | MigrationInputRequired | MigrationSuccess | MigrationFailed;
57
- export declare function listAppsForMigration(accountId: number): HubSpotPromise<ListAppsResponse>;
66
+ export declare function isMigrationStatus(error: unknown): error is MigrationStatus;
67
+ export declare function listAppsForMigration(accountId: number, platformVersion: string): HubSpotPromise<ListAppsResponse>;
58
68
  export declare function initializeMigration(accountId: number, applicationId: number, platformVersion: string): HubSpotPromise<InitializeMigrationResponse>;
59
69
  export declare function continueMigration(portalId: number, migrationId: number, componentUids: Record<string, string>, projectName: string): HubSpotPromise<ContinueMigrationResponse>;
60
70
  export declare function checkMigrationStatusV2(accountId: number, id: number): HubSpotPromise<MigrationStatus>;
package/api/migrate.js CHANGED
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLI_UNMIGRATABLE_REASONS = void 0;
4
+ exports.isMigrationStatus = isMigrationStatus;
3
5
  exports.listAppsForMigration = listAppsForMigration;
4
6
  exports.initializeMigration = initializeMigration;
5
7
  exports.continueMigration = continueMigration;
@@ -7,9 +9,21 @@ exports.checkMigrationStatusV2 = checkMigrationStatusV2;
7
9
  const projects_1 = require("@hubspot/local-dev-lib/constants/projects");
8
10
  const http_1 = require("@hubspot/local-dev-lib/http");
9
11
  const MIGRATIONS_API_PATH_V2 = 'dfs/migrations/v2';
10
- async function listAppsForMigration(accountId) {
12
+ exports.CLI_UNMIGRATABLE_REASONS = {
13
+ PART_OF_PROJECT_ALREADY: 'PART_OF_PROJECT_ALREADY',
14
+ };
15
+ function isMigrationStatus(error) {
16
+ return (typeof error === 'object' &&
17
+ error !== null &&
18
+ 'id' in error &&
19
+ 'status' in error);
20
+ }
21
+ async function listAppsForMigration(accountId, platformVersion) {
11
22
  return http_1.http.get(accountId, {
12
23
  url: `${MIGRATIONS_API_PATH_V2}/list-apps`,
24
+ params: {
25
+ platformVersion: mapPlatformVersionToEnum(platformVersion),
26
+ },
13
27
  });
14
28
  }
15
29
  function mapPlatformVersionToEnum(platformVersion) {
@@ -37,7 +51,7 @@ async function continueMigration(portalId, migrationId, componentUids, projectNa
37
51
  },
38
52
  });
39
53
  }
40
- function checkMigrationStatusV2(accountId, id) {
54
+ async function checkMigrationStatusV2(accountId, id) {
41
55
  return http_1.http.get(accountId, {
42
56
  url: `${MIGRATIONS_API_PATH_V2}/migrations/${id}/status`,
43
57
  });
package/bin/cli.js CHANGED
@@ -1,21 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  const yargs = require('yargs');
4
- const updateNotifier = require('update-notifier');
5
- const chalk = require('chalk');
6
4
  const { logger } = require('@hubspot/local-dev-lib/logger');
7
- const { addUserAgentHeader } = require('@hubspot/local-dev-lib/http');
8
- const { loadConfig, getAccountId, configFileExists, getConfigPath, validateConfig, } = require('@hubspot/local-dev-lib/config');
9
5
  const { logError } = require('../lib/errorHandlers/index');
10
6
  const { setLogLevel, getCommandName } = require('../lib/commonOpts');
11
- const { validateAccount } = require('../lib/validation');
12
7
  const { trackHelpUsage, trackConvertFieldsUsage, } = require('../lib/usageTracking');
13
- const { getIsInProject } = require('../lib/projects');
14
- const pkg = require('../package.json');
15
- const { i18n } = require('../lib/lang');
16
8
  const { EXIT_CODES } = require('../lib/enums/exitCodes');
17
- const { UI_COLORS, uiCommandReference, uiDeprecatedTag } = require('../lib/ui');
18
- const { checkAndWarnGitInclusion } = require('../lib/ui/git');
9
+ const { loadConfigMiddleware, injectAccountIdMiddleware, validateAccountOptions, handleDeprecatedEnvVariables, } = require('../lib/middleware/configMiddleware');
10
+ const { notifyAboutUpdates, } = require('../lib/middleware/notificationsMiddleware');
11
+ const { checkAndWarnGitInclusionMiddleware, } = require('../lib/middleware/gitMiddleware');
12
+ const { performChecks } = require('../lib/middleware/yargsChecksMiddleware');
13
+ const { setRequestHeaders } = require('../lib/middleware/requestMiddleware');
14
+ const { checkFireAlarms } = require('../lib/middleware/fireAlarmMiddleware');
19
15
  const removeCommand = require('../commands/remove');
20
16
  const initCommand = require('../commands/init');
21
17
  const logsCommand = require('../commands/logs');
@@ -44,33 +40,7 @@ const feedbackCommand = require('../commands/feedback');
44
40
  const doctorCommand = require('../commands/doctor');
45
41
  const completionCommand = require('../commands/completion');
46
42
  const appCommand = require('../commands/app');
47
- const notifier = updateNotifier({
48
- pkg: { ...pkg, name: '@hubspot/cli' },
49
- distTag: 'latest',
50
- shouldNotifyInNpmScript: true,
51
- });
52
- const CMS_CLI_PACKAGE_NAME = '@hubspot/cms-cli';
53
- notifier.notify({
54
- message: pkg.name === CMS_CLI_PACKAGE_NAME
55
- ? i18n(`commands.generalErrors.updateNotify.cmsUpdateNotification`, {
56
- packageName: CMS_CLI_PACKAGE_NAME,
57
- updateCommand: uiCommandReference('{updateCommand}'),
58
- })
59
- : i18n(`commands.generalErrors.updateNotify.cliUpdateNotification`, {
60
- updateCommand: uiCommandReference('{updateCommand}'),
61
- }),
62
- defer: false,
63
- boxenOptions: {
64
- borderColor: UI_COLORS.MARIGOLD_DARK,
65
- margin: 1,
66
- padding: 1,
67
- textAlignment: 'center',
68
- borderStyle: 'round',
69
- title: pkg.name === CMS_CLI_PACKAGE_NAME
70
- ? null
71
- : chalk.bold(i18n(`commands.generalErrors.updateNotify.notifyTitle`)),
72
- },
73
- });
43
+ notifyAboutUpdates();
74
44
  const getTerminalWidth = () => {
75
45
  const width = yargs.terminalWidth();
76
46
  if (width >= 100)
@@ -92,152 +62,6 @@ const handleFailure = (msg, err, yargs) => {
92
62
  process.exit(EXIT_CODES.ERROR);
93
63
  }
94
64
  };
95
- const performChecks = argv => {
96
- // "hs config set default-account" has moved to "hs accounts use"
97
- if (argv._[0] === 'config' &&
98
- argv._[1] === 'set' &&
99
- argv._[2] === 'default-account') {
100
- logger.error(i18n(`commands.generalErrors.setDefaultAccountMoved`));
101
- process.exit(EXIT_CODES.ERROR);
102
- }
103
- // Require "project" command when running upload/watch inside of a project
104
- if (argv._.length === 1 && ['upload', 'watch'].includes(argv._[0])) {
105
- if (getIsInProject(argv.src)) {
106
- logger.error(i18n(`commands.generalErrors.srcIsProject`, {
107
- src: argv.src || './',
108
- command: argv._.join(' '),
109
- }));
110
- process.exit(EXIT_CODES.ERROR);
111
- }
112
- else {
113
- return true;
114
- }
115
- }
116
- else {
117
- return true;
118
- }
119
- };
120
- const setRequestHeaders = () => {
121
- addUserAgentHeader('HubSpot CLI', pkg.version);
122
- };
123
- const isTargetedCommand = (options, commandMap) => {
124
- const checkCommand = (options, commandMap) => {
125
- const currentCommand = options._[0];
126
- if (!commandMap[currentCommand]) {
127
- return false;
128
- }
129
- if (commandMap[currentCommand].target) {
130
- return true;
131
- }
132
- const subCommands = commandMap[currentCommand].subCommands || {};
133
- if (options._.length > 1) {
134
- return checkCommand({ _: options._.slice(1) }, subCommands);
135
- }
136
- return false;
137
- };
138
- return checkCommand(options, commandMap);
139
- };
140
- const SKIP_CONFIG_VALIDATION = {
141
- init: { target: true },
142
- auth: { target: true },
143
- };
144
- const handleDeprecatedEnvVariables = options => {
145
- // HUBSPOT_PORTAL_ID is deprecated, but we'll still support it for now
146
- // The HubSpot GH Deploy Action still uses HUBSPOT_PORTAL_ID
147
- if (options.useEnv &&
148
- process.env.HUBSPOT_PORTAL_ID &&
149
- !process.env.HUBSPOT_ACCOUNT_ID) {
150
- uiDeprecatedTag(i18n(`commands.generalErrors.handleDeprecatedEnvVariables.portalEnvVarDeprecated`, {
151
- configPath: getConfigPath(),
152
- }));
153
- process.env.HUBSPOT_ACCOUNT_ID = process.env.HUBSPOT_PORTAL_ID;
154
- }
155
- };
156
- /**
157
- * Auto-injects the derivedAccountId flag into all commands
158
- */
159
- const injectAccountIdMiddleware = async (options) => {
160
- const { account } = options;
161
- // Preserves the original --account flag for certain commands.
162
- options.providedAccountId = account;
163
- if (options.useEnv && process.env.HUBSPOT_ACCOUNT_ID) {
164
- options.derivedAccountId = parseInt(process.env.HUBSPOT_ACCOUNT_ID, 10);
165
- }
166
- else {
167
- options.derivedAccountId = getAccountId(account);
168
- }
169
- };
170
- const loadConfigMiddleware = async (options) => {
171
- // Skip this when no command is provided
172
- if (!options._.length) {
173
- return;
174
- }
175
- const maybeValidateConfig = () => {
176
- if (!isTargetedCommand(options, SKIP_CONFIG_VALIDATION) &&
177
- !validateConfig()) {
178
- process.exit(EXIT_CODES.ERROR);
179
- }
180
- };
181
- if (configFileExists(true) && options.config) {
182
- logger.error(i18n(`commands.generalErrors.loadConfigMiddleware.configFileExists`, {
183
- configPath: getConfigPath(),
184
- }));
185
- process.exit(EXIT_CODES.ERROR);
186
- }
187
- else if (!isTargetedCommand(options, { init: { target: true } })) {
188
- const { config: configPath } = options;
189
- const config = loadConfig(configPath, options);
190
- // We don't run validateConfig() for auth because users should be able to run it when
191
- // no accounts are configured, but we still want to exit if the config file is not found
192
- if (isTargetedCommand(options, { auth: { target: true } }) && !config) {
193
- process.exit(EXIT_CODES.ERROR);
194
- }
195
- }
196
- maybeValidateConfig();
197
- };
198
- const checkAndWarnGitInclusionMiddleware = options => {
199
- // Skip this when no command is provided
200
- if (!options._.length) {
201
- return;
202
- }
203
- checkAndWarnGitInclusion(getConfigPath());
204
- };
205
- const accountsSubCommands = {
206
- target: false,
207
- subCommands: {
208
- clean: { target: true },
209
- list: { target: true },
210
- ls: { target: true },
211
- remove: { target: true },
212
- },
213
- };
214
- const sandboxesSubCommands = {
215
- target: false,
216
- subCommands: {
217
- delete: { target: true },
218
- },
219
- };
220
- const SKIP_ACCOUNT_VALIDATION = {
221
- init: { target: true },
222
- auth: { target: true },
223
- account: accountsSubCommands,
224
- accounts: accountsSubCommands,
225
- sandbox: sandboxesSubCommands,
226
- sandboxes: sandboxesSubCommands,
227
- };
228
- const validateAccountOptions = async (options) => {
229
- // Skip this when no command is provided
230
- if (!options._.length) {
231
- return;
232
- }
233
- let validAccount = true;
234
- if (!isTargetedCommand(options, SKIP_ACCOUNT_VALIDATION)) {
235
- validAccount = await validateAccount(options);
236
- }
237
- if (!validAccount) {
238
- process.exit(EXIT_CODES.ERROR);
239
- }
240
- };
241
65
  const argv = yargs
242
66
  .usage('The command line interface to interact with HubSpot.')
243
67
  // loadConfigMiddleware loads the new hidden config for all commands
@@ -249,6 +73,7 @@ const argv = yargs
249
73
  injectAccountIdMiddleware,
250
74
  checkAndWarnGitInclusionMiddleware,
251
75
  validateAccountOptions,
76
+ checkFireAlarms,
252
77
  ])
253
78
  .exitProcess(false)
254
79
  .fail(handleFailure)
@@ -0,0 +1,10 @@
1
+ import { Argv, ArgumentsCamelCase } from 'yargs';
2
+ import { CommonArgs, ConfigArgs } from '../../types/Yargs';
3
+ export declare const describe: string;
4
+ export declare const command = "auth";
5
+ type AccountAuthArgs = CommonArgs & ConfigArgs & {
6
+ disableTracking?: boolean;
7
+ };
8
+ export declare function handler(args: ArgumentsCamelCase<AccountAuthArgs>): Promise<void>;
9
+ export declare function builder(yargs: Argv): Argv<AccountAuthArgs>;
10
+ export {};
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.command = exports.describe = void 0;
4
+ exports.handler = handler;
5
+ exports.builder = builder;
6
+ const config_1 = require("@hubspot/local-dev-lib/config");
7
+ const migrate_1 = require("@hubspot/local-dev-lib/config/migrate");
8
+ const getAccountIdentifier_1 = require("@hubspot/local-dev-lib/config/getAccountIdentifier");
9
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
10
+ const personalAccessKey_1 = require("@hubspot/local-dev-lib/personalAccessKey");
11
+ const environments_1 = require("@hubspot/local-dev-lib/constants/environments");
12
+ const text_1 = require("@hubspot/local-dev-lib/text");
13
+ const auth_1 = require("@hubspot/local-dev-lib/constants/auth");
14
+ const commonOpts_1 = require("../../lib/commonOpts");
15
+ const configMigrate_1 = require("../../lib/configMigrate");
16
+ const process_1 = require("../../lib/process");
17
+ const index_1 = require("../../lib/errorHandlers/index");
18
+ const lang_1 = require("../../lib/lang");
19
+ const usageTracking_1 = require("../../lib/usageTracking");
20
+ const personalAccessKeyPrompt_1 = require("../../lib/prompts/personalAccessKeyPrompt");
21
+ const accountNamePrompt_1 = require("../../lib/prompts/accountNamePrompt");
22
+ const setAsDefaultAccountPrompt_1 = require("../../lib/prompts/setAsDefaultAccountPrompt");
23
+ const index_2 = require("../../lib/errorHandlers/index");
24
+ const usageTracking_2 = require("../../lib/usageTracking");
25
+ const exitCodes_1 = require("../../lib/enums/exitCodes");
26
+ const ui_1 = require("../../lib/ui");
27
+ const TRACKING_STATUS = {
28
+ STARTED: 'started',
29
+ ERROR: 'error',
30
+ COMPLETE: 'complete',
31
+ };
32
+ async function updateConfig(env, doesConfigExist, disableTracking, authType, account) {
33
+ try {
34
+ const { personalAccessKey } = await (0, personalAccessKeyPrompt_1.personalAccessKeyPrompt)({
35
+ env,
36
+ account,
37
+ });
38
+ const token = await (0, personalAccessKey_1.getAccessToken)(personalAccessKey, env);
39
+ const defaultName = token.hubName ? (0, text_1.toKebabCase)(token.hubName) : undefined;
40
+ const name = doesConfigExist
41
+ ? undefined
42
+ : (await (0, accountNamePrompt_1.cliAccountNamePrompt)(defaultName)).name;
43
+ const updatedConfig = await (0, personalAccessKey_1.updateConfigWithAccessToken)(token, personalAccessKey, env, name, !doesConfigExist);
44
+ if (!updatedConfig)
45
+ return null;
46
+ if (doesConfigExist && !updatedConfig.name) {
47
+ updatedConfig.name = (await (0, accountNamePrompt_1.cliAccountNamePrompt)(defaultName)).name;
48
+ (0, config_1.updateAccountConfig)({
49
+ ...updatedConfig,
50
+ });
51
+ (0, config_1.writeConfig)();
52
+ }
53
+ return updatedConfig;
54
+ }
55
+ catch (e) {
56
+ if (!disableTracking) {
57
+ await (0, usageTracking_1.trackAuthAction)('account-auth', authType, TRACKING_STATUS.ERROR);
58
+ }
59
+ (0, index_1.debugError)(e);
60
+ return null;
61
+ }
62
+ }
63
+ async function handleConfigMigration(providedAccountId) {
64
+ const deprecatedConfigExists = (0, migrate_1.configFileExists)(false);
65
+ const globalConfigExists = (0, migrate_1.configFileExists)(true);
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);
78
+ }
79
+ return mergeConfirmed;
80
+ }
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);
89
+ }
90
+ }
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;
101
+ }
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) {
113
+ if (!configAlreadyExists) {
114
+ (0, config_1.createEmptyConfigFile)({}, true);
115
+ }
116
+ (0, config_1.loadConfig)('');
117
+ (0, process_1.handleExit)(config_1.deleteEmptyConfigFile);
118
+ const updatedConfig = await updateConfig(env, configAlreadyExists, disableTracking, authType, providedAccountId);
119
+ if (!updatedConfig) {
120
+ logger_1.logger.error((0, lang_1.i18n)('commands.account.subcommands.auth.errors.failedToUpdateConfig'));
121
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
122
+ }
123
+ const { name } = updatedConfig;
124
+ const accountId = (0, getAccountIdentifier_1.getAccountIdentifier)(updatedConfig);
125
+ if (!configAlreadyExists) {
126
+ logger_1.logger.log('');
127
+ logger_1.logger.success((0, lang_1.i18n)('commands.account.subcommands.auth.success.configFileCreated', {
128
+ configPath: (0, migrate_1.getConfigPath)('', true),
129
+ }));
130
+ logger_1.logger.success((0, lang_1.i18n)('commands.account.subcommands.auth.success.configFileUpdated', {
131
+ account: name || accountId?.toString() || '',
132
+ }));
133
+ }
134
+ else {
135
+ const setAsDefault = await (0, setAsDefaultAccountPrompt_1.setAsDefaultAccountPrompt)(name);
136
+ logger_1.logger.log('');
137
+ if (setAsDefault) {
138
+ logger_1.logger.success((0, lang_1.i18n)(`lib.prompts.setAsDefaultAccountPrompt.setAsDefaultAccount`, {
139
+ accountName: name,
140
+ }));
141
+ }
142
+ else {
143
+ logger_1.logger.info((0, lang_1.i18n)(`lib.prompts.setAsDefaultAccountPrompt.keepingCurrentDefault`, {
144
+ accountName: (0, config_1.getConfigDefaultAccount)(),
145
+ }));
146
+ }
147
+ }
148
+ (0, ui_1.uiFeatureHighlight)([
149
+ 'helpCommand',
150
+ 'accountAuthCommand',
151
+ 'accountsListCommand',
152
+ ]);
153
+ if (!disableTracking) {
154
+ await (0, usageTracking_1.trackAuthAction)('account-auth', authType, TRACKING_STATUS.COMPLETE, accountId);
155
+ }
156
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
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
+ }
172
+ function builder(yargs) {
173
+ yargs.options({
174
+ account: {
175
+ describe: (0, lang_1.i18n)('commands.account.subcommands.auth.options.account.describe'),
176
+ type: 'string',
177
+ alias: 'a',
178
+ },
179
+ 'disable-tracking': {
180
+ type: 'boolean',
181
+ hidden: true,
182
+ default: false,
183
+ },
184
+ });
185
+ (0, commonOpts_1.addTestingOptions)(yargs);
186
+ (0, commonOpts_1.addGlobalOptions)(yargs);
187
+ return yargs;
188
+ }
@@ -6,19 +6,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.describe = exports.command = void 0;
7
7
  exports.handler = handler;
8
8
  exports.builder = builder;
9
+ const fs_1 = __importDefault(require("fs"));
9
10
  const logger_1 = require("@hubspot/local-dev-lib/logger");
10
11
  const personalAccessKey_1 = require("@hubspot/local-dev-lib/personalAccessKey");
11
12
  const config_1 = require("@hubspot/local-dev-lib/config");
12
13
  const getAccountIdentifier_1 = require("@hubspot/local-dev-lib/config/getAccountIdentifier");
13
14
  const index_1 = require("@hubspot/local-dev-lib/errors/index");
15
+ const config_2 = require("@hubspot/local-dev-lib/config");
14
16
  const usageTracking_1 = require("../../lib/usageTracking");
15
17
  const lang_1 = require("../../lib/lang");
16
18
  const exitCodes_1 = require("../../lib/enums/exitCodes");
17
19
  const commonOpts_1 = require("../../lib/commonOpts");
18
20
  const promptUtils_1 = require("../../lib/prompts/promptUtils");
21
+ const accountsPrompt_1 = require("../../lib/prompts/accountsPrompt");
19
22
  const table_1 = require("../../lib/ui/table");
20
23
  const SpinniesManager_1 = __importDefault(require("../../lib/ui/SpinniesManager"));
21
24
  const ui_1 = require("../../lib/ui");
25
+ const errorHandlers_1 = require("../../lib/errorHandlers");
22
26
  exports.command = 'clean';
23
27
  exports.describe = (0, lang_1.i18n)(`commands.account.subcommands.clean.describe`);
24
28
  async function handler(args) {
@@ -69,25 +73,54 @@ async function handler(args) {
69
73
  logger_1.logger.log((0, table_1.getTableContents)(accountsToRemove.map(p => [
70
74
  (0, ui_1.uiAccountDescription)((0, getAccountIdentifier_1.getAccountIdentifier)(p)),
71
75
  ]), { border: { bodyLeft: ' ' } }));
76
+ let promptMessage = (0, lang_1.i18n)(oneAccountFound
77
+ ? `commands.account.subcommands.clean.confirm.one`
78
+ : `commands.account.subcommands.clean.confirm.other`, {
79
+ count: accountsToRemove.length,
80
+ });
81
+ const accountOverride = (0, config_2.getCWDAccountOverride)();
82
+ const overrideFilePath = (0, config_2.getDefaultAccountOverrideFilePath)();
83
+ const accountOverrideMatches = accountsToRemove.some(account => account.name === accountOverride ||
84
+ // @ts-expect-error: Default account override files can only exist with global config
85
+ account.accountId === accountOverride);
86
+ if (overrideFilePath && accountOverride && accountOverrideMatches) {
87
+ promptMessage = `${promptMessage}${(0, lang_1.i18n)(`commands.account.subcommands.clean.defaultAccountOverride`, {
88
+ overrideFilePath,
89
+ })}`;
90
+ }
72
91
  const { accountsCleanPrompt } = await (0, promptUtils_1.promptUser)([
73
92
  {
74
93
  name: 'accountsCleanPrompt',
75
94
  type: 'confirm',
76
- message: (0, lang_1.i18n)(oneAccountFound
77
- ? `commands.account.subcommands.clean.confirm.one`
78
- : `commands.account.subcommands.clean.confirm.other`, {
79
- count: accountsToRemove.length,
80
- }),
95
+ message: promptMessage,
81
96
  },
82
97
  ]);
83
98
  if (accountsCleanPrompt) {
84
99
  logger_1.logger.log('');
100
+ try {
101
+ if (overrideFilePath) {
102
+ fs_1.default.unlinkSync(overrideFilePath);
103
+ }
104
+ }
105
+ catch (error) {
106
+ (0, errorHandlers_1.logError)(error);
107
+ }
85
108
  for (const accountToRemove of accountsToRemove) {
86
109
  await (0, config_1.deleteAccount)(accountToRemove.name);
87
110
  logger_1.logger.log((0, lang_1.i18n)(`commands.account.subcommands.clean.removeSuccess`, {
88
111
  accountName: accountToRemove.name,
89
112
  }));
90
113
  }
114
+ // Get updated version of the config
115
+ (0, config_1.loadConfig)((0, config_1.getConfigPath)());
116
+ const defaultAccount = (0, config_1.getConfigDefaultAccount)();
117
+ if (defaultAccount &&
118
+ accountsToRemove.some(p => p.name === defaultAccount)) {
119
+ logger_1.logger.log();
120
+ logger_1.logger.log((0, lang_1.i18n)(`commands.account.subcommands.clean.replaceDefaultAccount`));
121
+ const newDefaultAccount = await (0, accountsPrompt_1.selectAccountFromConfig)();
122
+ (0, config_1.updateDefaultAccount)(newDefaultAccount);
123
+ }
91
124
  }
92
125
  }
93
126
  else {
@@ -0,0 +1,10 @@
1
+ import { Argv, ArgumentsCamelCase } from 'yargs';
2
+ import { CommonArgs } from '../../types/Yargs';
3
+ export declare const describe: string;
4
+ export declare const command = "create-override [account]";
5
+ type AccountCreateOverrideArgs = CommonArgs & {
6
+ account: string | number;
7
+ };
8
+ export declare function handler(args: ArgumentsCamelCase<AccountCreateOverrideArgs>): Promise<void>;
9
+ export declare function builder(yargs: Argv): Argv<AccountCreateOverrideArgs>;
10
+ export {};