@hubspot/cli 7.2.2-experimental.0 → 7.2.4-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 (144) hide show
  1. package/bin/cli.js +3 -52
  2. package/commands/account/info.d.ts +1 -1
  3. package/commands/account/info.js +8 -5
  4. package/commands/account/list.js +0 -4
  5. package/commands/account.js +0 -4
  6. package/commands/auth.d.ts +9 -0
  7. package/commands/auth.js +89 -87
  8. package/commands/config/set.d.ts +0 -12
  9. package/commands/config/set.js +29 -30
  10. package/commands/config.d.ts +1 -4
  11. package/commands/config.js +10 -45
  12. package/commands/create/api-sample.js +14 -4
  13. package/commands/customObject/create.d.ts +11 -0
  14. package/commands/customObject/create.js +37 -28
  15. package/commands/customObject/schema/create.d.ts +10 -0
  16. package/commands/customObject/schema/create.js +40 -42
  17. package/commands/customObject/schema/delete.d.ts +11 -0
  18. package/commands/customObject/schema/delete.js +34 -27
  19. package/commands/customObject/schema/fetch-all.d.ts +10 -0
  20. package/commands/customObject/schema/fetch-all.js +31 -24
  21. package/commands/customObject/schema/fetch.d.ts +11 -0
  22. package/commands/customObject/schema/fetch.js +34 -42
  23. package/commands/customObject/schema/list.d.ts +7 -0
  24. package/commands/customObject/schema/list.js +23 -14
  25. package/commands/customObject/schema/update.d.ts +11 -0
  26. package/commands/customObject/schema/update.js +44 -46
  27. package/commands/customObject/schema.d.ts +5 -1
  28. package/commands/customObject/schema.js +49 -11
  29. package/commands/customObject.d.ts +4 -1
  30. package/commands/customObject.js +54 -21
  31. package/commands/filemanager/fetch.d.ts +12 -0
  32. package/commands/filemanager/fetch.js +33 -30
  33. package/commands/filemanager/upload.d.ts +11 -0
  34. package/commands/filemanager/upload.js +53 -47
  35. package/commands/filemanager.d.ts +4 -1
  36. package/commands/filemanager.js +41 -7
  37. package/commands/init.d.ts +11 -0
  38. package/commands/init.js +123 -98
  39. package/commands/list.d.ts +9 -0
  40. package/commands/list.js +63 -57
  41. package/commands/mv.d.ts +10 -0
  42. package/commands/mv.js +32 -32
  43. package/commands/open.d.ts +10 -0
  44. package/commands/open.js +37 -34
  45. package/commands/project/add.js +62 -16
  46. package/commands/project/cloneApp.js +3 -3
  47. package/commands/project/create.js +72 -15
  48. package/commands/project/dev/deprecatedFlow.d.ts +5 -0
  49. package/commands/project/dev/deprecatedFlow.js +137 -0
  50. package/commands/project/dev/index.d.ts +6 -0
  51. package/commands/project/dev/index.js +52 -0
  52. package/commands/project/dev/unifiedFlow.d.ts +5 -0
  53. package/commands/project/dev/unifiedFlow.js +112 -0
  54. package/commands/project/migrateApp.js +3 -3
  55. package/commands/project/upload.js +7 -2
  56. package/commands/remove.d.ts +9 -0
  57. package/commands/remove.js +25 -23
  58. package/commands/sandbox/create.d.ts +12 -0
  59. package/commands/sandbox/create.js +90 -72
  60. package/commands/sandbox/delete.d.ts +11 -0
  61. package/commands/sandbox/delete.js +112 -95
  62. package/commands/sandbox.d.ts +4 -1
  63. package/commands/sandbox.js +44 -10
  64. package/commands/theme/generate-selectors.d.ts +9 -0
  65. package/commands/theme/generate-selectors.js +61 -43
  66. package/commands/theme/marketplace-validate.d.ts +10 -0
  67. package/commands/theme/marketplace-validate.js +32 -26
  68. package/commands/theme/preview.d.ts +16 -0
  69. package/commands/theme/preview.js +104 -97
  70. package/commands/theme.d.ts +4 -1
  71. package/commands/theme.js +44 -10
  72. package/lang/en.lyaml +55 -77
  73. package/lib/DevServerManagerV2.d.ts +34 -0
  74. package/lib/DevServerManagerV2.js +85 -0
  75. package/lib/LocalDevManager.d.ts +2 -2
  76. package/lib/LocalDevManager.js +1 -1
  77. package/lib/LocalDevManagerV2.d.ts +64 -0
  78. package/lib/LocalDevManagerV2.js +382 -0
  79. package/lib/buildAccount.d.ts +2 -3
  80. package/lib/commonOpts.d.ts +1 -0
  81. package/lib/commonOpts.js +30 -0
  82. package/lib/constants.d.ts +12 -3
  83. package/lib/constants.js +13 -4
  84. package/lib/customObject.d.ts +3 -0
  85. package/lib/customObject.js +15 -0
  86. package/lib/doctor/Diagnosis.d.ts +0 -1
  87. package/lib/doctor/Diagnosis.js +0 -7
  88. package/lib/doctor/DiagnosticInfoBuilder.d.ts +6 -1
  89. package/lib/doctor/DiagnosticInfoBuilder.js +5 -1
  90. package/lib/doctor/Doctor.d.ts +1 -1
  91. package/lib/doctor/Doctor.js +6 -14
  92. package/lib/localDev.d.ts +3 -2
  93. package/lib/localDev.js +2 -2
  94. package/lib/marketplaceValidate.d.ts +2 -2
  95. package/lib/projects/buildAndDeploy.js +4 -1
  96. package/lib/projects/create.d.ts +5 -0
  97. package/lib/projects/create.js +51 -0
  98. package/lib/projects/index.d.ts +1 -5
  99. package/lib/projects/index.js +1 -62
  100. package/lib/projects/structure.d.ts +4 -0
  101. package/lib/projects/structure.js +9 -0
  102. package/lib/projects/upload.d.ts +1 -1
  103. package/lib/projects/upload.js +2 -2
  104. package/lib/prompts/accountNamePrompt.d.ts +1 -2
  105. package/lib/prompts/createProjectPrompt.d.ts +6 -8
  106. package/lib/prompts/createProjectPrompt.js +36 -62
  107. package/lib/prompts/personalAccessKeyPrompt.d.ts +4 -4
  108. package/lib/prompts/projectAddPrompt.d.ts +3 -3
  109. package/lib/prompts/projectAddPrompt.js +16 -6
  110. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -2
  111. package/lib/prompts/sandboxesPrompt.d.ts +3 -2
  112. package/lib/prompts/sandboxesPrompt.js +1 -1
  113. package/lib/sandboxSync.js +6 -2
  114. package/lib/sandboxes.d.ts +2 -5
  115. package/lib/testUtils.d.ts +12 -0
  116. package/lib/testUtils.js +10 -0
  117. package/lib/ui/index.d.ts +3 -3
  118. package/lib/ui/index.js +9 -8
  119. package/lib/ui/supportHyperlinks.js +2 -2
  120. package/lib/ui/supportsColor.js +2 -2
  121. package/lib/upload.d.ts +1 -1
  122. package/lib/upload.js +20 -20
  123. package/lib/validation.d.ts +1 -1
  124. package/lib/yargsUtils.d.ts +9 -0
  125. package/lib/yargsUtils.js +40 -0
  126. package/package.json +5 -4
  127. package/types/ProjectComponents.d.ts +38 -0
  128. package/types/ProjectComponents.js +3 -0
  129. package/types/Projects.d.ts +1 -6
  130. package/types/Prompts.d.ts +7 -0
  131. package/types/Sandboxes.d.ts +2 -0
  132. package/types/Yargs.d.ts +8 -0
  133. package/commands/account/auth.d.ts +0 -10
  134. package/commands/account/auth.js +0 -154
  135. package/commands/account/createOverride.d.ts +0 -10
  136. package/commands/account/createOverride.js +0 -62
  137. package/commands/config/migrate.d.ts +0 -10
  138. package/commands/config/migrate.js +0 -86
  139. package/commands/project/dev.d.ts +0 -1
  140. package/commands/project/dev.js +0 -146
  141. package/lib/configMigrate.d.ts +0 -2
  142. package/lib/configMigrate.js +0 -83
  143. package/lib/hasFlag.d.ts +0 -1
  144. package/lib/hasFlag.js +0 -15
package/commands/list.js CHANGED
@@ -1,37 +1,68 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
4
- const chalk = require('chalk');
5
- const { addAccountOptions, addConfigOptions, addGlobalOptions, addUseEnvironmentOptions, } = require('../lib/commonOpts');
6
- const { trackCommandUsage } = require('../lib/usageTracking');
7
- const { isPathFolder } = require('../lib/filesystem');
8
- const { logger } = require('@hubspot/local-dev-lib/logger');
9
- const { logError } = require('../lib/errorHandlers/index');
10
- const { getDirectoryContentsByPath, } = require('@hubspot/local-dev-lib/api/fileMapper');
11
- const { HUBSPOT_FOLDER, MARKETPLACE_FOLDER } = require('../lib/constants');
12
- const { i18n } = require('../lib/lang');
6
+ exports.describe = exports.command = void 0;
7
+ exports.handler = handler;
8
+ exports.builder = builder;
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const commonOpts_1 = require("../lib/commonOpts");
11
+ const usageTracking_1 = require("../lib/usageTracking");
12
+ const filesystem_1 = require("../lib/filesystem");
13
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
14
+ const index_1 = require("../lib/errorHandlers/index");
15
+ const fileMapper_1 = require("@hubspot/local-dev-lib/api/fileMapper");
16
+ const constants_1 = require("../lib/constants");
17
+ const lang_1 = require("../lib/lang");
18
+ const exitCodes_1 = require("../lib/enums/exitCodes");
13
19
  const i18nKey = 'commands.list';
14
- const { EXIT_CODES } = require('../lib/enums/exitCodes');
20
+ function addColorToContents(fileOrFolder) {
21
+ if (!(0, filesystem_1.isPathFolder)(fileOrFolder)) {
22
+ return chalk_1.default.reset.cyan(fileOrFolder);
23
+ }
24
+ if (fileOrFolder === constants_1.HUBSPOT_FOLDER || fileOrFolder === constants_1.MARKETPLACE_FOLDER) {
25
+ return chalk_1.default.reset.bold.blue(fileOrFolder);
26
+ }
27
+ return chalk_1.default.reset.blue(fileOrFolder);
28
+ }
29
+ function sortContents(a, b) {
30
+ // Pin @hubspot folder to top
31
+ if (a === constants_1.HUBSPOT_FOLDER) {
32
+ return -1;
33
+ }
34
+ else if (b === constants_1.HUBSPOT_FOLDER) {
35
+ return 1;
36
+ }
37
+ // Pin @marketplace folder to top
38
+ if (a === constants_1.MARKETPLACE_FOLDER) {
39
+ return -1;
40
+ }
41
+ else if (b === constants_1.MARKETPLACE_FOLDER) {
42
+ return 1;
43
+ }
44
+ return a.localeCompare(b);
45
+ }
15
46
  exports.command = 'list [path]';
16
- exports.describe = i18n(`${i18nKey}.describe`);
17
- exports.handler = async (options) => {
18
- const { path, derivedAccountId } = options;
47
+ exports.describe = (0, lang_1.i18n)(`${i18nKey}.describe`);
48
+ async function handler(args) {
49
+ const { path, derivedAccountId } = args;
19
50
  const directoryPath = path || '/';
20
51
  let contentsResp;
21
- trackCommandUsage('list', null, derivedAccountId);
22
- logger.debug(i18n(`${i18nKey}.gettingPathContents`, {
52
+ (0, usageTracking_1.trackCommandUsage)('list', undefined, derivedAccountId);
53
+ logger_1.logger.debug((0, lang_1.i18n)(`${i18nKey}.gettingPathContents`, {
23
54
  path: directoryPath,
24
55
  }));
25
56
  try {
26
- const { data } = await getDirectoryContentsByPath(derivedAccountId, directoryPath);
57
+ const { data } = await (0, fileMapper_1.getDirectoryContentsByPath)(derivedAccountId, directoryPath);
27
58
  contentsResp = data;
28
59
  }
29
60
  catch (e) {
30
- logError(e);
31
- process.exit(EXIT_CODES.SUCCESS);
61
+ (0, index_1.logError)(e);
62
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
32
63
  }
33
64
  if (!contentsResp.folder) {
34
- logger.info(i18n(`${i18nKey}.noFilesFoundAtPath`, {
65
+ logger_1.logger.info((0, lang_1.i18n)(`${i18nKey}.noFilesFoundAtPath`, {
35
66
  path: directoryPath,
36
67
  }));
37
68
  return;
@@ -41,7 +72,7 @@ exports.handler = async (options) => {
41
72
  ? ['@hubspot', ...contentsResp.children]
42
73
  : contentsResp.children;
43
74
  if (contents.length === 0) {
44
- logger.info(i18n(`${i18nKey}.noFilesFoundAtPath`, {
75
+ logger_1.logger.info((0, lang_1.i18n)(`${i18nKey}.noFilesFoundAtPath`, {
45
76
  path: directoryPath,
46
77
  }));
47
78
  return;
@@ -50,43 +81,18 @@ exports.handler = async (options) => {
50
81
  .map(addColorToContents)
51
82
  .sort(sortContents)
52
83
  .join('\n');
53
- logger.log(folderContentsOutput);
54
- };
55
- exports.builder = yargs => {
84
+ logger_1.logger.log(folderContentsOutput);
85
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
86
+ }
87
+ function builder(yargs) {
88
+ (0, commonOpts_1.addConfigOptions)(yargs);
89
+ (0, commonOpts_1.addAccountOptions)(yargs);
90
+ (0, commonOpts_1.addUseEnvironmentOptions)(yargs);
91
+ (0, commonOpts_1.addGlobalOptions)(yargs);
56
92
  yargs.positional('path', {
57
- describe: i18n(`${i18nKey}.positionals.path.describe`),
93
+ describe: (0, lang_1.i18n)(`${i18nKey}.positionals.path.describe`),
58
94
  type: 'string',
59
95
  });
60
- yargs.example([['$0 list'], ['$0 list /'], ['$0 list serverless']]);
61
- addConfigOptions(yargs);
62
- addAccountOptions(yargs);
63
- addUseEnvironmentOptions(yargs);
64
- addGlobalOptions(yargs);
96
+ yargs.example([['$0 list'], ['$0 list /'], ['$0 list my-modules']]);
65
97
  return yargs;
66
- };
67
- const addColorToContents = fileOrFolder => {
68
- if (!isPathFolder(fileOrFolder)) {
69
- return chalk.reset.cyan(fileOrFolder);
70
- }
71
- if (fileOrFolder === HUBSPOT_FOLDER || fileOrFolder === MARKETPLACE_FOLDER) {
72
- return chalk.reset.bold.blue(fileOrFolder);
73
- }
74
- return chalk.reset.blue(fileOrFolder);
75
- };
76
- const sortContents = (a, b) => {
77
- // Pin @hubspot folder to top
78
- if (a === HUBSPOT_FOLDER) {
79
- return -1;
80
- }
81
- else if (b === HUBSPOT_FOLDER) {
82
- return 1;
83
- }
84
- // Pin @marketplace folder to top
85
- if (a === MARKETPLACE_FOLDER) {
86
- return -1;
87
- }
88
- else if (b === MARKETPLACE_FOLDER) {
89
- return 1;
90
- }
91
- return a.localeCompare(b);
92
- };
98
+ }
package/commands/mv.d.ts CHANGED
@@ -1 +1,11 @@
1
+ import { Argv, ArgumentsCamelCase } from 'yargs';
2
+ import { CommonArgs, ConfigArgs, EnvironmentArgs } from '../types/Yargs';
3
+ export declare const command = "mv <srcPath> <destPath>";
4
+ export declare const describe: string | undefined;
5
+ type MvArgs = CommonArgs & ConfigArgs & EnvironmentArgs & {
6
+ srcPath: string;
7
+ destPath: string;
8
+ };
9
+ export declare function handler(args: ArgumentsCamelCase<MvArgs>): Promise<void>;
10
+ export declare function builder(yargs: Argv): Argv<MvArgs>;
1
11
  export {};
package/commands/mv.js CHANGED
@@ -1,58 +1,62 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
4
- const { logger } = require('@hubspot/local-dev-lib/logger');
5
- const { moveFile } = require('@hubspot/local-dev-lib/api/fileMapper');
6
- const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index');
7
- const { logError, ApiErrorContext } = require('../lib/errorHandlers/index');
8
- const { addConfigOptions, addAccountOptions, addUseEnvironmentOptions, addGlobalOptions, } = require('../lib/commonOpts');
9
- const { trackCommandUsage } = require('../lib/usageTracking');
10
- const { isPathFolder } = require('../lib/filesystem');
11
- const { i18n } = require('../lib/lang');
12
- const { uiBetaTag } = require('../lib/ui');
3
+ exports.describe = exports.command = void 0;
4
+ exports.handler = handler;
5
+ exports.builder = builder;
6
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
7
+ const fileMapper_1 = require("@hubspot/local-dev-lib/api/fileMapper");
8
+ const index_1 = require("@hubspot/local-dev-lib/errors/index");
9
+ const index_2 = require("../lib/errorHandlers/index");
10
+ const commonOpts_1 = require("../lib/commonOpts");
11
+ const usageTracking_1 = require("../lib/usageTracking");
12
+ const filesystem_1 = require("../lib/filesystem");
13
+ const lang_1 = require("../lib/lang");
14
+ const ui_1 = require("../lib/ui");
13
15
  const i18nKey = 'commands.mv';
14
- const getCorrectedDestPath = (srcPath, destPath) => {
15
- if (!isPathFolder(srcPath)) {
16
+ function getCorrectedDestPath(srcPath, destPath) {
17
+ if (!(0, filesystem_1.isPathFolder)(srcPath)) {
16
18
  return destPath;
17
19
  }
18
20
  // Makes sure that nested folders are moved independently
19
21
  return `${destPath}/${srcPath.split('/').pop()}`;
20
- };
22
+ }
21
23
  exports.command = 'mv <srcPath> <destPath>';
22
- exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
23
- exports.handler = async (options) => {
24
- const { srcPath, destPath, derivedAccountId } = options;
25
- trackCommandUsage('mv', null, derivedAccountId);
24
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
25
+ async function handler(args) {
26
+ const { srcPath, destPath, derivedAccountId } = args;
27
+ (0, usageTracking_1.trackCommandUsage)('mv', undefined, derivedAccountId);
26
28
  try {
27
- await moveFile(derivedAccountId, srcPath, getCorrectedDestPath(srcPath, destPath));
28
- logger.success(i18n(`${i18nKey}.move`, {
29
+ await (0, fileMapper_1.moveFile)(derivedAccountId, srcPath, getCorrectedDestPath(srcPath, destPath));
30
+ logger_1.logger.success((0, lang_1.i18n)(`${i18nKey}.move`, {
29
31
  accountId: derivedAccountId,
30
32
  destPath,
31
33
  srcPath,
32
34
  }));
33
35
  }
34
36
  catch (error) {
35
- logger.error(i18n(`${i18nKey}.errors.moveFailed`, {
37
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.moveFailed`, {
36
38
  accountId: derivedAccountId,
37
39
  destPath,
38
40
  srcPath,
39
41
  }));
40
- if (isSpecifiedError(error, { statusCode: 409 })) {
41
- logger.error(i18n(`${i18nKey}.errors.sourcePathExists`, {
42
+ if ((0, index_1.isSpecifiedError)(error, { statusCode: 409 })) {
43
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.sourcePathExists`, {
42
44
  destPath,
43
45
  srcPath,
44
46
  }));
45
47
  }
46
48
  else {
47
- logError(error, new ApiErrorContext({
49
+ (0, index_2.logError)(error, new index_2.ApiErrorContext({
48
50
  accountId: derivedAccountId,
49
- srcPath,
50
- destPath,
51
51
  }));
52
52
  }
53
53
  }
54
- };
55
- exports.builder = yargs => {
54
+ }
55
+ function builder(yargs) {
56
+ (0, commonOpts_1.addConfigOptions)(yargs);
57
+ (0, commonOpts_1.addAccountOptions)(yargs);
58
+ (0, commonOpts_1.addUseEnvironmentOptions)(yargs);
59
+ (0, commonOpts_1.addGlobalOptions)(yargs);
56
60
  yargs.positional('srcPath', {
57
61
  describe: 'Remote hubspot path',
58
62
  type: 'string',
@@ -61,9 +65,5 @@ exports.builder = yargs => {
61
65
  describe: 'Remote hubspot path',
62
66
  type: 'string',
63
67
  });
64
- addConfigOptions(yargs);
65
- addAccountOptions(yargs);
66
- addUseEnvironmentOptions(yargs);
67
- addGlobalOptions(yargs);
68
68
  return yargs;
69
- };
69
+ }
@@ -1 +1,11 @@
1
+ import { Argv, ArgumentsCamelCase } from 'yargs';
2
+ import { CommonArgs, ConfigArgs, EnvironmentArgs, AccountArgs } from '../types/Yargs';
3
+ export declare const command = "open [shortcut]";
4
+ export declare const describe: string;
5
+ type OpenArgs = CommonArgs & ConfigArgs & EnvironmentArgs & AccountArgs & {
6
+ shortcut?: string;
7
+ list?: boolean;
8
+ };
9
+ export declare function handler(args: ArgumentsCamelCase<OpenArgs>): Promise<void>;
10
+ export declare function builder(yargs: Argv): Argv<OpenArgs>;
1
11
  export {};
package/commands/open.js CHANGED
@@ -1,50 +1,57 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // @ts-nocheck
3
+ exports.describe = exports.command = void 0;
4
+ exports.handler = handler;
5
+ exports.builder = builder;
6
+ const commonOpts_1 = require("../lib/commonOpts");
7
+ const usageTracking_1 = require("../lib/usageTracking");
8
+ const links_1 = require("../lib/links");
9
+ const promptUtils_1 = require("../lib/prompts/promptUtils");
10
+ const lang_1 = require("../lib/lang");
4
11
  const exitCodes_1 = require("../lib/enums/exitCodes");
5
- const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addGlobalOptions, } = require('../lib/commonOpts');
6
- const { trackCommandUsage } = require('../lib/usageTracking');
7
- const { logSiteLinks, getSiteLinksAsArray, openLink } = require('../lib/links');
8
- const { promptUser } = require('../lib/prompts/promptUtils');
9
- const { i18n } = require('../lib/lang');
10
12
  const i18nKey = 'commands.open';
11
13
  const separator = ' => ';
12
- const createListPrompt = async (accountId) => promptUser([
13
- {
14
- type: 'rawlist',
15
- look: false,
16
- name: 'open',
17
- pageSize: 20,
18
- message: i18n(`${i18nKey}.selectLink`),
19
- choices: getSiteLinksAsArray(accountId).map(l => `${l.shortcut}${separator}${l.url}`),
20
- filter: val => val.split(separator)[0],
21
- },
22
- ]);
14
+ async function createListPrompt(accountId) {
15
+ return (0, promptUtils_1.promptUser)([
16
+ {
17
+ type: 'rawlist',
18
+ name: 'open',
19
+ pageSize: 20,
20
+ message: (0, lang_1.i18n)(`${i18nKey}.selectLink`),
21
+ choices: (0, links_1.getSiteLinksAsArray)(accountId).map(l => `${l.shortcut}${separator}${l.url}`),
22
+ filter: val => val.split(separator)[0],
23
+ },
24
+ ]);
25
+ }
23
26
  exports.command = 'open [shortcut]';
24
- exports.describe = i18n(`${i18nKey}.describe`);
25
- exports.handler = async (options) => {
26
- const { shortcut, list, derivedAccountId } = options;
27
- trackCommandUsage('open', null, derivedAccountId);
27
+ exports.describe = (0, lang_1.i18n)(`${i18nKey}.describe`);
28
+ async function handler(args) {
29
+ const { shortcut, list, derivedAccountId } = args;
30
+ (0, usageTracking_1.trackCommandUsage)('open', undefined, derivedAccountId);
28
31
  if (shortcut === undefined && !list) {
29
32
  const choice = await createListPrompt(derivedAccountId);
30
- openLink(derivedAccountId, choice.open);
33
+ (0, links_1.openLink)(derivedAccountId, choice.open);
31
34
  }
32
35
  else if (list) {
33
- logSiteLinks(derivedAccountId);
36
+ (0, links_1.logSiteLinks)(derivedAccountId);
34
37
  }
35
- else {
36
- openLink(derivedAccountId, shortcut);
38
+ else if (shortcut) {
39
+ (0, links_1.openLink)(derivedAccountId, shortcut);
37
40
  }
38
41
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
39
- };
40
- exports.builder = yargs => {
42
+ }
43
+ function builder(yargs) {
44
+ (0, commonOpts_1.addConfigOptions)(yargs);
45
+ (0, commonOpts_1.addAccountOptions)(yargs);
46
+ (0, commonOpts_1.addUseEnvironmentOptions)(yargs);
47
+ (0, commonOpts_1.addGlobalOptions)(yargs);
41
48
  yargs.positional('[shortcut]', {
42
- describe: i18n(`${i18nKey}.positionals.shortcut.describe`),
49
+ describe: (0, lang_1.i18n)(`${i18nKey}.positionals.shortcut.describe`),
43
50
  type: 'string',
44
51
  });
45
52
  yargs.option('list', {
46
53
  alias: 'l',
47
- describe: i18n(`${i18nKey}.options.list.describe`),
54
+ describe: (0, lang_1.i18n)(`${i18nKey}.options.list.describe`),
48
55
  type: 'boolean',
49
56
  });
50
57
  yargs.example([
@@ -54,9 +61,5 @@ exports.builder = yargs => {
54
61
  ['$0 open settings/navigation'],
55
62
  ['$0 open sn'],
56
63
  ]);
57
- addConfigOptions(yargs);
58
- addAccountOptions(yargs);
59
- addUseEnvironmentOptions(yargs);
60
- addGlobalOptions(yargs);
61
64
  return yargs;
62
- };
65
+ }
@@ -1,42 +1,88 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
+ const path = require('path');
4
5
  const { logger } = require('@hubspot/local-dev-lib/logger');
5
- const { logError } = require('../../lib/errorHandlers/index');
6
- const { fetchReleaseData } = require('@hubspot/local-dev-lib/github');
6
+ const { cloneGithubRepo, fetchReleaseData, } = require('@hubspot/local-dev-lib/github');
7
+ const { debugError } = require('../../lib/errorHandlers');
7
8
  const { trackCommandUsage } = require('../../lib/usageTracking');
8
9
  const { i18n } = require('../../lib/lang');
9
10
  const { projectAddPrompt } = require('../../lib/prompts/projectAddPrompt');
10
- const { createProjectComponent, getProjectComponentsByVersion, } = require('../../lib/projects');
11
+ const { getProjectConfig } = require('../../lib/projects');
12
+ const { getProjectComponentListFromRepo, } = require('../../lib/projects/create');
13
+ const { findProjectComponents } = require('../../lib/projects/structure');
14
+ const { ComponentTypes } = require('../../types/Projects');
11
15
  const { uiBetaTag } = require('../../lib/ui');
12
16
  const { HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, } = require('../../lib/constants');
17
+ const { EXIT_CODES } = require('../../lib/enums/exitCodes');
13
18
  const i18nKey = 'commands.project.subcommands.add';
14
19
  exports.command = 'add';
15
20
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
16
21
  exports.handler = async (options) => {
17
22
  const { derivedAccountId } = options;
23
+ trackCommandUsage('project-add', null, derivedAccountId);
24
+ const { projectConfig, projectDir } = await getProjectConfig();
25
+ if (!projectDir || !projectConfig) {
26
+ logger.error(i18n(`${i18nKey}.error.locationInProject`));
27
+ process.exit(EXIT_CODES.ERROR);
28
+ }
29
+ // We currently only support adding private apps to projects
30
+ let projectContainsPublicApp = false;
31
+ try {
32
+ const components = await findProjectComponents(projectDir);
33
+ projectContainsPublicApp = components.some(c => c.type === ComponentTypes.PublicApp);
34
+ }
35
+ catch (err) {
36
+ debugError(err);
37
+ }
38
+ if (projectContainsPublicApp) {
39
+ logger.error(i18n(`${i18nKey}.error.projectContainsPublicApp`));
40
+ process.exit(EXIT_CODES.ERROR);
41
+ }
18
42
  logger.log('');
19
- logger.log(i18n(`${i18nKey}.creatingComponent.message`));
43
+ logger.log(i18n(`${i18nKey}.creatingComponent`, {
44
+ projectName: projectConfig.name,
45
+ }));
20
46
  logger.log('');
21
- const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
22
- const projectComponentsVersion = releaseData.tag_name;
23
- const components = await getProjectComponentsByVersion(projectComponentsVersion);
24
- let { component, name } = await projectAddPrompt(components, options);
25
- name = name || options.name;
26
- if (!component) {
27
- component = components.find(t => t.path === options.type);
47
+ let latestRepoReleaseTag;
48
+ try {
49
+ // We want the tag_name from the latest release of the components repo
50
+ const repoReleaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
51
+ if (repoReleaseData) {
52
+ latestRepoReleaseTag = repoReleaseData.tag_name;
53
+ }
28
54
  }
29
- trackCommandUsage('project-add', null, derivedAccountId);
55
+ catch (err) {
56
+ debugError(err);
57
+ }
58
+ if (!latestRepoReleaseTag) {
59
+ logger.error(i18n(`${i18nKey}.error.failedToFetchComponentList`));
60
+ process.exit(EXIT_CODES.ERROR);
61
+ }
62
+ const components = await getProjectComponentListFromRepo(latestRepoReleaseTag);
63
+ if (!components.length) {
64
+ logger.error(i18n(`${i18nKey}.error.failedToFetchComponentList`));
65
+ process.exit(EXIT_CODES.ERROR);
66
+ }
67
+ const projectAddPromptResponse = await projectAddPrompt(components, options);
30
68
  try {
31
- await createProjectComponent(component, name, projectComponentsVersion);
69
+ const componentPath = path.join(projectDir, projectConfig.srcDir, projectAddPromptResponse.componentTemplate.insertPath, projectAddPromptResponse.name);
70
+ await cloneGithubRepo(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, componentPath, {
71
+ sourceDir: projectAddPromptResponse.componentTemplate.path,
72
+ tag: latestRepoReleaseTag,
73
+ hideLogs: true,
74
+ });
32
75
  logger.log('');
33
- logger.log(i18n(`${i18nKey}.success.message`, {
34
- componentName: name,
76
+ logger.success(i18n(`${i18nKey}.success`, {
77
+ componentName: projectAddPromptResponse.name,
35
78
  }));
36
79
  }
37
80
  catch (error) {
38
- logError(error);
81
+ debugError(error);
82
+ logger.error(i18n(`${i18nKey}.error.failedToDownloadComponent`));
83
+ process.exit(EXIT_CODES.ERROR);
39
84
  }
85
+ process.exit(EXIT_CODES.SUCCESS);
40
86
  };
41
87
  exports.builder = yargs => {
42
88
  yargs.options({
@@ -53,9 +53,9 @@ exports.handler = async (options) => {
53
53
  });
54
54
  appId = appIdResponse.appId;
55
55
  }
56
- const { name, dest } = await createProjectPrompt('', options, true);
57
- projectName = name;
58
- projectDest = options.dest || dest;
56
+ const createProjectPromptResponse = await createProjectPrompt(options);
57
+ projectName = createProjectPromptResponse.name;
58
+ projectDest = createProjectPromptResponse.dest;
59
59
  }
60
60
  catch (error) {
61
61
  logError(error, new ApiErrorContext({ accountId: derivedAccountId }));
@@ -1,40 +1,97 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  // @ts-nocheck
4
- const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
5
- const { trackCommandUsage } = require('../../lib/usageTracking');
6
- const { getCwd } = require('@hubspot/local-dev-lib/path');
7
4
  const path = require('path');
5
+ const fs = require('fs-extra');
8
6
  const chalk = require('chalk');
7
+ const { logger } = require('@hubspot/local-dev-lib/logger');
8
+ const { fetchReleaseData, cloneGithubRepo, } = require('@hubspot/local-dev-lib/github');
9
+ const { getCwd } = require('@hubspot/local-dev-lib/path');
10
+ const { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, } = require('../../lib/commonOpts');
11
+ const { trackCommandUsage } = require('../../lib/usageTracking');
9
12
  const { createProjectPrompt, } = require('../../lib/prompts/createProjectPrompt');
10
- const { createProjectConfig } = require('../../lib/projects');
13
+ const { writeProjectConfig, getProjectConfig } = require('../../lib/projects');
14
+ const { getProjectTemplateListFromRepo, EMPTY_PROJECT_TEMPLATE_NAME, } = require('../../lib/projects/create');
11
15
  const { i18n } = require('../../lib/lang');
12
16
  const { uiBetaTag, uiFeatureHighlight } = require('../../lib/ui');
13
- const { HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, } = require('../../lib/constants');
14
- const { logger } = require('@hubspot/local-dev-lib/logger');
15
- const { fetchReleaseData } = require('@hubspot/local-dev-lib/github');
17
+ const { debugError } = require('../../lib/errorHandlers');
18
+ const { EXIT_CODES } = require('../../lib/enums/exitCodes');
19
+ const { PROJECT_CONFIG_FILE, HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, DEFAULT_PROJECT_TEMPLATE_BRANCH, } = require('../../lib/constants');
16
20
  const i18nKey = 'commands.project.subcommands.create';
17
21
  exports.command = 'create';
18
22
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
19
23
  exports.handler = async (options) => {
20
24
  const { derivedAccountId } = options;
21
- const hasCustomTemplateSource = Boolean(options.templateSource);
22
- let githubRef = '';
23
- if (!hasCustomTemplateSource) {
24
- const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
25
- githubRef = releaseData.tag_name;
25
+ let latestRepoReleaseTag;
26
+ let templateSource = options.templateSource;
27
+ if (!templateSource) {
28
+ templateSource = HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH;
29
+ try {
30
+ const releaseData = await fetchReleaseData(HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH);
31
+ if (releaseData) {
32
+ latestRepoReleaseTag = releaseData.tag_name;
33
+ }
34
+ }
35
+ catch (err) {
36
+ logger.error(i18n(`${i18nKey}.error.failedToFetchProjectList`));
37
+ process.exit(EXIT_CODES.ERROR);
38
+ }
26
39
  }
27
- const { name, template, dest } = await createProjectPrompt(githubRef, options);
28
- trackCommandUsage('project-create', { type: template.name }, derivedAccountId);
29
- await createProjectConfig(path.resolve(getCwd(), options.dest || dest), options.name || name, template, options.templateSource, githubRef);
40
+ const projectTemplates = await getProjectTemplateListFromRepo(templateSource, latestRepoReleaseTag || DEFAULT_PROJECT_TEMPLATE_BRANCH);
41
+ if (!projectTemplates.length) {
42
+ logger.error(i18n(`${i18nKey}.error.failedToFetchProjectList`));
43
+ process.exit(EXIT_CODES.ERROR);
44
+ }
45
+ const createProjectPromptResponse = await createProjectPrompt(options, projectTemplates);
46
+ const projectDest = path.resolve(getCwd(), createProjectPromptResponse.dest);
47
+ trackCommandUsage('project-create', { type: createProjectPromptResponse.projectTemplate.name }, derivedAccountId);
48
+ const { projectConfig: existingProjectConfig, projectDir: existingProjectDir, } = await getProjectConfig(projectDest);
49
+ // Exit if the target destination is within an existing project
50
+ if (existingProjectConfig && projectDest.startsWith(existingProjectDir)) {
51
+ logger.error(i18n(`${i18nKey}.errors.cannotNestProjects`, {
52
+ projectDir: existingProjectDir,
53
+ }));
54
+ process.exit(EXIT_CODES.ERROR);
55
+ }
56
+ try {
57
+ await cloneGithubRepo(templateSource, projectDest, {
58
+ sourceDir: createProjectPromptResponse.projectTemplate.path,
59
+ tag: latestRepoReleaseTag,
60
+ hideLogs: true,
61
+ });
62
+ }
63
+ catch (err) {
64
+ debugError(err);
65
+ logger.error(i18n(`${i18nKey}.errors.failedToDownloadProject`));
66
+ process.exit(EXIT_CODES.ERROR);
67
+ }
68
+ const projectConfigPath = path.join(projectDest, PROJECT_CONFIG_FILE);
69
+ const parsedConfigFile = JSON.parse(fs.readFileSync(projectConfigPath).toString());
70
+ writeProjectConfig(projectConfigPath, {
71
+ ...parsedConfigFile,
72
+ name: createProjectPromptResponse.name,
73
+ });
74
+ // If the template is 'no-template', we need to manually create a src directory
75
+ if (createProjectPromptResponse.projectTemplate.name ===
76
+ EMPTY_PROJECT_TEMPLATE_NAME) {
77
+ fs.ensureDirSync(path.join(projectDest, 'src'));
78
+ }
79
+ logger.log('');
80
+ logger.success(i18n(`${i18nKey}.logs.success`, {
81
+ projectName: createProjectPromptResponse.name,
82
+ projectDest,
83
+ }));
30
84
  logger.log('');
31
85
  logger.log(chalk.bold(i18n(`${i18nKey}.logs.welcomeMessage`)));
32
86
  uiFeatureHighlight([
87
+ 'projectCommandTip',
88
+ 'projectUploadCommand',
33
89
  'projectDevCommand',
34
90
  'projectHelpCommand',
35
91
  'feedbackCommand',
36
92
  'sampleProjects',
37
93
  ]);
94
+ process.exit(EXIT_CODES.SUCCESS);
38
95
  };
39
96
  exports.builder = yargs => {
40
97
  yargs.options({
@@ -0,0 +1,5 @@
1
+ import { ArgumentsCamelCase } from 'yargs';
2
+ import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts';
3
+ import { ProjectConfig } from '../../../types/Projects';
4
+ import { ProjectDevArgs } from '../../../types/Yargs';
5
+ export declare function deprecatedProjectDevFlow(args: ArgumentsCamelCase<ProjectDevArgs>, accountConfig: CLIAccount, projectConfig: ProjectConfig, projectDir: string): Promise<void>;