@hubspot/cli 7.8.11-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 (252) 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/auth.d.ts +1 -0
  16. package/commands/auth.js +16 -7
  17. package/commands/cms/convertFields.js +7 -9
  18. package/commands/cms/getReactModule.js +9 -14
  19. package/commands/cms/lighthouseScore.js +33 -36
  20. package/commands/cms.js +2 -2
  21. package/commands/completion.js +3 -3
  22. package/commands/config/set.d.ts +1 -1
  23. package/commands/config/set.js +64 -36
  24. package/commands/config.js +2 -2
  25. package/commands/create.js +2 -2
  26. package/commands/customObject/create.js +10 -12
  27. package/commands/customObject/schema/create.js +9 -11
  28. package/commands/customObject/schema/delete.js +16 -16
  29. package/commands/customObject/schema/fetch-all.js +12 -11
  30. package/commands/customObject/schema/fetch.js +15 -15
  31. package/commands/customObject/schema/list.js +4 -4
  32. package/commands/customObject/schema/update.js +13 -13
  33. package/commands/customObject/schema.js +2 -2
  34. package/commands/customObject.js +6 -7
  35. package/commands/doctor.js +8 -11
  36. package/commands/feedback.js +6 -11
  37. package/commands/fetch.js +8 -8
  38. package/commands/filemanager/fetch.js +7 -7
  39. package/commands/filemanager/upload.js +15 -34
  40. package/commands/filemanager.js +2 -2
  41. package/commands/function/deploy.js +11 -29
  42. package/commands/function/list.js +8 -8
  43. package/commands/function/server.js +9 -11
  44. package/commands/function.d.ts +1 -1
  45. package/commands/function.js +2 -2
  46. package/commands/getStarted.js +2 -2
  47. package/commands/hubdb/clear.js +7 -15
  48. package/commands/hubdb/create.js +9 -15
  49. package/commands/hubdb/delete.js +8 -15
  50. package/commands/hubdb/fetch.js +6 -9
  51. package/commands/hubdb.d.ts +1 -1
  52. package/commands/hubdb.js +2 -2
  53. package/commands/init.js +2 -3
  54. package/commands/lint.js +16 -16
  55. package/commands/list.js +8 -14
  56. package/commands/logs.js +14 -20
  57. package/commands/mv.js +6 -17
  58. package/commands/open.js +5 -5
  59. package/commands/project/__tests__/add.test.js +4 -2
  60. package/commands/project/__tests__/deploy.test.js +3 -4
  61. package/commands/project/__tests__/installDeps.test.js +8 -8
  62. package/commands/project/__tests__/logs.test.js +1 -1
  63. package/commands/project/__tests__/migrate.test.js +5 -5
  64. package/commands/project/__tests__/migrateApp.test.js +2 -5
  65. package/commands/project/__tests__/validate.test.js +98 -0
  66. package/commands/project/add.js +3 -3
  67. package/commands/project/cloneApp.js +14 -19
  68. package/commands/project/create.js +0 -1
  69. package/commands/project/deploy.js +3 -3
  70. package/commands/project/dev/deprecatedFlow.js +7 -16
  71. package/commands/project/dev/index.js +14 -12
  72. package/commands/project/dev/unifiedFlow.js +3 -1
  73. package/commands/project/download.js +10 -13
  74. package/commands/project/installDeps.js +8 -8
  75. package/commands/project/listBuilds.js +11 -20
  76. package/commands/project/logs.js +21 -24
  77. package/commands/project/migrate.js +14 -16
  78. package/commands/project/migrateApp.js +9 -15
  79. package/commands/project/open.js +6 -13
  80. package/commands/project/upload.js +16 -25
  81. package/commands/project/validate.js +6 -6
  82. package/commands/project/watch.js +13 -22
  83. package/commands/project.js +2 -2
  84. package/commands/sandbox/__tests__/create.test.js +5 -5
  85. package/commands/sandbox/create.js +22 -32
  86. package/commands/sandbox/delete.js +38 -63
  87. package/commands/sandbox.js +2 -2
  88. package/commands/secret/addSecret.js +7 -17
  89. package/commands/secret/deleteSecret.js +10 -20
  90. package/commands/secret/listSecret.js +8 -10
  91. package/commands/secret/updateSecret.js +9 -17
  92. package/commands/secret.js +2 -2
  93. package/commands/testAccount/__tests__/delete.test.js +2 -4
  94. package/commands/testAccount/delete.d.ts +4 -3
  95. package/commands/testAccount/delete.js +155 -14
  96. package/commands/theme/preview.js +1 -4
  97. package/lang/en.d.ts +310 -102
  98. package/lang/en.js +351 -147
  99. package/lang/en.lyaml +2 -2
  100. package/lib/__tests__/buildAccount.test.js +2 -1
  101. package/lib/__tests__/commonOpts.test.js +1 -1
  102. package/lib/__tests__/dependencyManagement.test.js +1 -1
  103. package/lib/__tests__/developerTestAccounts.test.js +3 -3
  104. package/lib/__tests__/npm.test.js +1 -1
  105. package/lib/__tests__/oauth.test.js +4 -4
  106. package/lib/__tests__/process.test.js +10 -5
  107. package/lib/__tests__/sandboxSync.test.js +8 -8
  108. package/lib/__tests__/sandboxes.test.js +8 -8
  109. package/lib/__tests__/serverlessLogs.test.js +1 -1
  110. package/lib/__tests__/usageTracking.test.js +5 -5
  111. package/lib/__tests__/validation.test.js +2 -1
  112. package/lib/__tests__/yargsUtils.test.js +83 -9
  113. package/lib/app/__tests__/migrate.test.js +5 -5
  114. package/lib/app/__tests__/migrate_legacy.test.js +1 -1
  115. package/lib/app/migrate.js +1 -1
  116. package/lib/app/migrate_legacy.js +20 -24
  117. package/lib/buildAccount.js +25 -57
  118. package/lib/commonOpts.d.ts +1 -1
  119. package/lib/commonOpts.js +25 -22
  120. package/lib/configOptions.js +7 -0
  121. package/lib/constants.d.ts +6 -1
  122. package/lib/constants.js +10 -1
  123. package/lib/dependencyManagement.js +9 -27
  124. package/lib/developerTestAccounts.js +9 -23
  125. package/lib/doctor/Diagnosis.js +11 -23
  126. package/lib/doctor/DiagnosticInfoBuilder.js +12 -11
  127. package/lib/doctor/Doctor.js +42 -90
  128. package/lib/doctor/__tests__/Doctor.test.js +4 -4
  129. package/lib/errorHandlers/index.js +12 -20
  130. package/lib/errorHandlers/suppressError.js +11 -18
  131. package/lib/lang.js +6 -5
  132. package/lib/links.js +4 -4
  133. package/lib/middleware/__test__/commandTargetingUtils.test.d.ts +1 -0
  134. package/lib/middleware/__test__/commandTargetingUtils.test.js +99 -0
  135. package/lib/middleware/__test__/configMiddleware.test.js +11 -11
  136. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +6 -8
  137. package/lib/middleware/commandTargetingUtils.d.ts +8 -0
  138. package/lib/middleware/commandTargetingUtils.js +78 -0
  139. package/lib/middleware/configMiddleware.d.ts +1 -1
  140. package/lib/middleware/configMiddleware.js +21 -81
  141. package/lib/middleware/fireAlarmMiddleware.js +15 -17
  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/projects/__tests__/AppDevModeInterface.test.js +14 -34
  149. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +70 -39
  150. package/lib/projects/__tests__/localDevProjectHelpers.test.js +2 -0
  151. package/lib/projects/__tests__/platformVersion.test.js +8 -8
  152. package/lib/projects/__tests__/projects.test.js +12 -12
  153. package/lib/projects/__tests__/structure.test.js +3 -3
  154. package/lib/projects/__tests__/upload.test.d.ts +1 -0
  155. package/lib/projects/__tests__/upload.test.js +82 -0
  156. package/lib/projects/add/__tests__/legacyAddComponent.test.js +6 -6
  157. package/lib/projects/add/__tests__/v3AddComponent.test.js +4 -4
  158. package/lib/projects/create/__tests__/legacy.test.js +5 -5
  159. package/lib/projects/create/__tests__/v3.test.js +1 -1
  160. package/lib/projects/create/index.js +2 -2
  161. package/lib/projects/create/legacy.js +2 -2
  162. package/lib/projects/create/v3.js +2 -2
  163. package/lib/projects/localDev/AppDevModeInterface.d.ts +2 -0
  164. package/lib/projects/localDev/AppDevModeInterface.js +22 -20
  165. package/lib/projects/localDev/LocalDevLogger.js +10 -11
  166. package/lib/projects/localDev/LocalDevManager.js +4 -5
  167. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +0 -1
  168. package/lib/projects/localDev/LocalDevWebsocketServer.js +7 -10
  169. package/lib/projects/localDev/helpers/project.d.ts +1 -0
  170. package/lib/projects/localDev/helpers/project.js +37 -0
  171. package/lib/projects/platformVersion.d.ts +1 -1
  172. package/lib/projects/platformVersion.js +1 -1
  173. package/lib/projects/structure.js +6 -6
  174. package/lib/projects/upload.d.ts +1 -1
  175. package/lib/projects/upload.js +17 -8
  176. package/lib/prompts/__tests__/downloadProjectPrompt.test.js +1 -0
  177. package/lib/prompts/accountNamePrompt.js +14 -19
  178. package/lib/prompts/accountsPrompt.js +2 -2
  179. package/lib/prompts/cmsFieldPrompt.js +2 -2
  180. package/lib/prompts/createApiSamplePrompt.js +5 -5
  181. package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +10 -1
  182. package/lib/prompts/createFunctionPrompt.js +14 -14
  183. package/lib/prompts/createModulePrompt.js +9 -9
  184. package/lib/prompts/createTemplatePrompt.js +2 -2
  185. package/lib/prompts/downloadProjectPrompt.js +5 -8
  186. package/lib/prompts/personalAccessKeyPrompt.js +3 -3
  187. package/lib/prompts/previewPrompt.js +6 -6
  188. package/lib/prompts/projectAddPrompt.js +6 -0
  189. package/lib/prompts/projectDevTargetAccountPrompt.js +20 -32
  190. package/lib/prompts/projectNamePrompt.js +4 -8
  191. package/lib/prompts/projectsLogsPrompt.js +2 -4
  192. package/lib/prompts/promptUtils.js +27 -9
  193. package/lib/prompts/sandboxesPrompt.js +7 -7
  194. package/lib/prompts/secretPrompt.js +3 -3
  195. package/lib/prompts/selectAppPrompt.js +3 -3
  196. package/lib/prompts/selectHubDBTablePrompt.js +9 -13
  197. package/lib/prompts/selectPublicAppForMigrationPrompt.js +15 -19
  198. package/lib/prompts/setAsDefaultAccountPrompt.js +4 -8
  199. package/lib/prompts/uploadPrompt.js +5 -5
  200. package/lib/sandboxSync.js +24 -41
  201. package/lib/sandboxes.js +19 -47
  202. package/lib/schema.js +3 -3
  203. package/lib/serverlessLogs.js +11 -13
  204. package/lib/theme/__tests__/migrate.test.js +3 -3
  205. package/lib/theme/migrate.js +2 -2
  206. package/lib/ui/SpinniesManager.d.ts +2 -0
  207. package/lib/ui/SpinniesManager.js +7 -0
  208. package/lib/ui/boxen.js +1 -2
  209. package/lib/ui/git.js +13 -10
  210. package/lib/ui/index.d.ts +4 -0
  211. package/lib/ui/index.js +47 -38
  212. package/lib/ui/serverlessFunctionLogs.js +9 -7
  213. package/lib/ui/uiMessages.d.ts +68 -0
  214. package/lib/ui/uiMessages.js +71 -0
  215. package/lib/usageTracking.js +7 -7
  216. package/lib/validation.js +20 -23
  217. package/lib/yargsUtils.d.ts +1 -1
  218. package/lib/yargsUtils.js +12 -5
  219. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  220. package/mcp-server/tools/index.js +4 -0
  221. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.d.ts +23 -0
  222. package/mcp-server/tools/project/GetApiUsagePatternsByAppIdTool.js +68 -0
  223. package/mcp-server/tools/project/GetApplicationInfoTool.d.ts +11 -0
  224. package/mcp-server/tools/project/GetApplicationInfoTool.js +49 -0
  225. package/mcp-server/tools/project/GetConfigValuesTool.js +2 -2
  226. package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +2 -2
  227. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.d.ts +1 -0
  228. package/mcp-server/tools/project/__tests__/GetApiUsagePatternsByAppIdTool.test.js +169 -0
  229. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.d.ts +1 -0
  230. package/mcp-server/tools/project/__tests__/GetApplicationInfoTool.test.js +115 -0
  231. package/mcp-server/utils/toolUsageTracking.js +2 -2
  232. package/package.json +7 -7
  233. package/ui/components/BoxWithTitle.d.ts +8 -0
  234. package/ui/components/BoxWithTitle.js +9 -0
  235. package/ui/components/HorizontalSelectPrompt.d.ts +8 -0
  236. package/ui/components/HorizontalSelectPrompt.js +30 -0
  237. package/ui/components/StatusMessageBoxes.d.ts +12 -0
  238. package/ui/components/StatusMessageBoxes.js +31 -0
  239. package/ui/index.d.ts +1 -0
  240. package/ui/index.js +6 -0
  241. package/ui/lib/ui-testing-utils.d.ts +9 -0
  242. package/ui/lib/ui-testing-utils.js +47 -0
  243. package/ui/lib/useTerminalSize.d.ts +13 -0
  244. package/ui/lib/useTerminalSize.js +31 -0
  245. package/ui/styles.d.ts +18 -0
  246. package/ui/styles.js +18 -0
  247. package/ui/views/UiSandbox.d.ts +5 -0
  248. package/ui/views/UiSandbox.js +25 -0
  249. package/lib/middleware/__test__/utils.test.js +0 -51
  250. package/lib/middleware/utils.d.ts +0 -8
  251. package/lib/middleware/utils.js +0 -14
  252. /package/{lib/middleware/__test__/utils.test.d.ts → commands/project/__tests__/validate.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
  },
@@ -1627,7 +1736,7 @@ export const commands = {
1627
1736
  describe: 'Create a new secret.',
1628
1737
  errors: {
1629
1738
  add: (secretName) => `The secret "${secretName}" was not added`,
1630
- 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')}`,
1631
1740
  },
1632
1741
  positionals: {
1633
1742
  name: {
@@ -1635,7 +1744,7 @@ export const commands = {
1635
1744
  },
1636
1745
  },
1637
1746
  success: {
1638
- 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)}`,
1639
1748
  },
1640
1749
  },
1641
1750
  delete: {
@@ -1653,7 +1762,7 @@ export const commands = {
1653
1762
  },
1654
1763
  },
1655
1764
  success: {
1656
- 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)}`,
1657
1766
  },
1658
1767
  },
1659
1768
  list: {
@@ -1676,7 +1785,7 @@ export const commands = {
1676
1785
  },
1677
1786
  },
1678
1787
  success: {
1679
- 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}`,
1680
1789
  updateExplanation: 'Existing serverless functions will start using this new value within 10 seconds.',
1681
1790
  },
1682
1791
  },
@@ -1905,18 +2014,41 @@ export const commands = {
1905
2014
  example: (name) => `Create a test account config file with the name "${name}"`,
1906
2015
  },
1907
2016
  delete: {
1908
- describe: 'Delete a test account config file.',
2017
+ describe: 'Delete a test account from your HubSpot account and CLI config',
1909
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
+ },
1910
2028
  errors: {
1911
- 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.`,
1912
2036
  },
1913
2037
  success: {
1914
- 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`,
1915
2040
  },
1916
- positionals: {
1917
- 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',
1918
2051
  },
1919
- example: (testAccountId) => `Delete a test account with the id "${testAccountId}"`,
1920
2052
  },
1921
2053
  },
1922
2054
  secrets: {
@@ -1933,7 +2065,7 @@ export const commands = {
1933
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)}.`,
1934
2066
  scopes: {
1935
2067
  message: "The personal access key you provided doesn't include secrets permissions.",
1936
- 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`,
1937
2069
  },
1938
2070
  },
1939
2071
  },
@@ -1950,7 +2082,7 @@ export const commands = {
1950
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)}.`,
1951
2083
  scopes: {
1952
2084
  message: "The personal access key you provided doesn't include secrets permissions.",
1953
- 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`,
1954
2086
  },
1955
2087
  },
1956
2088
  },
@@ -1967,7 +2099,7 @@ export const commands = {
1967
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)}.`,
1968
2100
  scopes: {
1969
2101
  message: "The personal access key you provided doesn't include secrets permissions.",
1970
- 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`,
1971
2103
  },
1972
2104
  },
1973
2105
  },
@@ -1986,7 +2118,7 @@ export const commands = {
1986
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)}.`,
1987
2119
  scopes: {
1988
2120
  message: "The personal access key you provided doesn't include serverless function permissions.",
1989
- 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`,
1990
2122
  },
1991
2123
  },
1992
2124
  },
@@ -2003,7 +2135,7 @@ export const commands = {
2003
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)}.`,
2004
2136
  scopes: {
2005
2137
  message: "The personal access key you provided doesn't include serverless function permissions.",
2006
- 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`,
2007
2139
  },
2008
2140
  },
2009
2141
  },
@@ -2020,7 +2152,7 @@ export const commands = {
2020
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)}.`,
2021
2153
  scopes: {
2022
2154
  message: "The personal access key you provided doesn't include serverless function permissions.",
2023
- 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`,
2024
2156
  },
2025
2157
  },
2026
2158
  },
@@ -2039,7 +2171,7 @@ export const commands = {
2039
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)}.`,
2040
2172
  scopes: {
2041
2173
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2042
- 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`,
2043
2175
  },
2044
2176
  },
2045
2177
  },
@@ -2056,7 +2188,7 @@ export const commands = {
2056
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)}.`,
2057
2189
  scopes: {
2058
2190
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2059
- 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`,
2060
2192
  },
2061
2193
  },
2062
2194
  },
@@ -2073,7 +2205,7 @@ export const commands = {
2073
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)}.`,
2074
2206
  scopes: {
2075
2207
  message: "The personal access key you provided doesn't include serverless function log permissions.",
2076
- 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`,
2077
2209
  },
2078
2210
  },
2079
2211
  },
@@ -2092,7 +2224,7 @@ export const commands = {
2092
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)}.`,
2093
2225
  scopes: {
2094
2226
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2095
- 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`,
2096
2228
  },
2097
2229
  },
2098
2230
  },
@@ -2109,7 +2241,7 @@ export const commands = {
2109
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)}.`,
2110
2242
  scopes: {
2111
2243
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2112
- 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`,
2113
2245
  },
2114
2246
  },
2115
2247
  },
@@ -2126,7 +2258,7 @@ export const commands = {
2126
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)}.`,
2127
2259
  scopes: {
2128
2260
  message: "The personal access key you provided doesn't include serverless function metric permissions.",
2129
- 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`,
2130
2262
  },
2131
2263
  },
2132
2264
  },
@@ -2145,7 +2277,7 @@ export const commands = {
2145
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)}.`,
2146
2278
  scopes: {
2147
2279
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2148
- 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`,
2149
2281
  },
2150
2282
  },
2151
2283
  },
@@ -2162,7 +2294,7 @@ export const commands = {
2162
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)}.`,
2163
2295
  scopes: {
2164
2296
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2165
- 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`,
2166
2298
  },
2167
2299
  },
2168
2300
  },
@@ -2179,7 +2311,7 @@ export const commands = {
2179
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)}.`,
2180
2312
  scopes: {
2181
2313
  message: "The personal access key you provided doesn't include serverless function setting permissions.",
2182
- 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`,
2183
2315
  },
2184
2316
  },
2185
2317
  },
@@ -2198,7 +2330,7 @@ export const commands = {
2198
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)}.`,
2199
2331
  scopes: {
2200
2332
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2201
- 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`,
2202
2334
  },
2203
2335
  },
2204
2336
  },
@@ -2215,7 +2347,7 @@ export const commands = {
2215
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)}.`,
2216
2348
  scopes: {
2217
2349
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2218
- 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`,
2219
2351
  },
2220
2352
  },
2221
2353
  },
@@ -2232,7 +2364,7 @@ export const commands = {
2232
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)}.`,
2233
2365
  scopes: {
2234
2366
  message: "The personal access key you provided doesn't include serverless function version permissions.",
2235
- 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`,
2236
2368
  },
2237
2369
  },
2238
2370
  },
@@ -2251,7 +2383,7 @@ export const commands = {
2251
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)}.`,
2252
2384
  scopes: {
2253
2385
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2254
- 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`,
2255
2387
  },
2256
2388
  },
2257
2389
  },
@@ -2268,7 +2400,7 @@ export const commands = {
2268
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)}.`,
2269
2401
  scopes: {
2270
2402
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2271
- 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`,
2272
2404
  },
2273
2405
  },
2274
2406
  },
@@ -2285,7 +2417,7 @@ export const commands = {
2285
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)}.`,
2286
2418
  scopes: {
2287
2419
  message: "The personal access key you provided doesn't include serverless function webhook permissions.",
2288
- 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`,
2289
2421
  },
2290
2422
  },
2291
2423
  },
@@ -2304,7 +2436,7 @@ export const commands = {
2304
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)}.`,
2305
2437
  scopes: {
2306
2438
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2307
- 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`,
2308
2440
  },
2309
2441
  },
2310
2442
  },
@@ -2321,7 +2453,7 @@ export const commands = {
2321
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)}.`,
2322
2454
  scopes: {
2323
2455
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2324
- 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`,
2325
2457
  },
2326
2458
  },
2327
2459
  },
@@ -2338,7 +2470,7 @@ export const commands = {
2338
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)}.`,
2339
2471
  scopes: {
2340
2472
  message: "The personal access key you provided doesn't include serverless function webhook subscription permissions.",
2341
- 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`,
2342
2474
  },
2343
2475
  },
2344
2476
  },
@@ -2357,7 +2489,7 @@ export const commands = {
2357
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)}.`,
2358
2490
  scopes: {
2359
2491
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2360
- 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`,
2361
2493
  },
2362
2494
  },
2363
2495
  },
@@ -2374,7 +2506,7 @@ export const commands = {
2374
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)}.`,
2375
2507
  scopes: {
2376
2508
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2377
- 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`,
2378
2510
  },
2379
2511
  },
2380
2512
  },
@@ -2391,7 +2523,7 @@ export const commands = {
2391
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)}.`,
2392
2524
  scopes: {
2393
2525
  message: "The personal access key you provided doesn't include serverless function webhook subscription event permissions.",
2394
- 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`,
2395
2527
  },
2396
2528
  },
2397
2529
  },
@@ -2410,7 +2542,7 @@ export const commands = {
2410
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)}.`,
2411
2543
  scopes: {
2412
2544
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2413
- 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`,
2414
2546
  },
2415
2547
  },
2416
2548
  },
@@ -2427,7 +2559,7 @@ export const commands = {
2427
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)}.`,
2428
2560
  scopes: {
2429
2561
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2430
- 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`,
2431
2563
  },
2432
2564
  },
2433
2565
  },
@@ -2444,7 +2576,7 @@ export const commands = {
2444
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)}.`,
2445
2577
  scopes: {
2446
2578
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type permissions.",
2447
- 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`,
2448
2580
  },
2449
2581
  },
2450
2582
  },
@@ -2463,7 +2595,7 @@ export const commands = {
2463
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)}.`,
2464
2596
  scopes: {
2465
2597
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2466
- 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`,
2467
2599
  },
2468
2600
  },
2469
2601
  },
@@ -2480,7 +2612,7 @@ export const commands = {
2480
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)}.`,
2481
2613
  scopes: {
2482
2614
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2483
- 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`,
2484
2616
  },
2485
2617
  },
2486
2618
  },
@@ -2497,7 +2629,7 @@ export const commands = {
2497
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)}.`,
2498
2630
  scopes: {
2499
2631
  message: "The personal access key you provided doesn't include serverless function webhook subscription event type option permissions.",
2500
- 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`,
2501
2633
  },
2502
2634
  },
2503
2635
  },
@@ -2608,7 +2740,7 @@ export const lib = {
2608
2740
  checking: 'Checking if your deployed build is up to date...',
2609
2741
  upToDate: 'Deployed build is up to date.',
2610
2742
  notUpToDate: `Your project contains undeployed local changes.`,
2611
- 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.`,
2612
2744
  },
2613
2745
  createNewProjectForLocalDev: {
2614
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.`,
@@ -2624,31 +2756,36 @@ export const lib = {
2624
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.',
2625
2757
  genericError: `An error occurred while creating the initial build for this project. Run ${uiCommandReference('hs project upload')} to try again.`,
2626
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
+ },
2627
2764
  },
2628
2765
  account: {
2629
2766
  checkIfDefaultAccountIsSupported: {
2630
- 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')}.`,
2631
- 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()}.`,
2632
2769
  },
2633
2770
  validateAccountOption: {
2634
- 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.`,
2635
- 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')}.`,
2636
- 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.`,
2637
2774
  publicAppNonDeveloperTestAccountWarning: `Local development of public apps is only supported in ${chalk.bold('developer test accounts')}.`,
2638
2775
  },
2639
2776
  checkIfParentAccountIsAuthed: {
2640
- 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}.`,
2641
2778
  },
2642
2779
  selectAccountTypePrompt: {
2643
- message: '[--testing-account] Choose the type of account to test on',
2780
+ message: 'Choose the type of account to test on',
2644
2781
  developerTestAccountOption: 'Test on a developer test account (recommended)',
2645
2782
  sandboxAccountOption: 'Test on a sandbox account',
2646
2783
  sandboxAccountOptionDisabled: 'Disabled - requires access to sandbox accounts',
2647
2784
  productionAccountOption: (accountId) => `<${chalk.red('!')} Test on your project account: ${uiAccountDescription(accountId, false)} ${chalk.red('!')}>`,
2648
2785
  },
2649
2786
  confirmDefaultAccountIsTarget: {
2650
- configError: `An error occurred while reading the default account from your config. Run ${uiCommandReference('hs auth')} to re-auth this account`,
2651
- 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')}.`,
2652
2789
  },
2653
2790
  },
2654
2791
  },
@@ -2765,6 +2902,7 @@ export const lib = {
2765
2902
  compressed: (byteCount) => `Project files compressed: ${byteCount} bytes`,
2766
2903
  compressing: (path) => `Compressing build files to "${path}"`,
2767
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.`,
2768
2906
  },
2769
2907
  },
2770
2908
  boxen: {
@@ -2781,13 +2919,15 @@ export const lib = {
2781
2919
  viewImportLink: (baseUrl, accountId, importId) => `Data import currently processing. You can view the status of your import ${uiLink('here', `${baseUrl}/import/${accountId}/post/${importId}`)}`,
2782
2920
  },
2783
2921
  ui: {
2784
- betaTag: chalk.bold('[BETA]'),
2922
+ betaTag: '[BETA]',
2923
+ betaTagWithStyle: chalk.bold('[BETA]'),
2785
2924
  betaWarning: {
2786
2925
  header: chalk.yellow('***************************** WARNING ****************************'),
2787
2926
  footer: chalk.yellow('******************************************************************'),
2788
2927
  },
2789
2928
  infoTag: chalk.bold('[INFO]'),
2790
- deprecatedTag: chalk.bold('[DEPRECATED]'),
2929
+ deprecatedTag: '[DEPRECATED]',
2930
+ deprecatedTagWithStyle: chalk.bold('[DEPRECATED]'),
2791
2931
  errorTag: chalk.bold('[ERROR]'),
2792
2932
  deprecatedMessage: (command, url) => `The ${command} command is deprecated and will be disabled soon. ${url}`,
2793
2933
  deprecatedDescription: (message, command, url) => `${message}. The ${command} command is deprecated and will be disabled soon. ${url}`,
@@ -2806,7 +2946,7 @@ export const lib = {
2806
2946
  message: (command) => `${command} - See a list of configured HubSpot accounts`,
2807
2947
  },
2808
2948
  accountsUseCommand: {
2809
- command: 'hs accounts use',
2949
+ command: 'hs account use',
2810
2950
  message: (command) => `${command} - Set the Hubspot account that the CLI will target by default`,
2811
2951
  },
2812
2952
  authCommand: {
@@ -2845,6 +2985,9 @@ export const lib = {
2845
2985
  command: 'hs project install-deps',
2846
2986
  message: (command) => `${command} - Install all project dependencies`,
2847
2987
  },
2988
+ projectCommandTip: {
2989
+ message: 'Tip: All project commands must be run from within a project directory',
2990
+ },
2848
2991
  sampleProjects: {
2849
2992
  linkText: "HubSpot's sample projects",
2850
2993
  url: 'https://developers.hubspot.com/docs/platform/sample-projects?utm_source=cli&utm_content=project_create_whats_next',
@@ -2883,25 +3026,26 @@ export const lib = {
2883
3026
  },
2884
3027
  setAllowUsageTracking: {
2885
3028
  fieldName: 'usage tracking',
2886
- success: (isEnabled) => `Allow usage tracking set to: "${isEnabled}"`,
3029
+ success: (isEnabled) => `Successfully updated ${chalk.bold('allow usage tracking')} to ${chalk.bold(isEnabled)}`,
2887
3030
  },
2888
3031
  setAllowAutoUpdates: {
2889
3032
  fieldName: 'auto updates',
2890
- success: (isEnabled) => `Allow auto updates set to: "${isEnabled}"`,
3033
+ success: (isEnabled) => `Successfully updated ${chalk.bold('allow auto updates')} to ${chalk.bold(isEnabled)}`,
2891
3034
  },
2892
3035
  setDefaultCmsPublishMode: {
2893
3036
  promptMessage: 'Select CMS publish mode to be used as the default',
2894
3037
  error: (validModes) => `The provided CMS publish mode is invalid. Valid values are ${validModes}.`,
2895
- success: (mode) => `Default mode updated to: ${mode}`,
3038
+ success: (mode) => `Successfully updated ${chalk.bold('default CMS publish mode')} to ${chalk.bold(mode)}`,
2896
3039
  },
2897
3040
  setHttpTimeout: {
2898
3041
  promptMessage: 'Enter http timeout duration',
2899
- 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.`,
2900
3044
  },
2901
3045
  setAutoOpenBrowser: {
2902
3046
  fieldName: 'auto open browser',
2903
- enabled: 'Auto opening your browser has been enabled',
2904
- 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')}`,
2905
3049
  },
2906
3050
  },
2907
3051
  commonOpts: {
@@ -2939,6 +3083,11 @@ export const lib = {
2939
3083
  },
2940
3084
  },
2941
3085
  prompts: {
3086
+ promptUtils: {
3087
+ errors: {
3088
+ noSelectableChoices: 'Exiting prompt because no selectable choices are available',
3089
+ },
3090
+ },
2942
3091
  importDataFilePathPrompt: {
2943
3092
  promptContext: `To view the JSON schema for data imports, visit ${uiLink('the docs', 'https://developers.hubspot.com/docs/guides/api/crm/imports')}`,
2944
3093
  promptMessage: '[--file-path] Select the JSON file that will be used to import your data.',
@@ -2955,10 +3104,10 @@ export const lib = {
2955
3104
  projectDevTargetAccountPrompt: {
2956
3105
  createNewSandboxOption: '<Test on a new development sandbox>',
2957
3106
  createNewDeveloperTestAccountOption: '<Test on a new developer test account>',
2958
- chooseDefaultAccountOption: () => `<${chalk.bold('❗')} Test on this production account ${chalk.bold('❗')}>`,
2959
- 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:`,
2960
3109
  sandboxLimit: (limit) => `Your account reached the limit of ${limit} development sandboxes`,
2961
- 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.`,
2962
3111
  developerTestAccountLimit: (limit) => `Your account reached the limit of ${limit} developer test accounts.`,
2963
3112
  confirmDefaultAccount: (accountName, accountType) => `Continue testing on ${chalk.bold(`${accountName} (${accountType})`)}? (Y/n)`,
2964
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.`,
@@ -3098,8 +3247,8 @@ export const lib = {
3098
3247
  selectAppIdClone: (accountName) => `[--appId] Choose an app under ${accountName} to clone:`,
3099
3248
  errors: {
3100
3249
  noAccountId: 'An account ID is required to select an app.',
3101
- noAppsMigration: () => `${chalk.bold('No apps to migrate')}`,
3102
- noAppsClone: () => `${chalk.bold('No apps to clone')}`,
3250
+ noAppsMigration: `${chalk.bold('No apps to migrate')}`,
3251
+ noAppsClone: `${chalk.bold('No apps to clone')}`,
3103
3252
  noAppsMigrationMessage: (accountName) => `The selected developer account ${chalk.bold(accountName)} doesn't have any apps that can be migrated to the projects framework.`,
3104
3253
  noAppsCloneMessage: (accountName) => `The selected developer account ${chalk.bold(accountName)} doesn't have any apps that can be cloned to the projects framework.`,
3105
3254
  errorFetchingApps: 'There was an error fetching public apps.',
@@ -3120,6 +3269,7 @@ export const lib = {
3120
3269
  errors: {
3121
3270
  nameRequired: 'A component name is required',
3122
3271
  componentRequired: 'Must select a feature to add',
3272
+ noSelectableChoices: 'There are no available features that can be added to this project',
3123
3273
  invalidType: (type) => `[--type] Could not find type "${type}". Please choose an available type:`,
3124
3274
  cannotAddFeature: (feature, reasons) => `Cannot Add feature '${feature}' to project for the following reasons: ${reasons}`,
3125
3275
  },
@@ -3155,7 +3305,7 @@ export const lib = {
3155
3305
  enterName: '[--project] Enter project name:',
3156
3306
  errors: {
3157
3307
  invalidName: 'You entered an invalid name. Please try again.',
3158
- 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)}"`,
3159
3309
  },
3160
3310
  },
3161
3311
  previewPrompt: {
@@ -3215,11 +3365,11 @@ export const lib = {
3215
3365
  },
3216
3366
  failure: {
3217
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)}.`,
3218
- 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.`,
3219
- 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')}.`,
3220
3370
  scopes: {
3221
3371
  message: "The personal access key you provided doesn't include developer test account permissions.",
3222
- 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`,
3223
3373
  },
3224
3374
  },
3225
3375
  },
@@ -3236,14 +3386,13 @@ export const lib = {
3236
3386
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3237
3387
  },
3238
3388
  failure: {
3239
- 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 sandboxes. \n- To connect a developer sandbox 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 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',
3242
3392
  scopes: {
3243
3393
  message: "The personal access key you provided doesn't include developer sandbox 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 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`,
3245
3395
  },
3246
- generic: 'An error occurred while creating a developer sandbox',
3247
3396
  },
3248
3397
  },
3249
3398
  standard: {
@@ -3256,30 +3405,54 @@ export const lib = {
3256
3405
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3257
3406
  },
3258
3407
  failure: {
3259
- 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)}.`,
3260
- 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.`,
3261
- 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')}.`,
3262
3410
  scopes: {
3263
3411
  message: "The personal access key you provided doesn't include standard sandbox permissions.",
3264
- 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`,
3265
3413
  },
3266
3414
  },
3267
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
+ },
3268
3425
  },
3269
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
+ },
3270
3436
  loading: {
3271
3437
  add: (accountName) => `Syncing sandbox ${chalk.bold(accountName)}`,
3272
- fail: (accountName) => `Failed to sync sandbox ${chalk.bold(accountName)}.`,
3273
- 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}`,
3274
3443
  },
3275
3444
  success: {
3276
3445
  configFileUpdated: (accountName, authType) => `Account "${accountName}" updated using "${authType}"`,
3277
3446
  },
3278
3447
  failure: {
3448
+ syncTypeFetch: 'Unable to fetch available sandbox sync types. Please try again.',
3279
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.`,
3280
3453
  scopes: {
3281
3454
  message: "The personal access key you provided doesn't include sandbox sync permissions.",
3282
- 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`,
3283
3456
  },
3284
3457
  },
3285
3458
  },
@@ -3290,6 +3463,8 @@ export const lib = {
3290
3463
  errorContext: (context) => `Context: ${context}`,
3291
3464
  errorCause: (cause) => `Cause: ${cause}`,
3292
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.',
3293
3468
  },
3294
3469
  suppressErrors: {
3295
3470
  platformVersionErrors: {
@@ -3301,7 +3476,7 @@ export const lib = {
3301
3476
  docsLink: 'Projects platform versioning (BETA)',
3302
3477
  betaLink: (docsLink) => `For more info, see ${docsLink}.`,
3303
3478
  },
3304
- 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.`,
3305
3480
  },
3306
3481
  },
3307
3482
  serverless: {
@@ -3309,7 +3484,7 @@ export const lib = {
3309
3484
  fetchScopeDataError: (scopeGroup) => `Error verifying access of scopeGroup ${scopeGroup}:`,
3310
3485
  portalMissingScope: 'Your account does not have access to this action. Talk to an account admin to request it.',
3311
3486
  userMissingScope: "You don't have access to this action. Ask an account admin to change your permissions in Users & Teams settings.",
3312
- 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()}.`,
3313
3488
  },
3314
3489
  },
3315
3490
  doctor: {
@@ -3318,13 +3493,13 @@ export const lib = {
3318
3493
  accountChecks: {
3319
3494
  active: 'Default account active',
3320
3495
  inactive: "Default account isn't active",
3321
- 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`,
3322
3497
  unableToDetermine: 'Unable to determine if the portal is active',
3323
3498
  pak: {
3324
3499
  incomplete: 'Personal access key is valid, but there are more scopes available to your user that are not included in your key.',
3325
- 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}`,
3326
3501
  invalid: 'Personal access key is invalid',
3327
- 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.`,
3328
3503
  valid: (link) => `Personal Access Key is valid. ${link}`,
3329
3504
  viewScopes: 'View selected scopes',
3330
3505
  },
@@ -3341,25 +3516,24 @@ export const lib = {
3341
3516
  },
3342
3517
  hsChecks: {
3343
3518
  notLatest: (hsVersion) => `Version ${hsVersion} outdated`,
3344
- 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}`,
3345
3520
  latest: (hsVersion) => `HubSpot CLI v${hsVersion} up to date`,
3346
3521
  unableToDetermine: 'Unable to determine if HubSpot CLI is up to date.',
3347
- unableToDetermineSecondary: (command, link) => `Run ${command} to check your installed version; then visit the ${link} to validate whether you have the latest version`,
3348
- 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`,
3349
3523
  },
3350
3524
  projectDependenciesChecks: {
3351
3525
  missingDependencies: (dir) => `missing dependencies in ${chalk.bold(dir)}`,
3352
- missingDependenciesSecondary: (command) => `Run ${command} to install all project dependencies locally`,
3526
+ missingDependenciesSecondary: (command) => `Run ${uiCommandReference(command)} to install all project dependencies locally`,
3353
3527
  unableToDetermine: (dir) => `Unable to determine if dependencies are installed ${dir}`,
3354
3528
  success: 'App dependencies are installed and up to date',
3355
3529
  },
3356
3530
  files: {
3357
- invalidJson: (filename) => `invalid JSON in ${chalk.bold(filename)}`,
3531
+ invalidJson: (filename) => `Invalid JSON in ${chalk.bold(filename)}`,
3358
3532
  validJson: 'JSON files valid',
3359
3533
  },
3360
3534
  port: {
3361
3535
  inUse: (port) => `Port ${port} is in use`,
3362
- inUseSecondary: (command) => `Make sure it is available before running ${command}`,
3536
+ inUseSecondary: (command) => `Make sure it is available before running ${uiCommandReference(command)}`,
3363
3537
  available: (port) => `Port ${port} available for local development`,
3364
3538
  },
3365
3539
  diagnosis: {
@@ -3371,22 +3545,52 @@ export const lib = {
3371
3545
  configFileSubHeader: (filename) => `Config File: ${chalk.bold(filename)}`,
3372
3546
  defaultAccountSubHeader: (accountDetails) => `Default Account: ${accountDetails}`,
3373
3547
  noConfigFile: 'CLI configuration not found',
3374
- 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
+ },
3375
3553
  },
3376
3554
  projectConfig: {
3377
3555
  header: 'Project configuration',
3378
3556
  projectDirSubHeader: (projectDir) => `Project dir: ${chalk.bold(projectDir)}`,
3379
3557
  projectNameSubHeader: (projectName) => `Project name: ${chalk.bold(projectName)}`,
3380
3558
  },
3559
+ defaultAccountOverrideFile: {
3560
+ header: 'Default account override file path:',
3561
+ },
3381
3562
  counts: {
3382
3563
  errors: (count) => `${chalk.bold('Errors:')} ${count}`,
3383
3564
  warnings: (count) => `${chalk.bold('Warning:')} ${count}`,
3384
3565
  },
3385
3566
  },
3567
+ defaultAccountOverrideFileChecks: {
3568
+ overrideActive: (defaultAccountOverrideFile) => `Default account override file is active: ${defaultAccountOverrideFile}`,
3569
+ overrideAccountId: (overrideAccountId) => `Active account ID: ${overrideAccountId}`,
3570
+ },
3386
3571
  },
3387
3572
  oauth: {
3388
3573
  missingClientId: 'Error building oauth URL: missing client ID.',
3389
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
+ },
3390
3594
  migrate: {
3391
3595
  componentsToBeMigrated: (components) => `The following features will be migrated: ${components}`,
3392
3596
  componentsThatWillNotBeMigrated: (components) => `[NOTE] These features are not yet supported for migration but will be available later: ${components}`,
@@ -3420,7 +3624,7 @@ export const lib = {
3420
3624
  },
3421
3625
  noAppsEligible: (accountId, reasons) => `No apps in account ${accountId} are currently migratable${reasons.length ? `\n - ${reasons.join('\n - ')}` : ''}`,
3422
3626
  invalidAccountTypeTitle: `${chalk.bold('Developer account not targeted')}`,
3423
- 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.`,
3424
3628
  appWithAppIdNotFound: (appId) => `Could not find an app with the id ${appId} `,
3425
3629
  noAppsForProject: (projectName) => `No apps associated with project ${projectName}`,
3426
3630
  migrationFailed: 'Migration Failed',