@hubspot/cli 7.4.6-experimental.0 → 7.4.7-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/api/migrate.d.ts +14 -4
  2. package/api/migrate.js +16 -2
  3. package/bin/cli.js +8 -183
  4. package/commands/account/auth.d.ts +10 -0
  5. package/commands/account/auth.js +188 -0
  6. package/commands/account/clean.js +38 -5
  7. package/commands/account/createOverride.d.ts +10 -0
  8. package/commands/account/createOverride.js +104 -0
  9. package/commands/account/info.js +38 -4
  10. package/commands/account/list.js +23 -5
  11. package/commands/account/remove.js +36 -2
  12. package/commands/account/removeOverride.d.ts +10 -0
  13. package/commands/account/removeOverride.js +76 -0
  14. package/commands/account/use.js +25 -3
  15. package/commands/account.js +7 -2
  16. package/commands/app/migrate.d.ts +6 -6
  17. package/commands/app/migrate.js +62 -45
  18. package/commands/app.js +0 -2
  19. package/commands/auth.js +14 -11
  20. package/commands/cms/lighthouseScore.js +7 -3
  21. package/commands/cms.js +1 -2
  22. package/commands/completion.js +2 -3
  23. package/commands/config/migrate.d.ts +10 -0
  24. package/commands/config/migrate.js +84 -0
  25. package/commands/config/set.d.ts +10 -0
  26. package/commands/config/set.js +34 -29
  27. package/commands/config.d.ts +4 -1
  28. package/commands/config.js +45 -11
  29. package/commands/create/api-sample.js +3 -1
  30. package/commands/create/website-theme.js +1 -1
  31. package/commands/create.js +7 -8
  32. package/commands/customObject/schema/delete.js +4 -1
  33. package/commands/customObject/schema/fetch-all.js +2 -1
  34. package/commands/customObject/schema/fetch.js +2 -1
  35. package/commands/customObject.js +3 -4
  36. package/commands/doctor.js +5 -6
  37. package/commands/feedback.js +7 -8
  38. package/commands/fetch.js +6 -7
  39. package/commands/filemanager.js +1 -2
  40. package/commands/function.js +1 -2
  41. package/commands/hubdb/clear.js +5 -6
  42. package/commands/hubdb/create.js +7 -8
  43. package/commands/hubdb/delete.js +8 -7
  44. package/commands/hubdb/fetch.js +4 -5
  45. package/commands/hubdb.js +1 -2
  46. package/commands/init.js +18 -20
  47. package/commands/lint.js +3 -4
  48. package/commands/list.js +5 -6
  49. package/commands/logs.js +12 -13
  50. package/commands/module/marketplace-validate.js +5 -6
  51. package/commands/module.js +1 -3
  52. package/commands/mv.js +4 -5
  53. package/commands/open.js +4 -5
  54. package/commands/project/add.d.ts +3 -7
  55. package/commands/project/add.js +28 -23
  56. package/commands/project/cloneApp.d.ts +6 -8
  57. package/commands/project/cloneApp.js +49 -45
  58. package/commands/project/create.d.ts +10 -1
  59. package/commands/project/create.js +85 -63
  60. package/commands/project/deploy.d.ts +3 -6
  61. package/commands/project/deploy.js +27 -25
  62. package/commands/project/dev/deprecatedFlow.js +32 -25
  63. package/commands/project/dev/index.d.ts +4 -2
  64. package/commands/project/dev/index.js +31 -18
  65. package/commands/project/dev/unifiedFlow.js +10 -11
  66. package/commands/project/download.d.ts +3 -7
  67. package/commands/project/download.js +18 -19
  68. package/commands/project/installDeps.d.ts +6 -1
  69. package/commands/project/installDeps.js +48 -32
  70. package/commands/project/listBuilds.d.ts +3 -7
  71. package/commands/project/listBuilds.js +32 -27
  72. package/commands/project/logs.d.ts +10 -1
  73. package/commands/project/logs.js +73 -65
  74. package/commands/project/migrate.d.ts +6 -0
  75. package/commands/project/migrate.js +71 -0
  76. package/commands/project/migrateApp.d.ts +3 -8
  77. package/commands/project/migrateApp.js +23 -20
  78. package/commands/project/open.d.ts +3 -7
  79. package/commands/project/open.js +29 -21
  80. package/commands/project/upload.d.ts +9 -1
  81. package/commands/project/upload.js +78 -54
  82. package/commands/project/watch.d.ts +6 -1
  83. package/commands/project/watch.js +95 -61
  84. package/commands/project.d.ts +3 -1
  85. package/commands/project.js +47 -35
  86. package/commands/remove.js +7 -5
  87. package/commands/sandbox/create.js +10 -11
  88. package/commands/sandbox/delete.js +18 -19
  89. package/commands/sandbox.js +1 -2
  90. package/commands/secret/addSecret.js +5 -6
  91. package/commands/secret/deleteSecret.js +12 -9
  92. package/commands/secret/listSecret.js +3 -4
  93. package/commands/secret/updateSecret.js +9 -8
  94. package/commands/secret.js +1 -2
  95. package/commands/theme/generate-selectors.js +5 -6
  96. package/commands/theme/marketplace-validate.js +5 -6
  97. package/commands/theme/preview.js +16 -16
  98. package/commands/theme.js +1 -2
  99. package/commands/upload.js +23 -24
  100. package/commands/watch.js +18 -19
  101. package/lang/en.d.ts +2806 -0
  102. package/lang/en.js +2659 -3300
  103. package/lang/en.lyaml +98 -43
  104. package/lib/accountTypes.d.ts +1 -0
  105. package/lib/accountTypes.js +12 -0
  106. package/lib/app/migrate.d.ts +10 -4
  107. package/lib/app/migrate.js +209 -96
  108. package/lib/app/migrate_legacy.d.ts +2 -2
  109. package/lib/app/migrate_legacy.js +10 -7
  110. package/lib/buildAccount.d.ts +1 -2
  111. package/lib/buildAccount.js +11 -10
  112. package/lib/commonOpts.d.ts +3 -4
  113. package/lib/commonOpts.js +46 -18
  114. package/lib/configMigrate.d.ts +2 -0
  115. package/lib/configMigrate.js +104 -0
  116. package/lib/configOptions.js +11 -10
  117. package/lib/constants.d.ts +4 -0
  118. package/lib/constants.js +5 -1
  119. package/lib/dependencyManagement.js +2 -2
  120. package/lib/doctor/Diagnosis.d.ts +1 -2
  121. package/lib/doctor/Diagnosis.js +19 -16
  122. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
  123. package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
  124. package/lib/doctor/Doctor.d.ts +1 -0
  125. package/lib/doctor/Doctor.js +57 -44
  126. package/lib/errorHandlers/index.js +6 -7
  127. package/lib/errorHandlers/suppressError.js +6 -7
  128. package/lib/generateSelectors.js +1 -2
  129. package/lib/hasFeature.d.ts +3 -1
  130. package/lib/middleware/__test__/configMiddleware.test.d.ts +1 -0
  131. package/lib/middleware/__test__/configMiddleware.test.js +194 -0
  132. package/lib/middleware/__test__/gitMiddleware.test.d.ts +1 -0
  133. package/lib/middleware/__test__/gitMiddleware.test.js +76 -0
  134. package/lib/middleware/__test__/notificationsMiddleware.test.d.ts +1 -0
  135. package/lib/middleware/__test__/notificationsMiddleware.test.js +10 -0
  136. package/lib/middleware/__test__/requestMiddleware.test.d.ts +1 -0
  137. package/lib/middleware/__test__/requestMiddleware.test.js +20 -0
  138. package/lib/middleware/__test__/utils.test.d.ts +1 -0
  139. package/lib/middleware/__test__/utils.test.js +53 -0
  140. package/lib/middleware/__test__/yargsChecksMiddleware.test.d.ts +1 -0
  141. package/lib/middleware/__test__/yargsChecksMiddleware.test.js +81 -0
  142. package/lib/middleware/configMiddleware.d.ts +13 -0
  143. package/lib/middleware/configMiddleware.js +116 -0
  144. package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
  145. package/lib/middleware/fireAlarmMiddleware.js +123 -0
  146. package/lib/middleware/gitMiddleware.d.ts +2 -0
  147. package/lib/middleware/gitMiddleware.js +14 -0
  148. package/lib/middleware/notificationsMiddleware.d.ts +1 -0
  149. package/lib/middleware/notificationsMiddleware.js +38 -0
  150. package/lib/middleware/requestMiddleware.d.ts +1 -0
  151. package/lib/middleware/requestMiddleware.js +11 -0
  152. package/lib/middleware/utils.d.ts +8 -0
  153. package/lib/middleware/utils.js +17 -0
  154. package/lib/middleware/yargsChecksMiddleware.d.ts +4 -0
  155. package/lib/middleware/yargsChecksMiddleware.js +24 -0
  156. package/lib/oauth.js +1 -2
  157. package/lib/process.js +1 -2
  158. package/lib/projects/ProjectLogsManager.d.ts +1 -1
  159. package/lib/projects/ProjectLogsManager.js +16 -21
  160. package/lib/projects/buildAndDeploy.js +28 -39
  161. package/lib/projects/config.d.ts +9 -0
  162. package/lib/projects/config.js +79 -0
  163. package/lib/projects/create.js +5 -6
  164. package/lib/projects/ensureProjectExists.d.ts +11 -0
  165. package/lib/projects/ensureProjectExists.js +97 -0
  166. package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
  167. package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
  168. package/lib/{DevServerManagerV2.d.ts → projects/localDev/DevServerManagerV2.d.ts} +1 -1
  169. package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +3 -4
  170. package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
  171. package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +49 -82
  172. package/lib/{LocalDevManagerV2.d.ts → projects/localDev/LocalDevManagerV2.d.ts} +2 -2
  173. package/lib/{LocalDevManagerV2.js → projects/localDev/LocalDevManagerV2.js} +43 -75
  174. package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +5 -4
  175. package/lib/{localDev.js → projects/localDev/helpers.js} +97 -114
  176. package/lib/projects/ui.d.ts +1 -0
  177. package/lib/projects/ui.js +15 -0
  178. package/lib/projects/upload.d.ts +13 -2
  179. package/lib/projects/upload.js +18 -34
  180. package/lib/projects/urls.d.ts +1 -0
  181. package/lib/projects/urls.js +6 -0
  182. package/lib/projects/watch.d.ts +1 -1
  183. package/lib/projects/watch.js +21 -18
  184. package/lib/prompts/accountNamePrompt.js +16 -13
  185. package/lib/prompts/accountsPrompt.js +1 -2
  186. package/lib/prompts/cmsFieldPrompt.js +1 -2
  187. package/lib/prompts/createApiSamplePrompt.js +4 -5
  188. package/lib/prompts/createFunctionPrompt.js +13 -14
  189. package/lib/prompts/createModulePrompt.js +8 -9
  190. package/lib/prompts/createProjectPrompt.d.ts +11 -4
  191. package/lib/prompts/createProjectPrompt.js +14 -9
  192. package/lib/prompts/createTemplatePrompt.js +1 -2
  193. package/lib/prompts/downloadProjectPrompt.js +3 -4
  194. package/lib/prompts/installPublicAppPrompt.js +6 -5
  195. package/lib/prompts/personalAccessKeyPrompt.js +17 -18
  196. package/lib/prompts/previewPrompt.js +5 -6
  197. package/lib/prompts/projectAddPrompt.js +4 -5
  198. package/lib/prompts/projectDevTargetAccountPrompt.js +11 -12
  199. package/lib/prompts/projectNamePrompt.js +5 -6
  200. package/lib/prompts/projectsLogsPrompt.js +3 -2
  201. package/lib/prompts/promptUtils.d.ts +1 -1
  202. package/lib/prompts/sandboxesPrompt.js +5 -6
  203. package/lib/prompts/secretPrompt.js +2 -3
  204. package/lib/prompts/selectHubDBTablePrompt.js +11 -8
  205. package/lib/prompts/selectPublicAppPrompt.js +6 -7
  206. package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
  207. package/lib/prompts/uploadPrompt.js +4 -5
  208. package/lib/sandboxSync.js +15 -14
  209. package/lib/sandboxes.js +12 -13
  210. package/lib/serverlessLogs.js +4 -6
  211. package/lib/ui/SpinniesManager.d.ts +1 -1
  212. package/lib/ui/boxen.d.ts +5 -0
  213. package/lib/ui/boxen.js +30 -0
  214. package/lib/ui/git.js +8 -9
  215. package/lib/ui/index.d.ts +4 -2
  216. package/lib/ui/index.js +16 -16
  217. package/lib/ui/logger.d.ts +10 -0
  218. package/lib/ui/logger.js +15 -0
  219. package/lib/ui/serverlessFunctionLogs.js +2 -3
  220. package/lib/ui/spinniesUtils.d.ts +5 -5
  221. package/lib/yargsUtils.d.ts +1 -1
  222. package/package.json +7 -6
  223. package/types/Yargs.d.ts +5 -11
  224. package/lib/projects/index.d.ts +0 -20
  225. package/lib/projects/index.js +0 -199
@@ -3,10 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.downloadProjectFiles = downloadProjectFiles;
7
6
  exports.migrateApp2025_2 = migrateApp2025_2;
8
7
  exports.logInvalidAccountError = logInvalidAccountError;
9
- const logger_1 = require("@hubspot/local-dev-lib/logger");
10
8
  const path_1 = __importDefault(require("path"));
11
9
  const path_2 = require("@hubspot/local-dev-lib/path");
12
10
  const archive_1 = require("@hubspot/local-dev-lib/archive");
@@ -16,51 +14,88 @@ const projects_1 = require("@hubspot/local-dev-lib/constants/projects");
16
14
  const transform_1 = require("@hubspot/project-parsing-lib/src/lib/transform");
17
15
  const Migration_1 = require("@hubspot/local-dev-lib/types/Migration");
18
16
  const projects_2 = require("@hubspot/local-dev-lib/api/projects");
17
+ const inquirer = require('inquirer');
19
18
  const promptUtils_1 = require("../prompts/promptUtils");
20
19
  const ui_1 = require("../ui");
21
- const lang_1 = require("../lang");
22
- const projects_3 = require("../projects");
20
+ const ensureProjectExists_1 = require("../projects/ensureProjectExists");
23
21
  const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
24
22
  const polling_1 = require("../polling");
25
23
  const migrate_1 = require("../../api/migrate");
26
- function getUnmigratableReason(reasonCode) {
24
+ const fs_1 = __importDefault(require("fs"));
25
+ const en_1 = require("../../lang/en");
26
+ const hasFeature_1 = require("../hasFeature");
27
+ const constants_1 = require("../constants");
28
+ const urls_1 = require("../projects/urls");
29
+ const logger_1 = require("../ui/logger");
30
+ function getUnmigratableReason(reasonCode, projectName, accountId) {
27
31
  switch (reasonCode) {
28
32
  case projects_1.UNMIGRATABLE_REASONS.UP_TO_DATE:
29
- return (0, lang_1.i18n)('commands.project.subcommands.migrateApp.unmigratableReasons.upToDate');
33
+ return en_1.lib.migrate.errors.unmigratableReasons.upToDate;
30
34
  case projects_1.UNMIGRATABLE_REASONS.IS_A_PRIVATE_APP:
31
- return (0, lang_1.i18n)('commands.project.subcommands.migrateApp.unmigratableReasons.isPrivateApp');
35
+ return en_1.lib.migrate.errors.unmigratableReasons.isPrivateApp;
32
36
  case projects_1.UNMIGRATABLE_REASONS.LISTED_IN_MARKETPLACE:
33
- return (0, lang_1.i18n)('commands.project.subcommands.migrateApp.unmigratableReasons.listedInMarketplace');
37
+ return en_1.lib.migrate.errors.unmigratableReasons.listedInMarketplace;
38
+ case projects_1.UNMIGRATABLE_REASONS.PROJECT_CONNECTED_TO_GITHUB:
39
+ return en_1.lib.migrate.errors.unmigratableReasons.projectConnectedToGitHub(projectName, accountId);
40
+ case migrate_1.CLI_UNMIGRATABLE_REASONS.PART_OF_PROJECT_ALREADY:
41
+ return en_1.lib.migrate.errors.unmigratableReasons.partOfProjectAlready;
34
42
  default:
35
- return (0, lang_1.i18n)('commands.project.subcommands.migrateApp.unmigratableReasons.generic', {
36
- reasonCode,
37
- });
43
+ return en_1.lib.migrate.errors.unmigratableReasons.generic(reasonCode);
38
44
  }
39
45
  }
40
- async function handleMigrationSetup(derivedAccountId, options) {
41
- const { name, dest, appId } = options;
42
- const { data } = await (0, migrate_1.listAppsForMigration)(derivedAccountId);
43
- const { migratableApps, unmigratableApps } = data;
44
- const allApps = [...migratableApps, ...unmigratableApps].filter(app => !app.projectName);
45
- if (allApps.length === 0) {
46
- throw new Error((0, lang_1.i18n)(`commands.project.subcommands.migrateApp.errors.noApps`, {
47
- accountId: derivedAccountId,
48
- }));
46
+ function filterAppsByProjectName(projectConfig) {
47
+ return (app) => {
48
+ if (projectConfig) {
49
+ return app.projectName === projectConfig?.projectConfig?.name;
50
+ }
51
+ return true;
52
+ };
53
+ }
54
+ function buildErrorMessageFromMigrationStatus(error) {
55
+ const { componentErrors, projectErrorDetail } = error;
56
+ if (!componentErrors || !componentErrors.length) {
57
+ return projectErrorDetail;
58
+ }
59
+ return `${projectErrorDetail}: \n\t- ${componentErrors
60
+ .map(componentError => {
61
+ const { componentType, errorMessage, developerSymbol: uid, } = componentError;
62
+ return `${componentType}${uid ? ` (${uid})` : ''}: ${errorMessage}`;
63
+ })
64
+ .join('\n\t- ')}`;
65
+ }
66
+ async function fetchMigrationApps(appId, derivedAccountId, platformVersion, projectConfig) {
67
+ const { data: { migratableApps, unmigratableApps }, } = await (0, migrate_1.listAppsForMigration)(derivedAccountId, platformVersion);
68
+ const filteredMigratableApps = migratableApps.filter(filterAppsByProjectName(projectConfig));
69
+ const filteredUnmigratableApps = unmigratableApps.filter(filterAppsByProjectName(projectConfig));
70
+ const allApps = [...filteredMigratableApps, ...filteredUnmigratableApps];
71
+ if (allApps.length > 1 && projectConfig) {
72
+ throw new Error(en_1.lib.migrate.errors.project.multipleApps);
49
73
  }
50
- if (migratableApps.length === 0) {
51
- const reasons = unmigratableApps.map(app => `${chalk_1.default.bold(app.appName)}: ${getUnmigratableReason(app.unmigratableReason)}`);
52
- throw new Error(`${(0, lang_1.i18n)(`commands.project.subcommands.migrateApp.errors.noAppsEligible`, {
53
- accountId: derivedAccountId,
54
- })} \n - ${reasons.join('\n - ')}`);
74
+ if (!projectConfig?.projectConfig) {
75
+ allApps.forEach(app => {
76
+ if (app.projectName) {
77
+ app.isMigratable = false;
78
+ app.unmigratableReason =
79
+ migrate_1.CLI_UNMIGRATABLE_REASONS.PART_OF_PROJECT_ALREADY;
80
+ }
81
+ });
82
+ }
83
+ if (allApps.length === 0 && projectConfig) {
84
+ throw new Error(en_1.lib.migrate.errors.noAppsForProject(projectConfig?.projectConfig?.name || ''));
85
+ }
86
+ if (allApps.length === 0 || !allApps.some(app => app.isMigratable)) {
87
+ const reasons = filteredUnmigratableApps.map(app => `${chalk_1.default.bold(app.appName)}: ${getUnmigratableReason(app.unmigratableReason, app.projectName, derivedAccountId)}`);
88
+ throw new Error(en_1.lib.migrate.errors.noAppsEligible((0, ui_1.uiAccountDescription)(derivedAccountId), reasons));
55
89
  }
56
90
  if (appId &&
57
91
  !allApps.some(app => {
58
92
  return app.appId === appId;
59
93
  })) {
60
- throw new Error((0, lang_1.i18n)('commands.project.subcommands.migrateApp.prompt.chooseApp', {
61
- appId,
62
- }));
94
+ throw new Error(en_1.lib.migrate.errors.appWithAppIdNotFound(appId));
63
95
  }
96
+ return allApps;
97
+ }
98
+ async function promptForAppToMigrate(allApps, derivedAccountId) {
64
99
  const appChoices = allApps.map(app => ({
65
100
  name: app.isMigratable
66
101
  ? app.appName
@@ -68,82 +103,138 @@ async function handleMigrationSetup(derivedAccountId, options) {
68
103
  value: app,
69
104
  disabled: app.isMigratable
70
105
  ? false
71
- : getUnmigratableReason(app.unmigratableReason),
106
+ : getUnmigratableReason(app.unmigratableReason, app.projectName, derivedAccountId),
72
107
  }));
108
+ const enabledChoices = appChoices.filter(app => !app.disabled);
109
+ const disabledChoices = appChoices.filter(app => app.disabled);
110
+ const { appId: selectedAppId } = await (0, promptUtils_1.listPrompt)(en_1.lib.migrate.prompt.chooseApp, {
111
+ choices: [
112
+ ...enabledChoices,
113
+ new inquirer.Separator(),
114
+ ...disabledChoices,
115
+ ],
116
+ });
117
+ return selectedAppId;
118
+ }
119
+ async function selectAppToMigrate(allApps, derivedAccountId, appId) {
120
+ if (appId &&
121
+ !allApps.some(app => {
122
+ return app.appId === appId;
123
+ })) {
124
+ throw new Error(en_1.lib.migrate.errors.appWithAppIdNotFound(appId));
125
+ }
73
126
  let appIdToMigrate = appId;
74
127
  if (!appIdToMigrate) {
75
- const { appId: selectedAppId } = await (0, promptUtils_1.listPrompt)((0, lang_1.i18n)('commands.project.subcommands.migrateApp.prompt.chooseApp'), {
76
- choices: appChoices,
77
- });
78
- appIdToMigrate = selectedAppId;
128
+ appIdToMigrate = await promptForAppToMigrate(allApps, derivedAccountId);
79
129
  }
80
130
  const selectedApp = allApps.find(app => app.appId === appIdToMigrate);
81
- const migratableComponents = [];
82
- const unmigratableComponents = [];
131
+ const migratableComponents = new Set();
132
+ const unmigratableComponents = new Set();
83
133
  selectedApp?.migrationComponents.forEach(component => {
84
134
  if (component.isSupported) {
85
- migratableComponents.push((0, transform_1.mapToUserFacingType)(component.componentType));
135
+ migratableComponents.add((0, transform_1.mapToUserFacingType)(component.componentType));
86
136
  }
87
137
  else {
88
- unmigratableComponents.push((0, transform_1.mapToUserFacingType)(component.componentType));
138
+ unmigratableComponents.add((0, transform_1.mapToUserFacingType)(component.componentType));
89
139
  }
90
140
  });
91
- if (migratableComponents.length !== 0) {
92
- logger_1.logger.log((0, lang_1.i18n)('commands.project.subcommands.migrateApp.componentsToBeMigrated', {
93
- components: `\n - ${migratableComponents.join('\n - ')}`,
94
- }));
141
+ if (migratableComponents.size !== 0) {
142
+ logger_1.uiLogger.log(en_1.lib.migrate.componentsToBeMigrated(`\n - ${[...migratableComponents].join('\n - ')}`));
95
143
  }
96
- if (unmigratableComponents.length !== 0) {
97
- logger_1.logger.log((0, lang_1.i18n)('commands.project.subcommands.migrateApp.componentsThatWillNotBeMigrated', {
98
- components: `\n - ${unmigratableComponents.join('\n - ')}`,
99
- }));
144
+ if (unmigratableComponents.size !== 0) {
145
+ logger_1.uiLogger.log(en_1.lib.migrate.componentsThatWillNotBeMigrated(`\n - ${[...unmigratableComponents].join('\n - ')}`));
100
146
  }
101
- logger_1.logger.log();
102
- const proceed = await (0, promptUtils_1.confirmPrompt)((0, lang_1.i18n)('commands.project.subcommands.migrateApp.prompt.proceed'));
147
+ logger_1.uiLogger.log('');
148
+ const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.migrate.prompt.proceed, {
149
+ defaultAnswer: false,
150
+ });
151
+ return {
152
+ proceed,
153
+ appIdToMigrate,
154
+ };
155
+ }
156
+ async function handleMigrationSetup(derivedAccountId, options, projectConfig) {
157
+ const { name, dest, appId } = options;
158
+ const allApps = await fetchMigrationApps(appId, derivedAccountId, options.platformVersion, projectConfig);
159
+ const { proceed, appIdToMigrate } = await selectAppToMigrate(allApps, derivedAccountId, appId);
103
160
  if (!proceed) {
104
161
  return {};
105
162
  }
163
+ // If it's a project we don't want to prompt for dest and name, so just return early
164
+ if (projectConfig &&
165
+ projectConfig?.projectConfig &&
166
+ projectConfig?.projectDir) {
167
+ return {
168
+ appIdToMigrate,
169
+ projectName: projectConfig.projectConfig.name,
170
+ projectDest: projectConfig.projectDir,
171
+ };
172
+ }
106
173
  const projectName = name ||
107
- (await (0, promptUtils_1.inputPrompt)((0, lang_1.i18n)('commands.project.subcommands.migrateApp.prompt.inputName')));
108
- const { projectExists } = await (0, projects_3.ensureProjectExists)(derivedAccountId, projectName, { allowCreate: false, noLogs: true });
109
- if (projectExists) {
110
- throw new Error((0, lang_1.i18n)('commands.project.subcommands.migrateApp.errors.projectAlreadyExists', {
111
- projectName,
174
+ (await (0, promptUtils_1.inputPrompt)(en_1.lib.migrate.prompt.inputName, {
175
+ validate: async (input) => {
176
+ const { projectExists } = await (0, ensureProjectExists_1.ensureProjectExists)(derivedAccountId, input, { allowCreate: false, noLogs: true });
177
+ if (projectExists) {
178
+ return en_1.lib.migrate.errors.project.alreadyExists(input);
179
+ }
180
+ return true;
181
+ },
112
182
  }));
183
+ const { projectExists } = await (0, ensureProjectExists_1.ensureProjectExists)(derivedAccountId, projectName, { allowCreate: false, noLogs: true });
184
+ if (projectExists) {
185
+ throw new Error(en_1.lib.migrate.errors.project.alreadyExists(projectName));
113
186
  }
114
187
  const projectDest = dest ||
115
- (await (0, promptUtils_1.inputPrompt)((0, lang_1.i18n)('commands.project.subcommands.migrateApp.prompt.inputDest'), {
188
+ (await (0, promptUtils_1.inputPrompt)(en_1.lib.migrate.prompt.inputDest, {
116
189
  defaultAnswer: path_1.default.resolve((0, path_2.getCwd)(), (0, path_2.sanitizeFileName)(projectName)),
117
190
  }));
118
191
  return { appIdToMigrate, projectName, projectDest };
119
192
  }
120
193
  async function beginMigration(derivedAccountId, appId, platformVersion) {
121
194
  SpinniesManager_1.default.add('beginningMigration', {
122
- text: (0, lang_1.i18n)('commands.project.subcommands.migrateApp.spinners.beginningMigration'),
195
+ text: en_1.lib.migrate.spinners.beginningMigration,
123
196
  });
124
197
  const uidMap = {};
125
198
  const { data } = await (0, migrate_1.initializeMigration)(derivedAccountId, appId, platformVersion);
126
199
  const { migrationId } = data;
127
- const pollResponse = await pollMigrationStatus(derivedAccountId, migrationId, [Migration_1.MIGRATION_STATUS.INPUT_REQUIRED]);
200
+ let pollResponse;
201
+ try {
202
+ pollResponse = await pollMigrationStatus(derivedAccountId, migrationId, [
203
+ Migration_1.MIGRATION_STATUS.INPUT_REQUIRED,
204
+ ]);
205
+ }
206
+ catch (error) {
207
+ SpinniesManager_1.default.fail('beginningMigration', {
208
+ text: en_1.lib.migrate.spinners.unableToStartMigration,
209
+ });
210
+ if ((0, migrate_1.isMigrationStatus)(error) && error.status === Migration_1.MIGRATION_STATUS.FAILURE) {
211
+ throw new Error(buildErrorMessageFromMigrationStatus(error));
212
+ }
213
+ throw new Error(en_1.lib.migrate.errors.migrationFailed, {
214
+ cause: error,
215
+ });
216
+ }
128
217
  if (pollResponse.status !== Migration_1.MIGRATION_STATUS.INPUT_REQUIRED) {
129
218
  SpinniesManager_1.default.fail('beginningMigration', {
130
- text: (0, lang_1.i18n)('commands.project.subcommands.migrateApp.spinners.unableToStartMigration'),
219
+ text: en_1.lib.migrate.spinners.unableToStartMigration,
131
220
  });
132
221
  return;
133
222
  }
134
223
  const { componentsRequiringUids } = pollResponse;
135
- SpinniesManager_1.default.succeed('beginningMigration', {
136
- text: (0, lang_1.i18n)('commands.project.subcommands.migrateApp.spinners.migrationStarted'),
137
- });
224
+ SpinniesManager_1.default.remove('beginningMigration');
138
225
  if (Object.values(componentsRequiringUids).length !== 0) {
139
226
  for (const [componentId, component] of Object.entries(componentsRequiringUids)) {
140
- uidMap[componentId] = await (0, promptUtils_1.inputPrompt)((0, lang_1.i18n)('commands.project.subcommands.migrateApp.prompt.uidForComponent', {
141
- componentName: component.componentHint || component.componentType,
142
- }), {
227
+ const { componentHint, componentType } = component;
228
+ uidMap[componentId] = await (0, promptUtils_1.inputPrompt)(en_1.lib.migrate.prompt.uidForComponent(componentHint
229
+ ? `${(0, transform_1.mapToUserFacingType)(componentType)} '${componentHint}'`
230
+ : (0, transform_1.mapToUserFacingType)(componentType)), {
143
231
  validate: (uid) => {
144
232
  const result = (0, project_parsing_lib_1.validateUid)(uid);
145
233
  return result === undefined ? true : result;
146
234
  },
235
+ defaultAnswer: componentHint
236
+ ? componentHint.replace(/[^A-Za-z0-9_\-.]/g, '')
237
+ : undefined,
147
238
  });
148
239
  }
149
240
  }
@@ -159,7 +250,7 @@ async function finalizeMigration(derivedAccountId, migrationId, uidMap, projectN
159
250
  let pollResponse;
160
251
  try {
161
252
  SpinniesManager_1.default.add('finishingMigration', {
162
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.finishingMigration`),
253
+ text: en_1.lib.migrate.spinners.finishingMigration,
163
254
  });
164
255
  await (0, migrate_1.continueMigration)(derivedAccountId, migrationId, uidMap, projectName);
165
256
  pollResponse = await pollMigrationStatus(derivedAccountId, migrationId, [
@@ -168,55 +259,78 @@ async function finalizeMigration(derivedAccountId, migrationId, uidMap, projectN
168
259
  }
169
260
  catch (error) {
170
261
  SpinniesManager_1.default.fail('finishingMigration', {
171
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.migrationFailed`),
262
+ text: en_1.lib.migrate.spinners.migrationFailed,
172
263
  });
173
- throw error;
264
+ if ((0, migrate_1.isMigrationStatus)(error) && error.status === Migration_1.MIGRATION_STATUS.FAILURE) {
265
+ throw new Error(buildErrorMessageFromMigrationStatus(error));
266
+ }
267
+ throw new Error(en_1.lib.migrate.errors.migrationFailed, {
268
+ cause: error,
269
+ });
270
+ }
271
+ if (pollResponse.status !== Migration_1.MIGRATION_STATUS.SUCCESS) {
272
+ throw new Error(en_1.lib.migrate.errors.migrationFailed);
174
273
  }
175
274
  if (pollResponse.status === Migration_1.MIGRATION_STATUS.SUCCESS) {
176
275
  SpinniesManager_1.default.succeed('finishingMigration', {
177
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.migrationComplete`),
276
+ text: en_1.lib.migrate.spinners.migrationComplete,
178
277
  });
179
- return pollResponse.buildId;
180
- }
181
- else {
182
- SpinniesManager_1.default.fail('finishingMigration', {
183
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.migrationFailed`),
184
- });
185
- if (pollResponse.status === Migration_1.MIGRATION_STATUS.FAILURE) {
186
- logger_1.logger.error(pollResponse.componentErrorDetails);
187
- throw new Error(pollResponse.projectErrorsDetail);
188
- }
189
- throw new Error((0, lang_1.i18n)('commands.project.subcommands.migrateApp.errors.migrationFailed'));
190
278
  }
279
+ return pollResponse.buildId;
191
280
  }
192
- async function downloadProjectFiles(derivedAccountId, projectName, buildId, projectDest) {
281
+ async function downloadProjectFiles(derivedAccountId, projectName, buildId, projectDest, projectConfig) {
193
282
  try {
194
283
  SpinniesManager_1.default.add('fetchingMigratedProject', {
195
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.downloadingProjectContents`),
284
+ text: en_1.lib.migrate.spinners.downloadingProjectContents,
196
285
  });
197
286
  const { data: zippedProject } = await (0, projects_2.downloadProject)(derivedAccountId, projectName, buildId);
198
- const absoluteDestPath = projectDest
199
- ? path_1.default.resolve((0, path_2.getCwd)(), projectDest)
200
- : (0, path_2.getCwd)();
287
+ let absoluteDestPath;
288
+ if (projectConfig?.projectConfig && projectConfig?.projectDir) {
289
+ const { projectDir } = projectConfig;
290
+ absoluteDestPath = projectDir;
291
+ const { srcDir } = projectConfig.projectConfig;
292
+ const archiveDest = path_1.default.join(projectDir, 'archive');
293
+ // Move the existing source directory to archive
294
+ fs_1.default.renameSync(path_1.default.join(projectDir, srcDir), archiveDest);
295
+ logger_1.uiLogger.info(en_1.lib.migrate.sourceContentsMoved(archiveDest));
296
+ }
297
+ else {
298
+ absoluteDestPath = projectDest
299
+ ? path_1.default.resolve((0, path_2.getCwd)(), projectDest)
300
+ : (0, path_2.getCwd)();
301
+ }
201
302
  await (0, archive_1.extractZipArchive)(zippedProject, (0, path_2.sanitizeFileName)(projectName), absoluteDestPath, {
202
303
  includesRootDir: true,
203
- hideLogs: false,
304
+ hideLogs: true,
204
305
  });
205
306
  SpinniesManager_1.default.succeed('fetchingMigratedProject', {
206
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.downloadingProjectContentsComplete`),
307
+ text: en_1.lib.migrate.spinners.downloadingProjectContentsComplete,
207
308
  });
208
- logger_1.logger.success(`Saved ${projectName} to ${projectDest}`);
309
+ logger_1.uiLogger.success(`Saved ${projectName} to ${projectDest}`);
209
310
  }
210
311
  catch (error) {
211
312
  SpinniesManager_1.default.fail('fetchingMigratedProject', {
212
- text: (0, lang_1.i18n)(`commands.project.subcommands.migrateApp.spinners.downloadingProjectContentsFailed`),
313
+ text: en_1.lib.migrate.spinners.downloadingProjectContentsFailed,
213
314
  });
214
315
  throw error;
215
316
  }
216
317
  }
217
- async function migrateApp2025_2(derivedAccountId, options) {
318
+ async function migrateApp2025_2(derivedAccountId, options, projectConfig) {
218
319
  SpinniesManager_1.default.init();
219
- const { appIdToMigrate, projectName, projectDest } = await handleMigrationSetup(derivedAccountId, options);
320
+ const ungatedForUnifiedApps = await (0, hasFeature_1.hasFeature)(derivedAccountId, constants_1.FEATURES.UNIFIED_APPS);
321
+ if (!ungatedForUnifiedApps) {
322
+ throw new Error(en_1.lib.migrate.errors.notUngatedForUnifiedApps((0, ui_1.uiAccountDescription)(derivedAccountId)));
323
+ }
324
+ if (projectConfig) {
325
+ if (!projectConfig?.projectConfig || !projectConfig?.projectDir) {
326
+ throw new Error(en_1.lib.migrate.errors.project.invalidConfig);
327
+ }
328
+ const { projectExists } = await (0, ensureProjectExists_1.ensureProjectExists)(derivedAccountId, projectConfig.projectConfig.name, { allowCreate: false, noLogs: true });
329
+ if (!projectExists) {
330
+ throw new Error(en_1.lib.migrate.errors.project.doesNotExist(derivedAccountId));
331
+ }
332
+ }
333
+ const { appIdToMigrate, projectName, projectDest } = await handleMigrationSetup(derivedAccountId, options, projectConfig);
220
334
  if (!appIdToMigrate || !projectName || !projectDest) {
221
335
  return;
222
336
  }
@@ -225,15 +339,14 @@ async function migrateApp2025_2(derivedAccountId, options) {
225
339
  return;
226
340
  }
227
341
  const { migrationId, uidMap } = migrationInProgress;
228
- const buildId = await finalizeMigration(derivedAccountId, migrationId, uidMap, projectName);
229
- await downloadProjectFiles(derivedAccountId, projectName, buildId, projectDest);
342
+ const buildId = await finalizeMigration(derivedAccountId, migrationId, uidMap, projectConfig?.projectConfig?.name || projectName);
343
+ await downloadProjectFiles(derivedAccountId, projectName, buildId, projectDest, projectConfig);
344
+ logger_1.uiLogger.log((0, ui_1.uiLink)('Project Details', (0, urls_1.getProjectDetailUrl)(projectName, derivedAccountId)));
345
+ logger_1.uiLogger.log((0, ui_1.uiLink)('Build Details', (0, urls_1.getProjectBuildDetailUrl)(projectName, buildId, derivedAccountId)));
230
346
  }
231
- function logInvalidAccountError(i18nKey) {
347
+ function logInvalidAccountError() {
232
348
  (0, ui_1.uiLine)();
233
- logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.invalidAccountTypeTitle`));
234
- logger_1.logger.log((0, lang_1.i18n)(`${i18nKey}.errors.invalidAccountTypeDescription`, {
235
- useCommand: (0, ui_1.uiCommandReference)('hs accounts use'),
236
- authCommand: (0, ui_1.uiCommandReference)('hs auth'),
237
- }));
349
+ logger_1.uiLogger.error(en_1.lib.migrate.errors.invalidAccountTypeTitle);
350
+ logger_1.uiLogger.log(en_1.lib.migrate.errors.invalidAccountTypeDescription((0, ui_1.uiCommandReference)('hs account use'), (0, ui_1.uiCommandReference)('hs auth')));
238
351
  (0, ui_1.uiLine)();
239
352
  }
@@ -1,4 +1,4 @@
1
1
  import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
2
2
  import { ArgumentsCamelCase } from 'yargs';
3
- import { MigrateAppOptions } from '../../types/Yargs';
4
- export declare function migrateApp2023_2(derivedAccountId: number, options: ArgumentsCamelCase<MigrateAppOptions>, accountConfig: CLIAccount): Promise<void>;
3
+ import { MigrateAppArgs } from './migrate';
4
+ export declare function migrateApp2023_2(derivedAccountId: number, options: ArgumentsCamelCase<MigrateAppArgs>, accountConfig: CLIAccount): Promise<void>;
@@ -19,7 +19,7 @@ const lang_1 = require("../lang");
19
19
  const accountTypes_1 = require("../accountTypes");
20
20
  const selectPublicAppPrompt_1 = require("../prompts/selectPublicAppPrompt");
21
21
  const createProjectPrompt_1 = require("../prompts/createProjectPrompt");
22
- const projects_2 = require("../projects");
22
+ const ensureProjectExists_1 = require("../projects/ensureProjectExists");
23
23
  const usageTracking_1 = require("../usageTracking");
24
24
  const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
25
25
  const process_1 = require("../process");
@@ -27,17 +27,20 @@ const polling_1 = require("../polling");
27
27
  const migrate_1 = require("./migrate");
28
28
  async function migrateApp2023_2(derivedAccountId, options, accountConfig) {
29
29
  const accountName = (0, ui_1.uiAccountDescription)(derivedAccountId);
30
- if (!(0, accountTypes_1.isAppDeveloperAccount)(accountConfig)) {
31
- (0, migrate_1.logInvalidAccountError)('commands.project.subcommands.migrateApp');
30
+ const defaultAccountIsUnified = await (0, accountTypes_1.isUnifiedAccount)(accountConfig);
31
+ if (!(0, accountTypes_1.isAppDeveloperAccount)(accountConfig) && !defaultAccountIsUnified) {
32
+ (0, migrate_1.logInvalidAccountError)();
32
33
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
33
34
  }
34
- const { appId } = 'appId' in options
35
- ? options
36
- : await (0, selectPublicAppPrompt_1.selectPublicAppPrompt)({
35
+ let appId = options.appId;
36
+ if (!appId) {
37
+ const { appId: selectAppId } = await (0, selectPublicAppPrompt_1.selectPublicAppPrompt)({
37
38
  accountId: derivedAccountId,
38
39
  accountName,
39
40
  isMigratingApp: true,
40
41
  });
42
+ appId = selectAppId;
43
+ }
41
44
  try {
42
45
  const { data: selectedApp } = await (0, appsDev_1.fetchPublicAppMetadata)(appId, derivedAccountId);
43
46
  // preventProjectMigrations returns true if we have not added app to allowlist config.
@@ -57,7 +60,7 @@ async function migrateApp2023_2(derivedAccountId, options, accountConfig) {
57
60
  }
58
61
  const createProjectPromptResponse = await (0, createProjectPrompt_1.createProjectPrompt)(options);
59
62
  const { name: projectName, dest: projectDest } = createProjectPromptResponse;
60
- const { projectExists } = await (0, projects_2.ensureProjectExists)(derivedAccountId, projectName, {
63
+ const { projectExists } = await (0, ensureProjectExists_1.ensureProjectExists)(derivedAccountId, projectName, {
61
64
  allowCreate: false,
62
65
  noLogs: true,
63
66
  });
@@ -1,10 +1,9 @@
1
1
  import { Environment } from '@hubspot/local-dev-lib/types/Config';
2
2
  import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
3
- import { DeveloperTestAccount } from '@hubspot/local-dev-lib/types/developerTestAccounts';
4
3
  import { SandboxResponse } from '@hubspot/local-dev-lib/types/Sandbox';
5
4
  import { SandboxAccountType } from '../types/Sandboxes';
6
5
  export declare function saveAccountToConfig(accountId: number | undefined, accountName: string, env: Environment, personalAccessKey?: string, force?: boolean): Promise<string>;
7
- export declare function buildDeveloperTestAccount(testAccountName: string, parentAccountConfig: CLIAccount, env: Environment, portalLimit: number): Promise<DeveloperTestAccount>;
6
+ export declare function buildDeveloperTestAccount(testAccountName: string, parentAccountConfig: CLIAccount, env: Environment, portalLimit: number): Promise<number>;
8
7
  type SandboxAccount = SandboxResponse & {
9
8
  name: string;
10
9
  };
@@ -61,49 +61,50 @@ async function saveAccountToConfig(accountId, accountName, env, personalAccessKe
61
61
  return validName;
62
62
  }
63
63
  async function buildDeveloperTestAccount(testAccountName, parentAccountConfig, env, portalLimit) {
64
- const i18nKey = 'lib.developerTestAccount.create.loading';
65
64
  const id = (0, getAccountIdentifier_1.getAccountIdentifier)(parentAccountConfig);
66
65
  const parentAccountId = (0, config_1.getAccountId)(id);
67
66
  if (!parentAccountId) {
68
- throw new Error((0, lang_1.i18n)(`${i18nKey}.fail`));
67
+ throw new Error((0, lang_1.i18n)(`lib.developerTestAccount.create.loading.fail`));
69
68
  }
70
69
  SpinniesManager_1.default.init({
71
70
  succeedColor: 'white',
72
71
  });
73
72
  logger_1.logger.log('');
74
73
  SpinniesManager_1.default.add('buildDeveloperTestAccount', {
75
- text: (0, lang_1.i18n)(`${i18nKey}.add`, {
74
+ text: (0, lang_1.i18n)(`lib.developerTestAccount.create.loading.add`, {
76
75
  accountName: testAccountName,
77
76
  }),
78
77
  });
79
- let developerTestAccount;
78
+ let developerTestAccountId;
79
+ let developerTestAccountPersonalAccessKey;
80
80
  try {
81
81
  const { data } = await (0, developerTestAccounts_1.createDeveloperTestAccount)(parentAccountId, testAccountName);
82
- developerTestAccount = data;
82
+ developerTestAccountId = data.id;
83
+ developerTestAccountPersonalAccessKey = data.personalAccessKey;
83
84
  SpinniesManager_1.default.succeed('buildDeveloperTestAccount', {
84
- text: (0, lang_1.i18n)(`${i18nKey}.succeed`, {
85
+ text: (0, lang_1.i18n)(`lib.developerTestAccount.create.loading.succeed`, {
85
86
  accountName: testAccountName,
86
- accountId: developerTestAccount.id,
87
+ accountId: developerTestAccountId,
87
88
  }),
88
89
  });
89
90
  }
90
91
  catch (e) {
91
92
  (0, index_1.debugError)(e);
92
93
  SpinniesManager_1.default.fail('buildDeveloperTestAccount', {
93
- text: (0, lang_1.i18n)(`${i18nKey}.fail`, {
94
+ text: (0, lang_1.i18n)(`lib.developerTestAccount.create.loading.fail`, {
94
95
  accountName: testAccountName,
95
96
  }),
96
97
  });
97
98
  (0, developerTestAccounts_2.handleDeveloperTestAccountCreateError)(e, parentAccountId, env, portalLimit);
98
99
  }
99
100
  try {
100
- await saveAccountToConfig(developerTestAccount.id, testAccountName, env);
101
+ await saveAccountToConfig(developerTestAccountId, testAccountName, env, developerTestAccountPersonalAccessKey);
101
102
  }
102
103
  catch (err) {
103
104
  (0, index_1.logError)(err);
104
105
  throw err;
105
106
  }
106
- return developerTestAccount;
107
+ return developerTestAccountId;
107
108
  }
108
109
  async function buildSandbox(sandboxName, parentAccountConfig, sandboxType, env, force = false) {
109
110
  let i18nKey;
@@ -1,9 +1,7 @@
1
1
  import { Argv, Arguments } from 'yargs';
2
2
  import { CmsPublishMode } from '@hubspot/local-dev-lib/types/Files';
3
3
  import { ConfigArgs } from '../types/Yargs';
4
- export declare function addGlobalOptions(yargs: Argv): Argv<{
5
- debug: boolean;
6
- }>;
4
+ export declare function addGlobalOptions(yargs: Argv): Argv<{}>;
7
5
  export declare function addAccountOptions(yargs: Argv): Argv;
8
6
  export declare function addConfigOptions(yargs: Argv): Argv<ConfigArgs>;
9
7
  export declare function addOverwriteOptions(yargs: Argv): Argv;
@@ -13,9 +11,10 @@ export declare function addCmsPublishModeOptions(yargs: Argv, { read, write }: {
13
11
  }): Argv;
14
12
  export declare function addTestingOptions(yargs: Argv): Argv;
15
13
  export declare function addUseEnvironmentOptions(yargs: Argv): Argv;
16
- export declare function addCustomHelpOutput(yargs: Argv, command: string, describe: string): Promise<void>;
14
+ export declare function addCustomHelpOutput(yargs: Argv, command: string | string[], describe?: string): Promise<void>;
17
15
  export declare function setLogLevel(options: Arguments<{
18
16
  debug?: boolean;
17
+ networkDebug?: boolean;
19
18
  }>): void;
20
19
  export declare function getCommandName(argv: Arguments<{
21
20
  _?: string[];