@hubspot/cli 7.7.0-experimental.3 → 7.7.2-experimental.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 (98) hide show
  1. package/bin/cli.js +96 -94
  2. package/commands/account/auth.js +51 -82
  3. package/commands/account.js +0 -2
  4. package/commands/app.js +0 -2
  5. package/commands/auth.js +2 -17
  6. package/commands/cms.js +0 -2
  7. package/commands/completion.js +0 -2
  8. package/commands/config/migrate.js +17 -36
  9. package/commands/config.js +0 -2
  10. package/commands/create.js +0 -2
  11. package/commands/customObject.js +0 -2
  12. package/commands/doctor.js +0 -2
  13. package/commands/feedback.js +0 -2
  14. package/commands/filemanager.js +0 -2
  15. package/commands/function.js +0 -2
  16. package/commands/hubdb.js +0 -2
  17. package/commands/init.js +1 -4
  18. package/commands/lint.js +0 -2
  19. package/commands/list.js +0 -2
  20. package/commands/module/marketplace-validate.js +6 -8
  21. package/commands/module.js +2 -1
  22. package/commands/mv.js +0 -2
  23. package/commands/open.js +0 -2
  24. package/commands/project/add.d.ts +5 -2
  25. package/commands/project/add.js +43 -80
  26. package/commands/project/create.d.ts +2 -8
  27. package/commands/project/create.js +84 -55
  28. package/commands/project/dev/deprecatedFlow.d.ts +8 -2
  29. package/commands/project/dev/deprecatedFlow.js +9 -1
  30. package/commands/project/dev/index.js +59 -34
  31. package/commands/project/dev/unifiedFlow.d.ts +10 -2
  32. package/commands/project/dev/unifiedFlow.js +28 -41
  33. package/commands/project.js +0 -2
  34. package/commands/remove.js +6 -14
  35. package/commands/sandbox.js +0 -2
  36. package/commands/secret.js +0 -2
  37. package/commands/theme/generate-selectors.js +7 -10
  38. package/commands/theme/marketplace-validate.js +6 -8
  39. package/commands/theme/preview.js +17 -18
  40. package/commands/theme.js +2 -4
  41. package/commands/upload.js +26 -65
  42. package/commands/watch.js +20 -32
  43. package/lang/en.d.ts +154 -95
  44. package/lang/en.js +156 -100
  45. package/lang/en.lyaml +3 -186
  46. package/lib/accountTypes.js +1 -3
  47. package/lib/commonOpts.d.ts +1 -3
  48. package/lib/commonOpts.js +1 -1
  49. package/lib/configMigrate.d.ts +2 -2
  50. package/lib/configMigrate.js +34 -69
  51. package/lib/constants.d.ts +23 -5
  52. package/lib/constants.js +24 -6
  53. package/lib/generateSelectors.js +3 -5
  54. package/lib/marketplaceValidate.d.ts +12 -2
  55. package/lib/marketplaceValidate.js +22 -29
  56. package/lib/middleware/configMiddleware.js +1 -0
  57. package/lib/middleware/fireAlarmMiddleware.d.ts +2 -2
  58. package/lib/middleware/fireAlarmMiddleware.js +5 -3
  59. package/lib/projects/add/legacyAddComponent.d.ts +5 -0
  60. package/lib/projects/add/legacyAddComponent.js +48 -0
  61. package/lib/projects/add/v3AddComponent.d.ts +8 -0
  62. package/lib/projects/add/v3AddComponent.js +85 -0
  63. package/lib/projects/components.d.ts +2 -0
  64. package/lib/projects/components.js +82 -0
  65. package/lib/projects/create/index.d.ts +23 -0
  66. package/lib/projects/create/index.js +33 -0
  67. package/lib/projects/create/legacy.d.ts +6 -0
  68. package/lib/projects/{create.js → create/legacy.js} +20 -11
  69. package/lib/projects/create/v3.d.ts +27 -0
  70. package/lib/projects/create/v3.js +158 -0
  71. package/lib/projects/localDev/AppDevModeInterface.d.ts +3 -2
  72. package/lib/projects/localDev/AppDevModeInterface.js +38 -8
  73. package/lib/projects/localDev/LocalDevProcess.d.ts +12 -5
  74. package/lib/projects/localDev/LocalDevProcess.js +47 -17
  75. package/lib/projects/localDev/LocalDevState.d.ts +16 -3
  76. package/lib/projects/localDev/LocalDevState.js +43 -2
  77. package/lib/projects/localDev/LocalDevWatcher.js +3 -6
  78. package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +3 -0
  79. package/lib/projects/localDev/LocalDevWebsocketServer.js +48 -9
  80. package/lib/projects/upload.js +6 -0
  81. package/lib/prompts/createProjectPrompt.d.ts +14 -5
  82. package/lib/prompts/createProjectPrompt.js +36 -13
  83. package/lib/prompts/projectAddPrompt.d.ts +5 -1
  84. package/lib/prompts/projectAddPrompt.js +35 -7
  85. package/lib/prompts/promptUtils.d.ts +0 -1
  86. package/lib/prompts/promptUtils.js +0 -2
  87. package/lib/prompts/setAsDefaultAccountPrompt.js +10 -0
  88. package/package.json +7 -6
  89. package/types/LocalDev.d.ts +11 -1
  90. package/types/Projects.d.ts +19 -2
  91. package/types/Yargs.d.ts +2 -0
  92. package/commands/testAccount/create.d.ts +0 -7
  93. package/commands/testAccount/create.js +0 -118
  94. package/commands/testAccount/delete.d.ts +0 -6
  95. package/commands/testAccount/delete.js +0 -42
  96. package/commands/testAccount.d.ts +0 -3
  97. package/commands/testAccount.js +0 -27
  98. package/lib/projects/create.d.ts +0 -5
@@ -29,5 +29,3 @@ const customObjectCommand = {
29
29
  handler: () => { },
30
30
  };
31
31
  exports.default = customObjectCommand;
32
- // TODO Remove this legacy export once we've migrated all commands to TS
33
- module.exports = customObjectCommand;
@@ -68,5 +68,3 @@ const doctorCommand = {
68
68
  builder,
69
69
  };
70
70
  exports.default = doctorCommand;
71
- // TODO Remove this after cli.ts is ported to TS
72
- module.exports = doctorCommand;
@@ -40,5 +40,3 @@ const feedbackCommand = {
40
40
  builder,
41
41
  };
42
42
  exports.default = feedbackCommand;
43
- // TODO remove this after cli.ts is ported to TS
44
- module.exports = feedbackCommand;
@@ -21,5 +21,3 @@ const fileManagerCommand = {
21
21
  handler: () => { },
22
22
  };
23
23
  exports.default = fileManagerCommand;
24
- // TODO Remove this legacy export once we've migrated all commands to TS
25
- module.exports = fileManagerCommand;
@@ -25,5 +25,3 @@ const functionCommand = {
25
25
  handler: () => { },
26
26
  };
27
27
  exports.default = functionCommand;
28
- // TODO Remove this legacy export once we've migrated all commands to TS
29
- module.exports = functionCommand;
package/commands/hubdb.js CHANGED
@@ -29,5 +29,3 @@ const hubdbCommand = {
29
29
  handler: () => { },
30
30
  };
31
31
  exports.default = hubdbCommand;
32
- // TODO Remove this legacy export once we've migrated all commands to TS
33
- module.exports = hubdbCommand;
package/commands/init.js CHANGED
@@ -76,9 +76,8 @@ async function handler(args) {
76
76
  }
77
77
  const env = args.qa ? environments_1.ENVIRONMENTS.QA : environments_1.ENVIRONMENTS.PROD;
78
78
  if ((0, config_1.configFileExists)(true)) {
79
- const globalConfigPath = (0, config_1.getConfigPath)('', true);
80
79
  logger_1.logger.error((0, lang_1.i18n)(`commands.init.errors.globalConfigFileExists`, {
81
- configPath: globalConfigPath,
80
+ accountAuthCommand: (0, ui_1.uiCommandReference)('hs account auth'),
82
81
  }));
83
82
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
84
83
  }
@@ -188,5 +187,3 @@ const initCommand = {
188
187
  builder,
189
188
  };
190
189
  exports.default = initCommand;
191
- // TODO Remove this legacy export once we've migrated all commands to TS
192
- module.exports = initCommand;
package/commands/lint.js CHANGED
@@ -83,5 +83,3 @@ const lintCommand = {
83
83
  builder,
84
84
  };
85
85
  exports.default = lintCommand;
86
- // TODO Remove this after cli.ts is ported to TS
87
- module.exports = lintCommand;
package/commands/list.js CHANGED
@@ -101,5 +101,3 @@ const cmsListCommand = {
101
101
  builder,
102
102
  };
103
103
  exports.default = cmsListCommand;
104
- // TODO Remove this legacy export once we've migrated all commands to TS
105
- module.exports = cmsListCommand;
@@ -6,32 +6,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const SpinniesManager_1 = __importDefault(require("../../lib/ui/SpinniesManager"));
7
7
  const usageTracking_1 = require("../../lib/usageTracking");
8
8
  const marketplaceValidate_1 = require("../../lib/marketplaceValidate");
9
- const lang_1 = require("../../lib/lang");
9
+ const en_1 = require("../../lang/en");
10
10
  const exitCodes_1 = require("../../lib/enums/exitCodes");
11
11
  const yargsUtils_1 = require("../../lib/yargsUtils");
12
12
  const command = 'marketplace-validate <src>';
13
- const describe = (0, lang_1.i18n)(`commands.module.subcommands.marketplaceValidate.describe`);
13
+ const describe = en_1.commands.module.subcommands.marketplaceValidate.describe;
14
14
  async function handler(args) {
15
15
  const { src, derivedAccountId } = args;
16
16
  (0, usageTracking_1.trackCommandUsage)('validate', undefined, derivedAccountId);
17
17
  SpinniesManager_1.default.init();
18
18
  SpinniesManager_1.default.add('marketplaceValidation', {
19
- text: (0, lang_1.i18n)(`commands.module.subcommands.marketplaceValidate.logs.validatingModule`, {
20
- path: src,
21
- }),
19
+ text: en_1.commands.module.subcommands.marketplaceValidate.logs.validatingModule(src),
22
20
  });
23
21
  const assetType = 'MODULE';
24
22
  const validationId = await (0, marketplaceValidate_1.kickOffValidation)(derivedAccountId, assetType, src);
25
23
  await (0, marketplaceValidate_1.pollForValidationFinish)(derivedAccountId, validationId);
26
24
  SpinniesManager_1.default.remove('marketplaceValidation');
27
25
  const validationResults = await (0, marketplaceValidate_1.fetchValidationResults)(derivedAccountId, validationId);
28
- (0, marketplaceValidate_1.processValidationErrors)('commands.module.subcommands.marketplaceValidate', validationResults);
29
- (0, marketplaceValidate_1.displayValidationResults)('commands.module.subcommands.marketplaceValidate', validationResults);
26
+ (0, marketplaceValidate_1.processValidationErrors)(en_1.commands.module.subcommands.marketplaceValidate.errors.invalidPath, validationResults);
27
+ (0, marketplaceValidate_1.displayValidationResults)(en_1.commands.module.subcommands.marketplaceValidate.results, validationResults);
30
28
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
31
29
  }
32
30
  function marketplaceValidateBuilder(yargs) {
33
31
  yargs.positional('src', {
34
- describe: (0, lang_1.i18n)(`commands.module.subcommands.marketplaceValidate.positionals.src.describe`),
32
+ describe: en_1.commands.module.subcommands.marketplaceValidate.positionals.src,
35
33
  type: 'string',
36
34
  });
37
35
  return yargs;
@@ -4,9 +4,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const marketplace_validate_1 = __importDefault(require("./module/marketplace-validate"));
7
+ const en_1 = require("../lang/en");
7
8
  const yargsUtils_1 = require("../lib/yargsUtils");
8
9
  const command = 'module';
9
- const describe = undefined;
10
+ const describe = en_1.commands.module.describe;
10
11
  function moduleBuilder(yargs) {
11
12
  yargs.command(marketplace_validate_1.default).demandCommand(1, '');
12
13
  return yargs;
package/commands/mv.js CHANGED
@@ -72,5 +72,3 @@ const cmsMvCommand = {
72
72
  builder,
73
73
  };
74
74
  exports.default = cmsMvCommand;
75
- // TODO Remove this legacy export once we've migrated all commands to TS
76
- module.exports = cmsMvCommand;
package/commands/open.js CHANGED
@@ -68,5 +68,3 @@ const openCommand = {
68
68
  builder,
69
69
  };
70
70
  exports.default = openCommand;
71
- // TODO Remove this legacy export once we've migrated all commands to TS
72
- module.exports = openCommand;
@@ -1,7 +1,10 @@
1
1
  import { YargsCommandModule, CommonArgs } from '../../types/Yargs';
2
2
  type ProjectAddArgs = CommonArgs & {
3
- type: string;
4
- name: string;
3
+ type?: string;
4
+ name?: string;
5
+ features?: string[];
6
+ distribution?: string;
7
+ auth?: string;
5
8
  };
6
9
  declare const projectAddCommand: YargsCommandModule<unknown, ProjectAddArgs>;
7
10
  export default projectAddCommand;
@@ -1,87 +1,38 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const path_1 = __importDefault(require("path"));
7
- const logger_1 = require("@hubspot/local-dev-lib/logger");
8
- const github_1 = require("@hubspot/local-dev-lib/github");
9
3
  const errorHandlers_1 = require("../../lib/errorHandlers");
10
4
  const usageTracking_1 = require("../../lib/usageTracking");
11
- const lang_1 = require("../../lib/lang");
12
- const projectAddPrompt_1 = require("../../lib/prompts/projectAddPrompt");
13
5
  const config_1 = require("../../lib/projects/config");
14
- const create_1 = require("../../lib/projects/create");
15
- const structure_1 = require("../../lib/projects/structure");
16
- const Projects_1 = require("../../types/Projects");
17
6
  const ui_1 = require("../../lib/ui");
18
- const constants_1 = require("../../lib/constants");
19
7
  const exitCodes_1 = require("../../lib/enums/exitCodes");
20
8
  const yargsUtils_1 = require("../../lib/yargsUtils");
9
+ const en_1 = require("../../lang/en");
10
+ const buildAndDeploy_1 = require("../../lib/projects/buildAndDeploy");
11
+ const legacyAddComponent_1 = require("../../lib/projects/add/legacyAddComponent");
12
+ const v3AddComponent_1 = require("../../lib/projects/add/v3AddComponent");
13
+ const constants_1 = require("../../lib/constants");
14
+ const logger_1 = require("../../lib/ui/logger");
21
15
  const command = 'add';
22
- const describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.add.describe`), false);
16
+ const describe = (0, ui_1.uiBetaTag)(en_1.commands.project.add.describe, false);
23
17
  async function handler(args) {
24
- const { derivedAccountId } = args;
25
- (0, usageTracking_1.trackCommandUsage)('project-add', undefined, derivedAccountId);
26
- const { projectConfig, projectDir } = await (0, config_1.getProjectConfig)();
27
- if (!projectDir || !projectConfig) {
28
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.add.error.locationInProject`));
29
- process.exit(exitCodes_1.EXIT_CODES.ERROR);
30
- }
31
- // We currently only support adding private apps to projects
32
- let projectContainsPublicApp = false;
33
- try {
34
- const components = await (0, structure_1.findProjectComponents)(projectDir);
35
- projectContainsPublicApp = components.some(c => c.type === Projects_1.ComponentTypes.PublicApp);
36
- }
37
- catch (err) {
38
- (0, errorHandlers_1.debugError)(err);
39
- }
40
- if (projectContainsPublicApp) {
41
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.add.error.projectContainsPublicApp`));
42
- process.exit(exitCodes_1.EXIT_CODES.ERROR);
43
- }
44
- logger_1.logger.log('');
45
- logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.add.creatingComponent`, {
46
- projectName: projectConfig.name,
47
- }));
48
- logger_1.logger.log('');
49
- let latestRepoReleaseTag;
50
18
  try {
51
- // We want the tag_name from the latest release of the components repo
52
- const repoReleaseData = await (0, github_1.fetchReleaseData)(constants_1.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
53
- if (repoReleaseData) {
54
- latestRepoReleaseTag = repoReleaseData.tag_name;
19
+ const { derivedAccountId } = args;
20
+ (0, usageTracking_1.trackCommandUsage)('project-add', undefined, derivedAccountId);
21
+ const { projectConfig, projectDir } = await (0, config_1.getProjectConfig)();
22
+ if (!projectDir || !projectConfig) {
23
+ logger_1.uiLogger.error(en_1.commands.project.add.error.locationInProject);
24
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
25
+ }
26
+ const isV3ProjectCreate = (0, buildAndDeploy_1.useV3Api)(projectConfig.platformVersion);
27
+ if (isV3ProjectCreate) {
28
+ await (0, v3AddComponent_1.v3AddComponent)(args, projectDir, projectConfig);
29
+ }
30
+ else {
31
+ await (0, legacyAddComponent_1.legacyAddComponent)(args, projectDir, projectConfig);
55
32
  }
56
33
  }
57
- catch (err) {
58
- (0, errorHandlers_1.debugError)(err);
59
- }
60
- if (!latestRepoReleaseTag) {
61
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.add.error.failedToFetchComponentList`));
62
- process.exit(exitCodes_1.EXIT_CODES.ERROR);
63
- }
64
- const components = await (0, create_1.getProjectComponentListFromRepo)(latestRepoReleaseTag);
65
- if (!components.length) {
66
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.add.error.failedToFetchComponentList`));
67
- process.exit(exitCodes_1.EXIT_CODES.ERROR);
68
- }
69
- const projectAddPromptResponse = await (0, projectAddPrompt_1.projectAddPrompt)(components, args);
70
- try {
71
- const componentPath = path_1.default.join(projectDir, projectConfig.srcDir, projectAddPromptResponse.componentTemplate.insertPath, projectAddPromptResponse.name);
72
- await (0, github_1.cloneGithubRepo)(constants_1.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, componentPath, {
73
- sourceDir: projectAddPromptResponse.componentTemplate.path,
74
- tag: latestRepoReleaseTag,
75
- hideLogs: true,
76
- });
77
- logger_1.logger.log('');
78
- logger_1.logger.success((0, lang_1.i18n)(`commands.project.subcommands.add.success`, {
79
- componentName: projectAddPromptResponse.name,
80
- }));
81
- }
82
- catch (error) {
83
- (0, errorHandlers_1.debugError)(error);
84
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.add.error.failedToDownloadComponent`));
34
+ catch (e) {
35
+ (0, errorHandlers_1.logError)(e);
85
36
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
86
37
  }
87
38
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
@@ -89,24 +40,36 @@ async function handler(args) {
89
40
  function projectAddBuilder(yargs) {
90
41
  yargs.options({
91
42
  type: {
92
- describe: (0, lang_1.i18n)(`commands.project.subcommands.add.options.type.describe`),
43
+ describe: en_1.commands.project.add.options.type.describe,
93
44
  type: 'string',
94
45
  },
95
46
  name: {
96
- describe: (0, lang_1.i18n)(`commands.project.subcommands.add.options.name.describe`),
47
+ describe: en_1.commands.project.add.options.name.describe,
48
+ type: 'string',
49
+ },
50
+ distribution: {
51
+ describe: en_1.commands.project.add.options.distribution.describe,
52
+ hidden: true,
97
53
  type: 'string',
54
+ choices: [constants_1.privateDistribution, constants_1.marketplaceDistribution],
55
+ },
56
+ auth: {
57
+ describe: en_1.commands.project.add.options.auth.describe,
58
+ hidden: true,
59
+ type: 'string',
60
+ choices: [constants_1.oAuth, constants_1.staticAuth],
61
+ },
62
+ features: {
63
+ describe: en_1.commands.project.add.options.features.describe,
64
+ hidden: true,
65
+ type: 'array',
98
66
  },
99
67
  });
100
- yargs.example([
101
- [
102
- '$0 project add',
103
- (0, lang_1.i18n)(`commands.project.subcommands.add.examples.default`),
104
- ],
105
- ]);
68
+ yargs.example([['$0 project add', en_1.commands.project.add.examples.default]]);
106
69
  yargs.example([
107
70
  [
108
71
  '$0 project add --name="my-component" --type="components/example-app"',
109
- (0, lang_1.i18n)(`commands.project.subcommands.add.examples.withFlags`),
72
+ en_1.commands.project.add.examples.withFlags,
110
73
  ],
111
74
  ]);
112
75
  return yargs;
@@ -1,10 +1,4 @@
1
- import { RepoPath } from '@hubspot/local-dev-lib/types/Github';
2
- import { AccountArgs, CommonArgs, ConfigArgs, EnvironmentArgs, YargsCommandModule } from '../../types/Yargs';
3
- type ProjectCreateArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
4
- name?: string;
5
- dest?: string;
6
- templateSource?: RepoPath;
7
- template?: string;
8
- };
1
+ import { YargsCommandModule } from '../../types/Yargs';
2
+ import { ProjectCreateArgs } from '../../lib/projects/create';
9
3
  declare const projectCreateCommand: YargsCommandModule<unknown, ProjectCreateArgs>;
10
4
  export default projectCreateCommand;
@@ -5,71 +5,75 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const path_1 = __importDefault(require("path"));
7
7
  const fs_extra_1 = __importDefault(require("fs-extra"));
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const logger_1 = require("@hubspot/local-dev-lib/logger");
10
8
  const github_1 = require("@hubspot/local-dev-lib/github");
11
9
  const path_2 = require("@hubspot/local-dev-lib/path");
12
10
  const usageTracking_1 = require("../../lib/usageTracking");
13
- const createProjectPrompt_1 = require("../../lib/prompts/createProjectPrompt");
14
11
  const config_1 = require("../../lib/projects/config");
15
- const create_1 = require("../../lib/projects/create");
16
- const lang_1 = require("../../lib/lang");
12
+ const legacy_1 = require("../../lib/projects/create/legacy");
13
+ const v3_1 = require("../../lib/projects/create/v3");
17
14
  const ui_1 = require("../../lib/ui");
18
15
  const errorHandlers_1 = require("../../lib/errorHandlers");
19
16
  const exitCodes_1 = require("../../lib/enums/exitCodes");
20
17
  const constants_1 = require("../../lib/constants");
21
18
  const yargsUtils_1 = require("../../lib/yargsUtils");
22
- const command = 'create';
23
- const describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.create.describe`), false);
19
+ const projects_1 = require("@hubspot/local-dev-lib/constants/projects");
20
+ const en_1 = require("../../lang/en");
21
+ const logger_1 = require("../../lib/ui/logger");
22
+ const v3_2 = require("../../lib/projects/create/v3");
23
+ const create_1 = require("../../lib/projects/create");
24
+ const command = ['create', 'init'];
25
+ const describe = (0, ui_1.uiBetaTag)(en_1.commands.project.create.describe, false);
26
+ const { v2023_2, v2025_1, v2025_2 } = projects_1.PLATFORM_VERSIONS;
24
27
  async function handler(args) {
25
- const { derivedAccountId } = args;
26
- let latestRepoReleaseTag;
27
- let templateSource = args.templateSource;
28
- if (!templateSource) {
29
- templateSource = constants_1.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH;
30
- try {
31
- const releaseData = await (0, github_1.fetchReleaseData)(constants_1.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
32
- if (releaseData) {
33
- latestRepoReleaseTag = releaseData.tag_name;
34
- }
35
- }
36
- catch (err) {
37
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.create.errors.failedToFetchProjectList`));
38
- process.exit(exitCodes_1.EXIT_CODES.ERROR);
39
- }
40
- }
41
- if (!templateSource || !templateSource.includes('/')) {
42
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.create.errors.invalidTemplateSource`));
28
+ const { derivedAccountId, platformVersion, templateSource } = args;
29
+ if (templateSource && !templateSource.includes('/')) {
30
+ logger_1.uiLogger.error(en_1.commands.project.create.errors.invalidTemplateSource);
43
31
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
44
32
  }
45
- const projectTemplates = await (0, create_1.getProjectTemplateListFromRepo)(templateSource, latestRepoReleaseTag || constants_1.DEFAULT_PROJECT_TEMPLATE_BRANCH);
46
- if (!projectTemplates.length) {
47
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.create.errors.failedToFetchProjectList`));
33
+ const repo = templateSource || constants_1.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH;
34
+ let handleResult;
35
+ try {
36
+ handleResult = await (0, create_1.handleProjectCreationFlow)(args);
37
+ }
38
+ catch (error) {
39
+ (0, errorHandlers_1.logError)(error);
48
40
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
49
41
  }
50
- const createProjectPromptResponse = await (0, createProjectPrompt_1.createProjectPrompt)(args, projectTemplates);
42
+ const { authType, distribution, repoConfig, projectContents, createProjectPromptResponse, } = handleResult;
43
+ (0, usageTracking_1.trackCommandUsage)('project-create', {
44
+ type: createProjectPromptResponse.projectTemplate?.name ||
45
+ (createProjectPromptResponse.componentTemplates || [])
46
+ // @ts-expect-error
47
+ .map((item) => item.label)
48
+ .join(','),
49
+ }, derivedAccountId);
51
50
  const projectDest = path_1.default.resolve((0, path_2.getCwd)(), createProjectPromptResponse.dest);
52
- (0, usageTracking_1.trackCommandUsage)('project-create', { type: createProjectPromptResponse.projectTemplate.name }, derivedAccountId);
53
51
  const { projectConfig: existingProjectConfig, projectDir: existingProjectDir, } = await (0, config_1.getProjectConfig)(projectDest);
54
52
  // Exit if the target destination is within an existing project
55
53
  if (existingProjectConfig &&
56
54
  existingProjectDir &&
57
55
  projectDest.startsWith(existingProjectDir)) {
58
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.create.errors.cannotNestProjects`, {
59
- projectDir: existingProjectDir,
60
- }));
56
+ logger_1.uiLogger.error(en_1.commands.project.create.errors.cannotNestProjects(existingProjectDir));
61
57
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
62
58
  }
59
+ const components = (0, v3_2.generateComponentPaths)({
60
+ createProjectPromptResponse,
61
+ platformVersion,
62
+ repoConfig,
63
+ projectContents,
64
+ authType,
65
+ distribution,
66
+ });
63
67
  try {
64
- await (0, github_1.cloneGithubRepo)(templateSource, projectDest, {
65
- sourceDir: createProjectPromptResponse.projectTemplate.path,
66
- tag: latestRepoReleaseTag,
68
+ await (0, github_1.cloneGithubRepo)(repo, projectDest, {
69
+ sourceDir: createProjectPromptResponse.projectTemplate?.path || components,
67
70
  hideLogs: true,
71
+ branch: 'main',
68
72
  });
69
73
  }
70
74
  catch (err) {
71
75
  (0, errorHandlers_1.debugError)(err);
72
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.create.errors.failedToDownloadProject`));
76
+ logger_1.uiLogger.error(en_1.commands.project.create.errors.failedToDownloadProject);
73
77
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
74
78
  }
75
79
  const projectConfigPath = path_1.default.join(projectDest, constants_1.PROJECT_CONFIG_FILE);
@@ -79,17 +83,13 @@ async function handler(args) {
79
83
  name: createProjectPromptResponse.name,
80
84
  });
81
85
  // If the template is 'no-template', we need to manually create a src directory
82
- if (createProjectPromptResponse.projectTemplate.name ===
83
- create_1.EMPTY_PROJECT_TEMPLATE_NAME) {
86
+ if (createProjectPromptResponse.projectTemplate?.name ===
87
+ legacy_1.EMPTY_PROJECT_TEMPLATE_NAME ||
88
+ projectContents === v3_1.EMPTY_PROJECT) {
84
89
  fs_extra_1.default.ensureDirSync(path_1.default.join(projectDest, 'src'));
85
90
  }
86
- logger_1.logger.log('');
87
- logger_1.logger.success((0, lang_1.i18n)(`commands.project.subcommands.create.logs.success`, {
88
- projectName: createProjectPromptResponse.name,
89
- projectDest,
90
- }));
91
- logger_1.logger.log('');
92
- logger_1.logger.log(chalk_1.default.bold((0, lang_1.i18n)(`commands.project.subcommands.create.logs.welcomeMessage`)));
91
+ logger_1.uiLogger.success(en_1.commands.project.create.logs.success(createProjectPromptResponse.name, projectDest));
92
+ logger_1.uiLogger.log(en_1.commands.project.create.logs.welcomeMessage);
93
93
  (0, ui_1.uiFeatureHighlight)([
94
94
  'projectCommandTip',
95
95
  'projectUploadCommand',
@@ -104,32 +104,61 @@ async function handler(args) {
104
104
  function projectCreateBuilder(yargs) {
105
105
  yargs.options({
106
106
  name: {
107
- describe: (0, lang_1.i18n)(`commands.project.subcommands.create.options.name.describe`),
107
+ describe: en_1.commands.project.create.options.name.describe,
108
108
  type: 'string',
109
109
  },
110
110
  dest: {
111
- describe: (0, lang_1.i18n)(`commands.project.subcommands.create.options.dest.describe`),
111
+ describe: en_1.commands.project.create.options.dest.describe,
112
112
  type: 'string',
113
113
  },
114
114
  template: {
115
- describe: (0, lang_1.i18n)(`commands.project.subcommands.create.options.template.describe`),
115
+ // TODO: When we release 2025.2 scaffolding, we need to point out this is only valid for 2025.1 prior
116
+ describe: en_1.commands.project.create.options.template.describe,
116
117
  type: 'string',
117
118
  },
118
119
  'template-source': {
119
- describe: (0, lang_1.i18n)(`commands.project.subcommands.create.options.templateSource.describe`),
120
+ describe: en_1.commands.project.create.options.templateSource.describe,
121
+ type: 'string',
122
+ },
123
+ 'platform-version': {
124
+ describe: en_1.commands.project.create.options.platformVersion.describe,
125
+ hidden: true,
120
126
  type: 'string',
127
+ choices: [v2023_2, v2025_1, v2025_2],
128
+ default: v2023_2,
129
+ },
130
+ 'project-base': {
131
+ describe: en_1.commands.project.create.options.projectBase.describe,
132
+ hidden: true,
133
+ type: 'string',
134
+ choices: [v3_1.EMPTY_PROJECT, v3_1.PROJECT_WITH_APP],
135
+ },
136
+ distribution: {
137
+ describe: en_1.commands.project.create.options.distribution.describe,
138
+ hidden: true,
139
+ type: 'string',
140
+ choices: [constants_1.privateDistribution, constants_1.marketplaceDistribution],
141
+ },
142
+ auth: {
143
+ describe: en_1.commands.project.create.options.auth.describe,
144
+ hidden: true,
145
+ type: 'string',
146
+ choices: [constants_1.oAuth, constants_1.staticAuth],
147
+ },
148
+ features: {
149
+ describe: en_1.commands.project.create.options.features.describe,
150
+ hidden: true,
151
+ type: 'array',
121
152
  },
122
153
  });
154
+ yargs.conflicts('template', 'features');
123
155
  yargs.example([
124
- [
125
- '$0 project create',
126
- (0, lang_1.i18n)(`commands.project.subcommands.create.examples.default`),
127
- ],
156
+ ['$0 project create', en_1.commands.project.create.examples.default],
128
157
  ]);
129
158
  yargs.example([
130
159
  [
131
160
  '$0 project create --template-source HubSpot/ui-extensions-examples',
132
- (0, lang_1.i18n)(`commands.project.subcommands.create.examples.templateSource`),
161
+ en_1.commands.project.create.examples.templateSource,
133
162
  ],
134
163
  ]);
135
164
  return yargs;
@@ -1,5 +1,11 @@
1
1
  import { ArgumentsCamelCase } from 'yargs';
2
- import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
3
2
  import { ProjectConfig } from '../../../types/Projects';
4
3
  import { ProjectDevArgs } from '../../../types/Yargs';
5
- export declare function deprecatedProjectDevFlow(args: ArgumentsCamelCase<ProjectDevArgs>, accountConfig: CLIAccount, projectConfig: ProjectConfig, projectDir: string): Promise<void>;
4
+ type DeprecatedProjectDevFlowArgs = {
5
+ args: ArgumentsCamelCase<ProjectDevArgs>;
6
+ accountId: number;
7
+ projectConfig: ProjectConfig;
8
+ projectDir: string;
9
+ };
10
+ export declare function deprecatedProjectDevFlow({ args, accountId, projectConfig, projectDir, }: DeprecatedProjectDevFlowArgs): Promise<void>;
11
+ export {};
@@ -18,7 +18,7 @@ const helpers_1 = require("../../../lib/projects/localDev/helpers");
18
18
  const process_1 = require("../../../lib/process");
19
19
  const accountTypes_1 = require("../../../lib/accountTypes");
20
20
  const ensureProjectExists_1 = require("../../../lib/projects/ensureProjectExists");
21
- async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, projectDir) {
21
+ async function deprecatedProjectDevFlow({ args, accountId, projectConfig, projectDir, }) {
22
22
  const { providedAccountId, derivedAccountId } = args;
23
23
  const env = (0, environment_1.getValidEnv)((0, config_1.getEnv)(derivedAccountId));
24
24
  const components = await (0, structure_1.findProjectComponents)(projectDir);
@@ -26,6 +26,14 @@ async function deprecatedProjectDevFlow(args, accountConfig, projectConfig, proj
26
26
  const componentTypes = (0, structure_1.getProjectComponentTypes)(runnableComponents);
27
27
  const hasPrivateApps = !!componentTypes[Projects_1.ComponentTypes.PrivateApp];
28
28
  const hasPublicApps = !!componentTypes[Projects_1.ComponentTypes.PublicApp];
29
+ const accountConfig = (0, config_1.getAccountConfig)(accountId);
30
+ if (!accountConfig) {
31
+ logger_1.logger.error((0, lang_1.i18n)('commands.project.subcommands.dev.errors.noAccount', {
32
+ accountId: accountId,
33
+ authCommand: (0, ui_1.uiCommandReference)('hs auth'),
34
+ }));
35
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
36
+ }
29
37
  if (runnableComponents.length === 0) {
30
38
  logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.noRunnableComponents`, {
31
39
  projectDir,