@hubspot/cli 7.8.12-experimental.0 → 7.8.12-experimental.1

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 (244) hide show
  1. package/bin/cli.js +31 -25
  2. package/commands/__tests__/auth.test.js +5 -0
  3. package/commands/__tests__/doctor.test.js +16 -16
  4. package/commands/account/clean.js +18 -27
  5. package/commands/account/createOverride.js +13 -31
  6. package/commands/account/info.js +20 -31
  7. package/commands/account/list.js +16 -22
  8. package/commands/account/remove.js +12 -20
  9. package/commands/account/removeOverride.js +11 -21
  10. package/commands/account/rename.js +6 -9
  11. package/commands/account/use.js +12 -26
  12. package/commands/account.js +2 -2
  13. package/commands/app/__tests__/migrate.test.js +5 -5
  14. package/commands/app/migrate.js +13 -18
  15. package/commands/app.js +1 -6
  16. package/commands/auth.d.ts +1 -0
  17. package/commands/auth.js +16 -7
  18. package/commands/cms/convertFields.js +7 -9
  19. package/commands/cms/getReactModule.js +9 -14
  20. package/commands/cms/lighthouseScore.js +33 -36
  21. package/commands/cms.js +2 -2
  22. package/commands/completion.js +3 -3
  23. package/commands/config/set.d.ts +1 -1
  24. package/commands/config/set.js +64 -36
  25. package/commands/config.js +2 -2
  26. package/commands/create.js +2 -2
  27. package/commands/customObject/create.js +10 -12
  28. package/commands/customObject/schema/create.js +9 -11
  29. package/commands/customObject/schema/delete.js +16 -16
  30. package/commands/customObject/schema/fetch-all.js +12 -11
  31. package/commands/customObject/schema/fetch.js +15 -15
  32. package/commands/customObject/schema/list.js +4 -4
  33. package/commands/customObject/schema/update.js +13 -13
  34. package/commands/customObject/schema.js +2 -2
  35. package/commands/customObject.js +6 -7
  36. package/commands/doctor.js +8 -11
  37. package/commands/feedback.js +6 -11
  38. package/commands/fetch.js +8 -8
  39. package/commands/filemanager/fetch.js +7 -7
  40. package/commands/filemanager/upload.js +15 -34
  41. package/commands/filemanager.js +2 -2
  42. package/commands/function/deploy.js +11 -29
  43. package/commands/function/list.js +8 -8
  44. package/commands/function/server.js +9 -11
  45. package/commands/function.d.ts +1 -1
  46. package/commands/function.js +2 -2
  47. package/commands/getStarted.js +2 -2
  48. package/commands/hubdb/clear.js +7 -15
  49. package/commands/hubdb/create.js +9 -15
  50. package/commands/hubdb/delete.js +8 -15
  51. package/commands/hubdb/fetch.js +6 -9
  52. package/commands/hubdb.d.ts +1 -1
  53. package/commands/hubdb.js +2 -2
  54. package/commands/init.js +2 -3
  55. package/commands/lint.js +16 -16
  56. package/commands/list.js +8 -14
  57. package/commands/logs.js +14 -20
  58. package/commands/mv.js +6 -17
  59. package/commands/open.js +5 -5
  60. package/commands/project/__tests__/add.test.js +4 -2
  61. package/commands/project/__tests__/deploy.test.js +3 -4
  62. package/commands/project/__tests__/installDeps.test.js +8 -8
  63. package/commands/project/__tests__/logs.test.js +1 -1
  64. package/commands/project/__tests__/migrate.test.js +5 -5
  65. package/commands/project/__tests__/migrateApp.test.js +2 -5
  66. package/commands/project/__tests__/validate.test.js +98 -0
  67. package/commands/project/add.js +3 -3
  68. package/commands/project/cloneApp.js +14 -19
  69. package/commands/project/create.js +0 -1
  70. package/commands/project/deploy.js +3 -3
  71. package/commands/project/dev/deprecatedFlow.js +7 -16
  72. package/commands/project/dev/index.js +14 -12
  73. package/commands/project/dev/unifiedFlow.js +3 -1
  74. package/commands/project/download.js +10 -13
  75. package/commands/project/installDeps.js +8 -8
  76. package/commands/project/listBuilds.js +11 -20
  77. package/commands/project/logs.js +21 -24
  78. package/commands/project/migrateApp.js +9 -15
  79. package/commands/project/open.js +6 -13
  80. package/commands/project/upload.d.ts +2 -2
  81. package/commands/project/upload.js +17 -26
  82. package/commands/project/validate.js +6 -6
  83. package/commands/project/watch.js +13 -22
  84. package/commands/project.js +2 -2
  85. package/commands/sandbox/__tests__/create.test.js +5 -5
  86. package/commands/sandbox/create.js +22 -32
  87. package/commands/sandbox/delete.js +38 -63
  88. package/commands/sandbox.js +2 -2
  89. package/commands/secret/addSecret.js +7 -17
  90. package/commands/secret/deleteSecret.js +10 -20
  91. package/commands/secret/listSecret.js +8 -10
  92. package/commands/secret/updateSecret.js +9 -17
  93. package/commands/secret.js +2 -2
  94. package/commands/testAccount/__tests__/delete.test.js +2 -4
  95. package/commands/testAccount/create.js +0 -3
  96. package/commands/testAccount/delete.d.ts +4 -3
  97. package/commands/testAccount/delete.js +155 -14
  98. package/commands/theme/preview.js +1 -4
  99. package/lang/en.d.ts +310 -124
  100. package/lang/en.js +351 -169
  101. package/lang/en.lyaml +2 -2
  102. package/lib/__tests__/buildAccount.test.js +2 -1
  103. package/lib/__tests__/commonOpts.test.js +1 -1
  104. package/lib/__tests__/dependencyManagement.test.js +1 -1
  105. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  106. package/lib/__tests__/npm.test.js +1 -1
  107. package/lib/__tests__/oauth.test.js +4 -4
  108. package/lib/__tests__/process.test.js +10 -5
  109. package/lib/__tests__/sandboxSync.test.js +8 -8
  110. package/lib/__tests__/sandboxes.test.js +8 -8
  111. package/lib/__tests__/serverlessLogs.test.js +1 -1
  112. package/lib/__tests__/usageTracking.test.js +5 -5
  113. package/lib/__tests__/validation.test.js +2 -1
  114. package/lib/__tests__/yargsUtils.test.js +83 -9
  115. package/lib/app/__tests__/migrate.test.js +5 -5
  116. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  117. package/lib/app/migrate.js +1 -1
  118. package/lib/app/migrate_legacy.js +20 -24
  119. package/lib/buildAccount.js +25 -57
  120. package/lib/commonOpts.d.ts +1 -1
  121. package/lib/commonOpts.js +25 -22
  122. package/lib/configOptions.js +7 -0
  123. package/lib/constants.d.ts +6 -1
  124. package/lib/constants.js +10 -1
  125. package/lib/dependencyManagement.js +9 -27
  126. package/lib/developerTestAccounts.js +9 -23
  127. package/lib/doctor/Diagnosis.js +11 -23
  128. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  129. package/lib/doctor/Doctor.js +42 -90
  130. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  131. package/lib/errorHandlers/index.js +12 -20
  132. package/lib/errorHandlers/suppressError.js +11 -18
  133. package/lib/lang.js +6 -5
  134. package/lib/links.js +4 -4
  135. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  136. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  137. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  138. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  139. package/lib/middleware/commandTargetingUtils.js +78 -0
  140. package/lib/middleware/configMiddleware.d.ts +1 -1
  141. package/lib/middleware/configMiddleware.js +21 -81
  142. package/lib/middleware/gitMiddleware.js +5 -1
  143. package/lib/middleware/notificationsMiddleware.js +5 -11
  144. package/lib/middleware/yargsChecksMiddleware.js +6 -9
  145. package/lib/npm.js +2 -2
  146. package/lib/oauth.js +5 -5
  147. package/lib/process.js +5 -4
  148. package/lib/projectProfiles.d.ts +1 -1
  149. package/lib/projectProfiles.js +2 -10
  150. package/lib/projects/__tests__/AppDevModeInterface.test.js +14 -34
  151. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +70 -39
  152. package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
  153. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  154. package/lib/projects/__tests__/projects.test.js +12 -12
  155. package/lib/projects/__tests__/structure.test.js +3 -3
  156. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  157. package/lib/projects/__tests__/upload.test.js +82 -0
  158. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  159. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  160. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  161. package/lib/projects/create/__tests__/v3.test.js +1 -1
  162. package/lib/projects/create/index.js +2 -2
  163. package/lib/projects/create/legacy.js +2 -2
  164. package/lib/projects/create/v3.js +2 -2
  165. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  166. package/lib/projects/localDev/AppDevModeInterface.js +22 -20
  167. package/lib/projects/localDev/LocalDevLogger.js +10 -11
  168. package/lib/projects/localDev/LocalDevManager.js +4 -5
  169. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +0 -1
  170. package/lib/projects/localDev/LocalDevWebsocketServer.js +7 -10
  171. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  172. package/lib/projects/localDev/helpers/project.js +37 -0
  173. package/lib/projects/platformVersion.d.ts +1 -1
  174. package/lib/projects/platformVersion.js +1 -1
  175. package/lib/projects/structure.d.ts +2 -2
  176. package/lib/projects/structure.js +6 -6
  177. package/lib/projects/upload.d.ts +2 -3
  178. package/lib/projects/upload.js +17 -9
  179. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  180. package/lib/prompts/accountNamePrompt.js +14 -19
  181. package/lib/prompts/accountsPrompt.js +2 -2
  182. package/lib/prompts/cmsFieldPrompt.js +2 -2
  183. package/lib/prompts/createApiSamplePrompt.js +5 -5
  184. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  185. package/lib/prompts/createFunctionPrompt.js +14 -14
  186. package/lib/prompts/createModulePrompt.js +9 -9
  187. package/lib/prompts/createTemplatePrompt.js +2 -2
  188. package/lib/prompts/downloadProjectPrompt.js +5 -8
  189. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  190. package/lib/prompts/previewPrompt.js +6 -6
  191. package/lib/prompts/projectAddPrompt.js +6 -0
  192. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  193. package/lib/prompts/projectNamePrompt.js +4 -8
  194. package/lib/prompts/projectsLogsPrompt.js +2 -4
  195. package/lib/prompts/promptUtils.js +27 -9
  196. package/lib/prompts/sandboxesPrompt.js +7 -7
  197. package/lib/prompts/secretPrompt.js +3 -3
  198. package/lib/prompts/selectAppPrompt.js +3 -3
  199. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  200. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  201. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  202. package/lib/prompts/uploadPrompt.js +5 -5
  203. package/lib/sandboxSync.js +24 -41
  204. package/lib/sandboxes.js +19 -47
  205. package/lib/schema.js +3 -3
  206. package/lib/serverlessLogs.js +11 -13
  207. package/lib/theme/__tests__/migrate.test.js +3 -3
  208. package/lib/theme/migrate.js +2 -2
  209. package/lib/ui/SpinniesManager.d.ts +2 -0
  210. package/lib/ui/SpinniesManager.js +7 -0
  211. package/lib/ui/boxen.js +1 -2
  212. package/lib/ui/git.js +13 -10
  213. package/lib/ui/index.d.ts +4 -0
  214. package/lib/ui/index.js +47 -38
  215. package/lib/ui/serverlessFunctionLogs.js +9 -7
  216. package/lib/ui/uiMessages.d.ts +68 -0
  217. package/lib/ui/uiMessages.js +71 -0
  218. package/lib/usageTracking.js +7 -7
  219. package/lib/validation.js +20 -23
  220. package/lib/yargsUtils.d.ts +1 -1
  221. package/lib/yargsUtils.js +12 -5
  222. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  223. package/mcp-server/tools/index.js +4 -0
  224. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  225. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  226. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  227. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  228. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
  229. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  230. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  231. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  232. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  233. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  234. package/mcp-server/utils/toolUsageTracking.js +2 -2
  235. package/package.json +6 -6
  236. package/types/Yargs.d.ts +1 -1
  237. package/commands/app/__tests__/install.test.js +0 -47
  238. package/commands/app/install.d.ts +0 -8
  239. package/commands/app/install.js +0 -122
  240. package/lib/middleware/__test__/utils.test.js +0 -51
  241. package/lib/middleware/utils.d.ts +0 -8
  242. package/lib/middleware/utils.js +0 -14
  243. /package/commands/{app/__tests__/install.test.d.ts → project/__tests__/validate.test.d.ts} +0 -0
  244. /package/lib/middleware/__test__/{utils.test.d.ts → commandTargetingUtils.test.d.ts} +0 -0
package/lang/en.js CHANGED
@@ -3,10 +3,10 @@ import { mapToUserFriendlyName } from '@hubspot/project-parsing-lib';
3
3
  import { PLATFORM_VERSIONS } from '@hubspot/local-dev-lib/constants/projects';
4
4
  import { PERSONAL_ACCESS_KEY_AUTH_METHOD } from '@hubspot/local-dev-lib/constants/auth';
5
5
  import { ARCHIVED_HUBSPOT_CONFIG_YAML_FILE_NAME, GLOBAL_CONFIG_PATH, DEFAULT_HUBSPOT_CONFIG_YAML_FILE_NAME, } from '@hubspot/local-dev-lib/constants/config';
6
- import { uiAccountDescription, uiBetaTag, uiCommandReference, uiLink, UI_COLORS, } from '../lib/ui/index.js';
6
+ import { uiAccountDescription, uiBetaTag, uiCommandReference, uiLink, UI_COLORS, uiAuthCommandReference, } from '../lib/ui/index.js';
7
7
  import { getProjectDetailUrl, getProjectSettingsUrl, getLocalDevUiUrl, getAppAllowlistUrl, } from '../lib/projects/urls.js';
8
8
  import { getProductUpdatesUrl } from '../lib/links.js';
9
- import { APP_DISTRIBUTION_TYPES, APP_AUTH_TYPES, PROJECT_CONFIG_FILE, PROJECT_WITH_APP, } from '../lib/constants.js';
9
+ import { APP_DISTRIBUTION_TYPES, APP_AUTH_TYPES, PROJECT_CONFIG_FILE, PROJECT_WITH_APP, LEGACY_PUBLIC_APP_FILE, } from '../lib/constants.js';
10
10
  import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier';
11
11
  export const commands = {
12
12
  generalErrors: {
@@ -86,7 +86,7 @@ export const commands = {
86
86
  errors: {
87
87
  invalidAccountIdProvided: `--account must be a number.`,
88
88
  failedToUpdateConfig: 'Failed to update the configuration file. Please try again.',
89
- migrationNotConfirmed: `Did not migrate your configuration file. Run ${uiCommandReference('hs auth')} to update your existing config, or use ${uiCommandReference('hs config migrate')} to switch to the new global configuration.`,
89
+ migrationNotConfirmed: `Did not migrate your configuration file. Run ${uiAuthCommandReference()} to update your existing config, or use ${uiCommandReference('hs config migrate')} to switch to the new global configuration.`,
90
90
  mergeNotConfirmed: `Did not merge configuration files. When you are ready to merge the deprecated config file with the global config file, run ${uiCommandReference('hs config migrate')}.`,
91
91
  },
92
92
  success: {
@@ -96,9 +96,13 @@ export const commands = {
96
96
  },
97
97
  list: {
98
98
  accounts: `${chalk.bold('Accounts')}:`,
99
- defaultAccount: (account) => `${chalk.bold('Default account')}: ${account}`,
99
+ defaultAccountTitle: `${chalk.bold('Default Account')}`,
100
+ defaultAccount: (account) => `Account: ${account}`,
100
101
  describe: 'List names of accounts defined in config.',
101
- configPath: (configPath) => `${chalk.bold('Config path')}: ${configPath}`,
102
+ configPath: (configPath) => `Source: ${configPath}`,
103
+ overrideFilePathTitle: `${chalk.bold('Default Account Override')}`,
104
+ overrideFilePath: (overrideFilePath) => `Source: ${overrideFilePath}`,
105
+ overrideAccount: (account) => `Account: ${account}`,
102
106
  labels: {
103
107
  accountId: 'Account ID',
104
108
  authType: 'Auth Type',
@@ -124,6 +128,8 @@ export const commands = {
124
128
  errors: {
125
129
  accountNotFound: (specifiedAccount, configPath) => `The account "${specifiedAccount}" could not be found in ${configPath}`,
126
130
  },
131
+ accountOverride: (accountOverride) => `This project currently has an account override set: "${accountOverride}". Account "${accountOverride}" will continue to act as the default account for this project.`,
132
+ accountOverrideCommands: `Use ${uiCommandReference('hs account create-override')} to change override accounts, or ${uiCommandReference('hs account remove-override')} to remove the override and use your default account.`,
127
133
  examples: {
128
134
  default: 'Select a HubSpot account to use as the default account',
129
135
  idBased: 'Set the default account to the account in the config with accountId equal to "1234567"',
@@ -145,6 +151,7 @@ export const commands = {
145
151
  replaceDefaultAccount: 'The removed account was the default account.',
146
152
  },
147
153
  prompts: {
154
+ deleteOverrideFile: (overrideFilePath, accountName) => `Delete the override file (${overrideFilePath}) associated with ${accountName}?`,
148
155
  selectAccountToRemove: 'Select an account to remove from the config',
149
156
  },
150
157
  errors: {
@@ -164,12 +171,40 @@ export const commands = {
164
171
  accountRemoved: (accountName) => `Account "${accountName}" removed from the config`,
165
172
  },
166
173
  },
174
+ removeOverride: {
175
+ describe: (overrideFile) => `Remove the default account override file (${overrideFile}) from the current working directory.`,
176
+ accountOverride: (overrideFilePath, accountOverride) => `There is an account override file at ${overrideFilePath} associated with account "${accountOverride}".`,
177
+ prompts: {
178
+ deleteOverrideFile: 'Delete account override file?',
179
+ },
180
+ success: 'Removed the default account override file.',
181
+ noOverrideFile: 'No default account override file found in the current working directory. No action required.',
182
+ errors: {
183
+ globalConfigNotFound: `This command is only compatible with our new global config. Run ${uiCommandReference('hs account auth')} to get started.`,
184
+ },
185
+ options: {
186
+ force: {
187
+ describe: 'Skip confirmation prompt when removing the override file',
188
+ },
189
+ },
190
+ },
167
191
  info: {
168
192
  accountId: (accountId) => `${chalk.bold('Account ID')}: ${accountId}`,
193
+ defaultAccountTitle: `${chalk.bold('Default Account')}`,
194
+ configPath: (configPath) => `Source: ${configPath}`,
195
+ defaultAccount: (accountName) => `Account: ${accountName}`,
196
+ overrideFilePathTitle: `${chalk.bold('Default Account Override')}`,
197
+ overrideFilePath: (overrideFilePath) => `Source: ${overrideFilePath}`,
198
+ overrideAccount: (accountName) => `Account: ${accountName}`,
169
199
  describe: 'Print information about the default account, or about the account specified with the "account" option.',
170
200
  errors: {
171
201
  notUsingPersonalAccessKey: 'This command currently only supports fetching scopes for the personal access key auth type.',
172
202
  },
203
+ options: {
204
+ account: {
205
+ describe: 'Account name or id to show info for',
206
+ },
207
+ },
173
208
  examples: {
174
209
  default: 'Print information for the default account',
175
210
  idBased: 'Print information for the account with accountId equal to "1234567"',
@@ -193,6 +228,30 @@ export const commands = {
193
228
  other: (count) => `Remove ${count} inactive accounts from the CLI config?`,
194
229
  },
195
230
  removeSuccess: (accountName) => `Removed ${accountName} from the CLI config.`,
231
+ replaceDefaultAccount: 'The default account was removed.',
232
+ defaultAccountOverride: (overrideFilePath) => `\n(This will also delete the default account override file at ${overrideFilePath})`,
233
+ },
234
+ createOverride: {
235
+ describe: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory.`,
236
+ success: (overrideFilePath) => `Default account override file created at ${overrideFilePath}`,
237
+ accountOverride: (overrideFilePath, accountOverride) => `An account override file already exists at ${overrideFilePath} associated with account "${accountOverride}".`,
238
+ prompts: {
239
+ replaceOverrideFile: 'Replace existing account override file?',
240
+ },
241
+ errors: {
242
+ globalConfigNotFound: `This command is only compatible with our new global config. Run ${uiCommandReference('hs account auth')} to get started.`,
243
+ accountNotFound: (configPath) => `The specified account could not be found in the config file ${configPath}`,
244
+ },
245
+ options: {
246
+ account: {
247
+ describe: 'Name or ID of the account to create an override file for.',
248
+ },
249
+ },
250
+ examples: {
251
+ default: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory`,
252
+ idBased: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory, using the account with accountId "1234567"`,
253
+ nameBased: (hsAccountFileName) => `Create a new default account override file (${hsAccountFileName}) in the current working directory, using the account with name "MyAccount"`,
254
+ },
196
255
  },
197
256
  },
198
257
  },
@@ -262,6 +321,10 @@ export const commands = {
262
321
  describe: 'Enable or disable automatic opening of the browser',
263
322
  },
264
323
  },
324
+ errors: {
325
+ invalidBoolean: (commandName, value) => `Invalid boolean value "${value}" for --${commandName}. Valid values are: true, false`,
326
+ invalidHTTPTimeout: `Invalid HTTP timeout value. Must be a number greater than 3000.`,
327
+ },
265
328
  },
266
329
  },
267
330
  },
@@ -282,6 +345,9 @@ export const commands = {
282
345
  pageTemplateScoreTitle: 'Page template scores',
283
346
  lighthouseLinksTitle: 'Lighthouse links',
284
347
  failedTemplatePathsTitle: 'The following templates could not be scored',
348
+ themeToCheckTitle: (themeToCheck, target) => `${themeToCheck} ${target} scores`,
349
+ themeTitle: (themeToCheck) => `Theme: ${themeToCheck}`,
350
+ poweredByLink: `Powered by ${uiLink('Google Lighthouse', 'https://developer.chrome.com/docs/lighthouse/overview/')}`,
285
351
  },
286
352
  errors: {
287
353
  targetOptionRequired: '[--target] is required for detailed view',
@@ -400,9 +466,9 @@ export const commands = {
400
466
  },
401
467
  },
402
468
  customObject: {
403
- betaMessage: `${chalk.bold('[BETA]')} The Custom Object CLI is currently in beta and is subject to change.`,
469
+ betaMessage: `The Custom Object CLI is currently in beta and is subject to change.`,
404
470
  describe: 'Commands for managing custom objects.',
405
- seeMoreLink: 'View our docs to find out more.',
471
+ seeMoreLink: `${uiLink('View our docs to find out more', 'https://developers.hubspot.com/docs/api-reference/crm-custom-objects-v3/guide#custom-objects-api-guide')}`,
406
472
  subcommands: {
407
473
  create: {
408
474
  describe: 'Create custom object instances.',
@@ -802,7 +868,7 @@ export const commands = {
802
868
  configFileUpdated: (authType, account) => `Connected account "${account}" using "${authType}" and set it as the default account`,
803
869
  },
804
870
  logs: {
805
- updateConfig: 'To update an existing config file, use the "hs auth" command.',
871
+ updateConfig: `To update an existing config file, use the ${uiAuthCommandReference()} command.`,
806
872
  },
807
873
  errors: {
808
874
  invalidAccountIdProvided: `--account must be a number.`,
@@ -945,6 +1011,7 @@ export const commands = {
945
1011
  selectLink: 'Select a link to open',
946
1012
  },
947
1013
  project: {
1014
+ describe: `Commands for managing projects. For more information visit our documentation https://developers.hubspot.com/docs/getting-started/quickstart`,
948
1015
  profile: {
949
1016
  describe: 'Commands for managing project profiles',
950
1017
  verboseDescribe: `Commands for managing project profiles\n\nProfiles are stored at the root of your project's source directory and they make configuration dynamic. Use them to couple specialized configurations of your project to specific HubSpot accounts.\n\nRun ${uiCommandReference('hs project profile add')} to get started!`,
@@ -1017,7 +1084,7 @@ export const commands = {
1017
1084
  placeholderAccountSelection: 'Using default account as target account (for now)',
1018
1085
  accountTypeInformation: 'Testing in a developer test account is strongly recommended, but you can use a sandbox account if your plan allows you to create one.',
1019
1086
  learnMoreMessageV3: `Learn more about ${uiLink('HubSpot projects local dev', 'https://developers.hubspot.com/docs/developer-tooling/local-development/hubspot-cli/project-commands#start-a-local-development-server')} | ${uiLink('HubSpot account types', 'https://developers.hubspot.com/docs/getting-started/account-types')}`,
1020
- learnMoreMessageLegacy: uiLink('Learn more about the projects local dev server', 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'),
1087
+ learnMoreMessageLegacy: uiLink('Learn more about the projects local dev server', 'https://developers.hubspot.com/docs/developer-tooling/local-development/hubspot-cli/project-commands#start-a-local-development-server'),
1021
1088
  profileProjectAccountExplanation: (accountId, profileName) => `Using account ${uiAccountDescription(accountId)} from profile ${chalk.bold(profileName)} for project upload`,
1022
1089
  defaultProjectAccountExplanation: (accountId) => `Using default account ${uiAccountDescription(accountId)} for project upload`,
1023
1090
  projectAccountFlagExplanation: (accountId) => `Using account ${uiAccountDescription(accountId)} provided by the --project-account flag for project upload`,
@@ -1027,8 +1094,8 @@ export const commands = {
1027
1094
  },
1028
1095
  errors: {
1029
1096
  noProjectConfig: 'No project detected. Please run this command again from a project directory.',
1030
- noAccount: (accountId) => `An error occurred while reading account ${uiAccountDescription(accountId)} from your config. Run ${uiCommandReference('hs auth')} to re-auth this account.`,
1031
- noAccountsInConfig: (authCommand) => `No accounts found in your config. Run ${chalk.bold(authCommand)} to configure a HubSpot account with the CLI.`,
1097
+ noAccount: (accountId) => `An error occurred while reading account ${uiAccountDescription(accountId)} from your config. Run ${uiAuthCommandReference()} to re-auth this account.`,
1098
+ noAccountsInConfig: `No accounts found in your config. Run ${uiAuthCommandReference()} to configure a HubSpot account with the CLI.`,
1032
1099
  invalidProjectComponents: 'Projects cannot contain both private and public apps. Move your apps to separate projects before attempting local development.',
1033
1100
  noRunnableComponents: `No supported components were found in this project. Run ${uiCommandReference('hs project add')} to see a list of available components and add one to your project.`,
1034
1101
  accountNotCombined: `\nLocal development of unified apps is currently only compatible with accounts that are opted into the unified apps beta. Make sure that this account is opted in or switch accounts using ${uiCommandReference('hs account use')}.`,
@@ -1040,8 +1107,9 @@ export const commands = {
1040
1107
  },
1041
1108
  options: {
1042
1109
  profile: 'The profile to target during local dev',
1043
- projectAccount: 'The id of the account to upload your project to. Only compatible with platform versions 2025.2 and above.',
1044
- testingAccount: 'The id of the account to install apps and test on. Only compatible with platform versions 2025.2 and above.',
1110
+ projectAccount: 'The id of the account to upload your project to. Must be used with --testing-account. Supported on platform versions 2025.2 and newer.',
1111
+ testingAccount: 'The id of the account to install apps and test on. Must be used with --project-account. Supported on platform versions 2025.2 and newer.',
1112
+ account: 'The id of the account to upload your project to. Unsupported on platform versions 2025.2 and newer.',
1045
1113
  },
1046
1114
  },
1047
1115
  create: {
@@ -1111,28 +1179,33 @@ export const commands = {
1111
1179
  describe: 'Project name (cannot be changed)',
1112
1180
  },
1113
1181
  },
1114
- header: {
1115
- text: 'This command will migrate an app to the projects framework. It will walk you through the fields required to complete the migration and download the project source code into a directory of your choosing.',
1116
- link: 'Learn more about migrating apps to the projects framework',
1117
- },
1118
- deprecationWarning: (oldCommand, newCommand) => `The ${oldCommand} command is deprecated and will be removed. Use ${newCommand} going forward.`,
1182
+ header: `This command will migrate an app to the projects framework. It will walk you through the fields required to complete the migration and download the project source code into a directory of your choosing.\n${uiLink('Learn more about migrating apps to the projects framework', 'https://developers.hubspot.com/docs/platform/migrate-a-public-app-to-projects')}`,
1183
+ deprecationWarning: (platformVersion) => `The ${uiCommandReference('hs project migrate-app')} command is deprecated and will be removed. Use ${uiCommandReference(`hs app migrate --platform-version=${platformVersion}`)} going forward.`,
1119
1184
  migrationStatus: {
1120
- inProgress: () => `Converting app configuration to ${chalk.bold('public-app.json')} component definition ...`,
1185
+ inProgress: () => `Converting app configuration to ${chalk.bold(LEGACY_PUBLIC_APP_FILE)} component definition ...`,
1121
1186
  success: () => `${chalk.bold('Your app was converted and build #1 is deployed')}`,
1122
- done: () => 'Converting app configuration to public-app.json component definition ... DONE',
1123
- failure: () => 'Converting app configuration to public-app.json component definition ... FAILED',
1187
+ done: () => `Converting app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... DONE`,
1188
+ failure: () => `Converting app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... FAILED`,
1124
1189
  },
1125
1190
  warning: {
1126
- title: () => `${chalk.bold('You are about to migrate an app to the projects framework')}`,
1127
- projectConversion: () => `${chalk.bold('The selected app will be converted to a project component.')}`,
1128
- appConfig: () => `All supported app configuration will be moved to the ${chalk.bold('public-app.json')} component definition file. Future updates to those features must be made through the project build and deploy pipeline, not the developer account UI.`,
1129
- buildAndDeploy: 'This will create a new project with a single app component and immediately build and deploy it to your developer account (build #1).',
1130
- existingApps: () => `${chalk.bold('This will not affect existing app users or installs.')}`,
1191
+ title: `${chalk.bold('You are about to migrate an app to the projects framework')}\n`,
1192
+ projectConversion: `${chalk.bold('The selected app will be converted to a project component.')}\n`,
1193
+ appConfig: `All supported app configuration will be moved to the ${chalk.bold(LEGACY_PUBLIC_APP_FILE)} component definition file. Future updates to those features must be made through the project build and deploy pipeline, not the developer account UI.\n`,
1194
+ buildAndDeploy: 'This will create a new project with a single app component and immediately build and deploy it to your developer account (build #1).\n',
1195
+ existingApps: `${chalk.bold('This will not affect existing app users or installs.')}`,
1131
1196
  copyApp: 'We strongly recommend making a copy of your app to test this process in a development app before replacing production.',
1132
1197
  },
1133
1198
  migrationInterrupted: '\nThe command is terminated, but app migration is still in progress. Please check your account to ensure that the project and associated app have been created successfully.',
1134
1199
  createAppPrompt: "Proceed with migrating this app to a project component (this process can't be aborted)?",
1135
1200
  projectDetailsLink: 'View project details in your developer account',
1201
+ errors: {
1202
+ noAppsForProject: (projectName) => `No apps associated with project ${projectName}`,
1203
+ noAccountConfig: 'No account configuration found. Please check your account settings.',
1204
+ projectAlreadyExists: (projectName) => `A project with name ${projectName} already exists. Please choose another name.`,
1205
+ invalidApp: (appId) => `Could not migrate appId ${appId}. This app cannot be migrated at this time. Please choose another public app.`,
1206
+ migrationFailed: 'Migration Failed',
1207
+ notAllowedWithinProject: `This command cannot be run from within a project directory. Run the command again from outside a project directory. If you are trying to migrate a project, run ${uiCommandReference('hs project migrate')}`,
1208
+ },
1136
1209
  },
1137
1210
  migrate: {
1138
1211
  preamble: (platformVersion) => `This command will migrate an existing project to platformVersion ${platformVersion}. It will walk you through the fields required to complete the migration and download the new project source code into the project source directory. It will also copy all of your existing files to a new directory (archive) in case you need access to your old files later.`,
@@ -1159,15 +1232,16 @@ export const commands = {
1159
1232
  },
1160
1233
  },
1161
1234
  cloneStatus: {
1162
- inProgress: () => `Cloning app configuration to ${chalk.bold('public-app.json')} component definition ...`,
1163
- done: 'Cloning app configuration to public-app.json component definition ... DONE',
1235
+ inProgress: `Cloning app configuration to ${chalk.bold(LEGACY_PUBLIC_APP_FILE)} component definition ...`,
1236
+ done: `Cloning app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... DONE`,
1164
1237
  success: (dest) => `Your cloned project was created in ${dest}`,
1165
- failure: 'Cloning app configuration to public-app.json component definition ... FAILED',
1238
+ failure: `Cloning app configuration to ${LEGACY_PUBLIC_APP_FILE} component definition ... FAILED`,
1166
1239
  },
1167
1240
  errors: {
1168
1241
  invalidAccountTypeTitle: () => `${chalk.bold('Developer account not targeted')}`,
1169
1242
  invalidAccountTypeDescription: (useCommand, authCommand) => `Only public apps created in a developer account can be converted to a project component. Select a connected developer account with ${useCommand} or ${authCommand} and try again.`,
1170
1243
  couldNotWriteConfigPath: (configPath) => `Failed to write project config at ${configPath}`,
1244
+ noAccountConfig: (accountId) => `No account config found for ${uiAccountDescription(accountId)}`,
1171
1245
  },
1172
1246
  },
1173
1247
  add: {
@@ -1274,7 +1348,7 @@ export const commands = {
1274
1348
  },
1275
1349
  logs: {
1276
1350
  showingLogs: 'Showing logs for:',
1277
- hubspotLogsDirectLink: 'View function logs in HubSpot',
1351
+ hubspotLogsDirectLink: (url) => `${uiLink('View function logs in HubSpot', url)}`,
1278
1352
  noLogsFound: (name) => `No logs were found for "${name}"`,
1279
1353
  },
1280
1354
  table: {
@@ -1315,11 +1389,11 @@ export const commands = {
1315
1389
  logs: {
1316
1390
  buildSucceeded: (buildId) => `Build #${buildId} succeeded\n`,
1317
1391
  readyToGoLive: '🚀 Ready to take your project live?',
1318
- runCommand: (command) => `Run \`${command}\``,
1319
- autoDeployDisabled: (deployCommand) => `Automatic deploys are disabled for this project. Run ${deployCommand} to deploy this build.`,
1392
+ runCommand: (command) => `Run \`${uiCommandReference(command)}\``,
1393
+ autoDeployDisabled: (deployCommand) => `Automatic deploys are disabled for this project. Run ${uiCommandReference(deployCommand)} to deploy this build.`,
1320
1394
  },
1321
1395
  errors: {
1322
- projectLockedError: () => `Your project is locked. This may mean that another user is running the ${chalk.bold('`hs project dev`')} command for this project. If this is you, unlock the project in Projects UI.`,
1396
+ projectLockedError: `Your project is locked. This may mean that another user is running the ${uiCommandReference('hs project dev')} command for this project. If this is you, unlock the project in Projects UI.`,
1323
1397
  },
1324
1398
  options: {
1325
1399
  forceCreate: {
@@ -1328,6 +1402,9 @@ export const commands = {
1328
1402
  message: {
1329
1403
  describe: 'Add a message when you upload your project and create a build',
1330
1404
  },
1405
+ profile: {
1406
+ describe: 'Profile to target for this upload',
1407
+ },
1331
1408
  },
1332
1409
  },
1333
1410
  watch: {
@@ -1365,6 +1442,7 @@ export const commands = {
1365
1442
  uploadFailed: (remotePath, filePath) => `Failed to upload file "${filePath}" to "${remotePath}"`,
1366
1443
  deleteFileFailed: (remotePath) => `Failed to delete file "${remotePath}"`,
1367
1444
  deleteFolderFailed: (remotePath) => `Failed to delete folder "${remotePath}"`,
1445
+ v3ApiError: (platformVersion) => `${uiCommandReference('hs project watch')} is not supported for platform version '${platformVersion}' use ${uiCommandReference('hs project dev')} instead to develop locally. ${uiLink('How to develop locally', 'https://developers.hubspot.com/docs/guides/crm/ui-extensions/local-development')}`,
1368
1446
  },
1369
1447
  },
1370
1448
  download: {
@@ -1379,6 +1457,7 @@ export const commands = {
1379
1457
  errors: {
1380
1458
  downloadFailed: 'Something went wrong downloading the project',
1381
1459
  projectNotFound: (projectName, accountId) => `Your project ${chalk.bold(projectName)} could not be found in ${accountId}`,
1460
+ noBuildIdToDownload: 'No build ID available for download',
1382
1461
  },
1383
1462
  warnings: {
1384
1463
  cannotDownloadWithinProject: 'Cancelling project download. Please run the command again outside the context of an existing project.',
@@ -1426,8 +1505,8 @@ export const commands = {
1426
1505
  addingDependenciesToLocation: (dependencies, directory) => `Installing ${dependencies} in ${directory}`,
1427
1506
  installingDependenciesFailed: (directory) => `Installing dependencies for ${directory} failed`,
1428
1507
  noProjectConfig: 'No project detected. Run this command from a project directory.',
1429
- noPackageJsonInProject: (projectName, link) => `No dependencies to install. The project ${projectName} folder might be missing component or subcomponent files. ${link}`,
1430
- packageManagerNotInstalled: (packageManager, link) => `This command depends on ${packageManager}, install ${chalk.bold(link)}`,
1508
+ noPackageJsonInProject: (projectName) => `No dependencies to install. The project ${projectName} folder might be missing component or subcomponent files. ${uiLink('Learn how to create a project from scratch', 'https://developers.hubspot.com/docs/apps/developer-platform/build-apps/create-an-app#customize-a-new-project-using-the-cli')}`,
1509
+ packageManagerNotInstalled: (packageManager) => `This command depends on ${packageManager}, install ${uiLink(packageManager, 'https://docs.npmjs.com/downloading-and-installing-node-js-and-npm')}`,
1431
1510
  },
1432
1511
  validate: {
1433
1512
  describe: 'Validate the project before uploading',
@@ -1459,6 +1538,30 @@ export const commands = {
1459
1538
  describe: 'Commands for managing sandboxes.',
1460
1539
  subcommands: {
1461
1540
  create: {
1541
+ describe: 'Create a sandbox account.',
1542
+ failure: {
1543
+ noAccountConfig: (accountId) => `No account config found for ${uiAccountDescription(accountId)}. Run ${uiAuthCommandReference()} to add it.`,
1544
+ invalidAccountType: (accountType, accountName) => `Sandboxes must be created from a production account. Your current default account ${chalk.bold(accountName)} is a ${chalk.bold(accountType)}. \n- Run ${uiCommandReference('hs account use')} to switch to your default account to your production account. \n- Run ${uiAuthCommandReference()} to connect a production account to the HubSpot CLI.\n`,
1545
+ noSandboxAccountConfig: (accountId) => `No account config found for ${uiAccountDescription(accountId)}. Run ${uiAuthCommandReference()} to add the sandbox account.`,
1546
+ optionMissing: {
1547
+ type: 'Type is required when using --force. Use --type=developer or --type=standard.',
1548
+ name: 'Name is required when using --force. Use --name=YourSandboxName.',
1549
+ },
1550
+ },
1551
+ options: {
1552
+ force: {
1553
+ describe: 'Skips all prompts and uses provided options.',
1554
+ },
1555
+ name: {
1556
+ describe: 'Name of the sandbox account to create',
1557
+ },
1558
+ type: {
1559
+ describe: 'Type of sandbox to create (developer or standard)',
1560
+ },
1561
+ },
1562
+ examples: {
1563
+ default: 'Creates a standard sandbox named MySandboxAccount.',
1564
+ },
1462
1565
  developer: {
1463
1566
  loading: {
1464
1567
  add: (accountName) => `Creating developer sandbox ${chalk.bold(accountName)}`,
@@ -1470,11 +1573,11 @@ export const commands = {
1470
1573
  },
1471
1574
  failure: {
1472
1575
  invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1473
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To connect a developer sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
1474
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${chalk.bold('hs accounts use')}.`,
1576
+ limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To connect a developer sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
1577
+ alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${chalk.bold('hs account use')}.`,
1475
1578
  scopes: {
1476
1579
  message: "The personal access key you provided doesn't include developer sandbox permissions.",
1477
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
1580
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1478
1581
  },
1479
1582
  },
1480
1583
  },
@@ -1489,11 +1592,11 @@ export const commands = {
1489
1592
  },
1490
1593
  failure: {
1491
1594
  invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1492
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To connect a standard sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
1493
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${chalk.bold('hs accounts use')}.`,
1595
+ limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To connect a standard sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
1596
+ alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${chalk.bold('hs account use')}.`,
1494
1597
  scopes: {
1495
1598
  message: "The personal access key you provided doesn't include standard sandbox permissions.",
1496
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
1599
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1497
1600
  },
1498
1601
  },
1499
1602
  },
@@ -1501,28 +1604,28 @@ export const commands = {
1501
1604
  delete: {
1502
1605
  describe: 'Delete a sandbox account.',
1503
1606
  debug: {
1504
- deleting: (account) => `Deleting sandbox account "${account}"`,
1607
+ deleting: (account) => `Deleting sandbox account "${uiAccountDescription(account)}"`,
1505
1608
  error: 'Error deleting sandbox account:',
1506
1609
  },
1507
1610
  examples: {
1508
1611
  default: 'Deletes the sandbox account named MySandboxAccount.',
1509
1612
  },
1510
- confirm: (account) => `Delete sandbox ${chalk.bold(account)}? All data for this sandbox will be permanently deleted.`,
1511
- defaultAccountWarning: (account) => `The sandbox ${chalk.bold(account)} is currently set as the default account.`,
1613
+ confirm: (account) => `Delete sandbox ${uiAccountDescription(account)}? All data for this sandbox will be permanently deleted.`,
1614
+ defaultAccountWarning: (account) => `The sandbox ${uiAccountDescription(account)} is currently set as the default account.`,
1512
1615
  success: {
1513
1616
  delete: (account, sandboxHubId) => `Sandbox "${account}" with portalId "${sandboxHubId}" was deleted successfully.`,
1514
1617
  deleteDefault: (account, sandboxHubId) => `Sandbox "${account}" with portalId "${sandboxHubId}" was deleted successfully and removed as the default account.`,
1515
1618
  configFileUpdated: (account, configFilename) => `Removed account ${account} from ${configFilename}.`,
1516
1619
  },
1517
1620
  failure: {
1518
- invalidUser: (accountName, parentAccountName) => `Couldn't delete ${accountName} because your account has been removed from ${parentAccountName} or your permission set doesn't allow you to delete the sandbox. To update your permissions, contact a super admin in ${parentAccountName}.`,
1621
+ invalidUser: (account, parentAccount) => `Couldn't delete ${uiAccountDescription(account)} because your account has been removed from ${uiAccountDescription(parentAccount)} or your permission set doesn't allow you to delete the sandbox. To update your permissions, contact a super admin in ${uiAccountDescription(parentAccount)}.`,
1519
1622
  noAccount: 'No account specified. Specify an account by using the --account flag.',
1520
- noSandboxAccounts: (authCommand) => `There are no sandboxes connected to the CLI. To add a sandbox, run ${authCommand}.`,
1623
+ noSandboxAccounts: `There are no sandboxes connected to the CLI. To add a sandbox, run ${uiAuthCommandReference()}.`,
1521
1624
  noSandboxAccountId: "This sandbox can't be deleted from the CLI because we could not find the associated sandbox account.",
1522
- noParentAccount: (authCommand) => `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${authCommand} and add the parent account.`,
1523
- objectNotFound: (account) => `Sandbox ${chalk.bold(account)} may have been deleted through the UI. The account has been removed from the config.`,
1524
- noParentPortalAvailable: (command, url) => `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${command}. You can also delete the sandbox from the HubSpot management tool: ${chalk.bold(url)}.`,
1525
- invalidKey: (account, authCommand) => `Your personal access key for account ${chalk.bold(account)} is inactive. To re-authenticate, please run ${authCommand}.`,
1625
+ noParentAccount: `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${uiAuthCommandReference()} and add the parent account.`,
1626
+ objectNotFound: (account) => `Sandbox ${uiAccountDescription(account)} may have been deleted through the UI. The account has been removed from the config.`,
1627
+ noParentPortalAvailable: (command, url) => `This sandbox can't be deleted from the CLI because you haven't given the CLI access to its parent account. To do this, run ${uiCommandReference(command)}. You can also delete the sandbox from the HubSpot management tool: ${chalk.bold(url)}.`,
1628
+ invalidKey: (account) => `Your personal access key for account ${uiAccountDescription(account)} is inactive. To re-authenticate, please run ${uiAuthCommandReference()}.`,
1526
1629
  },
1527
1630
  options: {
1528
1631
  force: {
@@ -1547,7 +1650,13 @@ export const commands = {
1547
1650
  invalidUser: (accountName, parentAccountName) => `Couldn't sync ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to sync the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1548
1651
  scopes: {
1549
1652
  message: "The personal access key you provided doesn't include sandbox sync permissions.",
1550
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
1653
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1654
+ },
1655
+ },
1656
+ confirm: {
1657
+ syncContactRecords: {
1658
+ standard: 'Copy up to 5000 most recently updated contacts? This includes up to 100 of each of the following: associated deals, tickets, and companies.',
1659
+ developer: 'Include up to 100 most recently updated contacts? This includes up to 100 of each of the following: associated deals, tickets, and companies. This can be done once per sandbox.',
1551
1660
  },
1552
1661
  },
1553
1662
  },
@@ -1555,28 +1664,6 @@ export const commands = {
1555
1664
  app: {
1556
1665
  describe: 'Commands for managing apps.',
1557
1666
  subcommands: {
1558
- install: {
1559
- describe: 'Install an OAuth app into a test account.',
1560
- options: {
1561
- appUid: 'The uid of the app to install',
1562
- projectName: 'The name of the project that contains the app',
1563
- },
1564
- positionals: {
1565
- testAccountId: 'The id of the test account to install the app into',
1566
- },
1567
- errors: {
1568
- mustSpecifyProjectName: `You must specify a project name. Use the ${uiCommandReference('--project-name')} flag to specify the project name or run this command from within a project directory.`,
1569
- noAppUidFound: `No app uid found. Please specify the app uid with the ${uiCommandReference('--app-uid')} flag or run this command from within a project that contains an app.`,
1570
- appMustBeOauth: 'This command only supports installing oauth apps. Please specify an app with oauth auth type.',
1571
- },
1572
- polling: {
1573
- start: 'Installing app...',
1574
- success: 'App installed successfully',
1575
- failure: 'App installation failed',
1576
- error: 'Error installing app',
1577
- },
1578
- example: 'Install the app with uid my-app-uid from the project named "my-project" into the target account with id 1234567890',
1579
- },
1580
1667
  secret: {
1581
1668
  describe: 'Commands for managing secrets.',
1582
1669
  subcommands: {
@@ -1649,7 +1736,7 @@ export const commands = {
1649
1736
  describe: 'Create a new secret.',
1650
1737
  errors: {
1651
1738
  add: (secretName) => `The secret "${secretName}" was not added`,
1652
- alreadyExists: (secretName, command) => `The secret "${secretName}" already exists, it's value can be modified with ${command}`,
1739
+ alreadyExists: (secretName) => `The secret "${secretName}" already exists, it's value can be modified with ${uiCommandReference('hs secret update')}`,
1653
1740
  },
1654
1741
  positionals: {
1655
1742
  name: {
@@ -1657,7 +1744,7 @@ export const commands = {
1657
1744
  },
1658
1745
  },
1659
1746
  success: {
1660
- add: (secretName, accountIdentifier) => `The secret "${secretName}" was added to the HubSpot account: ${accountIdentifier}`,
1747
+ add: (secretName, accountId) => `The secret "${secretName}" was added to the HubSpot account: ${uiAccountDescription(accountId)}`,
1661
1748
  },
1662
1749
  },
1663
1750
  delete: {
@@ -1675,7 +1762,7 @@ export const commands = {
1675
1762
  },
1676
1763
  },
1677
1764
  success: {
1678
- delete: (secretName, accountIdentifier) => `The secret "${secretName}" was deleted from the HubSpot account: ${accountIdentifier}`,
1765
+ delete: (secretName, accountId) => `The secret "${secretName}" was deleted from the HubSpot account: ${uiAccountDescription(accountId)}`,
1679
1766
  },
1680
1767
  },
1681
1768
  list: {
@@ -1698,7 +1785,7 @@ export const commands = {
1698
1785
  },
1699
1786
  },
1700
1787
  success: {
1701
- update: (secretName, accountIdentifier) => `The secret "${secretName}" was updated in the HubSpot account: ${accountIdentifier}`,
1788
+ update: (secretName, accountId) => `The secret "${secretName}" was updated in the HubSpot account: ${accountId}`,
1702
1789
  updateExplanation: 'Existing serverless functions will start using this new value within 10 seconds.',
1703
1790
  },
1704
1791
  },
@@ -1927,18 +2014,41 @@ export const commands = {
1927
2014
  example: (name) => `Create a test account config file with the name "${name}"`,
1928
2015
  },
1929
2016
  delete: {
1930
- describe: 'Delete a test account config file.',
2017
+ describe: 'Delete a test account from your HubSpot account and CLI config',
1931
2018
  pathPrompt: '[--path] What is the path to the test account config?',
2019
+ info: {
2020
+ deletionCanceled: 'Deletion canceled by user',
2021
+ accountNotFoundWithId: (id) => `No account was found with ID ${id}`,
2022
+ replaceDefaultAccount: (testAccountId, parentAccountName) => `The removed test account ${chalk.bold(testAccountId)} was the default account. Replaced default account to parent account: ${chalk.bold(parentAccountName)}`,
2023
+ },
2024
+ prompts: {
2025
+ selectTestAccounts: 'Select test account(s) to delete',
2026
+ confirmDeletion: 'All data for the account will be permanently deleted. Any connected apps will have their access tokens revoked. Do you wish to proceed?',
2027
+ },
1932
2028
  errors: {
1933
- failedToDelete: 'Failed to delete test account',
2029
+ failedToDelete: (testAccountToDelete) => `Failed to delete test account with ID ${testAccountToDelete}`,
2030
+ failedToSelectAccount: 'Failed to select a test account to delete',
2031
+ noAccountsToDelete: (accountId) => `There are no test accounts associated with ${uiAccountDescription(accountId)} to delete. Try running ${uiCommandReference('hs account use')} to change your default account`,
2032
+ failedToDeleteFromConfig: (testAccountToDelete) => `Failed to delete test account with ID ${testAccountToDelete} from the CLI config`,
2033
+ failedToFetchTestAccounts: 'Failed to fetch developer test accounts',
2034
+ testAccountNotFound: (nameOrId) => `Test account${nameOrId ? ` ${chalk.bold(nameOrId)}` : ''} not found in config. \nTry running ${uiCommandReference('hs account auth')} to add the account to config or visit ${uiLink('developer test accounts', 'https://app.hubspot.com/l/developer-test-accounts/')} to delete the test account.`,
2035
+ parentAccountNotFound: (testAccountId) => `Parent account of test account ${chalk.bold(testAccountId)} not found in config. \nTry running ${uiCommandReference('hs account auth')} to add the parent account to config or visit ${uiLink('developer test accounts', 'https://app.hubspot.com/l/developer-test-accounts/')} to delete the test account.`,
1934
2036
  },
1935
2037
  success: {
1936
- testAccountDeleted: (testAccountId) => `Test account with id ${testAccountId} successfully deleted`,
2038
+ testAccountDeletedFromHubSpot: (testAccountToDelete) => `Successfully deleted test account with ID ${testAccountToDelete}`,
2039
+ testAccountDeletedFromConfig: (accountId) => `Successfully deleted test account with ID ${accountId} from the CLI config`,
1937
2040
  },
1938
- positionals: {
1939
- testAccountId: 'The id of the test account',
2041
+ options: {
2042
+ name: 'The name of the test account (in your CLI config) to delete',
2043
+ id: 'The id of the test account',
2044
+ },
2045
+ examples: {
2046
+ withPositionalID: (testAccountToDelete) => `Delete a test account with id "${testAccountToDelete}" using positional argument`,
2047
+ withPositionalName: (testAccountToDelete) => `Delete a test account with name "${testAccountToDelete}" using positional argument`,
2048
+ withID: (testAccountToDelete) => `Delete a test account with the id "${testAccountToDelete}"`,
2049
+ withName: (testAccountToDelete) => `Delete a test account with the name "${testAccountToDelete}"`,
2050
+ withoutId: 'Delete a test account via a prompt',
1940
2051
  },
1941
- example: (testAccountId) => `Delete a test account with the id "${testAccountId}"`,
1942
2052
  },
1943
2053
  },
1944
2054
  secrets: {
@@ -1955,7 +2065,7 @@ export const commands = {
1955
2065
  invalidUser: (secretName, parentAccountName) => `Couldn't add ${chalk.bold(secretName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add secrets. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1956
2066
  scopes: {
1957
2067
  message: "The personal access key you provided doesn't include secrets permissions.",
1958
- instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2068
+ instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1959
2069
  },
1960
2070
  },
1961
2071
  },
@@ -1972,7 +2082,7 @@ export const commands = {
1972
2082
  invalidUser: (secretName, parentAccountName) => `Couldn't delete ${chalk.bold(secretName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete secrets. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1973
2083
  scopes: {
1974
2084
  message: "The personal access key you provided doesn't include secrets permissions.",
1975
- instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2085
+ instructions: (secretName, url) => `To update CLI permissions for "${secretName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1976
2086
  },
1977
2087
  },
1978
2088
  },
@@ -1989,7 +2099,7 @@ export const commands = {
1989
2099
  invalidUser: (parentAccountName) => `Couldn't list secrets because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list secrets. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
1990
2100
  scopes: {
1991
2101
  message: "The personal access key you provided doesn't include secrets permissions.",
1992
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2102
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes secrets permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
1993
2103
  },
1994
2104
  },
1995
2105
  },
@@ -2008,7 +2118,7 @@ export const commands = {
2008
2118
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless functions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2009
2119
  scopes: {
2010
2120
  message: "The personal access key you provided doesn't include serverless function permissions.",
2011
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2121
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2012
2122
  },
2013
2123
  },
2014
2124
  },
@@ -2025,7 +2135,7 @@ export const commands = {
2025
2135
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless functions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2026
2136
  scopes: {
2027
2137
  message: "The personal access key you provided doesn't include serverless function permissions.",
2028
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2138
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2029
2139
  },
2030
2140
  },
2031
2141
  },
@@ -2042,7 +2152,7 @@ export const commands = {
2042
2152
  invalidUser: (parentAccountName) => `Couldn't list serverless functions because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless functions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2043
2153
  scopes: {
2044
2154
  message: "The personal access key you provided doesn't include serverless function permissions.",
2045
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2155
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2046
2156
  },
2047
2157
  },
2048
2158
  },
@@ -2061,7 +2171,7 @@ export const commands = {
2061
2171
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function logs. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2062
2172
  scopes: {
2063
2173
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2064
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2174
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2065
2175
  },
2066
2176
  },
2067
2177
  },
@@ -2078,7 +2188,7 @@ export const commands = {
2078
2188
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function logs. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2079
2189
  scopes: {
2080
2190
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2081
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2191
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2082
2192
  },
2083
2193
  },
2084
2194
  },
@@ -2095,7 +2205,7 @@ export const commands = {
2095
2205
  invalidUser: (parentAccountName) => `Couldn't list serverless function logs because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function logs. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2096
2206
  scopes: {
2097
2207
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2098
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2208
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function log permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2099
2209
  },
2100
2210
  },
2101
2211
  },
@@ -2114,7 +2224,7 @@ export const commands = {
2114
2224
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function metrics. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2115
2225
  scopes: {
2116
2226
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2117
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2227
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2118
2228
  },
2119
2229
  },
2120
2230
  },
@@ -2131,7 +2241,7 @@ export const commands = {
2131
2241
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function metrics. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2132
2242
  scopes: {
2133
2243
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2134
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2244
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2135
2245
  },
2136
2246
  },
2137
2247
  },
@@ -2148,7 +2258,7 @@ export const commands = {
2148
2258
  invalidUser: (parentAccountName) => `Couldn't list serverless function metrics because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function metrics. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2149
2259
  scopes: {
2150
2260
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2151
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2261
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function metric permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2152
2262
  },
2153
2263
  },
2154
2264
  },
@@ -2167,7 +2277,7 @@ export const commands = {
2167
2277
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function settings. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2168
2278
  scopes: {
2169
2279
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2170
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2280
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2171
2281
  },
2172
2282
  },
2173
2283
  },
@@ -2184,7 +2294,7 @@ export const commands = {
2184
2294
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function settings. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2185
2295
  scopes: {
2186
2296
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2187
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2297
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2188
2298
  },
2189
2299
  },
2190
2300
  },
@@ -2201,7 +2311,7 @@ export const commands = {
2201
2311
  invalidUser: (parentAccountName) => `Couldn't list serverless function settings because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function settings. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2202
2312
  scopes: {
2203
2313
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2204
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2314
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function setting permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2205
2315
  },
2206
2316
  },
2207
2317
  },
@@ -2220,7 +2330,7 @@ export const commands = {
2220
2330
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function versions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2221
2331
  scopes: {
2222
2332
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2223
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2333
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2224
2334
  },
2225
2335
  },
2226
2336
  },
@@ -2237,7 +2347,7 @@ export const commands = {
2237
2347
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function versions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2238
2348
  scopes: {
2239
2349
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2240
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2350
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2241
2351
  },
2242
2352
  },
2243
2353
  },
@@ -2254,7 +2364,7 @@ export const commands = {
2254
2364
  invalidUser: (parentAccountName) => `Couldn't list serverless function versions because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function versions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2255
2365
  scopes: {
2256
2366
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2257
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2367
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function version permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2258
2368
  },
2259
2369
  },
2260
2370
  },
@@ -2273,7 +2383,7 @@ export const commands = {
2273
2383
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhooks. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2274
2384
  scopes: {
2275
2385
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2276
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2386
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2277
2387
  },
2278
2388
  },
2279
2389
  },
@@ -2290,7 +2400,7 @@ export const commands = {
2290
2400
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhooks. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2291
2401
  scopes: {
2292
2402
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2293
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2403
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2294
2404
  },
2295
2405
  },
2296
2406
  },
@@ -2307,7 +2417,7 @@ export const commands = {
2307
2417
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhooks because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhooks. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2308
2418
  scopes: {
2309
2419
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2310
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2420
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2311
2421
  },
2312
2422
  },
2313
2423
  },
@@ -2326,7 +2436,7 @@ export const commands = {
2326
2436
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscriptions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2327
2437
  scopes: {
2328
2438
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2329
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2439
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2330
2440
  },
2331
2441
  },
2332
2442
  },
@@ -2343,7 +2453,7 @@ export const commands = {
2343
2453
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscriptions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2344
2454
  scopes: {
2345
2455
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2346
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2456
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2347
2457
  },
2348
2458
  },
2349
2459
  },
@@ -2360,7 +2470,7 @@ export const commands = {
2360
2470
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscriptions because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscriptions. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2361
2471
  scopes: {
2362
2472
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2363
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2473
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2364
2474
  },
2365
2475
  },
2366
2476
  },
@@ -2379,7 +2489,7 @@ export const commands = {
2379
2489
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscription events. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2380
2490
  scopes: {
2381
2491
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2382
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2492
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2383
2493
  },
2384
2494
  },
2385
2495
  },
@@ -2396,7 +2506,7 @@ export const commands = {
2396
2506
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscription events. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2397
2507
  scopes: {
2398
2508
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2399
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2509
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2400
2510
  },
2401
2511
  },
2402
2512
  },
@@ -2413,7 +2523,7 @@ export const commands = {
2413
2523
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscription events because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscription events. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2414
2524
  scopes: {
2415
2525
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2416
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2526
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2417
2527
  },
2418
2528
  },
2419
2529
  },
@@ -2432,7 +2542,7 @@ export const commands = {
2432
2542
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscription event types. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2433
2543
  scopes: {
2434
2544
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2435
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2545
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2436
2546
  },
2437
2547
  },
2438
2548
  },
@@ -2449,7 +2559,7 @@ export const commands = {
2449
2559
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscription event types. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2450
2560
  scopes: {
2451
2561
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2452
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2562
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2453
2563
  },
2454
2564
  },
2455
2565
  },
@@ -2466,7 +2576,7 @@ export const commands = {
2466
2576
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscription event types because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscription event types. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2467
2577
  scopes: {
2468
2578
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2469
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2579
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2470
2580
  },
2471
2581
  },
2472
2582
  },
@@ -2485,7 +2595,7 @@ export const commands = {
2485
2595
  invalidUser: (functionName, parentAccountName) => `Couldn't add ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to add serverless function webhook subscription event type options. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2486
2596
  scopes: {
2487
2597
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2488
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2598
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2489
2599
  },
2490
2600
  },
2491
2601
  },
@@ -2502,7 +2612,7 @@ export const commands = {
2502
2612
  invalidUser: (functionName, parentAccountName) => `Couldn't delete ${chalk.bold(functionName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to delete serverless function webhook subscription event type options. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2503
2613
  scopes: {
2504
2614
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2505
- instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2615
+ instructions: (functionName, url) => `To update CLI permissions for "${functionName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2506
2616
  },
2507
2617
  },
2508
2618
  },
@@ -2519,7 +2629,7 @@ export const commands = {
2519
2629
  invalidUser: (parentAccountName) => `Couldn't list serverless function webhook subscription event type options because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to list serverless function webhook subscription event type options. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
2520
2630
  scopes: {
2521
2631
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2522
- instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
2632
+ instructions: (url) => `To update CLI permissions: \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes serverless function webhook subscription event type option permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
2523
2633
  },
2524
2634
  },
2525
2635
  },
@@ -2630,7 +2740,7 @@ export const lib = {
2630
2740
  checking: 'Checking if your deployed build is up to date...',
2631
2741
  upToDate: 'Deployed build is up to date.',
2632
2742
  notUpToDate: `Your project contains undeployed local changes.`,
2633
- notUpToDateExplanation: (profile) => `Run ${uiCommandReference(`hs project upload ${profile ? `--profile ${profile}` : ''}`)} to upload these changes to HubSpot, then re-run ${uiCommandReference(`hs project dev ${profile ? `--profile ${profile}` : ''}`)} to continue local development.`,
2743
+ notUpToDateExplanation: (profile) => `Run ${uiCommandReference(`hs project upload${profile ? ` --profile ${profile}` : ''}`)} to upload these changes to HubSpot, then re-run ${uiCommandReference(`hs project dev${profile ? ` --profile ${profile}` : ''}`)} to continue local development.`,
2634
2744
  },
2635
2745
  createNewProjectForLocalDev: {
2636
2746
  projectMustExistExplanation: (projectName, accountId) => `The project ${projectName} does not exist in the target account ${uiAccountDescription(accountId)}. This command requires the project to exist in the target account.`,
@@ -2646,31 +2756,36 @@ export const lib = {
2646
2756
  projectLockedError: 'Your project is locked. This may mean that another user is running the `hs project watch` command for this project. If this is you, unlock the project in Projects UI.',
2647
2757
  genericError: `An error occurred while creating the initial build for this project. Run ${uiCommandReference('hs project upload')} to try again.`,
2648
2758
  },
2759
+ checkAndInstallDependencies: {
2760
+ checkingDependencies: 'Checking for missing or updated dependencies...',
2761
+ dependenciesUpToDate: 'All dependencies are up to date',
2762
+ dependenciesFailure: 'Failed to check or install dependencies',
2763
+ },
2649
2764
  },
2650
2765
  account: {
2651
2766
  checkIfDefaultAccountIsSupported: {
2652
- publicApp: `This project contains a public app. Local development of public apps is only supported on developer accounts and developer test accounts. Change your default account using ${uiCommandReference('hs accounts use')}, or link a new account with ${uiCommandReference('hs auth')}.`,
2653
- privateApp: `This project contains a private app. Local development of private apps is not supported in developer accounts. Change your default account using ${uiCommandReference('hs accounts use')}, or link a new account with ${uiCommandReference('hs auth')}.`,
2767
+ publicApp: `This project contains a public app. Local development of public apps is only supported on developer accounts and developer test accounts. Change your default account using ${uiCommandReference('hs account use')}, or link a new account with ${uiAuthCommandReference()}.`,
2768
+ privateApp: `This project contains a private app. Local development of private apps is not supported in developer accounts. Change your default account using ${uiCommandReference('hs account use')}, or link a new account with ${uiAuthCommandReference()}.`,
2654
2769
  },
2655
2770
  validateAccountOption: {
2656
- invalidPublicAppAccount: `This project contains a public app. The "--account" flag must point to a developer test account to develop this project locally. Alternatively, change your default account to an App Developer Account using ${uiCommandReference('hs accounts use')} and run ${uiCommandReference('hs project dev')} to set up a new Developer Test Account.`,
2657
- invalidPrivateAppAccount: `This project contains a private app. The account specified with the "--account" flag points to a developer account, which do not support the local development of private apps. Update the "--account" flag to point to a standard, sandbox, or developer test account, or change your default account by running ${uiCommandReference('hs accounts use')}.`,
2658
- nonSandboxWarning: `Testing in a sandbox is strongly recommended. To switch the target account, select an option below or run ${uiCommandReference('hs accounts use')} before running the command again.`,
2771
+ invalidPublicAppAccount: `This project contains a public app. The "--account" flag must point to a developer test account to develop this project locally. Alternatively, change your default account to an App Developer Account using ${uiCommandReference('hs account use')} and run ${uiCommandReference('hs project dev')} to set up a new Developer Test Account.`,
2772
+ invalidPrivateAppAccount: `This project contains a private app. The account specified with the "--account" flag points to a developer account, which do not support the local development of private apps. Update the "--account" flag to point to a standard, sandbox, or developer test account, or change your default account by running ${uiCommandReference('hs account use')}.`,
2773
+ nonSandboxWarning: `Testing in a sandbox is strongly recommended. To switch the target account, select an option below or run ${uiCommandReference('hs account use')} before running the command again.`,
2659
2774
  publicAppNonDeveloperTestAccountWarning: `Local development of public apps is only supported in ${chalk.bold('developer test accounts')}.`,
2660
2775
  },
2661
2776
  checkIfParentAccountIsAuthed: {
2662
- notAuthedError: (parentAccountId, accountIdentifier) => `To develop this project locally, run ${uiCommandReference(`hs auth --account=${parentAccountId}`)} to authenticate the App Developer Account ${parentAccountId} associated with ${accountIdentifier}.`,
2777
+ notAuthedError: (parentAccountId, accountIdentifier) => `To develop this project locally, run ${uiAuthCommandReference({ accountId: parentAccountId })} to authenticate the App Developer Account ${parentAccountId} associated with ${accountIdentifier}.`,
2663
2778
  },
2664
2779
  selectAccountTypePrompt: {
2665
- message: '[--testing-account] Choose the type of account to test on',
2780
+ message: 'Choose the type of account to test on',
2666
2781
  developerTestAccountOption: 'Test on a developer test account (recommended)',
2667
2782
  sandboxAccountOption: 'Test on a sandbox account',
2668
2783
  sandboxAccountOptionDisabled: 'Disabled - requires access to sandbox accounts',
2669
2784
  productionAccountOption: (accountId) => `<${chalk.red('!')} Test on your project account: ${uiAccountDescription(accountId, false)} ${chalk.red('!')}>`,
2670
2785
  },
2671
2786
  confirmDefaultAccountIsTarget: {
2672
- configError: `An error occurred while reading the default account from your config. Run ${uiCommandReference('hs auth')} to re-auth this account`,
2673
- declineDefaultAccountExplanation: `To develop on a different account, run ${uiCommandReference('hs accounts use')} to change your default account, then re-run ${uiCommandReference('hs project dev')}.`,
2787
+ configError: `An error occurred while reading the default account from your config. Run ${uiAuthCommandReference()} to re-auth this account`,
2788
+ declineDefaultAccountExplanation: `To develop on a different account, run ${uiCommandReference('hs account use')} to change your default account, then re-run ${uiCommandReference('hs project dev')}.`,
2674
2789
  },
2675
2790
  },
2676
2791
  },
@@ -2787,6 +2902,7 @@ export const lib = {
2787
2902
  compressed: (byteCount) => `Project files compressed: ${byteCount} bytes`,
2788
2903
  compressing: (path) => `Compressing build files to "${path}"`,
2789
2904
  fileFiltered: (filename) => `Ignore rule triggered for "${filename}"`,
2905
+ legacyFileDetected: (filename, platformVersion) => `The ${chalk.bold(filename)} file is not supported on platform version ${chalk.bold(platformVersion)} and will be ignored.`,
2790
2906
  },
2791
2907
  },
2792
2908
  boxen: {
@@ -2803,13 +2919,15 @@ export const lib = {
2803
2919
  viewImportLink: (baseUrl, accountId, importId) => `Data import currently processing. You can view the status of your import ${uiLink('here', `${baseUrl}/import/${accountId}/post/${importId}`)}`,
2804
2920
  },
2805
2921
  ui: {
2806
- betaTag: chalk.bold('[BETA]'),
2922
+ betaTag: '[BETA]',
2923
+ betaTagWithStyle: chalk.bold('[BETA]'),
2807
2924
  betaWarning: {
2808
2925
  header: chalk.yellow('***************************** WARNING ****************************'),
2809
2926
  footer: chalk.yellow('******************************************************************'),
2810
2927
  },
2811
2928
  infoTag: chalk.bold('[INFO]'),
2812
- deprecatedTag: chalk.bold('[DEPRECATED]'),
2929
+ deprecatedTag: '[DEPRECATED]',
2930
+ deprecatedTagWithStyle: chalk.bold('[DEPRECATED]'),
2813
2931
  errorTag: chalk.bold('[ERROR]'),
2814
2932
  deprecatedMessage: (command, url) => `The ${command} command is deprecated and will be disabled soon. ${url}`,
2815
2933
  deprecatedDescription: (message, command, url) => `${message}. The ${command} command is deprecated and will be disabled soon. ${url}`,
@@ -2828,7 +2946,7 @@ export const lib = {
2828
2946
  message: (command) => `${command} - See a list of configured HubSpot accounts`,
2829
2947
  },
2830
2948
  accountsUseCommand: {
2831
- command: 'hs accounts use',
2949
+ command: 'hs account use',
2832
2950
  message: (command) => `${command} - Set the Hubspot account that the CLI will target by default`,
2833
2951
  },
2834
2952
  authCommand: {
@@ -2867,6 +2985,9 @@ export const lib = {
2867
2985
  command: 'hs project install-deps',
2868
2986
  message: (command) => `${command} - Install all project dependencies`,
2869
2987
  },
2988
+ projectCommandTip: {
2989
+ message: 'Tip: All project commands must be run from within a project directory',
2990
+ },
2870
2991
  sampleProjects: {
2871
2992
  linkText: "HubSpot's sample projects",
2872
2993
  url: 'https://developers.hubspot.com/docs/platform/sample-projects?utm_source=cli&utm_content=project_create_whats_next',
@@ -2905,25 +3026,26 @@ export const lib = {
2905
3026
  },
2906
3027
  setAllowUsageTracking: {
2907
3028
  fieldName: 'usage tracking',
2908
- success: (isEnabled) => `Allow usage tracking set to: "${isEnabled}"`,
3029
+ success: (isEnabled) => `Successfully updated ${chalk.bold('allow usage tracking')} to ${chalk.bold(isEnabled)}`,
2909
3030
  },
2910
3031
  setAllowAutoUpdates: {
2911
3032
  fieldName: 'auto updates',
2912
- success: (isEnabled) => `Allow auto updates set to: "${isEnabled}"`,
3033
+ success: (isEnabled) => `Successfully updated ${chalk.bold('allow auto updates')} to ${chalk.bold(isEnabled)}`,
2913
3034
  },
2914
3035
  setDefaultCmsPublishMode: {
2915
3036
  promptMessage: 'Select CMS publish mode to be used as the default',
2916
3037
  error: (validModes) => `The provided CMS publish mode is invalid. Valid values are ${validModes}.`,
2917
- success: (mode) => `Default mode updated to: ${mode}`,
3038
+ success: (mode) => `Successfully updated ${chalk.bold('default CMS publish mode')} to ${chalk.bold(mode)}`,
2918
3039
  },
2919
3040
  setHttpTimeout: {
2920
3041
  promptMessage: 'Enter http timeout duration',
2921
- success: (timeout) => `HTTP timeout set to: ${timeout}`,
3042
+ success: (timeout) => `Successfully updated ${chalk.bold('HTTP timeout')} to ${chalk.bold(timeout)}`,
3043
+ error: (timeout) => `Invalid HTTP timeout value "${timeout}". Must be a number greater than 3000.`,
2922
3044
  },
2923
3045
  setAutoOpenBrowser: {
2924
3046
  fieldName: 'auto open browser',
2925
- enabled: 'Auto opening your browser has been enabled',
2926
- disabled: 'Auto opening your browser has been disabled',
3047
+ enabled: `Successfully updated ${chalk.bold('auto open browser')} to ${chalk.bold('enabled')}`,
3048
+ disabled: `Successfully updated ${chalk.bold('auto open browser')} to ${chalk.bold('disabled')}`,
2927
3049
  },
2928
3050
  },
2929
3051
  commonOpts: {
@@ -2961,6 +3083,11 @@ export const lib = {
2961
3083
  },
2962
3084
  },
2963
3085
  prompts: {
3086
+ promptUtils: {
3087
+ errors: {
3088
+ noSelectableChoices: 'Exiting prompt because no selectable choices are available',
3089
+ },
3090
+ },
2964
3091
  importDataFilePathPrompt: {
2965
3092
  promptContext: `To view the JSON schema for data imports, visit ${uiLink('the docs', 'https://developers.hubspot.com/docs/guides/api/crm/imports')}`,
2966
3093
  promptMessage: '[--file-path] Select the JSON file that will be used to import your data.',
@@ -2977,10 +3104,10 @@ export const lib = {
2977
3104
  projectDevTargetAccountPrompt: {
2978
3105
  createNewSandboxOption: '<Test on a new development sandbox>',
2979
3106
  createNewDeveloperTestAccountOption: '<Test on a new developer test account>',
2980
- chooseDefaultAccountOption: () => `<${chalk.bold('❗')} Test on this production account ${chalk.bold('❗')}>`,
2981
- promptMessage: (accountType, accountIdentifier) => `[--account] Choose a ${accountType} under ${accountIdentifier} to test with:`,
3107
+ chooseDefaultAccountOption: `<${chalk.bold('❗')} Test on this production account ${chalk.bold('❗')}>`,
3108
+ promptMessage: (accountType, accountIdentifier) => `Choose a ${accountType} under ${accountIdentifier} to test with:`,
2982
3109
  sandboxLimit: (limit) => `Your account reached the limit of ${limit} development sandboxes`,
2983
- sandboxLimitWithSuggestion: (limit, authCommand) => `Your account reached the limit of ${limit} development sandboxes. Run ${authCommand} to add an existing one to the config.`,
3110
+ sandboxLimitWithSuggestion: (limit) => `Your account reached the limit of ${limit} development sandboxes. Run ${uiAuthCommandReference()} to add an existing one to the config.`,
2984
3111
  developerTestAccountLimit: (limit) => `Your account reached the limit of ${limit} developer test accounts.`,
2985
3112
  confirmDefaultAccount: (accountName, accountType) => `Continue testing on ${chalk.bold(`${accountName} (${accountType})`)}? (Y/n)`,
2986
3113
  confirmUseExistingDeveloperTestAccount: (accountName) => `Continue with ${accountName}? This account isn't currently connected to the HubSpot CLI. By continuing, you'll be prompted to generate a personal access key and connect it.`,
@@ -3120,8 +3247,8 @@ export const lib = {
3120
3247
  selectAppIdClone: (accountName) => `[--appId] Choose an app under ${accountName} to clone:`,
3121
3248
  errors: {
3122
3249
  noAccountId: 'An account ID is required to select an app.',
3123
- noAppsMigration: () => `${chalk.bold('No apps to migrate')}`,
3124
- noAppsClone: () => `${chalk.bold('No apps to clone')}`,
3250
+ noAppsMigration: `${chalk.bold('No apps to migrate')}`,
3251
+ noAppsClone: `${chalk.bold('No apps to clone')}`,
3125
3252
  noAppsMigrationMessage: (accountName) => `The selected developer account ${chalk.bold(accountName)} doesn't have any apps that can be migrated to the projects framework.`,
3126
3253
  noAppsCloneMessage: (accountName) => `The selected developer account ${chalk.bold(accountName)} doesn't have any apps that can be cloned to the projects framework.`,
3127
3254
  errorFetchingApps: 'There was an error fetching public apps.',
@@ -3142,6 +3269,7 @@ export const lib = {
3142
3269
  errors: {
3143
3270
  nameRequired: 'A component name is required',
3144
3271
  componentRequired: 'Must select a feature to add',
3272
+ noSelectableChoices: 'There are no available features that can be added to this project',
3145
3273
  invalidType: (type) => `[--type] Could not find type "${type}". Please choose an available type:`,
3146
3274
  cannotAddFeature: (feature, reasons) => `Cannot Add feature '${feature}' to project for the following reasons: ${reasons}`,
3147
3275
  },
@@ -3177,7 +3305,7 @@ export const lib = {
3177
3305
  enterName: '[--project] Enter project name:',
3178
3306
  errors: {
3179
3307
  invalidName: 'You entered an invalid name. Please try again.',
3180
- projectDoesNotExist: (projectName, accountIdentifier) => `Project ${chalk.bold(projectName)} could not be found in "${accountIdentifier}"`,
3308
+ projectDoesNotExist: (projectName, accountId) => `Project ${chalk.bold(projectName)} could not be found in "${uiAccountDescription(accountId)}"`,
3181
3309
  },
3182
3310
  },
3183
3311
  previewPrompt: {
@@ -3237,11 +3365,11 @@ export const lib = {
3237
3365
  },
3238
3366
  failure: {
3239
3367
  invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3240
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To connect a developer test account to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
3241
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To use an existing developer test account, run ${chalk.bold('hs accounts use')}.`,
3368
+ limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To connect a developer test account to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
3369
+ alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer test accounts. \n- To use an existing developer test account, run ${uiCommandReference('hs account use')}.`,
3242
3370
  scopes: {
3243
3371
  message: "The personal access key you provided doesn't include developer test account permissions.",
3244
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer test account permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3372
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer test account permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3245
3373
  },
3246
3374
  },
3247
3375
  },
@@ -3258,14 +3386,13 @@ export const lib = {
3258
3386
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3259
3387
  },
3260
3388
  failure: {
3261
- invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3262
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To connect a developer sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
3263
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${chalk.bold('hs accounts use')}.`,
3389
+ limit: (accountId, limit, link) => `${uiAccountDescription(accountId)} reached the limit of ${limit} developer sandboxes. \n- View sandbox details at ${uiLink('View sandbox details at', link)} \n- To connect a developer sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
3390
+ alreadyInConfig: (accountId, limit) => `${uiAccountDescription(accountId)} reached the limit of ${limit} developer sandboxes. \n- To use an existing developer sandbox, run ${uiCommandReference('hs account use')}. \n- To delete an existing sandbox, run ${uiCommandReference('hs sandbox delete')}.`,
3391
+ generic: 'An error occurred while creating a developer sandbox',
3264
3392
  scopes: {
3265
3393
  message: "The personal access key you provided doesn't include developer sandbox permissions.",
3266
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3394
+ instructions: (account, url) => `To update CLI permissions for "${chalk.bold(account)}": \n- ${uiLink('Go to', url)}, deactivate the existing personal access key, and create a new one that includes developer sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3267
3395
  },
3268
- generic: 'An error occurred while creating a developer sandbox',
3269
3396
  },
3270
3397
  },
3271
3398
  standard: {
@@ -3278,30 +3405,54 @@ export const lib = {
3278
3405
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3279
3406
  },
3280
3407
  failure: {
3281
- invalidUser: (accountName, parentAccountName) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3282
- limit: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To connect a standard sandbox to your HubSpot CLI, run ${chalk.bold('hs auth')} and follow the prompts.`,
3283
- alreadyInConfig: (accountName, limit) => `${chalk.bold(accountName)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${chalk.bold('hs accounts use')}.`,
3408
+ limit: (accountId, limit, link) => `${uiAccountDescription(accountId)} reached the limit of ${limit} standard sandboxes.\n- View sandbox details at ${uiLink('View sandbox details at', link)} \n- To connect a standard sandbox to your HubSpot CLI, run ${uiAuthCommandReference()} and follow the prompts.`,
3409
+ alreadyInConfig: (accountId, limit) => `${uiAccountDescription(accountId)} reached the limit of ${limit} standard sandboxes. \n- To use an existing standard sandbox, run ${uiCommandReference('hs account use')}. \n- To delete an existing sandbox, run ${uiCommandReference('hs sandbox delete')}.`,
3284
3410
  scopes: {
3285
3411
  message: "The personal access key you provided doesn't include standard sandbox permissions.",
3286
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3412
+ instructions: (account, url) => `To update CLI permissions for "${chalk.bold(account)}": \n- ${uiLink('Go to', url)}, deactivate the existing personal access key, and create a new one that includes standard sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3287
3413
  },
3288
3414
  },
3289
3415
  },
3416
+ failure: {
3417
+ usageLimitsFetch: 'Unable to fetch sandbox usage limits. Please try again.',
3418
+ scopes: {
3419
+ message: "The personal access key you provided doesn't include sandbox permissions.",
3420
+ instructions: (account, url) => `To update CLI permissions for "${chalk.bold(account)}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes Sandbox permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3421
+ },
3422
+ invalidUser: (accountName, parentAccountId) => `Couldn't create ${chalk.bold(accountName)} because your account has been removed from ${uiAccountDescription(parentAccountId)} or your permission set doesn't allow you to create the sandbox. To update your permissions, contact a super admin in ${uiAccountDescription(parentAccountId)}.`,
3423
+ '403Gating': (accountName, parentAccountId) => `We couldn't create ${chalk.bold(accountName)} because ${uiAccountDescription(parentAccountId)} is a developer account and does not have access to development sandboxes. To gain access to developer sandboxes, you can ${uiLink('convert your account', 'https://developers.hubspot.com/docs/getting-started/convert-your-account-into-a-developer-crm-account')}.`,
3424
+ },
3290
3425
  },
3291
3426
  sync: {
3427
+ info: {
3428
+ syncMessage: (url) => `Asset sync from production to the sandbox is in progress and is running in the background. It may take some time. ${uiLink('View sync status details here', url)}`,
3429
+ syncMessageDevSb: (url) => `Sync of object definitions from production to the sandbox is in progress and is running in the background. It may take some time. ${url}`,
3430
+ },
3431
+ confirm: {
3432
+ syncContactRecords: {
3433
+ standard: 'Do you want to sync contact records from your production account?',
3434
+ },
3435
+ },
3292
3436
  loading: {
3293
3437
  add: (accountName) => `Syncing sandbox ${chalk.bold(accountName)}`,
3294
- fail: (accountName) => `Failed to sync sandbox ${chalk.bold(accountName)}.`,
3295
- succeed: (accountName) => `Successfully synced sandbox ${chalk.bold(accountName)}.`,
3438
+ fail: (accountId) => `Failed to sync sandbox ${uiAccountDescription(accountId)}.`,
3439
+ succeed: (accountId) => `Successfully synced sandbox ${uiAccountDescription(accountId)}.`,
3440
+ startSync: 'Initiating sync...',
3441
+ succeedDevSb: (accountId) => `Initiated sync of object definitions from production to ${uiAccountDescription(accountId)}`,
3442
+ successDevSbInfo: (accountId, url) => `Initiated sync of object definitions from production to ${uiAccountDescription(accountId)}. It may take some time. ${url}`,
3296
3443
  },
3297
3444
  success: {
3298
3445
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3299
3446
  },
3300
3447
  failure: {
3448
+ syncTypeFetch: 'Unable to fetch available sandbox sync types. Please try again.',
3301
3449
  invalidUser: (accountName, parentAccountName) => `Couldn't sync ${chalk.bold(accountName)} because your account has been removed from ${chalk.bold(parentAccountName)} or your permission set doesn't allow you to sync the sandbox. To update your permissions, contact a super admin in ${chalk.bold(parentAccountName)}.`,
3450
+ syncInProgress: (url) => `Couldn't run the sync because there's another sync in progress. Wait for the current sync to finish and then try again. To check the sync status, visit the sync activity log: ${url}.`,
3451
+ notSuperAdmin: (accountId) => `Couldn't run the sync because you are not a super admin in ${uiAccountDescription(accountId)}. Ask the account owner for super admin access to the sandbox.`,
3452
+ objectNotFound: (accountId) => `Couldn't sync the sandbox because ${uiAccountDescription(accountId)} may have been deleted through the UI. Run ${uiCommandReference('hs sandbox delete')} to remove this account from the config.`,
3302
3453
  scopes: {
3303
3454
  message: "The personal access key you provided doesn't include sandbox sync permissions.",
3304
- instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- Go to ${url}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${chalk.bold('hs auth')} and entering the new key.\n`,
3455
+ instructions: (accountName, url) => `To update CLI permissions for "${accountName}": \n- ${uiLink('Go to', url)}, deactivate the existing personal access key, and create a new one that includes sandbox sync permissions. \n- Update the CLI config for this account by running ${uiAuthCommandReference()} and entering the new key.\n`,
3305
3456
  },
3306
3457
  },
3307
3458
  },
@@ -3312,6 +3463,8 @@ export const lib = {
3312
3463
  errorContext: (context) => `Context: ${context}`,
3313
3464
  errorCause: (cause) => `Cause: ${cause}`,
3314
3465
  unknownErrorOccurred: 'An unknown error has occurred.',
3466
+ configTimeoutErrorOccurred: (timeout, configSetCommand) => `This error occurred because a request exceeded the default HTTP timeout of ${timeout}ms. To increase the default HTTP timeout, run ${uiCommandReference(configSetCommand)}.`,
3467
+ genericTimeoutErrorOccurred: 'This error occurred because an HTTP request timed out. Re-running the command may resolve this issue.',
3315
3468
  },
3316
3469
  suppressErrors: {
3317
3470
  platformVersionErrors: {
@@ -3323,7 +3476,7 @@ export const lib = {
3323
3476
  docsLink: 'Projects platform versioning (BETA)',
3324
3477
  betaLink: (docsLink) => `For more info, see ${docsLink}.`,
3325
3478
  },
3326
- missingScopeError: (request, accountName, authCommand) => `Couldn't execute the ${request} because the access key for ${accountName} is missing required scopes. To update scopes, run ${authCommand}. Then deactivate the existing key and generate a new one that includes the missing scopes.`,
3479
+ missingScopeError: (request, accountName) => `Couldn't execute the ${request} because the access key for ${accountName} is missing required scopes. To update scopes, run ${uiAuthCommandReference()}. Then deactivate the existing key and generate a new one that includes the missing scopes.`,
3327
3480
  },
3328
3481
  },
3329
3482
  serverless: {
@@ -3331,7 +3484,7 @@ export const lib = {
3331
3484
  fetchScopeDataError: (scopeGroup) => `Error verifying access of scopeGroup ${scopeGroup}:`,
3332
3485
  portalMissingScope: 'Your account does not have access to this action. Talk to an account admin to request it.',
3333
3486
  userMissingScope: "You don't have access to this action. Ask an account admin to change your permissions in Users & Teams settings.",
3334
- genericMissingScope: 'Your access key does not allow this action. Please generate a new access key by running `hs auth personalaccesskey`.',
3487
+ genericMissingScope: `Your access key does not allow this action. Please generate a new access key by running ${uiAuthCommandReference()}.`,
3335
3488
  },
3336
3489
  },
3337
3490
  doctor: {
@@ -3340,13 +3493,13 @@ export const lib = {
3340
3493
  accountChecks: {
3341
3494
  active: 'Default account active',
3342
3495
  inactive: "Default account isn't active",
3343
- inactiveSecondary: (command) => `Run ${command} to remove inactive accounts from your CLI config`,
3496
+ inactiveSecondary: (command) => `Run ${uiCommandReference(command)} to remove inactive accounts from your CLI config`,
3344
3497
  unableToDetermine: 'Unable to determine if the portal is active',
3345
3498
  pak: {
3346
3499
  incomplete: 'Personal access key is valid, but there are more scopes available to your user that are not included in your key.',
3347
- incompleteSecondary: (command, link) => `To add the available scopes, run ${command} and re-authenticate your account with a new key that has those scopes. Visit HubSpot to view selected and available scopes for your personal access key. ${link}`,
3500
+ incompleteSecondary: (link) => `To add the available scopes, run ${uiAuthCommandReference()} and re-authenticate your account with a new key that has those scopes. Visit HubSpot to view selected and available scopes for your personal access key. ${link}`,
3348
3501
  invalid: 'Personal access key is invalid',
3349
- invalidSecondary: (command) => `To get a new key, run ${command}, deactivate your access key, and generate a new one. Then use that new key to authenticate your account.`,
3502
+ invalidSecondary: `To get a new key, run ${uiAuthCommandReference()}, deactivate your access key, and generate a new one. Then use that new key to authenticate your account.`,
3350
3503
  valid: (link) => `Personal Access Key is valid. ${link}`,
3351
3504
  viewScopes: 'View selected scopes',
3352
3505
  },
@@ -3363,25 +3516,24 @@ export const lib = {
3363
3516
  },
3364
3517
  hsChecks: {
3365
3518
  notLatest: (hsVersion) => `Version ${hsVersion} outdated`,
3366
- notLatestSecondary: (command, hsVersion) => `Run ${command} to upgrade to the latest version ${hsVersion}`,
3519
+ notLatestSecondary: (command, hsVersion) => `Run ${uiCommandReference(command)} to upgrade to the latest version ${hsVersion}`,
3367
3520
  latest: (hsVersion) => `HubSpot CLI v${hsVersion} up to date`,
3368
3521
  unableToDetermine: 'Unable to determine if HubSpot CLI is up to date.',
3369
- unableToDetermineSecondary: (command, link) => `Run ${command} to check your installed version; then visit the ${link} to validate whether you have the latest version`,
3370
- unableToDetermineSecondaryLink: 'npm HubSpot CLI version history',
3522
+ unableToDetermineSecondary: (command, link) => `Run ${uiCommandReference(command)} to check your installed version; then visit the ${uiLink('npm HubSpot CLI version history', link)} to validate whether you have the latest version`,
3371
3523
  },
3372
3524
  projectDependenciesChecks: {
3373
3525
  missingDependencies: (dir) => `missing dependencies in ${chalk.bold(dir)}`,
3374
- missingDependenciesSecondary: (command) => `Run ${command} to install all project dependencies locally`,
3526
+ missingDependenciesSecondary: (command) => `Run ${uiCommandReference(command)} to install all project dependencies locally`,
3375
3527
  unableToDetermine: (dir) => `Unable to determine if dependencies are installed ${dir}`,
3376
3528
  success: 'App dependencies are installed and up to date',
3377
3529
  },
3378
3530
  files: {
3379
- invalidJson: (filename) => `invalid JSON in ${chalk.bold(filename)}`,
3531
+ invalidJson: (filename) => `Invalid JSON in ${chalk.bold(filename)}`,
3380
3532
  validJson: 'JSON files valid',
3381
3533
  },
3382
3534
  port: {
3383
3535
  inUse: (port) => `Port ${port} is in use`,
3384
- inUseSecondary: (command) => `Make sure it is available before running ${command}`,
3536
+ inUseSecondary: (command) => `Make sure it is available before running ${uiCommandReference(command)}`,
3385
3537
  available: (port) => `Port ${port} available for local development`,
3386
3538
  },
3387
3539
  diagnosis: {
@@ -3393,22 +3545,52 @@ export const lib = {
3393
3545
  configFileSubHeader: (filename) => `Config File: ${chalk.bold(filename)}`,
3394
3546
  defaultAccountSubHeader: (accountDetails) => `Default Account: ${accountDetails}`,
3395
3547
  noConfigFile: 'CLI configuration not found',
3396
- noConfigFileSecondary: (command) => `Run ${command} and follow the prompts to create your CLI configuration file and connect it to your HubSpot account`,
3548
+ noConfigFileSecondary: (command) => `Run ${uiCommandReference(command)} and follow the prompts to create your CLI configuration file and connect it to your HubSpot account`,
3549
+ settings: {
3550
+ httpUseLocalhost: `The setting ${chalk.bold('httpUseLocalhost')} is enabled`,
3551
+ httpUseLocalhostSecondary: 'This setting causes all CLI requests to route to localhost',
3552
+ },
3397
3553
  },
3398
3554
  projectConfig: {
3399
3555
  header: 'Project configuration',
3400
3556
  projectDirSubHeader: (projectDir) => `Project dir: ${chalk.bold(projectDir)}`,
3401
3557
  projectNameSubHeader: (projectName) => `Project name: ${chalk.bold(projectName)}`,
3402
3558
  },
3559
+ defaultAccountOverrideFile: {
3560
+ header: 'Default account override file path:',
3561
+ },
3403
3562
  counts: {
3404
3563
  errors: (count) => `${chalk.bold('Errors:')} ${count}`,
3405
3564
  warnings: (count) => `${chalk.bold('Warning:')} ${count}`,
3406
3565
  },
3407
3566
  },
3567
+ defaultAccountOverrideFileChecks: {
3568
+ overrideActive: (defaultAccountOverrideFile) => `Default account override file is active: ${defaultAccountOverrideFile}`,
3569
+ overrideAccountId: (overrideAccountId) => `Active account ID: ${overrideAccountId}`,
3570
+ },
3408
3571
  },
3409
3572
  oauth: {
3410
3573
  missingClientId: 'Error building oauth URL: missing client ID.',
3411
3574
  },
3575
+ validation: {
3576
+ accountNotFoundInConfig: (userProvidedAccount) => `The account "${userProvidedAccount}" could not be found in the config`,
3577
+ accountRequired: 'An account needs to be supplied either via "--account" or through setting a "defaultPortal"',
3578
+ userProvidedAccount: 'Cannot specify an account when environment variables are supplied. Please unset the environment variables or do not use the "--account" flag.',
3579
+ accountNotConfigured: (accountId) => `The account ${uiAccountDescription(accountId)} has not been configured`,
3580
+ invalidAuthType: (authType, accountId, configPath, validValues) => `Invalid "authType" value "${authType}" for account "${uiAccountDescription(accountId)}" in config file: ${configPath}. Valid values are ${validValues}.`,
3581
+ oauth2ConfigMissing: (accountId) => `The OAuth2 auth configuration for account ${uiAccountDescription(accountId)} is missing`,
3582
+ oauth2ConfigIncorrect: (accountId) => `The OAuth2 configuration for account ${uiAccountDescription(accountId)} is incorrect \n Run ${uiCommandReference('hs auth --auth-type=oauth2')} to reauthenticate`,
3583
+ oauth2AccessTokenNotFound: (accountId) => `The OAuth2 access token could not be found for accountId ${uiAccountDescription(accountId)}`,
3584
+ personalAccessKeyMissing: (accountId) => `The account "${uiAccountDescription(accountId)}" is configured to use a access key for authentication and is missing a "personalAccessKey" in the configuration file`,
3585
+ personalAccessKeyTokenRetrievalFailed: (accountId) => `An OAuth2 access token for account "${uiAccountDescription(accountId)} could not be retrieved using the "personalAccessKey" provided`,
3586
+ authConfigurationMissing: (accountId) => `The accountId ${uiAccountDescription(accountId)} is missing authentication configuration`,
3587
+ availableCMSModes: (modes) => `Available CMS publish modes are: ${modes}`,
3588
+ invalidCmsPublishMode: (cmsPublishMode, modesMessage) => `The CMS publish mode "${cmsPublishMode}" is invalid. ${modesMessage}`,
3589
+ missingCmsPublishMode: (modesMessage) => `The CMS publish mode option is missing. ${modesMessage}`,
3590
+ pathNotFile: (path) => `The path "${path}" is not a path to a file`,
3591
+ fileNotJson: (path) => `The file "${path}" must be a valid JSON file`,
3592
+ fileInvalidJson: (path) => `The file "${path}" contains invalid JSON`,
3593
+ },
3412
3594
  migrate: {
3413
3595
  componentsToBeMigrated: (components) => `The following features will be migrated: ${components}`,
3414
3596
  componentsThatWillNotBeMigrated: (components) => `[NOTE] These features are not yet supported for migration but will be available later: ${components}`,
@@ -3442,7 +3624,7 @@ export const lib = {
3442
3624
  },
3443
3625
  noAppsEligible: (accountId, reasons) => `No apps in account ${accountId} are currently migratable${reasons.length ? `\n - ${reasons.join('\n - ')}` : ''}`,
3444
3626
  invalidAccountTypeTitle: `${chalk.bold('Developer account not targeted')}`,
3445
- invalidAccountTypeDescription: (useCommand, authCommand) => `Only public apps created in a developer account can be converted to a project component. Select a connected developer account with ${useCommand} or ${authCommand} and try again.`,
3627
+ invalidAccountTypeDescription: (useCommand) => `Only public apps created in a developer account can be converted to a project component. Select a connected developer account with ${useCommand} or ${uiAuthCommandReference()} and try again.`,
3446
3628
  appWithAppIdNotFound: (appId) => `Could not find an app with the id ${appId} `,
3447
3629
  noAppsForProject: (projectName) => `No apps associated with project ${projectName}`,
3448
3630
  migrationFailed: 'Migration Failed',