@hubspot/cli 7.4.10-beta.0 → 7.5.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 (33) hide show
  1. package/commands/app/secret/add.d.ts +7 -0
  2. package/commands/app/secret/add.js +64 -0
  3. package/commands/app/secret/delete.d.ts +8 -0
  4. package/commands/app/secret/delete.js +87 -0
  5. package/commands/app/secret/list.d.ts +6 -0
  6. package/commands/app/secret/list.js +64 -0
  7. package/commands/app/secret/update.d.ts +7 -0
  8. package/commands/app/secret/update.js +77 -0
  9. package/commands/app/secret.d.ts +3 -0
  10. package/commands/app/secret.js +30 -0
  11. package/commands/app.js +4 -2
  12. package/commands/project/cloneApp.js +2 -2
  13. package/commands/project/dev/unifiedFlow.js +43 -20
  14. package/commands/project/profile/add.js +30 -11
  15. package/commands/project/profile/delete.d.ts +6 -0
  16. package/commands/project/profile/{remove.js → delete.js} +24 -20
  17. package/commands/project/profile.js +2 -2
  18. package/lang/en.d.ts +104 -17
  19. package/lang/en.js +104 -17
  20. package/lang/en.lyaml +7 -5
  21. package/lib/accountTypes.js +2 -1
  22. package/lib/app/migrate_legacy.js +2 -2
  23. package/lib/projects/localDev/helpers.d.ts +2 -1
  24. package/lib/projects/localDev/helpers.js +30 -1
  25. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +6 -1
  26. package/lib/prompts/projectDevTargetAccountPrompt.js +4 -11
  27. package/lib/prompts/selectAppPrompt.d.ts +2 -0
  28. package/lib/prompts/selectAppPrompt.js +40 -0
  29. package/lib/prompts/{selectPublicAppPrompt.d.ts → selectPublicAppForMigrationPrompt.d.ts} +1 -1
  30. package/lib/prompts/{selectPublicAppPrompt.js → selectPublicAppForMigrationPrompt.js} +8 -8
  31. package/package.json +2 -2
  32. package/types/Prompts.d.ts +0 -7
  33. package/commands/project/profile/remove.d.ts +0 -6
@@ -0,0 +1,7 @@
1
+ import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, YargsCommandModule } from '../../../types/Yargs';
2
+ type AddAppSecretArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
3
+ name?: string;
4
+ app?: number;
5
+ };
6
+ declare const addAppSecretCommand: YargsCommandModule<unknown, AddAppSecretArgs>;
7
+ export default addAppSecretCommand;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const devSecrets_1 = require("@hubspot/local-dev-lib/api/devSecrets");
4
+ const index_1 = require("../../../lib/errorHandlers/index");
5
+ const usageTracking_1 = require("../../../lib/usageTracking");
6
+ const secretPrompt_1 = require("../../../lib/prompts/secretPrompt");
7
+ const selectAppPrompt_1 = require("../../../lib/prompts/selectAppPrompt");
8
+ const en_1 = require("../../../lang/en");
9
+ const exitCodes_1 = require("../../../lib/enums/exitCodes");
10
+ const yargsUtils_1 = require("../../../lib/yargsUtils");
11
+ const logger_1 = require("../../../lib/ui/logger");
12
+ const command = 'add [name]';
13
+ const describe = en_1.commands.app.subcommands.secret.subcommands.add.describe;
14
+ async function handler(args) {
15
+ const { derivedAccountId } = args;
16
+ (0, usageTracking_1.trackCommandUsage)('app-secret-add', {}, derivedAccountId);
17
+ const appSecretApp = await (0, selectAppPrompt_1.selectAppPrompt)(derivedAccountId, args.app);
18
+ if (!appSecretApp) {
19
+ logger_1.uiLogger.log('');
20
+ logger_1.uiLogger.log(en_1.commands.app.subcommands.secret.subcommands.add.errors.noApps);
21
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
22
+ }
23
+ let appSecretName = args.name;
24
+ if (!appSecretName) {
25
+ const { secretName: name } = await (0, secretPrompt_1.secretNamePrompt)();
26
+ appSecretName = name;
27
+ }
28
+ const { secretValue } = await (0, secretPrompt_1.secretValuePrompt)();
29
+ try {
30
+ await (0, devSecrets_1.addAppSecret)(derivedAccountId, appSecretApp.id, appSecretName, secretValue);
31
+ logger_1.uiLogger.log('');
32
+ logger_1.uiLogger.success(en_1.commands.app.subcommands.secret.subcommands.add.success(appSecretApp.name, appSecretName));
33
+ }
34
+ catch (err) {
35
+ (0, index_1.logError)(err);
36
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
37
+ }
38
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
39
+ }
40
+ function addAppSecretBuilder(yargs) {
41
+ yargs.positional('name', {
42
+ describe: en_1.commands.app.subcommands.secret.subcommands.add.positionals.name,
43
+ type: 'string',
44
+ });
45
+ yargs.option('app', {
46
+ describe: en_1.commands.app.subcommands.secret.subcommands.add.options.app,
47
+ type: 'number',
48
+ });
49
+ yargs.example('add my-secret --app=1234567890', en_1.commands.app.subcommands.secret.subcommands.add.example);
50
+ return yargs;
51
+ }
52
+ const builder = (0, yargsUtils_1.makeYargsBuilder)(addAppSecretBuilder, command, describe, {
53
+ useGlobalOptions: true,
54
+ useAccountOptions: true,
55
+ useConfigOptions: true,
56
+ useEnvironmentOptions: true,
57
+ });
58
+ const addAppSecretCommand = {
59
+ command,
60
+ describe,
61
+ handler,
62
+ builder,
63
+ };
64
+ exports.default = addAppSecretCommand;
@@ -0,0 +1,8 @@
1
+ import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, YargsCommandModule } from '../../../types/Yargs';
2
+ type DeleteAppSecretArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
3
+ name?: string;
4
+ app?: number;
5
+ force?: boolean;
6
+ };
7
+ declare const deleteAppSecretCommand: YargsCommandModule<unknown, DeleteAppSecretArgs>;
8
+ export default deleteAppSecretCommand;
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const devSecrets_1 = require("@hubspot/local-dev-lib/api/devSecrets");
4
+ const index_1 = require("../../../lib/errorHandlers/index");
5
+ const usageTracking_1 = require("../../../lib/usageTracking");
6
+ const promptUtils_1 = require("../../../lib/prompts/promptUtils");
7
+ const selectAppPrompt_1 = require("../../../lib/prompts/selectAppPrompt");
8
+ const en_1 = require("../../../lang/en");
9
+ const exitCodes_1 = require("../../../lib/enums/exitCodes");
10
+ const yargsUtils_1 = require("../../../lib/yargsUtils");
11
+ const logger_1 = require("../../../lib/ui/logger");
12
+ const command = 'delete [name]';
13
+ const describe = en_1.commands.app.subcommands.secret.subcommands.delete.describe;
14
+ async function handler(args) {
15
+ const { derivedAccountId, force } = args;
16
+ (0, usageTracking_1.trackCommandUsage)('app-secret-delete', {}, derivedAccountId);
17
+ const appSecretApp = await (0, selectAppPrompt_1.selectAppPrompt)(derivedAccountId, args.app);
18
+ if (!appSecretApp) {
19
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
20
+ }
21
+ let appSecretToDelete = args.name;
22
+ if (!appSecretToDelete) {
23
+ let appSecrets = [];
24
+ try {
25
+ const { data: secrets } = await (0, devSecrets_1.fetchAppSecrets)(derivedAccountId, appSecretApp.id);
26
+ if (secrets.secretKeys.length > 0) {
27
+ appSecrets = secrets.secretKeys.map(secret => secret.secretKey);
28
+ }
29
+ }
30
+ catch (err) {
31
+ (0, index_1.logError)(err);
32
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
33
+ }
34
+ if (appSecrets.length === 0) {
35
+ logger_1.uiLogger.error(en_1.commands.app.subcommands.secret.subcommands.delete.errors.noSecrets);
36
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
37
+ }
38
+ appSecretToDelete = await (0, promptUtils_1.listPrompt)(en_1.commands.app.subcommands.secret.subcommands.delete.selectSecret, { choices: appSecrets });
39
+ }
40
+ const confirmDelete = force ||
41
+ (await (0, promptUtils_1.confirmPrompt)(en_1.commands.app.subcommands.secret.subcommands.delete.confirmDelete(appSecretApp.name, appSecretToDelete), {
42
+ defaultAnswer: false,
43
+ }));
44
+ if (!confirmDelete) {
45
+ logger_1.uiLogger.log(en_1.commands.app.subcommands.secret.subcommands.delete.deleteCanceled);
46
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
47
+ }
48
+ try {
49
+ await (0, devSecrets_1.deleteAppSecret)(derivedAccountId, appSecretApp.id, appSecretToDelete);
50
+ logger_1.uiLogger.log('');
51
+ logger_1.uiLogger.success(en_1.commands.app.subcommands.secret.subcommands.delete.success(appSecretApp.name, appSecretToDelete));
52
+ }
53
+ catch (err) {
54
+ (0, index_1.logError)(err);
55
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
56
+ }
57
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
58
+ }
59
+ function deleteAppSecretBuilder(yargs) {
60
+ yargs.positional('name', {
61
+ describe: en_1.commands.app.subcommands.secret.subcommands.delete.positionals.name,
62
+ type: 'string',
63
+ });
64
+ yargs.option('app', {
65
+ describe: en_1.commands.app.subcommands.secret.subcommands.delete.options.app,
66
+ type: 'number',
67
+ });
68
+ yargs.option('force', {
69
+ describe: en_1.commands.app.subcommands.secret.subcommands.delete.options.force,
70
+ type: 'boolean',
71
+ });
72
+ yargs.example('delete my-secret --app=1234567890', en_1.commands.app.subcommands.secret.subcommands.delete.example);
73
+ return yargs;
74
+ }
75
+ const builder = (0, yargsUtils_1.makeYargsBuilder)(deleteAppSecretBuilder, command, describe, {
76
+ useGlobalOptions: true,
77
+ useAccountOptions: true,
78
+ useConfigOptions: true,
79
+ useEnvironmentOptions: true,
80
+ });
81
+ const deleteAppSecretCommand = {
82
+ command,
83
+ describe,
84
+ handler,
85
+ builder,
86
+ };
87
+ exports.default = deleteAppSecretCommand;
@@ -0,0 +1,6 @@
1
+ import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, YargsCommandModule } from '../../../types/Yargs';
2
+ type ListAppSecretArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
3
+ app?: number;
4
+ };
5
+ declare const listAppSecretCommand: YargsCommandModule<unknown, ListAppSecretArgs>;
6
+ export default listAppSecretCommand;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const devSecrets_1 = require("@hubspot/local-dev-lib/api/devSecrets");
4
+ const index_1 = require("../../../lib/errorHandlers/index");
5
+ const usageTracking_1 = require("../../../lib/usageTracking");
6
+ const en_1 = require("../../../lang/en");
7
+ const exitCodes_1 = require("../../../lib/enums/exitCodes");
8
+ const yargsUtils_1 = require("../../../lib/yargsUtils");
9
+ const selectAppPrompt_1 = require("../../../lib/prompts/selectAppPrompt");
10
+ const logger_1 = require("../../../lib/ui/logger");
11
+ const command = 'list';
12
+ const describe = en_1.commands.app.subcommands.secret.subcommands.list.describe;
13
+ async function handler(args) {
14
+ const { derivedAccountId } = args;
15
+ (0, usageTracking_1.trackCommandUsage)('app-secret-list', {}, derivedAccountId);
16
+ const appSecretApp = await (0, selectAppPrompt_1.selectAppPrompt)(derivedAccountId, args.app);
17
+ if (!appSecretApp) {
18
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
19
+ }
20
+ let appSecrets = [];
21
+ try {
22
+ const { data: secrets } = await (0, devSecrets_1.fetchAppSecrets)(derivedAccountId, appSecretApp.id);
23
+ if (secrets.secretKeys.length > 0) {
24
+ appSecrets = secrets.secretKeys.map(secret => secret.secretKey);
25
+ }
26
+ }
27
+ catch (err) {
28
+ (0, index_1.logError)(err);
29
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
30
+ }
31
+ if (appSecrets.length === 0) {
32
+ logger_1.uiLogger.log('');
33
+ logger_1.uiLogger.log(en_1.commands.app.subcommands.secret.subcommands.list.errors.noSecrets);
34
+ }
35
+ else {
36
+ logger_1.uiLogger.log('');
37
+ logger_1.uiLogger.log(en_1.commands.app.subcommands.secret.subcommands.list.success(appSecretApp.name));
38
+ appSecrets.forEach(secret => {
39
+ logger_1.uiLogger.log(`- ${secret}`);
40
+ });
41
+ }
42
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
43
+ }
44
+ function listAppSecretBuilder(yargs) {
45
+ yargs.option('app', {
46
+ describe: en_1.commands.app.subcommands.secret.subcommands.list.options.app,
47
+ type: 'number',
48
+ });
49
+ yargs.example('list --app=1234567890', en_1.commands.app.subcommands.secret.subcommands.list.example);
50
+ return yargs;
51
+ }
52
+ const builder = (0, yargsUtils_1.makeYargsBuilder)(listAppSecretBuilder, command, describe, {
53
+ useGlobalOptions: true,
54
+ useAccountOptions: true,
55
+ useConfigOptions: true,
56
+ useEnvironmentOptions: true,
57
+ });
58
+ const listAppSecretCommand = {
59
+ command,
60
+ describe,
61
+ handler,
62
+ builder,
63
+ };
64
+ exports.default = listAppSecretCommand;
@@ -0,0 +1,7 @@
1
+ import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, YargsCommandModule } from '../../../types/Yargs';
2
+ type UpdateAppSecretArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
3
+ name?: string;
4
+ app?: number;
5
+ };
6
+ declare const updateAppSecretCommand: YargsCommandModule<unknown, UpdateAppSecretArgs>;
7
+ export default updateAppSecretCommand;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const devSecrets_1 = require("@hubspot/local-dev-lib/api/devSecrets");
4
+ const index_1 = require("../../../lib/errorHandlers/index");
5
+ const usageTracking_1 = require("../../../lib/usageTracking");
6
+ const secretPrompt_1 = require("../../../lib/prompts/secretPrompt");
7
+ const selectAppPrompt_1 = require("../../../lib/prompts/selectAppPrompt");
8
+ const promptUtils_1 = require("../../../lib/prompts/promptUtils");
9
+ const en_1 = require("../../../lang/en");
10
+ const exitCodes_1 = require("../../../lib/enums/exitCodes");
11
+ const yargsUtils_1 = require("../../../lib/yargsUtils");
12
+ const logger_1 = require("../../../lib/ui/logger");
13
+ const command = 'update [name]';
14
+ const describe = en_1.commands.app.subcommands.secret.subcommands.update.describe;
15
+ async function handler(args) {
16
+ const { derivedAccountId } = args;
17
+ (0, usageTracking_1.trackCommandUsage)('app-secret-update', {}, derivedAccountId);
18
+ const appSecretApp = await (0, selectAppPrompt_1.selectAppPrompt)(derivedAccountId, args.app);
19
+ if (!appSecretApp) {
20
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
21
+ }
22
+ let appSecretToUpdate = args.name;
23
+ if (!appSecretToUpdate) {
24
+ let appSecrets = [];
25
+ try {
26
+ const { data: secrets } = await (0, devSecrets_1.fetchAppSecrets)(derivedAccountId, appSecretApp.id);
27
+ if (secrets.secretKeys.length > 0) {
28
+ appSecrets = secrets.secretKeys.map(secret => secret.secretKey);
29
+ }
30
+ }
31
+ catch (err) {
32
+ (0, index_1.logError)(err);
33
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
34
+ }
35
+ if (appSecrets.length === 0) {
36
+ logger_1.uiLogger.error(en_1.commands.app.subcommands.secret.subcommands.update.errors.noSecrets);
37
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
38
+ }
39
+ appSecretToUpdate = await (0, promptUtils_1.listPrompt)(en_1.commands.app.subcommands.secret.subcommands.update.selectSecret, { choices: appSecrets });
40
+ }
41
+ const { secretValue } = await (0, secretPrompt_1.secretValuePrompt)();
42
+ try {
43
+ await (0, devSecrets_1.updateAppSecret)(derivedAccountId, appSecretApp.id, appSecretToUpdate, secretValue);
44
+ logger_1.uiLogger.log('');
45
+ logger_1.uiLogger.success(en_1.commands.app.subcommands.secret.subcommands.update.success(appSecretApp.name, appSecretToUpdate));
46
+ }
47
+ catch (err) {
48
+ (0, index_1.logError)(err);
49
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
50
+ }
51
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
52
+ }
53
+ function updateAppSecretBuilder(yargs) {
54
+ yargs.positional('name', {
55
+ describe: en_1.commands.app.subcommands.secret.subcommands.update.positionals.name,
56
+ type: 'string',
57
+ });
58
+ yargs.option('app', {
59
+ describe: en_1.commands.app.subcommands.secret.subcommands.update.options.app,
60
+ type: 'number',
61
+ });
62
+ yargs.example('update my-secret --app=1234567890', en_1.commands.app.subcommands.secret.subcommands.update.example);
63
+ return yargs;
64
+ }
65
+ const builder = (0, yargsUtils_1.makeYargsBuilder)(updateAppSecretBuilder, command, describe, {
66
+ useGlobalOptions: true,
67
+ useAccountOptions: true,
68
+ useConfigOptions: true,
69
+ useEnvironmentOptions: true,
70
+ });
71
+ const updateAppSecretCommand = {
72
+ command,
73
+ describe,
74
+ handler,
75
+ builder,
76
+ };
77
+ exports.default = updateAppSecretCommand;
@@ -0,0 +1,3 @@
1
+ import { YargsCommandModuleBucket } from '../../types/Yargs';
2
+ declare const appSecretCommand: YargsCommandModuleBucket;
3
+ export default appSecretCommand;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const en_1 = require("../../lang/en");
7
+ const yargsUtils_1 = require("../../lib/yargsUtils");
8
+ const add_1 = __importDefault(require("./secret/add"));
9
+ const delete_1 = __importDefault(require("./secret/delete"));
10
+ const list_1 = __importDefault(require("./secret/list"));
11
+ const update_1 = __importDefault(require("./secret/update"));
12
+ const command = ['secret', 'secrets'];
13
+ const describe = undefined; // commands.app.subcommands.secret.describe;
14
+ function appSecretBuilder(yargs) {
15
+ yargs
16
+ .command(add_1.default)
17
+ .command(delete_1.default)
18
+ .command(list_1.default)
19
+ .command(update_1.default)
20
+ .demandCommand(1, '');
21
+ return yargs;
22
+ }
23
+ const builder = (0, yargsUtils_1.makeYargsBuilder)(appSecretBuilder, command, en_1.commands.app.subcommands.secret.describe);
24
+ const appSecretCommand = {
25
+ command,
26
+ describe,
27
+ builder,
28
+ handler: () => { },
29
+ };
30
+ exports.default = appSecretCommand;
package/commands/app.js CHANGED
@@ -3,13 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const yargsUtils_1 = require("../lib/yargsUtils");
7
6
  const migrate_1 = __importDefault(require("./app/migrate"));
7
+ const secret_1 = __importDefault(require("./app/secret"));
8
+ const yargsUtils_1 = require("../lib/yargsUtils");
8
9
  const command = ['app', 'apps'];
9
10
  // Keep the command hidden for now
10
11
  const describe = undefined;
11
12
  function appBuilder(yargs) {
12
- return yargs.command(migrate_1.default).demandCommand(1, '');
13
+ yargs.command(migrate_1.default).command(secret_1.default).demandCommand(1, '');
14
+ return yargs;
13
15
  }
14
16
  const builder = (0, yargsUtils_1.makeYargsBuilder)(appBuilder, command, describe);
15
17
  const appCommand = {
@@ -7,7 +7,7 @@ const path_1 = __importDefault(require("path"));
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const usageTracking_1 = require("../../lib/usageTracking");
9
9
  const lang_1 = require("../../lib/lang");
10
- const selectPublicAppPrompt_1 = require("../../lib/prompts/selectPublicAppPrompt");
10
+ const selectPublicAppForMigrationPrompt_1 = require("../../lib/prompts/selectPublicAppForMigrationPrompt");
11
11
  const createProjectPrompt_1 = require("../../lib/prompts/createProjectPrompt");
12
12
  const polling_1 = require("../../lib/polling");
13
13
  const errorHandlers_1 = require("../../lib/errorHandlers");
@@ -46,7 +46,7 @@ async function handler(args) {
46
46
  try {
47
47
  appId = args.appId;
48
48
  if (!appId) {
49
- const appIdResponse = await (0, selectPublicAppPrompt_1.selectPublicAppPrompt)({
49
+ const appIdResponse = await (0, selectPublicAppForMigrationPrompt_1.selectPublicAppForMigrationPrompt)({
50
50
  accountId: derivedAccountId,
51
51
  accountName,
52
52
  isMigratingApp: false,
@@ -8,9 +8,10 @@ const path_1 = __importDefault(require("path"));
8
8
  const util_1 = __importDefault(require("util"));
9
9
  const logger_1 = require("@hubspot/local-dev-lib/logger");
10
10
  const getAccountIdentifier_1 = require("@hubspot/local-dev-lib/config/getAccountIdentifier");
11
+ const config_1 = require("@hubspot/local-dev-lib/constants/config");
11
12
  const errors_1 = require("@hubspot/project-parsing-lib/src/lib/errors");
12
13
  const project_parsing_lib_1 = require("@hubspot/project-parsing-lib");
13
- const config_1 = require("@hubspot/local-dev-lib/config");
14
+ const config_2 = require("@hubspot/local-dev-lib/config");
14
15
  const environment_1 = require("@hubspot/local-dev-lib/environment");
15
16
  const errorHandlers_1 = require("../../../lib/errorHandlers");
16
17
  const exitCodes_1 = require("../../../lib/enums/exitCodes");
@@ -27,7 +28,7 @@ const lang_1 = require("../../../lib/lang");
27
28
  // import LocalDevWebsocketServer from '../../../lib/projects/localDev/LocalDevWebsocketServer';
28
29
  async function unifiedProjectDevFlow(args, accountConfig, projectConfig, projectDir, profileConfig) {
29
30
  const targetProjectAccountId = (0, getAccountIdentifier_1.getAccountIdentifier)(accountConfig);
30
- const env = (0, environment_1.getValidEnv)((0, config_1.getEnv)(targetProjectAccountId));
31
+ const env = (0, environment_1.getValidEnv)((0, config_2.getEnv)(targetProjectAccountId));
31
32
  if (!targetProjectAccountId) {
32
33
  process.exit(exitCodes_1.EXIT_CODES.ERROR);
33
34
  }
@@ -60,32 +61,54 @@ async function unifiedProjectDevFlow(args, accountConfig, projectConfig, project
60
61
  process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
61
62
  }
62
63
  // @TODO Validate component types (i.e. previously you could not have both private and public apps)
63
- const accounts = (0, config_1.getConfigAccounts)();
64
- // TODO Ideally this should require the user to target a Combined account
65
- // For now, check if the account is either developer or standard
66
- const derivedAccountIsRecommendedType = (0, accountTypes_1.isAppDeveloperAccount)(accountConfig) || (0, accountTypes_1.isStandardAccount)(accountConfig);
67
- if (!derivedAccountIsRecommendedType && !profileConfig) {
68
- logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.invalidUnifiedAppsAccount`), {
69
- authCommand: (0, ui_1.uiCommandReference)('hs auth'),
70
- });
71
- process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
64
+ const accounts = (0, config_2.getConfigAccounts)();
65
+ const accountIsCombined = await (0, accountTypes_1.isUnifiedAccount)(accountConfig);
66
+ if (!accountIsCombined && !profileConfig) {
67
+ logger_1.logger.log('');
68
+ logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.dev.errors.accountNotCombined`, {
69
+ accountUseCommand: (0, ui_1.uiCommandReference)('hs account use'),
70
+ }));
71
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
72
72
  }
73
73
  let targetTestingAccountId = null;
74
74
  if (profileConfig) {
75
75
  // Bypass the prompt for the testing account if the user has a profile configured
76
76
  targetTestingAccountId = profileConfig.accountId;
77
77
  }
78
+ else if (args.providedAccountId) {
79
+ // By pass the prompt if the user explicitly provides an --account flag.
80
+ targetTestingAccountId = targetProjectAccountId;
81
+ }
78
82
  else {
79
- const devAccountPromptResponse = await (0, projectDevTargetAccountPrompt_1.selectDeveloperTestTargetAccountPrompt)(accounts, accountConfig);
80
- targetTestingAccountId = devAccountPromptResponse.targetAccountId;
81
- if (!!devAccountPromptResponse.notInConfigAccount) {
82
- // When the developer test account isn't configured in the CLI config yet
83
- // Walk the user through adding the account's PAK to the config
84
- await (0, helpers_1.useExistingDevTestAccount)(env, devAccountPromptResponse.notInConfigAccount);
83
+ logger_1.logger.log('');
84
+ (0, ui_1.uiLine)();
85
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.accountTypeInformation`));
86
+ logger_1.logger.log('');
87
+ logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.learnMoreMessage`, {
88
+ learnMoreLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`commands.project.subcommands.dev.logs.learnMoreLink`), 'https://developers.hubspot.com/docs/getting-started/account-types'),
89
+ }));
90
+ (0, ui_1.uiLine)();
91
+ logger_1.logger.log('');
92
+ const accountType = await (0, helpers_1.selectAccountTypePrompt)(accountConfig);
93
+ if (accountType === config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPER_TEST) {
94
+ const devAccountPromptResponse = await (0, projectDevTargetAccountPrompt_1.selectDeveloperTestTargetAccountPrompt)(accounts, accountConfig);
95
+ targetTestingAccountId = devAccountPromptResponse.targetAccountId;
96
+ if (!!devAccountPromptResponse.notInConfigAccount) {
97
+ // When the developer test account isn't configured in the CLI config yet
98
+ // Walk the user through adding the account's PAK to the config
99
+ await (0, helpers_1.useExistingDevTestAccount)(env, devAccountPromptResponse.notInConfigAccount);
100
+ }
101
+ else if (devAccountPromptResponse.createNestedAccount) {
102
+ // Create a new developer test account and automatically add it to the CLI config
103
+ targetTestingAccountId = await (0, helpers_1.createDeveloperTestAccountForLocalDev)(targetProjectAccountId, accountConfig, env);
104
+ }
105
+ }
106
+ else if (accountType === config_1.HUBSPOT_ACCOUNT_TYPES.DEVELOPMENT_SANDBOX) {
107
+ const sandboxAccountPromptResponse = await (0, projectDevTargetAccountPrompt_1.selectSandboxTargetAccountPrompt)(accounts, accountConfig);
108
+ targetTestingAccountId = sandboxAccountPromptResponse.targetAccountId;
85
109
  }
86
- else if (devAccountPromptResponse.createNestedAccount) {
87
- // Create a new developer test account and automatically add it to the CLI config
88
- targetTestingAccountId = await (0, helpers_1.createDeveloperTestAccountForLocalDev)(targetProjectAccountId, accountConfig, env);
110
+ else {
111
+ targetTestingAccountId = targetProjectAccountId;
89
112
  }
90
113
  }
91
114
  // Check if project exists in HubSpot
@@ -17,11 +17,11 @@ const yargsUtils_1 = require("../../../lib/yargsUtils");
17
17
  const en_1 = require("../../../lang/en");
18
18
  const promptUtils_1 = require("../../../lib/prompts/promptUtils");
19
19
  const validation_1 = require("../../../lib/validation");
20
+ const errorHandlers_1 = require("../../../lib/errorHandlers");
20
21
  const command = 'add [name]';
21
22
  const describe = (0, ui_1.uiBetaTag)(en_1.commands.project.profile.add.describe, false);
22
23
  const verboseDescribe = (0, ui_1.uiBetaTag)(en_1.commands.project.profile.add.verboseDescribe, false);
23
- async function selectProfileToCopyVariablesFrom(projectSourceDir) {
24
- const existingProfiles = await (0, project_parsing_lib_1.getAllHsProfiles)(projectSourceDir);
24
+ async function selectProfileToCopyVariablesFrom(existingProfiles) {
25
25
  let profileToCopyVariablesFrom;
26
26
  if (existingProfiles.length == 1) {
27
27
  logger_1.uiLogger.log('');
@@ -65,7 +65,7 @@ async function handler(args) {
65
65
  }
66
66
  const projectSourceDir = path_1.default.join(projectDir, projectConfig.srcDir);
67
67
  let profileName = args.name;
68
- let targetAccount = args.targetAccount;
68
+ let targetAccountId = args.targetAccount;
69
69
  function checkIfProfileExists(profileName) {
70
70
  return (0, validation_1.fileExists)(path_1.default.join(projectSourceDir, (0, project_parsing_lib_1.getHsProfileFilename)(profileName)));
71
71
  }
@@ -106,18 +106,18 @@ async function handler(args) {
106
106
  });
107
107
  profileName = promptResponse.name;
108
108
  }
109
- if (targetAccount) {
110
- const accountId = (0, config_1.getAccountId)(targetAccount);
109
+ if (targetAccountId) {
110
+ const accountId = (0, config_1.getAccountId)(targetAccountId);
111
111
  if (accountId) {
112
- targetAccount = accountId;
112
+ targetAccountId = accountId;
113
113
  }
114
114
  else {
115
115
  logger_1.uiLogger.error(en_1.commands.project.profile.add.errors.invalidTargetAccount);
116
116
  logger_1.uiLogger.log('');
117
- targetAccount = undefined;
117
+ targetAccountId = undefined;
118
118
  }
119
119
  }
120
- if (!targetAccount) {
120
+ if (!targetAccountId) {
121
121
  const configuredAccounts = (0, config_1.getConfigAccounts)();
122
122
  if (!configuredAccounts || !configuredAccounts.length) {
123
123
  logger_1.uiLogger.error(en_1.commands.project.profile.add.errors.noAccountsConfigured);
@@ -133,14 +133,33 @@ async function handler(args) {
133
133
  }),
134
134
  });
135
135
  if (promptResponse) {
136
- targetAccount = promptResponse;
136
+ targetAccountId = promptResponse;
137
+ }
138
+ }
139
+ const existingProfiles = await (0, project_parsing_lib_1.getAllHsProfiles)(projectSourceDir);
140
+ let existingTargetAccountIdSelected = false;
141
+ for (const profile of existingProfiles) {
142
+ try {
143
+ const loadedProfile = (0, project_parsing_lib_1.loadHsProfileFile)(projectSourceDir, profile);
144
+ if (loadedProfile?.accountId === targetAccountId) {
145
+ existingTargetAccountIdSelected = true;
146
+ break;
147
+ }
148
+ }
149
+ catch (err) {
150
+ // Skip profiles that can't be loaded
151
+ (0, errorHandlers_1.debugError)(err);
137
152
  }
138
153
  }
154
+ if (existingTargetAccountIdSelected) {
155
+ logger_1.uiLogger.log('');
156
+ logger_1.uiLogger.warn(en_1.commands.project.profile.add.warnings.duplicateTargetAccount(targetAccountId));
157
+ }
139
158
  const profileFileContent = {
140
- accountId: Number(targetAccount),
159
+ accountId: targetAccountId,
141
160
  variables: {},
142
161
  };
143
- const profileToCopyVariablesFrom = await selectProfileToCopyVariablesFrom(projectSourceDir);
162
+ const profileToCopyVariablesFrom = await selectProfileToCopyVariablesFrom(existingProfiles);
144
163
  if (profileToCopyVariablesFrom) {
145
164
  try {
146
165
  const profileToCopyFileContent = (0, project_parsing_lib_1.loadHsProfileFile)(projectSourceDir, profileToCopyVariablesFrom);
@@ -0,0 +1,6 @@
1
+ import { YargsCommandModule, CommonArgs } from '../../../types/Yargs';
2
+ type ProjectProfileDeleteArgs = CommonArgs & {
3
+ name?: string;
4
+ };
5
+ declare const projectProfileDeleteCommand: YargsCommandModule<unknown, ProjectProfileDeleteArgs>;
6
+ export default projectProfileDeleteCommand;