@hubspot/cli 7.8.12-experimental.1 → 7.9.0-beta.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 (276) hide show
  1. package/commands/__tests__/cms.test.js +44 -1
  2. package/commands/__tests__/customObject.test.js +22 -1
  3. package/commands/__tests__/project.test.js +2 -0
  4. package/commands/account/auth.js +1 -0
  5. package/commands/auth.js +1 -0
  6. package/commands/{__tests__/remove.test.js → cms/__tests__/delete.test.js} +8 -8
  7. package/commands/{__tests__ → cms/__tests__}/fetch.test.js +3 -3
  8. package/commands/{__tests__ → cms/__tests__}/function.test.js +7 -3
  9. package/commands/{__tests__ → cms/__tests__}/lint.test.js +3 -3
  10. package/commands/{__tests__ → cms/__tests__}/list.test.js +3 -3
  11. package/commands/{__tests__ → cms/__tests__}/mv.test.js +3 -3
  12. package/commands/{__tests__ → cms/__tests__}/theme.test.js +9 -2
  13. package/commands/cms/app/create.d.ts +9 -0
  14. package/commands/cms/app/create.js +82 -0
  15. package/commands/cms/app.d.ts +3 -0
  16. package/commands/cms/app.js +17 -0
  17. package/commands/cms/delete.d.ts +6 -0
  18. package/commands/cms/delete.js +43 -0
  19. package/commands/cms/fetch.d.ts +12 -0
  20. package/commands/cms/fetch.js +79 -0
  21. package/commands/{__tests__ → cms/function/__tests__}/logs.test.js +4 -5
  22. package/commands/cms/function/create.d.ts +12 -0
  23. package/commands/cms/function/create.js +84 -0
  24. package/commands/cms/function/deploy.d.ts +6 -0
  25. package/commands/cms/function/deploy.js +89 -0
  26. package/commands/cms/function/list.d.ts +6 -0
  27. package/commands/cms/function/list.js +60 -0
  28. package/commands/cms/function/logs.d.ts +10 -0
  29. package/commands/cms/function/logs.js +135 -0
  30. package/commands/cms/function/server.d.ts +10 -0
  31. package/commands/cms/function/server.js +69 -0
  32. package/commands/cms/function.d.ts +3 -0
  33. package/commands/cms/function.js +27 -0
  34. package/commands/cms/lint.d.ts +6 -0
  35. package/commands/cms/lint.js +83 -0
  36. package/commands/cms/list.d.ts +6 -0
  37. package/commands/cms/list.js +96 -0
  38. package/commands/cms/module/create.d.ts +11 -0
  39. package/commands/cms/module/create.js +84 -0
  40. package/commands/cms/module/marketplace-validate.d.ts +6 -0
  41. package/commands/cms/module/marketplace-validate.js +45 -0
  42. package/commands/cms/module.d.ts +3 -0
  43. package/commands/cms/module.js +17 -0
  44. package/commands/cms/mv.d.ts +7 -0
  45. package/commands/cms/mv.js +60 -0
  46. package/commands/cms/template/create.d.ts +9 -0
  47. package/commands/cms/template/create.js +72 -0
  48. package/commands/cms/template.d.ts +3 -0
  49. package/commands/cms/template.js +17 -0
  50. package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.js +2 -2
  51. package/commands/{theme → cms/theme}/__tests__/preview.test.js +2 -2
  52. package/commands/cms/theme/create.d.ts +6 -0
  53. package/commands/cms/theme/create.js +58 -0
  54. package/commands/cms/theme/generate-selectors.d.ts +6 -0
  55. package/commands/cms/theme/generate-selectors.js +171 -0
  56. package/commands/cms/theme/marketplace-validate.d.ts +6 -0
  57. package/commands/cms/theme/marketplace-validate.js +46 -0
  58. package/commands/cms/theme/preview.d.ts +12 -0
  59. package/commands/cms/theme/preview.js +224 -0
  60. package/commands/cms/theme.d.ts +3 -0
  61. package/commands/cms/theme.js +25 -0
  62. package/commands/cms/upload.d.ts +12 -0
  63. package/commands/cms/upload.js +212 -0
  64. package/commands/cms/watch.d.ts +14 -0
  65. package/commands/cms/watch.js +138 -0
  66. package/commands/cms/webpack/create.d.ts +6 -0
  67. package/commands/cms/webpack/create.js +58 -0
  68. package/commands/cms/webpack.d.ts +3 -0
  69. package/commands/cms/webpack.js +17 -0
  70. package/commands/cms.js +26 -0
  71. package/commands/create.js +4 -2
  72. package/commands/customObject/{schema/__tests__/create.test.js → __tests__/createSchema.test.js} +5 -5
  73. package/commands/customObject/{schema/__tests__/delete.test.js → __tests__/deleteSchema.test.js} +5 -5
  74. package/commands/customObject/{schema/__tests__/fetch-all.test.js → __tests__/fetch-all-schemas.test.js} +5 -5
  75. package/commands/customObject/{schema/__tests__/fetch.test.js → __tests__/fetchSchema.test.js} +5 -5
  76. package/commands/customObject/{schema/__tests__/list.test.js → __tests__/listSchemas.test.js} +5 -5
  77. package/commands/customObject/{schema/__tests__/update.test.js → __tests__/updateSchema.test.js} +5 -5
  78. package/commands/customObject/createSchema.d.ts +6 -0
  79. package/commands/customObject/createSchema.js +56 -0
  80. package/commands/customObject/deleteSchema.d.ts +7 -0
  81. package/commands/customObject/deleteSchema.js +69 -0
  82. package/commands/customObject/fetchAllSchemas.d.ts +6 -0
  83. package/commands/customObject/fetchAllSchemas.js +57 -0
  84. package/commands/customObject/fetchSchema.d.ts +7 -0
  85. package/commands/customObject/fetchSchema.js +67 -0
  86. package/commands/customObject/listSchemas.d.ts +4 -0
  87. package/commands/customObject/listSchemas.js +35 -0
  88. package/commands/customObject/schema/create.d.ts +4 -6
  89. package/commands/customObject/schema/create.js +13 -36
  90. package/commands/customObject/schema/delete.d.ts +4 -7
  91. package/commands/customObject/schema/delete.js +15 -50
  92. package/commands/customObject/schema/fetch-all.d.ts +4 -6
  93. package/commands/customObject/schema/fetch-all.js +14 -41
  94. package/commands/customObject/schema/fetch.d.ts +4 -7
  95. package/commands/customObject/schema/fetch.js +14 -49
  96. package/commands/customObject/schema/list.d.ts +4 -4
  97. package/commands/customObject/schema/list.js +10 -19
  98. package/commands/customObject/schema/update.d.ts +4 -7
  99. package/commands/customObject/schema/update.js +15 -50
  100. package/commands/customObject/schema.js +4 -2
  101. package/commands/customObject/updateSchema.d.ts +7 -0
  102. package/commands/customObject/updateSchema.js +71 -0
  103. package/commands/customObject.js +16 -1
  104. package/commands/feedback.js +1 -1
  105. package/commands/fetch.d.ts +4 -12
  106. package/commands/fetch.js +19 -46
  107. package/commands/function/deploy.d.ts +4 -6
  108. package/commands/function/deploy.js +14 -71
  109. package/commands/function/list.d.ts +4 -6
  110. package/commands/function/list.js +14 -40
  111. package/commands/function/server.d.ts +4 -10
  112. package/commands/function/server.js +22 -29
  113. package/commands/function.d.ts +2 -4
  114. package/commands/function.js +25 -14
  115. package/commands/lint.d.ts +4 -6
  116. package/commands/lint.js +13 -65
  117. package/commands/list.d.ts +4 -6
  118. package/commands/list.js +13 -74
  119. package/commands/logs.d.ts +4 -10
  120. package/commands/logs.js +24 -87
  121. package/commands/module/marketplace-validate.d.ts +4 -6
  122. package/commands/module/marketplace-validate.js +15 -27
  123. package/commands/module.d.ts +2 -2
  124. package/commands/module.js +17 -15
  125. package/commands/mv.d.ts +4 -7
  126. package/commands/mv.js +13 -39
  127. package/commands/project/__tests__/add.test.js +12 -12
  128. package/commands/project/__tests__/devUnifiedFlow.test.js +32 -0
  129. package/commands/project/__tests__/list.test.js +31 -0
  130. package/commands/project/__tests__/migrate.test.js +1 -0
  131. package/commands/project/add.d.ts +2 -2
  132. package/commands/project/add.js +3 -2
  133. package/commands/project/create.js +1 -1
  134. package/commands/project/dev/deprecatedFlow.js +2 -2
  135. package/commands/project/dev/index.js +5 -5
  136. package/commands/project/dev/unifiedFlow.js +8 -3
  137. package/commands/project/download.js +5 -2
  138. package/commands/project/installDeps.d.ts +2 -2
  139. package/commands/project/installDeps.js +1 -0
  140. package/commands/project/list.d.ts +4 -0
  141. package/commands/project/list.js +62 -0
  142. package/commands/project/migrate.js +5 -2
  143. package/commands/project.js +2 -0
  144. package/commands/remove.d.ts +4 -6
  145. package/commands/remove.js +12 -24
  146. package/commands/testAccount/create.js +2 -2
  147. package/commands/testAccount/delete.js +1 -1
  148. package/commands/theme/generate-selectors.d.ts +4 -6
  149. package/commands/theme/generate-selectors.js +14 -152
  150. package/commands/theme/marketplace-validate.d.ts +4 -6
  151. package/commands/theme/marketplace-validate.js +14 -25
  152. package/commands/theme/preview.d.ts +4 -12
  153. package/commands/theme/preview.js +18 -180
  154. package/commands/theme.d.ts +2 -2
  155. package/commands/theme.js +19 -13
  156. package/commands/upload.d.ts +4 -12
  157. package/commands/upload.js +19 -169
  158. package/commands/watch.d.ts +4 -14
  159. package/commands/watch.js +23 -88
  160. package/lang/en.d.ts +561 -425
  161. package/lang/en.js +563 -427
  162. package/lang/en.lyaml +2 -2
  163. package/lib/__tests__/buildAccount.test.js +2 -2
  164. package/lib/__tests__/http.test.js +40 -0
  165. package/lib/buildAccount.d.ts +2 -2
  166. package/lib/buildAccount.js +7 -7
  167. package/lib/configMigrate.js +88 -9
  168. package/lib/constants.d.ts +9 -0
  169. package/lib/constants.js +9 -0
  170. package/lib/generateSelectors.js +1 -1
  171. package/lib/http.d.ts +1 -0
  172. package/lib/http.js +26 -0
  173. package/lib/middleware/autoUpdateMiddleware.d.ts +2 -1
  174. package/lib/middleware/autoUpdateMiddleware.js +12 -2
  175. package/lib/middleware/commandTargetingUtils.d.ts +1 -1
  176. package/lib/middleware/commandTargetingUtils.js +16 -20
  177. package/lib/projects/__tests__/AppDevModeInterface.test.js +95 -109
  178. package/lib/projects/__tests__/DevServerManager.test.d.ts +1 -0
  179. package/lib/projects/__tests__/DevServerManager.test.js +183 -0
  180. package/lib/projects/__tests__/LocalDevProcess.test.js +6 -5
  181. package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +6 -6
  182. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.d.ts +1 -0
  183. package/lib/projects/__tests__/UIExtensionsDevModeInterface.test.js +161 -0
  184. package/lib/projects/__tests__/deploy.test.js +9 -9
  185. package/lib/projects/__tests__/upload.test.js +2 -2
  186. package/lib/projects/add/__tests__/v2AddComponent.test.d.ts +1 -0
  187. package/lib/projects/add/__tests__/{v3AddComponent.test.js → v2AddComponent.test.js} +35 -35
  188. package/lib/projects/add/{v3AddComponent.d.ts → v2AddComponent.d.ts} +1 -1
  189. package/lib/projects/add/{v3AddComponent.js → v2AddComponent.js} +5 -5
  190. package/lib/projects/create/__tests__/v2.test.d.ts +1 -0
  191. package/lib/projects/create/__tests__/{v3.test.js → v2.test.js} +2 -2
  192. package/lib/projects/create/index.js +2 -2
  193. package/lib/projects/create/{v3.d.ts → v2.d.ts} +3 -3
  194. package/lib/projects/create/{v3.js → v2.js} +3 -3
  195. package/lib/projects/deploy.d.ts +1 -1
  196. package/lib/projects/deploy.js +2 -2
  197. package/lib/projects/localDev/AppDevModeInterface.d.ts +10 -3
  198. package/lib/projects/localDev/AppDevModeInterface.js +132 -105
  199. package/lib/projects/localDev/DevServerManager.d.ts +10 -29
  200. package/lib/projects/localDev/DevServerManager.js +20 -76
  201. package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +40 -0
  202. package/lib/projects/localDev/DevServerManager_DEPRECATED.js +120 -0
  203. package/lib/projects/localDev/{LocalDevManager.js → LocalDevManager_DEPRECATED.js} +6 -6
  204. package/lib/projects/localDev/LocalDevProcess.js +3 -2
  205. package/lib/projects/localDev/LocalDevState.d.ts +3 -0
  206. package/lib/projects/localDev/LocalDevState.js +9 -0
  207. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +4 -0
  208. package/lib/projects/localDev/LocalDevWebsocketServer.js +39 -6
  209. package/lib/projects/localDev/UIExtensionsDevModeInterface.d.ts +13 -0
  210. package/lib/projects/localDev/UIExtensionsDevModeInterface.js +37 -0
  211. package/lib/projects/localDev/helpers/account.d.ts +1 -1
  212. package/lib/projects/localDev/helpers/account.js +2 -2
  213. package/lib/projects/localDev/helpers/process.d.ts +1 -0
  214. package/lib/projects/localDev/helpers/process.js +15 -0
  215. package/lib/projects/localDev/helpers/project.js +2 -3
  216. package/lib/projects/localDev/localDevWebsocketServerUtils.d.ts +3 -0
  217. package/lib/projects/localDev/localDevWebsocketServerUtils.js +9 -0
  218. package/lib/projects/urls.d.ts +0 -1
  219. package/lib/projects/urls.js +0 -3
  220. package/lib/prompts/__tests__/projectAddPrompt.test.js +10 -10
  221. package/lib/prompts/installAppPrompt.d.ts +1 -6
  222. package/lib/prompts/installAppPrompt.js +1 -6
  223. package/lib/prompts/projectAddPrompt.d.ts +2 -2
  224. package/lib/prompts/projectAddPrompt.js +1 -1
  225. package/lib/theme/__tests__/migrate.test.js +4 -4
  226. package/lib/ui/index.d.ts +2 -0
  227. package/lib/ui/index.js +8 -0
  228. package/lib/ui/uiMessages.d.ts +5 -0
  229. package/lib/ui/uiMessages.js +5 -0
  230. package/mcp-server/tools/cms/HsCreateModuleTool.d.ts +2 -2
  231. package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +1 -1
  232. package/package.json +6 -5
  233. package/types/Cms.d.ts +6 -6
  234. package/lib/projects/localDev/DevServerManagerV2.d.ts +0 -22
  235. package/lib/projects/localDev/DevServerManagerV2.js +0 -81
  236. /package/commands/{customObject/schema → cms}/__tests__/delete.test.d.ts +0 -0
  237. /package/commands/{__tests__ → cms/__tests__}/fetch.test.d.ts +0 -0
  238. /package/commands/{__tests__ → cms/__tests__}/function.test.d.ts +0 -0
  239. /package/commands/{__tests__ → cms/__tests__}/lint.test.d.ts +0 -0
  240. /package/commands/{__tests__ → cms/__tests__}/list.test.d.ts +0 -0
  241. /package/commands/{__tests__ → cms/__tests__}/mv.test.d.ts +0 -0
  242. /package/commands/{__tests__ → cms/__tests__}/theme.test.d.ts +0 -0
  243. /package/commands/{__tests__ → cms/function/__tests__}/logs.test.d.ts +0 -0
  244. /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.d.ts +0 -0
  245. /package/commands/{theme → cms/theme}/__tests__/generate-selectors.test.js +0 -0
  246. /package/commands/{theme → cms/theme}/__tests__/marketplace-validate.test.d.ts +0 -0
  247. /package/commands/{theme → cms/theme}/__tests__/preview.test.d.ts +0 -0
  248. /package/commands/{__tests__/remove.test.d.ts → customObject/__tests__/createSchema.test.d.ts} +0 -0
  249. /package/commands/customObject/{schema/__tests__/create.test.d.ts → __tests__/deleteSchema.test.d.ts} +0 -0
  250. /package/commands/customObject/{schema/__tests__/fetch-all.test.d.ts → __tests__/fetch-all-schemas.test.d.ts} +0 -0
  251. /package/commands/customObject/{schema/__tests__/fetch.test.d.ts → __tests__/fetchSchema.test.d.ts} +0 -0
  252. /package/commands/customObject/{schema/__tests__/list.test.d.ts → __tests__/listSchemas.test.d.ts} +0 -0
  253. /package/commands/customObject/{schema/__tests__/update.test.d.ts → __tests__/updateSchema.test.d.ts} +0 -0
  254. /package/{lib/projects/add/__tests__/v3AddComponent.test.d.ts → commands/project/__tests__/list.test.d.ts} +0 -0
  255. /package/lib/{projects/create/__tests__/v3.test.d.ts → __tests__/http.test.d.ts} +0 -0
  256. /package/{commands/create → lib/cmsAssets}/api-sample.d.ts +0 -0
  257. /package/{commands/create → lib/cmsAssets}/api-sample.js +0 -0
  258. /package/{commands/create → lib/cmsAssets}/app.d.ts +0 -0
  259. /package/{commands/create → lib/cmsAssets}/app.js +0 -0
  260. /package/{commands/create → lib/cmsAssets}/function.d.ts +0 -0
  261. /package/{commands/create → lib/cmsAssets}/function.js +0 -0
  262. /package/{commands/create → lib/cmsAssets}/index.d.ts +0 -0
  263. /package/{commands/create → lib/cmsAssets}/index.js +0 -0
  264. /package/{commands/create → lib/cmsAssets}/module.d.ts +0 -0
  265. /package/{commands/create → lib/cmsAssets}/module.js +0 -0
  266. /package/{commands/create → lib/cmsAssets}/react-app.d.ts +0 -0
  267. /package/{commands/create → lib/cmsAssets}/react-app.js +0 -0
  268. /package/{commands/create → lib/cmsAssets}/template.d.ts +0 -0
  269. /package/{commands/create → lib/cmsAssets}/template.js +0 -0
  270. /package/{commands/create → lib/cmsAssets}/vue-app.d.ts +0 -0
  271. /package/{commands/create → lib/cmsAssets}/vue-app.js +0 -0
  272. /package/{commands/create → lib/cmsAssets}/webpack-serverless.d.ts +0 -0
  273. /package/{commands/create → lib/cmsAssets}/webpack-serverless.js +0 -0
  274. /package/{commands/create → lib/cmsAssets}/website-theme.d.ts +0 -0
  275. /package/{commands/create → lib/cmsAssets}/website-theme.js +0 -0
  276. /package/lib/projects/localDev/{LocalDevManager.d.ts → LocalDevManager_DEPRECATED.d.ts} +0 -0
@@ -1,43 +1,31 @@
1
- import SpinniesManager from '../../lib/ui/SpinniesManager.js';
2
- import { trackCommandUsage } from '../../lib/usageTracking.js';
3
- import { kickOffValidation, pollForValidationFinish, fetchValidationResults, processValidationErrors, displayValidationResults, } from '../../lib/marketplaceValidate.js';
4
- import { commands } from '../../lang/en.js';
5
- import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
1
+ import { uiCommandRelocatedMessage, uiCommandRenamedDescription, uiDeprecatedTag, } from '../../lib/ui/index.js';
2
+ import marketplaceValidateCommand from '../cms/module/marketplace-validate.js';
6
3
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
7
- const command = 'marketplace-validate <src>';
8
- const describe = commands.module.subcommands.marketplaceValidate.describe;
4
+ import { commands } from '../../lang/en.js';
5
+ const command = 'marketplace-validate [src]';
6
+ const describe = uiDeprecatedTag(marketplaceValidateCommand.describe, false);
9
7
  async function handler(args) {
10
- const { src, derivedAccountId } = args;
11
- trackCommandUsage('validate', undefined, derivedAccountId);
12
- SpinniesManager.init();
13
- SpinniesManager.add('marketplaceValidation', {
14
- text: commands.module.subcommands.marketplaceValidate.logs.validatingModule(src),
15
- });
16
- const assetType = 'MODULE';
17
- const validationId = await kickOffValidation(derivedAccountId, assetType, src);
18
- await pollForValidationFinish(derivedAccountId, validationId);
19
- SpinniesManager.remove('marketplaceValidation');
20
- const validationResults = await fetchValidationResults(derivedAccountId, validationId);
21
- processValidationErrors(commands.module.subcommands.marketplaceValidate.errors.invalidPath, validationResults);
22
- displayValidationResults(commands.module.subcommands.marketplaceValidate.results, validationResults);
23
- process.exit(EXIT_CODES.SUCCESS);
8
+ uiCommandRelocatedMessage('hs cms module marketplace-validate');
9
+ await marketplaceValidateCommand.handler(args);
24
10
  }
25
- function marketplaceValidateBuilder(yargs) {
11
+ function deprecatedMarketplaceValidateBuilder(yargs) {
26
12
  yargs.positional('src', {
27
- describe: commands.module.subcommands.marketplaceValidate.positionals.src,
13
+ describe: commands.cms.subcommands.module.subcommands.marketplaceValidate
14
+ .positionals.src,
28
15
  type: 'string',
29
16
  });
30
17
  return yargs;
31
18
  }
32
- const builder = makeYargsBuilder(marketplaceValidateBuilder, command, describe, {
19
+ const verboseDescribe = uiCommandRenamedDescription(marketplaceValidateCommand.describe, 'hs cms module marketplace-validate');
20
+ const builder = makeYargsBuilder(deprecatedMarketplaceValidateBuilder, command, verboseDescribe, {
33
21
  useConfigOptions: true,
34
22
  useAccountOptions: true,
35
23
  useEnvironmentOptions: true,
36
24
  });
37
- const marketplaceValidateCommand = {
38
- command,
25
+ const deprecatedMarketplaceValidateCommand = {
26
+ ...marketplaceValidateCommand,
39
27
  describe,
40
28
  handler,
41
29
  builder,
42
30
  };
43
- export default marketplaceValidateCommand;
31
+ export default deprecatedMarketplaceValidateCommand;
@@ -1,3 +1,3 @@
1
1
  import { YargsCommandModuleBucket } from '../types/Yargs.js';
2
- declare const moduleCommand: YargsCommandModuleBucket;
3
- export default moduleCommand;
2
+ declare const deprecatedCmsModuleCommand: YargsCommandModuleBucket;
3
+ export default deprecatedCmsModuleCommand;
@@ -1,21 +1,23 @@
1
- import marketplaceValidate from './module/marketplace-validate.js';
2
- import { commands } from '../lang/en.js';
1
+ import { uiCommandRelocatedMessage, uiCommandRenamedDescription, uiDeprecatedTag, } from '../lib/ui/index.js';
2
+ import cmsModuleCommand from './cms/module.js';
3
+ import marketplaceValidateCommand from './module/marketplace-validate.js';
3
4
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
4
- const command = 'module';
5
- const describe = commands.module.describe;
6
- function moduleBuilder(yargs) {
7
- yargs.command(marketplaceValidate).demandCommand(1, '');
5
+ const command = ['module'];
6
+ const describe = uiDeprecatedTag(cmsModuleCommand.describe, false);
7
+ async function handler(args) {
8
+ uiCommandRelocatedMessage('hs cms module');
9
+ await cmsModuleCommand.handler(args);
10
+ }
11
+ function deprecatedCmsModuleBuilder(yargs) {
12
+ yargs.command(marketplaceValidateCommand).demandCommand(1, '');
8
13
  return yargs;
9
14
  }
10
- const builder = makeYargsBuilder(moduleBuilder, command, describe, {
11
- useGlobalOptions: true,
12
- useConfigOptions: true,
13
- useAccountOptions: true,
14
- });
15
- const moduleCommand = {
16
- command,
15
+ const verboseDescribe = uiCommandRenamedDescription(cmsModuleCommand.describe, 'hs cms module');
16
+ const builder = makeYargsBuilder(deprecatedCmsModuleBuilder, command, verboseDescribe);
17
+ const deprecatedCmsModuleCommand = {
18
+ ...cmsModuleCommand,
17
19
  describe,
20
+ handler,
18
21
  builder,
19
- handler: () => { },
20
22
  };
21
- export default moduleCommand;
23
+ export default deprecatedCmsModuleCommand;
package/commands/mv.d.ts CHANGED
@@ -1,7 +1,4 @@
1
- import { CommonArgs, ConfigArgs, EnvironmentArgs, YargsCommandModule } from '../types/Yargs.js';
2
- type MvArgs = CommonArgs & ConfigArgs & EnvironmentArgs & {
3
- srcPath: string;
4
- destPath: string;
5
- };
6
- declare const cmsMvCommand: YargsCommandModule<unknown, MvArgs>;
7
- export default cmsMvCommand;
1
+ import { YargsCommandModule } from '../types/Yargs.js';
2
+ import { MvArgs } from './cms/mv.js';
3
+ declare const deprecatedCmsMvCommand: YargsCommandModule<unknown, MvArgs>;
4
+ export default deprecatedCmsMvCommand;
package/commands/mv.js CHANGED
@@ -1,61 +1,35 @@
1
- import { moveFile } from '@hubspot/local-dev-lib/api/fileMapper';
2
- import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
3
- import { logError, ApiErrorContext } from '../lib/errorHandlers/index.js';
4
- import { trackCommandUsage } from '../lib/usageTracking.js';
5
- import { isPathFolder } from '../lib/filesystem.js';
6
- import { uiBetaTag } from '../lib/ui/index.js';
1
+ import { uiCommandRelocatedMessage, uiCommandRenamedDescription, uiDeprecatedTag, } from '../lib/ui/index.js';
2
+ import cmsMvCommand from './cms/mv.js';
7
3
  import { makeYargsBuilder } from '../lib/yargsUtils.js';
8
- import { uiLogger } from '../lib/ui/logger.js';
9
4
  import { commands } from '../lang/en.js';
10
- function getCorrectedDestPath(srcPath, destPath) {
11
- if (!isPathFolder(srcPath)) {
12
- return destPath;
13
- }
14
- // Makes sure that nested folders are moved independently
15
- return `${destPath}/${srcPath.split('/').pop()}`;
16
- }
17
5
  const command = 'mv <srcPath> <destPath>';
18
- const describe = uiBetaTag(commands.mv.describe, false);
6
+ const describe = uiDeprecatedTag(cmsMvCommand.describe, false);
19
7
  async function handler(args) {
20
- const { srcPath, destPath, derivedAccountId } = args;
21
- trackCommandUsage('mv', undefined, derivedAccountId);
22
- try {
23
- await moveFile(derivedAccountId, srcPath, getCorrectedDestPath(srcPath, destPath));
24
- uiLogger.success(commands.mv.move(srcPath, destPath, derivedAccountId));
25
- }
26
- catch (error) {
27
- uiLogger.error(commands.mv.errors.moveFailed(srcPath, destPath, derivedAccountId));
28
- if (isSpecifiedError(error, { statusCode: 409 })) {
29
- uiLogger.error(commands.mv.errors.sourcePathExists(srcPath, destPath));
30
- }
31
- else {
32
- logError(error, new ApiErrorContext({
33
- accountId: derivedAccountId,
34
- }));
35
- }
36
- }
8
+ uiCommandRelocatedMessage('hs cms mv');
9
+ await cmsMvCommand.handler(args);
37
10
  }
38
- function cmsMvBuilder(yargs) {
11
+ function deprecatedCmsMvBuilder(yargs) {
39
12
  yargs.positional('srcPath', {
40
- describe: 'Remote hubspot path',
13
+ describe: commands.cms.subcommands.mv.positionals.srcPath.describe,
41
14
  type: 'string',
42
15
  });
43
16
  yargs.positional('destPath', {
44
- describe: 'Remote hubspot path',
17
+ describe: commands.cms.subcommands.mv.positionals.destPath.describe,
45
18
  type: 'string',
46
19
  });
47
20
  return yargs;
48
21
  }
49
- const builder = makeYargsBuilder(cmsMvBuilder, command, describe, {
22
+ const verboseDescribe = uiCommandRenamedDescription(cmsMvCommand.describe, 'hs cms mv');
23
+ const builder = makeYargsBuilder(deprecatedCmsMvBuilder, command, verboseDescribe, {
50
24
  useGlobalOptions: true,
51
25
  useConfigOptions: true,
52
26
  useAccountOptions: true,
53
27
  useEnvironmentOptions: true,
54
28
  });
55
- const cmsMvCommand = {
56
- command,
29
+ const deprecatedCmsMvCommand = {
30
+ ...cmsMvCommand,
57
31
  describe,
58
32
  handler,
59
33
  builder,
60
34
  };
61
- export default cmsMvCommand;
35
+ export default deprecatedCmsMvCommand;
@@ -1,7 +1,7 @@
1
1
  import yargs from 'yargs';
2
2
  import projectAddCommand from '../add.js';
3
3
  import { marketplaceDistribution, oAuth, privateDistribution, staticAuth, } from '../../../lib/constants.js';
4
- import { v3AddComponent } from '../../../lib/projects/add/v3AddComponent.js';
4
+ import { v2AddComponent } from '../../../lib/projects/add/v2AddComponent.js';
5
5
  import { legacyAddComponent } from '../../../lib/projects/add/legacyAddComponent.js';
6
6
  import { getProjectConfig } from '../../../lib/projects/config.js';
7
7
  import { isV2Project } from '../../../lib/projects/platformVersion.js';
@@ -9,15 +9,15 @@ import { trackCommandUsage } from '../../../lib/usageTracking.js';
9
9
  vi.mock('../../../lib/commonOpts');
10
10
  vi.mock('../../../lib/ui/logger.js');
11
11
  vi.mock('../../../lib/errorHandlers/index.js');
12
- vi.mock('../../../lib/projects/add/v3AddComponent');
12
+ vi.mock('../../../lib/projects/add/v2AddComponent');
13
13
  vi.mock('../../../lib/projects/add/legacyAddComponent');
14
14
  vi.mock('../../../lib/projects/config');
15
15
  vi.mock('../../../lib/projects/platformVersion');
16
16
  vi.mock('../../../lib/usageTracking');
17
- const mockedV3AddComponent = vi.mocked(v3AddComponent);
17
+ const mockedV2AddComponent = vi.mocked(v2AddComponent);
18
18
  const mockedLegacyAddComponent = vi.mocked(legacyAddComponent);
19
19
  const mockedGetProjectConfig = vi.mocked(getProjectConfig);
20
- const mockedUseV3Api = vi.mocked(isV2Project);
20
+ const mockedUseV2Api = vi.mocked(isV2Project);
21
21
  const mockedTrackCommandUsage = vi.mocked(trackCommandUsage);
22
22
  describe('commands/project/add', () => {
23
23
  const yargsMock = yargs;
@@ -61,7 +61,7 @@ describe('commands/project/add', () => {
61
61
  const mockProjectConfig = {
62
62
  name: 'test-project',
63
63
  srcDir: 'src',
64
- platformVersion: 'v3',
64
+ platformVersion: '2025.2',
65
65
  };
66
66
  const mockProjectDir = '/path/to/project';
67
67
  const mockArgs = {
@@ -75,23 +75,23 @@ describe('commands/project/add', () => {
75
75
  projectDir: mockProjectDir,
76
76
  });
77
77
  mockedTrackCommandUsage.mockResolvedValue();
78
- mockedV3AddComponent.mockResolvedValue();
78
+ mockedV2AddComponent.mockResolvedValue();
79
79
  mockedLegacyAddComponent.mockResolvedValue();
80
80
  vi.spyOn(process, 'exit').mockImplementation(() => {
81
81
  throw new Error('process.exit called');
82
82
  });
83
83
  });
84
- it('should call v3AddComponent with accountId for v3 projects', async () => {
85
- mockedUseV3Api.mockReturnValue(true);
84
+ it('should call v2AddComponent with accountId for v2 projects', async () => {
85
+ mockedUseV2Api.mockReturnValue(true);
86
86
  await expect(projectAddCommand.handler(mockArgs)).rejects.toThrow('process.exit called');
87
- expect(mockedV3AddComponent).toHaveBeenCalledWith(mockArgs, mockProjectDir, mockProjectConfig, 123);
87
+ expect(mockedV2AddComponent).toHaveBeenCalledWith(mockArgs, mockProjectDir, mockProjectConfig, 123);
88
88
  expect(mockedLegacyAddComponent).not.toHaveBeenCalled();
89
89
  });
90
- it('should call legacyAddComponent for non-v3 projects', async () => {
91
- mockedUseV3Api.mockReturnValue(false);
90
+ it('should call legacyAddComponent for non-v2 projects', async () => {
91
+ mockedUseV2Api.mockReturnValue(false);
92
92
  await expect(projectAddCommand.handler(mockArgs)).rejects.toThrow('process.exit called');
93
93
  expect(mockedLegacyAddComponent).toHaveBeenCalledWith(mockArgs, mockProjectDir, mockProjectConfig, 123);
94
- expect(mockedV3AddComponent).not.toHaveBeenCalled();
94
+ expect(mockedV2AddComponent).not.toHaveBeenCalled();
95
95
  });
96
96
  it('should exit with error when project config is not found', async () => {
97
97
  mockedGetProjectConfig.mockResolvedValue({
@@ -3,6 +3,7 @@ import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
3
3
  import { translateForLocalDev } from '@hubspot/project-parsing-lib';
4
4
  import { getConfigAccounts, getAccountConfig, } from '@hubspot/local-dev-lib/config';
5
5
  import { getValidEnv } from '@hubspot/local-dev-lib/environment';
6
+ import { getServerPortByInstanceId } from '@hubspot/local-dev-lib/portManager';
6
7
  import { logError } from '../../../lib/errorHandlers/index.js';
7
8
  import { ensureProjectExists } from '../../../lib/projects/ensureProjectExists.js';
8
9
  import { createInitialBuildForNewProject, createNewProjectForLocalDev, } from '../../../lib/projects/localDev/helpers/project.js';
@@ -33,6 +34,7 @@ vi.mock('@hubspot/ui-extensions-dev-server', () => ({
33
34
  vi.mock('@hubspot/project-parsing-lib');
34
35
  vi.mock('@hubspot/local-dev-lib/config');
35
36
  vi.mock('@hubspot/local-dev-lib/environment');
37
+ vi.mock('@hubspot/local-dev-lib/portManager');
36
38
  vi.mock('../../../lib/errorHandlers');
37
39
  vi.mock('../../../lib/projects/ensureProjectExists');
38
40
  vi.mock('../../../lib/projects/localDev/helpers/project');
@@ -135,6 +137,7 @@ describe('unifiedProjectDevFlow', () => {
135
137
  uiLogger.error.mockImplementation(() => { });
136
138
  uiLogger.log.mockImplementation(() => { });
137
139
  uiLine.mockImplementation(() => { });
140
+ getServerPortByInstanceId.mockRejectedValue(new Error('No server running'));
138
141
  });
139
142
  describe('successful flow', () => {
140
143
  it('should complete successfully with existing project and provided testing account', async () => {
@@ -400,4 +403,33 @@ describe('unifiedProjectDevFlow', () => {
400
403
  expect(uiLogger.log).toHaveBeenCalledWith(commands.project.dev.logs.testingAccountFlagExplanation(providedTestingAccountId));
401
404
  });
402
405
  });
406
+ describe('confirmLocalDevIsNotRunning', () => {
407
+ it('should exit with error when local dev is already running', async () => {
408
+ getServerPortByInstanceId.mockResolvedValue(3000);
409
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
410
+ throw new Error('Process.exit called');
411
+ });
412
+ await unifiedProjectDevFlow({
413
+ args: mockArgs,
414
+ targetProjectAccountId: mockTargetProjectAccountId,
415
+ providedTargetTestingAccountId: mockProvidedTargetTestingAccountId,
416
+ projectConfig: mockProjectConfig,
417
+ projectDir: mockProjectDir,
418
+ });
419
+ expect(uiLogger.error).toHaveBeenCalledWith(commands.project.dev.errors.localDevAlreadyRunning);
420
+ expect(mockExit).toHaveBeenCalledWith(1);
421
+ mockExit.mockRestore();
422
+ });
423
+ it('should continue when local dev is not running', async () => {
424
+ getServerPortByInstanceId.mockRejectedValue(new Error('No server running'));
425
+ await unifiedProjectDevFlow({
426
+ args: mockArgs,
427
+ targetProjectAccountId: mockTargetProjectAccountId,
428
+ providedTargetTestingAccountId: mockProvidedTargetTestingAccountId,
429
+ projectConfig: mockProjectConfig,
430
+ projectDir: mockProjectDir,
431
+ });
432
+ expect(mockLocalDevProcess.start).toHaveBeenCalled();
433
+ });
434
+ });
403
435
  });
@@ -0,0 +1,31 @@
1
+ import yargs from 'yargs';
2
+ import { addAccountOptions, addConfigOptions, } from '../../../lib/commonOpts.js';
3
+ import projectListCommand from '../list.js';
4
+ vi.mock('../../../lib/commonOpts');
5
+ describe('commands/project/list', () => {
6
+ const yargsMock = yargs;
7
+ describe('command', () => {
8
+ it('should have the correct command structure', () => {
9
+ expect(projectListCommand.command).toEqual(['list', 'ls']);
10
+ });
11
+ });
12
+ describe('describe', () => {
13
+ it('should provide a description', () => {
14
+ expect(projectListCommand.describe).toBeDefined();
15
+ });
16
+ });
17
+ describe('builder', () => {
18
+ it('should support the correct options', () => {
19
+ projectListCommand.builder(yargsMock);
20
+ expect(addAccountOptions).toHaveBeenCalledTimes(1);
21
+ expect(addAccountOptions).toHaveBeenCalledWith(yargsMock);
22
+ expect(addConfigOptions).toHaveBeenCalledTimes(1);
23
+ expect(addConfigOptions).toHaveBeenCalledWith(yargsMock);
24
+ });
25
+ it('should define examples', () => {
26
+ const exampleSpy = vi.spyOn(yargsMock, 'example');
27
+ projectListCommand.builder(yargsMock);
28
+ expect(exampleSpy).toHaveBeenCalled();
29
+ });
30
+ });
31
+ });
@@ -10,6 +10,7 @@ vi.mock('../../../lib/ui/logger.js');
10
10
  vi.mock('../../../lib/app/migrate');
11
11
  vi.mock('../../../lib/projects/config');
12
12
  vi.mock('../../../lib/ui');
13
+ vi.mock('../../../lib/usageTracking.js');
13
14
  const { v2025_2 } = PLATFORM_VERSIONS;
14
15
  describe('commands/project/migrate', () => {
15
16
  const yargsMock = yargs;
@@ -1,5 +1,5 @@
1
- import { YargsCommandModule, CommonArgs } from '../../types/Yargs.js';
2
- export type ProjectAddArgs = CommonArgs & {
1
+ import { YargsCommandModule, CommonArgs, ConfigArgs } from '../../types/Yargs.js';
2
+ export type ProjectAddArgs = CommonArgs & ConfigArgs & {
3
3
  type?: string;
4
4
  name?: string;
5
5
  features?: string[];
@@ -5,7 +5,7 @@ import { makeYargsBuilder } from '../../lib/yargsUtils.js';
5
5
  import { commands } from '../../lang/en.js';
6
6
  import { isV2Project } from '../../lib/projects/platformVersion.js';
7
7
  import { legacyAddComponent } from '../../lib/projects/add/legacyAddComponent.js';
8
- import { v3AddComponent } from '../../lib/projects/add/v3AddComponent.js';
8
+ import { v2AddComponent } from '../../lib/projects/add/v2AddComponent.js';
9
9
  import { marketplaceDistribution, oAuth, privateDistribution, staticAuth, } from '../../lib/constants.js';
10
10
  import { uiLogger } from '../../lib/ui/logger.js';
11
11
  const command = 'add';
@@ -20,7 +20,7 @@ async function handler(args) {
20
20
  }
21
21
  const isV2ProjectCreate = isV2Project(projectConfig.platformVersion);
22
22
  if (isV2ProjectCreate) {
23
- await v3AddComponent(args, projectDir, projectConfig, derivedAccountId);
23
+ await v2AddComponent(args, projectDir, projectConfig, derivedAccountId);
24
24
  }
25
25
  else {
26
26
  await legacyAddComponent(args, projectDir, projectConfig, derivedAccountId);
@@ -68,6 +68,7 @@ function projectAddBuilder(yargs) {
68
68
  }
69
69
  const builder = makeYargsBuilder(projectAddBuilder, command, describe, {
70
70
  useGlobalOptions: true,
71
+ useConfigOptions: true,
71
72
  });
72
73
  const projectAddCommand = {
73
74
  command,
@@ -5,7 +5,7 @@ import { getCwd } from '@hubspot/local-dev-lib/path';
5
5
  import { trackCommandUsage } from '../../lib/usageTracking.js';
6
6
  import { writeProjectConfig, getProjectConfig, } from '../../lib/projects/config.js';
7
7
  import { EMPTY_PROJECT_TEMPLATE_NAME } from '../../lib/projects/create/legacy.js';
8
- import { generateComponentPaths } from '../../lib/projects/create/v3.js';
8
+ import { generateComponentPaths } from '../../lib/projects/create/v2.js';
9
9
  import { PROJECT_WITH_APP, EMPTY_PROJECT } from '../../lib/constants.js';
10
10
  import { uiFeatureHighlight } from '../../lib/ui/index.js';
11
11
  import { debugError, logError } from '../../lib/errorHandlers/index.js';
@@ -6,7 +6,7 @@ import { commands } from '../../../lang/en.js';
6
6
  import { uiLogger } from '../../../lib/ui/logger.js';
7
7
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
8
8
  import SpinniesManager from '../../../lib/ui/SpinniesManager.js';
9
- import LocalDevManager from '../../../lib/projects/localDev/LocalDevManager.js';
9
+ import LocalDevManager_DEPRECATED from '../../../lib/projects/localDev/LocalDevManager_DEPRECATED.js';
10
10
  import { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfAccountFlagIsSupported, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, useExistingDevTestAccount, checkIfParentAccountIsAuthed, hasSandboxes, } from '../../../lib/projects/localDev/helpers/account.js';
11
11
  import { createInitialBuildForNewProject, createNewProjectForLocalDev, } from '../../../lib/projects/localDev/helpers/project.js';
12
12
  import { handleExit } from '../../../lib/process.js';
@@ -121,7 +121,7 @@ export async function deprecatedProjectDevFlow({ args, accountId, projectConfig,
121
121
  project = await createNewProjectForLocalDev(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
122
122
  deployedBuild = await createInitialBuildForNewProject(projectConfig, projectDir, targetProjectAccountId);
123
123
  }
124
- const LocalDev = new LocalDevManager({
124
+ const LocalDev = new LocalDevManager_DEPRECATED({
125
125
  runnableComponents,
126
126
  debug: args.debug,
127
127
  deployedBuild,
@@ -12,14 +12,14 @@ import { commands } from '../../../lang/en.js';
12
12
  import { uiLogger } from '../../../lib/ui/logger.js';
13
13
  const command = 'dev';
14
14
  const describe = commands.project.dev.describe;
15
- function validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV3) {
15
+ function validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV2) {
16
16
  // Legacy projects do not support targetTestingAccount and targetProjectAccount
17
- if (testingAccount && projectAccount && !useV3) {
17
+ if (testingAccount && projectAccount && !useV2) {
18
18
  uiLogger.error(commands.project.dev.errors.unsupportedAccountFlagLegacy);
19
19
  process.exit(EXIT_CODES.ERROR);
20
20
  }
21
- if (userProvidedAccount && useV3) {
22
- uiLogger.error(commands.project.dev.errors.unsupportedAccountFlagV3);
21
+ if (userProvidedAccount && useV2) {
22
+ uiLogger.error(commands.project.dev.errors.unsupportedAccountFlagV2);
23
23
  process.exit(EXIT_CODES.ERROR);
24
24
  }
25
25
  }
@@ -35,7 +35,7 @@ async function handler(args) {
35
35
  validateAccountFlags(testingAccount, projectAccount, userProvidedAccount, useV2Projects);
36
36
  uiLogger.log(commands.project.dev.logs.header);
37
37
  if (useV2Projects) {
38
- uiLogger.log(commands.project.dev.logs.learnMoreMessageV3);
38
+ uiLogger.log(commands.project.dev.logs.learnMoreMessageV2);
39
39
  }
40
40
  else {
41
41
  uiLogger.log(commands.project.dev.logs.learnMoreMessageLegacy);
@@ -1,6 +1,7 @@
1
1
  import path from 'path';
2
2
  import util from 'util';
3
3
  import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config';
4
+ import { startPortManagerServer, stopPortManagerServer, } from '@hubspot/local-dev-lib/portManager';
4
5
  import { isTranslationError } from '@hubspot/project-parsing-lib/src/lib/errors.js';
5
6
  import { translateForLocalDev } from '@hubspot/project-parsing-lib';
6
7
  import { getEnv, getConfigAccounts, getAccountConfig, } from '@hubspot/local-dev-lib/config';
@@ -19,7 +20,9 @@ import { isTestAccountOrSandbox, isUnifiedAccount, } from '../../../lib/accountT
19
20
  import { uiLogger } from '../../../lib/ui/logger.js';
20
21
  import { commands } from '../../../lang/en.js';
21
22
  import LocalDevWebsocketServer from '../../../lib/projects/localDev/LocalDevWebsocketServer.js';
23
+ import { confirmLocalDevIsNotRunning } from '../../../lib/projects/localDev/helpers/process.js';
22
24
  export async function unifiedProjectDevFlow({ args, targetProjectAccountId, providedTargetTestingAccountId, projectConfig, projectDir, }) {
25
+ await confirmLocalDevIsNotRunning();
23
26
  const env = getValidEnv(getEnv(targetProjectAccountId));
24
27
  let projectNodes;
25
28
  let projectProfileData;
@@ -121,6 +124,7 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
121
124
  // Check for missing/outdated dependencies
122
125
  await checkAndInstallDependencies();
123
126
  // End setup, start local dev process
127
+ await startPortManagerServer();
124
128
  const localDevProcess = new LocalDevProcess({
125
129
  initialProjectNodes: projectNodes,
126
130
  initialProjectProfileData: projectProfileData,
@@ -133,11 +137,11 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
133
137
  projectData: project,
134
138
  env,
135
139
  });
136
- await localDevProcess.start();
137
- const watcher = new LocalDevWatcher(localDevProcess);
138
- watcher.start();
139
140
  const websocketServer = new LocalDevWebsocketServer(localDevProcess, args.debug);
141
+ const watcher = new LocalDevWatcher(localDevProcess);
140
142
  await websocketServer.start();
143
+ await localDevProcess.start();
144
+ watcher.start();
141
145
  handleKeypress(async (key) => {
142
146
  if ((key.ctrl && key.name === 'c') || key.name === 'q') {
143
147
  await Promise.all([
@@ -151,5 +155,6 @@ export async function unifiedProjectDevFlow({ args, targetProjectAccountId, prov
151
155
  localDevProcess.stop(!isSIGHUP);
152
156
  watcher.stop();
153
157
  websocketServer.shutdown();
158
+ stopPortManagerServer();
154
159
  });
155
160
  }
@@ -35,9 +35,12 @@ async function handler(args) {
35
35
  uiLogger.error(commands.project.download.errors.noBuildIdToDownload);
36
36
  process.exit(EXIT_CODES.ERROR);
37
37
  }
38
- const absoluteDestPath = dest ? path.resolve(getCwd(), dest) : getCwd();
38
+ const sanitizedProjectName = sanitizeFileName(projectName);
39
+ const absoluteDestPath = dest
40
+ ? path.resolve(getCwd(), dest, sanitizedProjectName)
41
+ : path.resolve(getCwd(), sanitizedProjectName);
39
42
  const { data: zippedProject } = await downloadProject(derivedAccountId, projectName, buildNumberToDownload);
40
- await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath), { includesRootDir: false });
43
+ await extractZipArchive(zippedProject, sanitizeFileName(projectName), path.resolve(absoluteDestPath));
41
44
  uiLogger.log(commands.project.download.logs.downloadSucceeded(buildNumberToDownload, projectName));
42
45
  process.exit(EXIT_CODES.SUCCESS);
43
46
  }
@@ -1,5 +1,5 @@
1
- import { CommonArgs, YargsCommandModule } from '../../types/Yargs.js';
2
- export type ProjectInstallDepsArgs = CommonArgs & {
1
+ import { CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
2
+ export type ProjectInstallDepsArgs = CommonArgs & ConfigArgs & {
3
3
  packages?: string[];
4
4
  };
5
5
  declare const projectInstallDepsCommand: YargsCommandModule<unknown, ProjectInstallDepsArgs>;
@@ -69,6 +69,7 @@ function projectInstallDepsBuilder(yargs) {
69
69
  }
70
70
  const builder = makeYargsBuilder(projectInstallDepsBuilder, command, describe, {
71
71
  useGlobalOptions: true,
72
+ useConfigOptions: true,
72
73
  });
73
74
  const projectInstallDepsCommand = {
74
75
  command,
@@ -0,0 +1,4 @@
1
+ import { AccountArgs, CommonArgs, ConfigArgs, YargsCommandModule } from '../../types/Yargs.js';
2
+ type ProjectListArgs = CommonArgs & ConfigArgs & AccountArgs;
3
+ declare const projectListCommand: YargsCommandModule<unknown, ProjectListArgs>;
4
+ export default projectListCommand;
@@ -0,0 +1,62 @@
1
+ import { trackCommandUsage } from '../../lib/usageTracking.js';
2
+ import { makeYargsBuilder } from '../../lib/yargsUtils.js';
3
+ import { fetchProjects } from '@hubspot/local-dev-lib/api/projects';
4
+ import { logError } from '../../lib/errorHandlers/index.js';
5
+ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
6
+ import { getTableContents, getTableHeader } from '../../lib/ui/table.js';
7
+ import { uiLogger } from '../../lib/ui/logger.js';
8
+ import { commands } from '../../lang/en.js';
9
+ const command = ['list', 'ls'];
10
+ const describe = commands.project.list.describe;
11
+ async function getProjectData(accountId) {
12
+ try {
13
+ const { data: projects } = await fetchProjects(accountId);
14
+ return projects.results;
15
+ }
16
+ catch (e) {
17
+ logError(e);
18
+ process.exit(EXIT_CODES.ERROR);
19
+ }
20
+ }
21
+ function formatProjectsAsTableRows(projects) {
22
+ const projectListData = [];
23
+ projects.forEach(project => {
24
+ projectListData.push([
25
+ project.name,
26
+ project.latestBuild ? project.latestBuild.platformVersion : '',
27
+ ]);
28
+ });
29
+ return projectListData;
30
+ }
31
+ async function handler(args) {
32
+ const { derivedAccountId } = args;
33
+ trackCommandUsage('projects-list', undefined, derivedAccountId);
34
+ const projectData = await getProjectData(derivedAccountId);
35
+ if (projectData.length === 0) {
36
+ uiLogger.error(commands.project.list.errors.noProjectsFound(derivedAccountId));
37
+ process.exit(EXIT_CODES.ERROR);
38
+ }
39
+ const projectListData = formatProjectsAsTableRows(projectData);
40
+ projectListData.unshift(getTableHeader([
41
+ commands.project.list.labels.name,
42
+ commands.project.list.labels.platformVersion,
43
+ ]));
44
+ uiLogger.log(commands.project.list.projects);
45
+ uiLogger.log(getTableContents(projectListData, { border: { bodyLeft: ' ' } }));
46
+ }
47
+ function projectListBuilder(yargs) {
48
+ yargs.example([['$0 project list']]);
49
+ return yargs;
50
+ }
51
+ const builder = makeYargsBuilder(projectListBuilder, command, describe, {
52
+ useGlobalOptions: true,
53
+ useConfigOptions: true,
54
+ useAccountOptions: true,
55
+ });
56
+ const projectListCommand = {
57
+ command,
58
+ describe,
59
+ handler,
60
+ builder,
61
+ };
62
+ export default projectListCommand;