@hubspot/cli 7.1.1 → 7.2.0-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 (111) hide show
  1. package/commands/create/api-sample.js +14 -4
  2. package/commands/customObject/create.d.ts +11 -0
  3. package/commands/customObject/create.js +37 -28
  4. package/commands/customObject/schema/create.d.ts +10 -0
  5. package/commands/customObject/schema/create.js +40 -42
  6. package/commands/customObject/schema/delete.d.ts +11 -0
  7. package/commands/customObject/schema/delete.js +34 -27
  8. package/commands/customObject/schema/fetch-all.d.ts +10 -0
  9. package/commands/customObject/schema/fetch-all.js +31 -24
  10. package/commands/customObject/schema/fetch.d.ts +11 -0
  11. package/commands/customObject/schema/fetch.js +34 -42
  12. package/commands/customObject/schema/list.d.ts +7 -0
  13. package/commands/customObject/schema/list.js +23 -14
  14. package/commands/customObject/schema/update.d.ts +11 -0
  15. package/commands/customObject/schema/update.js +44 -46
  16. package/commands/customObject/schema.d.ts +5 -1
  17. package/commands/customObject/schema.js +49 -11
  18. package/commands/customObject.d.ts +4 -1
  19. package/commands/customObject.js +54 -21
  20. package/commands/filemanager/fetch.d.ts +12 -0
  21. package/commands/filemanager/fetch.js +33 -30
  22. package/commands/filemanager/upload.d.ts +11 -0
  23. package/commands/filemanager/upload.js +53 -47
  24. package/commands/filemanager.d.ts +4 -1
  25. package/commands/filemanager.js +41 -7
  26. package/commands/hubdb/clear.d.ts +11 -0
  27. package/commands/hubdb/clear.js +33 -30
  28. package/commands/hubdb/create.d.ts +10 -0
  29. package/commands/hubdb/create.js +46 -40
  30. package/commands/hubdb/delete.d.ts +10 -0
  31. package/commands/hubdb/delete.js +38 -35
  32. package/commands/hubdb/fetch.d.ts +11 -0
  33. package/commands/hubdb/fetch.js +30 -27
  34. package/commands/hubdb.d.ts +4 -1
  35. package/commands/hubdb.js +45 -11
  36. package/commands/project/add.js +62 -16
  37. package/commands/project/cloneApp.js +3 -3
  38. package/commands/project/create.js +70 -15
  39. package/commands/project/dev.d.ts +7 -0
  40. package/commands/project/dev.js +96 -75
  41. package/commands/project/migrateApp.js +3 -3
  42. package/commands/project/upload.js +7 -2
  43. package/commands/sandbox/create.d.ts +12 -0
  44. package/commands/sandbox/create.js +90 -72
  45. package/commands/sandbox/delete.d.ts +11 -0
  46. package/commands/sandbox/delete.js +112 -95
  47. package/commands/sandbox.d.ts +4 -1
  48. package/commands/sandbox.js +44 -10
  49. package/commands/secret/addSecret.d.ts +10 -0
  50. package/commands/secret/addSecret.js +32 -31
  51. package/commands/secret/deleteSecret.d.ts +11 -0
  52. package/commands/secret/deleteSecret.js +31 -29
  53. package/commands/secret/listSecret.d.ts +9 -0
  54. package/commands/secret/listSecret.js +41 -0
  55. package/commands/secret/updateSecret.d.ts +10 -0
  56. package/commands/secret/updateSecret.js +33 -31
  57. package/commands/secret.d.ts +4 -1
  58. package/commands/secret.js +46 -12
  59. package/commands/theme/generate-selectors.d.ts +9 -0
  60. package/commands/theme/generate-selectors.js +61 -43
  61. package/commands/theme/marketplace-validate.d.ts +10 -0
  62. package/commands/theme/marketplace-validate.js +32 -26
  63. package/commands/theme/preview.d.ts +16 -0
  64. package/commands/theme/preview.js +104 -97
  65. package/commands/theme.d.ts +4 -1
  66. package/commands/theme.js +44 -10
  67. package/lang/en.lyaml +35 -16
  68. package/lib/LocalDevManager.d.ts +2 -2
  69. package/lib/buildAccount.d.ts +2 -3
  70. package/lib/constants.d.ts +0 -3
  71. package/lib/constants.js +1 -4
  72. package/lib/customObject.d.ts +3 -0
  73. package/lib/customObject.js +15 -0
  74. package/lib/doctor/DiagnosticInfoBuilder.d.ts +6 -0
  75. package/lib/doctor/DiagnosticInfoBuilder.js +5 -0
  76. package/lib/doctor/Doctor.d.ts +1 -0
  77. package/lib/doctor/Doctor.js +10 -0
  78. package/lib/localDev.d.ts +2 -1
  79. package/lib/marketplaceValidate.d.ts +2 -2
  80. package/lib/process.d.ts +1 -0
  81. package/lib/process.js +11 -10
  82. package/lib/projects/buildAndDeploy.js +4 -1
  83. package/lib/projects/create.d.ts +5 -0
  84. package/lib/projects/create.js +51 -0
  85. package/lib/projects/index.d.ts +1 -5
  86. package/lib/projects/index.js +1 -62
  87. package/lib/projects/upload.d.ts +1 -1
  88. package/lib/projects/upload.js +2 -2
  89. package/lib/prompts/createProjectPrompt.d.ts +6 -8
  90. package/lib/prompts/createProjectPrompt.js +26 -54
  91. package/lib/prompts/projectAddPrompt.d.ts +3 -3
  92. package/lib/prompts/projectAddPrompt.js +16 -6
  93. package/lib/prompts/projectDevTargetAccountPrompt.d.ts +3 -2
  94. package/lib/prompts/sandboxesPrompt.d.ts +3 -2
  95. package/lib/prompts/sandboxesPrompt.js +1 -1
  96. package/lib/sandboxSync.js +6 -2
  97. package/lib/sandboxes.d.ts +2 -5
  98. package/lib/testUtils.d.ts +12 -0
  99. package/lib/testUtils.js +10 -0
  100. package/lib/ui/index.d.ts +2 -2
  101. package/lib/ui/index.js +1 -0
  102. package/lib/upload.d.ts +1 -1
  103. package/lib/upload.js +20 -20
  104. package/lib/validation.d.ts +1 -1
  105. package/package.json +5 -4
  106. package/types/Projects.d.ts +1 -6
  107. package/types/Prompts.d.ts +7 -0
  108. package/types/Sandboxes.d.ts +2 -0
  109. package/types/Yargs.d.ts +14 -0
  110. package/commands/secret/listSecrets.d.ts +0 -1
  111. package/commands/secret/listSecrets.js +0 -39
@@ -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,32 +1,86 @@
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([
@@ -35,6 +89,7 @@ exports.handler = async (options) => {
35
89
  'feedbackCommand',
36
90
  'sampleProjects',
37
91
  ]);
92
+ process.exit(EXIT_CODES.SUCCESS);
38
93
  };
39
94
  exports.builder = yargs => {
40
95
  yargs.options({
@@ -1 +1,8 @@
1
+ import { ArgumentsCamelCase, Argv } from 'yargs';
2
+ import { CommonArgs, ConfigArgs, EnvironmentArgs } from '../../types/Yargs';
3
+ export declare const command = "dev";
4
+ export declare const describe: string | undefined;
5
+ type ProjectDevArgs = CommonArgs & ConfigArgs & EnvironmentArgs;
6
+ export declare function handler(args: ArgumentsCamelCase<ProjectDevArgs>): Promise<void>;
7
+ export declare function builder(yargs: Argv): Argv<ProjectDevArgs>;
1
8
  export {};
@@ -1,57 +1,75 @@
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 { addAccountOptions, addConfigOptions, addUseEnvironmentOptions, addTestingOptions, } = require('../../lib/commonOpts');
5
- const { trackCommandUsage } = require('../../lib/usageTracking');
6
- const { handleExit } = require('../../lib/process');
7
- const { i18n } = require('../../lib/lang');
8
- const { logger } = require('@hubspot/local-dev-lib/logger');
9
- const { getConfigAccounts, getAccountConfig, getEnv, } = require('@hubspot/local-dev-lib/config');
10
- const { getProjectConfig, ensureProjectExists, validateProjectConfig, } = require('../../lib/projects');
11
- const { EXIT_CODES } = require('../../lib/enums/exitCodes');
12
- const { uiBetaTag, uiCommandReference, uiLink } = require('../../lib/ui');
13
- const SpinniesManager = require('../../lib/ui/SpinniesManager');
14
- const LocalDevManager = require('../../lib/LocalDevManager');
15
- const { isSandbox, isDeveloperTestAccount, isStandardAccount, isAppDeveloperAccount, } = require('../../lib/accountTypes');
16
- const { getValidEnv } = require('@hubspot/local-dev-lib/environment');
17
- const { ComponentTypes } = require('../../types/Projects');
18
- const { findProjectComponents, getProjectComponentTypes, } = require('../../lib/projects/structure');
19
- const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, checkIfDefaultAccountIsSupported, createSandboxForLocalDev, createDeveloperTestAccountForLocalDev, createNewProjectForLocalDev, createInitialBuildForNewProject, useExistingDevTestAccount, checkIfAccountFlagIsSupported, checkIfParentAccountIsAuthed, } = require('../../lib/localDev');
6
+ exports.describe = exports.command = void 0;
7
+ exports.handler = handler;
8
+ exports.builder = builder;
9
+ const commonOpts_1 = require("../../lib/commonOpts");
10
+ const usageTracking_1 = require("../../lib/usageTracking");
11
+ const process_1 = require("../../lib/process");
12
+ const lang_1 = require("../../lib/lang");
13
+ const logger_1 = require("@hubspot/local-dev-lib/logger");
14
+ const config_1 = require("@hubspot/local-dev-lib/config");
15
+ const projects_1 = require("../../lib/projects");
16
+ const exitCodes_1 = require("../../lib/enums/exitCodes");
17
+ const ui_1 = require("../../lib/ui");
18
+ const SpinniesManager_1 = __importDefault(require("../../lib/ui/SpinniesManager"));
19
+ const LocalDevManager_1 = __importDefault(require("../../lib/LocalDevManager"));
20
+ const accountTypes_1 = require("../../lib/accountTypes");
21
+ const environment_1 = require("@hubspot/local-dev-lib/environment");
22
+ const Projects_1 = require("../../types/Projects");
23
+ const structure_1 = require("../../lib/projects/structure");
24
+ const localDev_1 = require("../../lib/localDev");
20
25
  const i18nKey = 'commands.project.subcommands.dev';
21
26
  exports.command = 'dev';
22
- exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
23
- exports.handler = async (options) => {
24
- const { derivedAccountId, providedAccountId } = options;
25
- const accountConfig = getAccountConfig(derivedAccountId);
26
- const env = getValidEnv(getEnv(derivedAccountId));
27
- trackCommandUsage('project-dev', null, derivedAccountId);
28
- const { projectConfig, projectDir } = await getProjectConfig();
29
- uiBetaTag(i18n(`${i18nKey}.logs.betaMessage`));
30
- logger.log(uiLink(i18n(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
31
- if (!projectConfig) {
32
- logger.error(i18n(`${i18nKey}.errors.noProjectConfig`));
33
- process.exit(EXIT_CODES.ERROR);
27
+ exports.describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.describe`), false);
28
+ async function handler(args) {
29
+ const { derivedAccountId, providedAccountId } = args;
30
+ const accountConfig = (0, config_1.getAccountConfig)(derivedAccountId);
31
+ const env = (0, environment_1.getValidEnv)((0, config_1.getEnv)(derivedAccountId));
32
+ (0, usageTracking_1.trackCommandUsage)('project-dev', {}, derivedAccountId);
33
+ const { projectConfig, projectDir } = await (0, projects_1.getProjectConfig)();
34
+ (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`${i18nKey}.logs.betaMessage`));
35
+ logger_1.logger.log((0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.logs.learnMoreLocalDevServer`), 'https://developers.hubspot.com/docs/platform/project-cli-commands#start-a-local-development-server'));
36
+ if (!projectConfig || !projectDir) {
37
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noProjectConfig`, {
38
+ accountId: derivedAccountId,
39
+ authCommand: (0, ui_1.uiCommandReference)('hs auth'),
40
+ }));
41
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
34
42
  }
35
- validateProjectConfig(projectConfig, projectDir);
36
- const components = await findProjectComponents(projectDir);
43
+ if (!accountConfig) {
44
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noAccount`));
45
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
46
+ }
47
+ (0, projects_1.validateProjectConfig)(projectConfig, projectDir);
48
+ const components = await (0, structure_1.findProjectComponents)(projectDir);
37
49
  const runnableComponents = components.filter(component => component.runnable);
38
- const componentTypes = getProjectComponentTypes(runnableComponents);
39
- const hasPrivateApps = !!componentTypes[ComponentTypes.PrivateApp];
40
- const hasPublicApps = !!componentTypes[ComponentTypes.PublicApp];
50
+ const componentTypes = (0, structure_1.getProjectComponentTypes)(runnableComponents);
51
+ const hasPrivateApps = !!componentTypes[Projects_1.ComponentTypes.PrivateApp];
52
+ const hasPublicApps = !!componentTypes[Projects_1.ComponentTypes.PublicApp];
41
53
  if (runnableComponents.length === 0) {
42
- logger.error(i18n(`${i18nKey}.errors.noRunnableComponents`, {
54
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noRunnableComponents`, {
43
55
  projectDir,
44
- command: uiCommandReference('hs project add'),
56
+ command: (0, ui_1.uiCommandReference)('hs project add'),
45
57
  }));
46
- process.exit(EXIT_CODES.SUCCESS);
58
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
47
59
  }
48
60
  else if (hasPrivateApps && hasPublicApps) {
49
- logger.error(i18n(`${i18nKey}.errors.invalidProjectComponents`));
50
- process.exit(EXIT_CODES.SUCCESS);
61
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.invalidProjectComponents`));
62
+ process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
63
+ }
64
+ const accounts = (0, config_1.getConfigAccounts)();
65
+ if (!accounts) {
66
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noAccountsInConfig`, {
67
+ authCommand: (0, ui_1.uiCommandReference)('hs auth'),
68
+ }));
69
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
51
70
  }
52
- const accounts = getConfigAccounts();
53
- const defaultAccountIsRecommendedType = isDeveloperTestAccount(accountConfig) ||
54
- (!hasPublicApps && isSandbox(accountConfig));
71
+ const defaultAccountIsRecommendedType = (0, accountTypes_1.isDeveloperTestAccount)(accountConfig) ||
72
+ (!hasPublicApps && (0, accountTypes_1.isSandbox)(accountConfig));
55
73
  // targetProjectAccountId and targetTestingAccountId are set to null if --account flag is not provided.
56
74
  // By setting them to null, we can later check if they need to be assigned based on the default account configuration and the type of app.
57
75
  let targetProjectAccountId = providedAccountId ? derivedAccountId : null;
@@ -59,21 +77,21 @@ exports.handler = async (options) => {
59
77
  let targetTestingAccountId = providedAccountId ? derivedAccountId : null;
60
78
  // Check that the default account or flag option is valid for the type of app in this project
61
79
  if (providedAccountId) {
62
- checkIfAccountFlagIsSupported(accountConfig, hasPublicApps);
80
+ (0, localDev_1.checkIfAccountFlagIsSupported)(accountConfig, hasPublicApps);
63
81
  if (hasPublicApps) {
64
- targetProjectAccountId = accountConfig.parentAccountId;
82
+ targetProjectAccountId = accountConfig.parentAccountId || null;
65
83
  }
66
84
  }
67
85
  else {
68
- checkIfDefaultAccountIsSupported(accountConfig, hasPublicApps);
86
+ (0, localDev_1.checkIfDefaultAccountIsSupported)(accountConfig, hasPublicApps);
69
87
  }
70
88
  // The user is targeting an account type that we recommend developing on
71
89
  if (!targetProjectAccountId && defaultAccountIsRecommendedType) {
72
90
  targetTestingAccountId = derivedAccountId;
73
- await confirmDefaultAccountIsTarget(accountConfig, hasPublicApps);
91
+ await (0, localDev_1.confirmDefaultAccountIsTarget)(accountConfig);
74
92
  if (hasPublicApps) {
75
- checkIfParentAccountIsAuthed(accountConfig);
76
- targetProjectAccountId = accountConfig.parentAccountId;
93
+ (0, localDev_1.checkIfParentAccountIsAuthed)(accountConfig);
94
+ targetProjectAccountId = accountConfig.parentAccountId || null;
77
95
  }
78
96
  else {
79
97
  targetProjectAccountId = derivedAccountId;
@@ -82,48 +100,52 @@ exports.handler = async (options) => {
82
100
  let createNewSandbox = false;
83
101
  let createNewDeveloperTestAccount = false;
84
102
  if (!targetProjectAccountId) {
85
- const { targetAccountId, parentAccountId, createNestedAccount, notInConfigAccount, } = await suggestRecommendedNestedAccount(accounts, accountConfig, hasPublicApps);
86
- targetProjectAccountId = hasPublicApps ? parentAccountId : targetAccountId;
103
+ const { targetAccountId, parentAccountId, createNestedAccount, notInConfigAccount, } = await (0, localDev_1.suggestRecommendedNestedAccount)(accounts, accountConfig, hasPublicApps);
104
+ targetProjectAccountId = hasPublicApps
105
+ ? parentAccountId || null
106
+ : targetAccountId;
87
107
  targetTestingAccountId = targetAccountId;
88
108
  // Only used for developer test accounts that are not yet in the config
89
109
  if (notInConfigAccount) {
90
- await useExistingDevTestAccount(env, notInConfigAccount);
110
+ await (0, localDev_1.useExistingDevTestAccount)(env, notInConfigAccount);
91
111
  }
92
- createNewSandbox = isStandardAccount(accountConfig) && createNestedAccount;
112
+ createNewSandbox = (0, accountTypes_1.isStandardAccount)(accountConfig) && createNestedAccount;
93
113
  createNewDeveloperTestAccount =
94
- isAppDeveloperAccount(accountConfig) && createNestedAccount;
114
+ (0, accountTypes_1.isAppDeveloperAccount)(accountConfig) && createNestedAccount;
95
115
  }
96
116
  if (createNewSandbox) {
97
- targetProjectAccountId = await createSandboxForLocalDev(derivedAccountId, accountConfig, env);
117
+ targetProjectAccountId = await (0, localDev_1.createSandboxForLocalDev)(derivedAccountId, accountConfig, env);
98
118
  // We will be running our tests against this new sandbox account
99
119
  targetTestingAccountId = targetProjectAccountId;
100
120
  }
101
121
  if (createNewDeveloperTestAccount) {
102
- targetTestingAccountId = await createDeveloperTestAccountForLocalDev(derivedAccountId, accountConfig, env);
122
+ targetTestingAccountId = await (0, localDev_1.createDeveloperTestAccountForLocalDev)(derivedAccountId, accountConfig, env);
103
123
  targetProjectAccountId = derivedAccountId;
104
124
  }
125
+ if (!targetProjectAccountId || !targetTestingAccountId) {
126
+ logger_1.logger.error((0, lang_1.i18n)(`${i18nKey}.errors.noAccount`));
127
+ process.exit(exitCodes_1.EXIT_CODES.ERROR);
128
+ }
105
129
  // eslint-disable-next-line prefer-const
106
- let { projectExists, project } = await ensureProjectExists(targetProjectAccountId, projectConfig.name, {
130
+ let { projectExists, project } = await (0, projects_1.ensureProjectExists)(targetProjectAccountId, projectConfig.name, {
107
131
  allowCreate: false,
108
132
  noLogs: true,
109
133
  withPolling: createNewSandbox,
110
134
  });
111
135
  let deployedBuild;
112
- let isGithubLinked;
113
- SpinniesManager.init();
114
- if (projectExists) {
136
+ let isGithubLinked = false;
137
+ SpinniesManager_1.default.init();
138
+ if (projectExists && project) {
115
139
  deployedBuild = project.deployedBuild;
116
- isGithubLinked =
117
- project.sourceIntegration &&
118
- project.sourceIntegration.source === 'GITHUB';
140
+ isGithubLinked = Boolean(project.sourceIntegration && project.sourceIntegration.source === 'GITHUB');
119
141
  }
120
142
  else {
121
- project = await createNewProjectForLocalDev(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
122
- deployedBuild = await createInitialBuildForNewProject(projectConfig, projectDir, targetProjectAccountId);
143
+ project = await (0, localDev_1.createNewProjectForLocalDev)(projectConfig, targetProjectAccountId, createNewSandbox, hasPublicApps);
144
+ deployedBuild = await (0, localDev_1.createInitialBuildForNewProject)(projectConfig, projectDir, targetProjectAccountId);
123
145
  }
124
- const LocalDev = new LocalDevManager({
146
+ const LocalDev = new LocalDevManager_1.default({
125
147
  runnableComponents,
126
- debug: options.debug,
148
+ debug: args.debug,
127
149
  deployedBuild,
128
150
  isGithubLinked,
129
151
  parentAccountId: targetProjectAccountId,
@@ -134,13 +156,12 @@ exports.handler = async (options) => {
134
156
  env,
135
157
  });
136
158
  await LocalDev.start();
137
- handleExit(({ isSIGHUP }) => LocalDev.stop(!isSIGHUP));
138
- };
139
- exports.builder = yargs => {
140
- addConfigOptions(yargs);
141
- addAccountOptions(yargs);
142
- addUseEnvironmentOptions(yargs);
143
- addTestingOptions(yargs);
144
- yargs.example([['$0 project dev', i18n(`${i18nKey}.examples.default`)]]);
159
+ (0, process_1.handleExit)(({ isSIGHUP }) => LocalDev.stop(!isSIGHUP));
160
+ }
161
+ function builder(yargs) {
162
+ (0, commonOpts_1.addConfigOptions)(yargs);
163
+ (0, commonOpts_1.addAccountOptions)(yargs);
164
+ (0, commonOpts_1.addUseEnvironmentOptions)(yargs);
165
+ yargs.example([['$0 project dev', (0, lang_1.i18n)(`${i18nKey}.examples.default`)]]);
145
166
  return yargs;
146
- };
167
+ }
@@ -71,9 +71,9 @@ exports.handler = async (options) => {
71
71
  let projectName;
72
72
  let projectDest;
73
73
  try {
74
- const { name, dest } = await createProjectPrompt('', options, true);
75
- projectName = options.name || name;
76
- projectDest = options.dest || dest;
74
+ const createProjectPromptResponse = await createProjectPrompt(options);
75
+ projectName = createProjectPromptResponse.name;
76
+ projectDest = createProjectPromptResponse.dest;
77
77
  const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
78
78
  allowCreate: false,
79
79
  noLogs: true,
@@ -20,7 +20,7 @@ const i18nKey = 'commands.project.subcommands.upload';
20
20
  exports.command = 'upload';
21
21
  exports.describe = uiBetaTag(i18n(`${i18nKey}.describe`), false);
22
22
  exports.handler = async (options) => {
23
- const { forceCreate, message, derivedAccountId } = options;
23
+ const { forceCreate, message, derivedAccountId, skipValidation } = options;
24
24
  const accountConfig = getAccountConfig(derivedAccountId);
25
25
  const accountType = accountConfig && accountConfig.accountType;
26
26
  const { projectConfig, projectDir } = await getProjectConfig();
@@ -31,7 +31,7 @@ exports.handler = async (options) => {
31
31
  uploadCommand: true,
32
32
  });
33
33
  try {
34
- const { result, uploadError } = await handleProjectUpload(derivedAccountId, projectConfig, projectDir, pollProjectBuildAndDeploy, message, useV3Api(projectConfig?.platformVersion));
34
+ const { result, uploadError } = await handleProjectUpload(derivedAccountId, projectConfig, projectDir, pollProjectBuildAndDeploy, message, useV3Api(projectConfig?.platformVersion), skipValidation);
35
35
  if (uploadError) {
36
36
  if (isSpecifiedError(uploadError, {
37
37
  subCategory: PROJECT_ERROR_TYPES.PROJECT_LOCKED,
@@ -81,6 +81,11 @@ exports.builder = yargs => {
81
81
  type: 'string',
82
82
  default: '',
83
83
  },
84
+ 'skip-validation': {
85
+ type: 'boolean',
86
+ hidden: true,
87
+ default: false,
88
+ },
84
89
  });
85
90
  yargs.example([['$0 project upload', i18n(`${i18nKey}.examples.default`)]]);
86
91
  addConfigOptions(yargs);
@@ -1 +1,13 @@
1
+ import { Argv, ArgumentsCamelCase } from 'yargs';
2
+ import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, TestingArgs } from '../../types/Yargs';
3
+ export declare const command = "create";
4
+ export declare const describe: string | undefined;
5
+ type CombinedArgs = ConfigArgs & AccountArgs & EnvironmentArgs & TestingArgs;
6
+ type SandboxCreateArgs = CommonArgs & CombinedArgs & {
7
+ name?: string;
8
+ force?: boolean;
9
+ type?: string;
10
+ };
11
+ export declare function handler(args: ArgumentsCamelCase<SandboxCreateArgs>): Promise<void>;
12
+ export declare function builder(yargs: Argv): Argv<SandboxCreateArgs>;
1
13
  export {};