@hubspot/cli 8.14.0 → 8.15.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 (109) hide show
  1. package/commands/cms/theme/preview.js +8 -1
  2. package/commands/getStarted.js +16 -21
  3. package/commands/project/add.js +7 -6
  4. package/commands/project/appInstallStatus.d.ts +1 -1
  5. package/commands/project/appInstallStatus.js +8 -4
  6. package/commands/project/create.js +24 -7
  7. package/commands/project/delete.js +1 -1
  8. package/commands/project/deploy.d.ts +1 -1
  9. package/commands/project/deploy.js +14 -12
  10. package/commands/project/dev/index.js +4 -7
  11. package/commands/project/download.d.ts +3 -2
  12. package/commands/project/download.js +18 -5
  13. package/commands/project/info.d.ts +1 -1
  14. package/commands/project/info.js +8 -5
  15. package/commands/project/installApp.d.ts +1 -1
  16. package/commands/project/installApp.js +9 -4
  17. package/commands/project/installDeps.js +6 -5
  18. package/commands/project/lint.js +16 -9
  19. package/commands/project/list.d.ts +3 -2
  20. package/commands/project/list.js +21 -3
  21. package/commands/project/listBuilds.d.ts +1 -1
  22. package/commands/project/listBuilds.js +4 -8
  23. package/commands/project/migrate.js +14 -19
  24. package/commands/project/open.js +15 -7
  25. package/commands/project/profile/add.js +8 -4
  26. package/commands/project/profile/delete.js +8 -4
  27. package/commands/project/release/create.d.ts +1 -1
  28. package/commands/project/release/create.js +5 -7
  29. package/commands/project/release/info.d.ts +1 -1
  30. package/commands/project/release/info.js +4 -4
  31. package/commands/project/release/list.d.ts +1 -1
  32. package/commands/project/release/list.js +4 -4
  33. package/commands/project/updateDeps.js +6 -5
  34. package/commands/project/upload.d.ts +1 -1
  35. package/commands/project/upload.js +26 -15
  36. package/commands/project/validate.d.ts +3 -2
  37. package/commands/project/validate.js +67 -97
  38. package/commands/project/watch.js +8 -11
  39. package/commands/project.js +1 -1
  40. package/commands/testAccount/create.d.ts +1 -1
  41. package/commands/testAccount/create.js +1 -1
  42. package/lang/en.d.ts +9 -19
  43. package/lang/en.js +9 -19
  44. package/lib/app/migrate.js +5 -7
  45. package/lib/constants.d.ts +0 -1
  46. package/lib/constants.js +0 -1
  47. package/lib/dependencyManagement.js +3 -10
  48. package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -2
  49. package/lib/doctor/DiagnosticInfoBuilder.js +8 -8
  50. package/lib/doctor/Doctor.js +7 -9
  51. package/lib/errors/ProjectErrors.d.ts +0 -6
  52. package/lib/errors/ProjectErrors.js +0 -12
  53. package/lib/errors/ProjectValidationError.d.ts +2 -1
  54. package/lib/errors/ProjectValidationError.js +3 -1
  55. package/lib/filesystem.d.ts +6 -0
  56. package/lib/filesystem.js +9 -0
  57. package/lib/getStartedV2Actions.js +14 -18
  58. package/lib/jsonOutput/appInstallStatus.d.ts +14 -0
  59. package/lib/jsonOutput/appInstallStatus.js +14 -0
  60. package/lib/jsonOutput/createTestAccount.d.ts +7 -0
  61. package/lib/jsonOutput/createTestAccount.js +6 -0
  62. package/lib/jsonOutput/deploy.d.ts +5 -0
  63. package/lib/jsonOutput/deploy.js +4 -0
  64. package/lib/jsonOutput/download.d.ts +7 -0
  65. package/lib/jsonOutput/download.js +6 -0
  66. package/lib/jsonOutput/info.d.ts +21 -0
  67. package/lib/jsonOutput/info.js +19 -0
  68. package/lib/jsonOutput/installApp.d.ts +11 -0
  69. package/lib/jsonOutput/installApp.js +10 -0
  70. package/lib/jsonOutput/listBuilds.d.ts +75 -0
  71. package/lib/jsonOutput/listBuilds.js +65 -0
  72. package/lib/jsonOutput/projectList.d.ts +29 -0
  73. package/lib/jsonOutput/projectList.js +28 -0
  74. package/lib/jsonOutput/release.d.ts +42 -0
  75. package/lib/jsonOutput/release.js +37 -0
  76. package/lib/jsonOutput/upload.d.ts +29 -0
  77. package/lib/jsonOutput/upload.js +23 -0
  78. package/lib/jsonOutput/validate.d.ts +36 -0
  79. package/lib/jsonOutput/validate.js +20 -0
  80. package/lib/npm/packageJson.js +1 -1
  81. package/lib/projects/ProjectLogsManager.js +1 -4
  82. package/lib/projects/config.d.ts +6 -5
  83. package/lib/projects/config.js +7 -38
  84. package/lib/projects/create/tracking.d.ts +1 -0
  85. package/lib/projects/create/tracking.js +27 -0
  86. package/lib/projects/delete.js +14 -1
  87. package/lib/projects/localDev/LocalDevProcess.js +7 -7
  88. package/lib/projects/projectProfiles.d.ts +3 -2
  89. package/lib/projects/projectProfiles.js +8 -3
  90. package/lib/projects/release.js +1 -1
  91. package/lib/projects/uieLinting.d.ts +2 -0
  92. package/lib/projects/uieLinting.js +13 -11
  93. package/lib/projects/upload.d.ts +5 -1
  94. package/lib/projects/upload.js +6 -1
  95. package/lib/projects/validate.d.ts +18 -0
  96. package/lib/projects/validate.js +142 -0
  97. package/lib/projects/validateLintConfigOnUpload.js +6 -5
  98. package/lib/projects/workspaces.js +6 -13
  99. package/lib/theme/migrate.js +1 -4
  100. package/mcp-server/tools/project/AddFeatureToProjectTool.d.ts +1 -1
  101. package/mcp-server/tools/project/CreateProjectTool.d.ts +1 -1
  102. package/mcp-server/tools/project/GetBuildLogsTool.js +2 -3
  103. package/mcp-server/tools/project/GetBuildStatusTool.js +2 -3
  104. package/mcp-server/tools/project/UploadProjectTools.js +3 -5
  105. package/mcp-server/tools/project/constants.d.ts +1 -1
  106. package/package.json +3 -3
  107. package/types/Projects.d.ts +1 -5
  108. package/lib/jsonOutput.d.ts +0 -182
  109. package/lib/jsonOutput.js +0 -158
@@ -6,6 +6,7 @@ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
6
6
  import { uiLogger } from '../../lib/ui/logger.js';
7
7
  import { commands } from '../../lang/en.js';
8
8
  import { renderTable } from '../../ui/render.js';
9
+ import { ProjectListSchema, mapProjectToListItem, } from '../../lib/jsonOutput/projectList.js';
9
10
  const command = ['list', 'ls'];
10
11
  const describe = commands.project.list.describe;
11
12
  async function getProjectData(accountId) {
@@ -23,7 +24,7 @@ function formatProjectsAsTableRows(projects) {
23
24
  return projectListData;
24
25
  }
25
26
  async function handler(args) {
26
- const { derivedAccountId, exit } = args;
27
+ const { derivedAccountId, formatOutputAsJson, exit, addJsonOutput } = args;
27
28
  let projectData;
28
29
  try {
29
30
  projectData = await getProjectData(derivedAccountId);
@@ -33,9 +34,20 @@ async function handler(args) {
33
34
  return exit(EXIT_CODES.ERROR);
34
35
  }
35
36
  if (projectData.length === 0) {
37
+ if (formatOutputAsJson) {
38
+ addJsonOutput({ accountId: derivedAccountId, results: [] });
39
+ return exit(EXIT_CODES.SUCCESS);
40
+ }
36
41
  uiLogger.error(commands.project.list.errors.noProjectsFound(derivedAccountId));
37
42
  return exit(EXIT_CODES.ERROR);
38
43
  }
44
+ if (formatOutputAsJson) {
45
+ addJsonOutput({
46
+ accountId: derivedAccountId,
47
+ results: projectData.map(mapProjectToListItem),
48
+ });
49
+ return exit(EXIT_CODES.SUCCESS);
50
+ }
39
51
  const projectListData = formatProjectsAsTableRows(projectData);
40
52
  const tableHeader = [
41
53
  commands.project.list.labels.name,
@@ -45,7 +57,10 @@ async function handler(args) {
45
57
  renderTable(tableHeader, projectListData);
46
58
  }
47
59
  function projectListBuilder(yargs) {
48
- yargs.example([['$0 project list']]);
60
+ yargs.example([
61
+ ['$0 project list', commands.project.list.examples.default],
62
+ ['$0 project list --json', commands.project.list.examples.json],
63
+ ]);
49
64
  return yargs;
50
65
  }
51
66
  const builder = makeYargsBuilder(projectListBuilder, command, describe, {
@@ -53,11 +68,14 @@ const builder = makeYargsBuilder(projectListBuilder, command, describe, {
53
68
  useConfigOptions: true,
54
69
  useAccountOptions: true,
55
70
  useEnvironmentOptions: true,
71
+ useJSONOutputOptions: true,
56
72
  });
57
73
  const projectListCommand = {
58
74
  command,
59
75
  describe,
60
- handler: makeWrappedYargsHandler('project-list', handler),
76
+ handler: makeWrappedYargsHandler('project-list', handler, {
77
+ jsonOutputSchema: ProjectListSchema,
78
+ }),
61
79
  builder,
62
80
  };
63
81
  export default projectListCommand;
@@ -1,5 +1,5 @@
1
1
  import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, JSONOutputArgs, YargsCommandModule } from '../../types/Yargs.js';
2
- import { ProjectBuildsListJsonOutput } from '../../lib/jsonOutput.js';
2
+ import { ProjectBuildsListJsonOutput } from '../../lib/jsonOutput/listBuilds.js';
3
3
  export type ProjectListBuildsArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & JSONOutputArgs<ProjectBuildsListJsonOutput> & {
4
4
  project?: string;
5
5
  limit?: number;
@@ -1,7 +1,7 @@
1
1
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
2
2
  import { fetchProject, fetchProjectBuilds, } from '@hubspot/local-dev-lib/api/projects';
3
3
  import { uiLink } from '../../lib/ui/index.js';
4
- import { getProjectConfig, validateProjectConfig, } from '../../lib/projects/config.js';
4
+ import { getProjectConfig } from '../../lib/projects/config.js';
5
5
  import { getProjectDetailUrl } from '../../lib/projects/urls.js';
6
6
  import moment from 'moment';
7
7
  import { promptUser } from '../../lib/prompts/promptUtils.js';
@@ -13,7 +13,7 @@ import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
13
13
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
14
14
  import { commands } from '../../lang/en.js';
15
15
  import { renderTable } from '../../ui/render.js';
16
- import { ProjectBuildsListSchema, mapBuildToJsonOutput, } from '../../lib/jsonOutput.js';
16
+ import { ProjectBuildsListSchema, mapBuildToJsonOutput, } from '../../lib/jsonOutput/listBuilds.js';
17
17
  const command = 'list-builds';
18
18
  const describe = commands.project.listBuilds.describe;
19
19
  async function fetchAndDisplayBuilds(accountId, project, options) {
@@ -66,18 +66,14 @@ async function handler(args) {
66
66
  const { project: projectFlagValue, limit, derivedAccountId, exit, json: formatOutputAsJson, addJsonOutput, } = args;
67
67
  let projectName = projectFlagValue;
68
68
  if (!projectName) {
69
- const { projectConfig, projectDir } = await getProjectConfig();
70
69
  try {
71
- validateProjectConfig(projectConfig, projectDir);
70
+ const { projectConfig } = getProjectConfig();
71
+ projectName = projectConfig.name;
72
72
  }
73
73
  catch (error) {
74
74
  logError(error);
75
75
  return exit(EXIT_CODES.ERROR);
76
76
  }
77
- if (!projectConfig) {
78
- return exit(EXIT_CODES.ERROR);
79
- }
80
- projectName = projectConfig.name;
81
77
  }
82
78
  try {
83
79
  const { data: project } = await fetchProject(derivedAccountId, projectName);
@@ -11,48 +11,43 @@ import { uiLogger } from '../../lib/ui/logger.js';
11
11
  import { renderInline } from '../../ui/render.js';
12
12
  import { getWarningBox } from '../../ui/components/StatusMessageBoxes.js';
13
13
  import { getHasMigratableThemes, migrateThemesV2, } from '../../lib/theme/migrate.js';
14
- import { hasFeature } from '../../lib/hasFeature.js';
15
- import { FEATURES } from '../../lib/constants.js';
16
14
  import { trackCommandMetadataUsage } from '../../lib/usageTracking.js';
17
15
  const { v2025_2, v2026_03_BETA, v2026_03 } = PLATFORM_VERSIONS;
18
16
  const command = 'migrate';
19
17
  const describe = commands.project.migrate.describe;
20
18
  async function handler(args) {
21
19
  const { platformVersion, unstable, derivedAccountId, exit } = args;
22
- const projectConfig = await getProjectConfig();
23
- if (!projectConfig.projectConfig) {
20
+ let projectConfig;
21
+ let projectDir;
22
+ try {
23
+ ({ projectConfig, projectDir } = getProjectConfig());
24
+ }
25
+ catch {
24
26
  uiLogger.error(commands.project.migrate.errors.noProjectConfig(uiCommandReference('hs app migrate')));
25
27
  return exit(EXIT_CODES.ERROR);
26
28
  }
27
- if (projectConfig?.projectConfig) {
28
- await renderInline(getWarningBox({
29
- title: lib.migrate.projectMigrationWarningTitle(platformVersion),
30
- message: lib.migrate.projectMigrationWarning(platformVersion),
31
- }));
32
- }
29
+ await renderInline(getWarningBox({
30
+ title: lib.migrate.projectMigrationWarningTitle(platformVersion),
31
+ message: lib.migrate.projectMigrationWarning(platformVersion),
32
+ }));
33
33
  try {
34
- const { hasMigratableThemes, migratableThemesCount } = await getHasMigratableThemes(projectConfig);
34
+ const { hasMigratableThemes, migratableThemesCount } = await getHasMigratableThemes({ projectConfig, projectDir });
35
35
  if (hasMigratableThemes) {
36
- const hasThemeMigrationAccess = await hasFeature(derivedAccountId, FEATURES.THEME_MIGRATION_2025_2);
37
- if (!hasThemeMigrationAccess) {
38
- uiLogger.error(commands.project.migrate.errors.noThemeMigrationAccess(derivedAccountId));
39
- return exit(EXIT_CODES.ERROR);
40
- }
41
36
  await migrateThemesV2(derivedAccountId, {
42
37
  ...args,
43
38
  platformVersion: unstable
44
39
  ? PLATFORM_VERSIONS.UNSTABLE
45
40
  : platformVersion,
46
- }, migratableThemesCount, projectConfig);
41
+ }, migratableThemesCount, { projectConfig, projectDir });
47
42
  }
48
43
  else {
49
44
  await migrateApp(derivedAccountId, {
50
45
  ...args,
51
- name: projectConfig?.projectConfig?.name,
46
+ name: projectConfig.name,
52
47
  platformVersion: unstable
53
48
  ? PLATFORM_VERSIONS.UNSTABLE
54
49
  : platformVersion,
55
- }, projectConfig);
50
+ }, { projectConfig, projectDir });
56
51
  }
57
52
  }
58
53
  catch (error) {
@@ -12,7 +12,6 @@ const command = 'open';
12
12
  const describe = commands.project.open.describe;
13
13
  async function handler(args) {
14
14
  const { project, derivedAccountId, exit } = args;
15
- const { projectConfig } = await getProjectConfig();
16
15
  let projectName = project;
17
16
  if (projectName) {
18
17
  const { projectExists } = await ensureProjectExists(derivedAccountId, projectName, {
@@ -22,12 +21,21 @@ async function handler(args) {
22
21
  return exit(EXIT_CODES.ERROR);
23
22
  }
24
23
  }
25
- else if (!projectName && projectConfig) {
26
- projectName = projectConfig.name;
27
- }
28
- else if (!projectName && !projectConfig) {
29
- const namePromptResponse = await projectNamePrompt(derivedAccountId);
30
- projectName = namePromptResponse.projectName;
24
+ else if (!projectName) {
25
+ let projectConfig;
26
+ try {
27
+ ({ projectConfig } = getProjectConfig());
28
+ }
29
+ catch {
30
+ // Not in a project directory, fall through to prompt
31
+ }
32
+ if (projectConfig) {
33
+ projectName = projectConfig.name;
34
+ }
35
+ else {
36
+ const namePromptResponse = await projectNamePrompt(derivedAccountId);
37
+ projectName = namePromptResponse.projectName;
38
+ }
31
39
  }
32
40
  const url = getProjectDetailUrl(projectName, derivedAccountId);
33
41
  open(url, { url: true });
@@ -12,7 +12,7 @@ import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
12
12
  import { commands } from '../../../lang/en.js';
13
13
  import { promptUser, listPrompt, confirmPrompt, } from '../../../lib/prompts/promptUtils.js';
14
14
  import { fileExists } from '../../../lib/validation.js';
15
- import { debugError } from '../../../lib/errorHandlers/index.js';
15
+ import { debugError, logError } from '../../../lib/errorHandlers/index.js';
16
16
  const command = 'add [name]';
17
17
  const describe = commands.project.profile.add.describe;
18
18
  const verboseDescribe = commands.project.profile.add.verboseDescribe;
@@ -52,9 +52,13 @@ async function selectProfileToCopyVariablesFrom(existingProfiles) {
52
52
  }
53
53
  async function handler(args) {
54
54
  const { exit } = args;
55
- const { projectConfig, projectDir } = await getProjectConfig();
56
- if (!projectConfig || !projectDir) {
57
- uiLogger.error(commands.project.profile.add.errors.noProjectConfig);
55
+ let projectConfig;
56
+ let projectDir;
57
+ try {
58
+ ({ projectConfig, projectDir } = getProjectConfig());
59
+ }
60
+ catch (error) {
61
+ logError(error);
58
62
  return exit(EXIT_CODES.ERROR);
59
63
  }
60
64
  if (isLegacyProject(projectConfig.platformVersion)) {
@@ -12,15 +12,19 @@ import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
12
12
  import { commands } from '../../../lang/en.js';
13
13
  import { confirmPrompt, listPrompt } from '../../../lib/prompts/promptUtils.js';
14
14
  import { fileExists } from '../../../lib/validation.js';
15
- import { debugError } from '../../../lib/errorHandlers/index.js';
15
+ import { debugError, logError } from '../../../lib/errorHandlers/index.js';
16
16
  import { isDeveloperTestAccount, isSandbox, } from '../../../lib/accountTypes.js';
17
17
  const command = 'delete [name]';
18
18
  const describe = commands.project.profile.delete.describe;
19
19
  async function handler(args) {
20
20
  const { exit } = args;
21
- const { projectConfig, projectDir } = await getProjectConfig();
22
- if (!projectConfig || !projectDir) {
23
- uiLogger.error(commands.project.profile.delete.errors.noProjectConfig);
21
+ let projectConfig;
22
+ let projectDir;
23
+ try {
24
+ ({ projectConfig, projectDir } = getProjectConfig());
25
+ }
26
+ catch (error) {
27
+ logError(error);
24
28
  return exit(EXIT_CODES.ERROR);
25
29
  }
26
30
  if (isLegacyProject(projectConfig.platformVersion)) {
@@ -1,5 +1,5 @@
1
1
  import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, JSONOutputArgs, YargsCommandModule } from '../../../types/Yargs.js';
2
- import { ReleaseJsonOutput } from '../../../lib/jsonOutput.js';
2
+ import { ReleaseJsonOutput } from '../../../lib/jsonOutput/release.js';
3
3
  export type ProjectReleaseCreateArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & JSONOutputArgs<ReleaseJsonOutput> & {
4
4
  build?: number;
5
5
  force: boolean;
@@ -3,14 +3,14 @@ import { pollProjectBuildAndDeploy } from '../../../lib/projects/pollProjectBuil
3
3
  import { resolveBuildId, validateBuildForRelease, executeRelease, } from '../../../lib/projects/release.js';
4
4
  import { logError, ApiErrorContext } from '../../../lib/errorHandlers/index.js';
5
5
  import { isPromptExitError } from '../../../lib/errors/PromptExitError.js';
6
- import { getProjectConfig, validateProjectConfig, } from '../../../lib/projects/config.js';
6
+ import { getProjectConfig } from '../../../lib/projects/config.js';
7
7
  import { confirmPrompt } from '../../../lib/prompts/promptUtils.js';
8
8
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
9
9
  import { uiLogger } from '../../../lib/ui/logger.js';
10
10
  import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
11
11
  import { commands } from '../../../lang/en.js';
12
12
  import { makeWrappedYargsHandler } from '../../../lib/yargs/makeWrappedYargsHandler.js';
13
- import { ReleaseSchema, mapReleaseToJsonOutput, } from '../../../lib/jsonOutput.js';
13
+ import { ReleaseSchema, mapReleaseToJsonOutput, } from '../../../lib/jsonOutput/release.js';
14
14
  const command = 'create';
15
15
  // const describe = commands.project.release.create.describe;
16
16
  const describe = undefined;
@@ -27,17 +27,15 @@ function logUploadError(error, accountId) {
27
27
  }
28
28
  async function handler(args) {
29
29
  const { exit, derivedAccountId, build: buildOption, json: formatOutputAsJson, force, addJsonOutput, } = args;
30
- const { projectConfig, projectDir } = await getProjectConfig();
30
+ let projectConfig;
31
+ let projectDir;
31
32
  try {
32
- validateProjectConfig(projectConfig, projectDir);
33
+ ({ projectConfig, projectDir } = getProjectConfig());
33
34
  }
34
35
  catch (error) {
35
36
  logError(error);
36
37
  return exit(EXIT_CODES.ERROR);
37
38
  }
38
- if (!projectConfig || !projectDir) {
39
- return exit(EXIT_CODES.ERROR);
40
- }
41
39
  const projectName = projectConfig.name;
42
40
  let buildId;
43
41
  try {
@@ -1,5 +1,5 @@
1
1
  import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, JSONOutputArgs, YargsCommandModule } from '../../../types/Yargs.js';
2
- import { ReleaseJsonOutput } from '../../../lib/jsonOutput.js';
2
+ import { ReleaseJsonOutput } from '../../../lib/jsonOutput/release.js';
3
3
  export type ProjectReleaseInfoArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & JSONOutputArgs<ReleaseJsonOutput> & {
4
4
  tag?: string;
5
5
  };
@@ -1,7 +1,7 @@
1
1
  import { getReleaseInfo, listReleases } from '../../../api/releases.js';
2
2
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
3
3
  import { logError, ApiErrorContext } from '../../../lib/errorHandlers/index.js';
4
- import { getProjectConfig, validateProjectConfig, } from '../../../lib/projects/config.js';
4
+ import { getProjectConfig } from '../../../lib/projects/config.js';
5
5
  import { listPrompt } from '../../../lib/prompts/promptUtils.js';
6
6
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
7
7
  import { uiLogger } from '../../../lib/ui/logger.js';
@@ -12,7 +12,7 @@ import { makeWrappedYargsHandler } from '../../../lib/yargs/makeWrappedYargsHand
12
12
  import { isPromptExitError } from '../../../lib/errors/PromptExitError.js';
13
13
  import { mapToUserFacingType } from '@hubspot/project-parsing-lib/transform';
14
14
  import { AUTO_GENERATED_COMPONENT_TYPES } from '@hubspot/project-parsing-lib/constants';
15
- import { ReleaseSchema, mapReleaseToJsonOutput, } from '../../../lib/jsonOutput.js';
15
+ import { ReleaseSchema, mapReleaseToJsonOutput, } from '../../../lib/jsonOutput/release.js';
16
16
  const command = 'info';
17
17
  // const describe = commands.project.release.info.describe;
18
18
  const describe = undefined;
@@ -38,9 +38,9 @@ async function selectReleasePrompt(accountId, projectName) {
38
38
  }
39
39
  async function handler(args) {
40
40
  const { derivedAccountId, tag: rawTag, json: formatOutputAsJson, exit, addJsonOutput, } = args;
41
- const { projectConfig, projectDir } = await getProjectConfig();
41
+ let projectConfig;
42
42
  try {
43
- validateProjectConfig(projectConfig, projectDir);
43
+ ({ projectConfig } = getProjectConfig());
44
44
  }
45
45
  catch (error) {
46
46
  logError(error);
@@ -1,5 +1,5 @@
1
1
  import { CommonArgs, ConfigArgs, AccountArgs, EnvironmentArgs, JSONOutputArgs, YargsCommandModule } from '../../../types/Yargs.js';
2
- import { ReleaseListJsonOutput } from '../../../lib/jsonOutput.js';
2
+ import { ReleaseListJsonOutput } from '../../../lib/jsonOutput/release.js';
3
3
  export type ProjectReleaseListArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & JSONOutputArgs<ReleaseListJsonOutput> & {
4
4
  limit?: number;
5
5
  };
@@ -2,7 +2,7 @@ import { listReleases } from '../../../api/releases.js';
2
2
  import { isHubSpotHttpError } from '@hubspot/local-dev-lib/errors/index';
3
3
  import { isPromptExitError } from '../../../lib/errors/PromptExitError.js';
4
4
  import { logError, ApiErrorContext } from '../../../lib/errorHandlers/index.js';
5
- import { getProjectConfig, validateProjectConfig, } from '../../../lib/projects/config.js';
5
+ import { getProjectConfig } from '../../../lib/projects/config.js';
6
6
  import { promptUser } from '../../../lib/prompts/promptUtils.js';
7
7
  import { EXIT_CODES } from '../../../lib/enums/exitCodes.js';
8
8
  import { uiLogger } from '../../../lib/ui/logger.js';
@@ -10,7 +10,7 @@ import { makeYargsBuilder } from '../../../lib/yargsUtils.js';
10
10
  import { commands } from '../../../lang/en.js';
11
11
  import { renderTable } from '../../../ui/render.js';
12
12
  import { makeWrappedYargsHandler } from '../../../lib/yargs/makeWrappedYargsHandler.js';
13
- import { ReleaseListSchema, mapReleaseToJsonOutput, } from '../../../lib/jsonOutput.js';
13
+ import { ReleaseListSchema, mapReleaseToJsonOutput, } from '../../../lib/jsonOutput/release.js';
14
14
  const command = 'list';
15
15
  // const describe = commands.project.release.list.describe;
16
16
  const describe = undefined;
@@ -43,9 +43,9 @@ async function fetchAndDisplayReleases(accountId, projectName, options) {
43
43
  }
44
44
  async function handler(args) {
45
45
  const { derivedAccountId, limit, json: formatOutputAsJson, exit, addJsonOutput, } = args;
46
- const { projectConfig, projectDir } = await getProjectConfig();
46
+ let projectConfig;
47
47
  try {
48
- validateProjectConfig(projectConfig, projectDir);
48
+ ({ projectConfig } = getProjectConfig());
49
49
  }
50
50
  catch (error) {
51
51
  logError(error);
@@ -5,7 +5,6 @@ import { getProjectConfig } from '../../lib/projects/config.js';
5
5
  import { promptUser } from '../../lib/prompts/promptUtils.js';
6
6
  import path from 'path';
7
7
  import { commands } from '../../lang/en.js';
8
- import { uiLogger } from '../../lib/ui/logger.js';
9
8
  import { makeWrappedYargsHandler } from '../../lib/yargs/makeWrappedYargsHandler.js';
10
9
  import { logError } from '../../lib/errorHandlers/index.js';
11
10
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
@@ -14,12 +13,14 @@ const describe = commands.project.updateDeps.help.describe;
14
13
  async function handler(args) {
15
14
  const { packages, exit } = args;
16
15
  try {
17
- const projectConfig = await getProjectConfig();
18
- if (!projectConfig || !projectConfig.projectDir) {
19
- uiLogger.error(commands.project.updateDeps.noProjectConfig);
16
+ let projectDir;
17
+ try {
18
+ ({ projectDir } = getProjectConfig());
19
+ }
20
+ catch (error) {
21
+ logError(error);
20
22
  return exit(EXIT_CODES.ERROR);
21
23
  }
22
- const { projectDir } = projectConfig;
23
24
  let installLocations = await getProjectPackageJsonLocations();
24
25
  if (packages) {
25
26
  const { selectedInstallLocations } = await promptUser([
@@ -1,5 +1,5 @@
1
1
  import { CommonArgs, JSONOutputArgs, YargsCommandModule } from '../../types/Yargs.js';
2
- import { UploadJsonOutput } from '../../lib/jsonOutput.js';
2
+ import { UploadJsonOutput } from '../../lib/jsonOutput/upload.js';
3
3
  export type ProjectUploadArgs = CommonArgs & JSONOutputArgs<UploadJsonOutput> & {
4
4
  force: boolean;
5
5
  forceCreate: boolean;
@@ -3,7 +3,7 @@ import { uiLogger } from '../../lib/ui/logger.js';
3
3
  import { getConfigAccountById } from '@hubspot/local-dev-lib/config';
4
4
  import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index';
5
5
  import { isLegacyProject, meetsMinimumPlatformVersion, } from '@hubspot/project-parsing-lib/projects';
6
- import { getProjectConfig, validateProjectConfig, } from '../../lib/projects/config.js';
6
+ import { getProjectConfig } from '../../lib/projects/config.js';
7
7
  import { logFeedbackMessage } from '../../lib/projects/ui.js';
8
8
  import { handleProjectUpload } from '../../lib/projects/upload.js';
9
9
  import { loadAndValidateProfile } from '../../lib/projects/projectProfiles.js';
@@ -14,7 +14,7 @@ import { PROJECT_ERROR_TYPES } from '../../lib/constants.js';
14
14
  import { logError, ApiErrorContext } from '../../lib/errorHandlers/index.js';
15
15
  import { EXIT_CODES } from '../../lib/enums/exitCodes.js';
16
16
  import { makeWrappedYargsHandler } from '../../lib/yargs/makeWrappedYargsHandler.js';
17
- import { UploadSchema, } from '../../lib/jsonOutput.js';
17
+ import { mapAccountToTargetAccount, UploadSchema, } from '../../lib/jsonOutput/upload.js';
18
18
  import { makeYargsBuilder } from '../../lib/yargsUtils.js';
19
19
  import { projectProfilePrompt } from '../../lib/prompts/projectProfilePrompt.js';
20
20
  import { uiDeprecatedTag } from '../../lib/ui/index.js';
@@ -41,27 +41,28 @@ async function handler(args) {
41
41
  if (forceCreate) {
42
42
  uiDeprecatedTag(commands.project.upload.logs.forceCreateDeprecated);
43
43
  }
44
- const { projectConfig, projectDir } = await getProjectConfig();
44
+ let projectConfig;
45
+ let projectDir;
45
46
  try {
46
- validateProjectConfig(projectConfig, projectDir);
47
+ ({ projectConfig, projectDir } = getProjectConfig());
47
48
  }
48
49
  catch (error) {
49
50
  logError(error);
50
51
  return exit(EXIT_CODES.ERROR);
51
52
  }
52
- if (!projectDir) {
53
- uiLogger.error(commands.project.upload.errors.noProjectConfig);
54
- return exit(EXIT_CODES.ERROR);
55
- }
56
53
  let targetAccountId;
57
54
  let profileName = args.profile;
58
- if (!isLegacyProject(projectConfig?.platformVersion)) {
55
+ let resolvedViaProfile = false;
56
+ if (!isLegacyProject(projectConfig.platformVersion)) {
59
57
  try {
60
58
  const profileNamePromptResult = await projectProfilePrompt(projectDir, projectConfig, profileOption, !!useEnvOption);
61
59
  if (profileNamePromptResult) {
62
60
  profileName = profileNamePromptResult;
63
61
  const profile = await loadAndValidateProfile(projectConfig, projectDir, profileName);
64
62
  targetAccountId = profile.accountId;
63
+ resolvedViaProfile = true;
64
+ uiLogger.log(commands.project.upload.logs.uploadingWithProfile(profileName, targetAccountId));
65
+ uiLogger.log('');
65
66
  }
66
67
  }
67
68
  catch (error) {
@@ -76,6 +77,10 @@ async function handler(args) {
76
77
  type: accountType,
77
78
  assetType: projectConfig.platformVersion,
78
79
  });
80
+ if (!resolvedViaProfile) {
81
+ uiLogger.log(commands.project.upload.logs.uploadingToAccount(targetAccountId));
82
+ uiLogger.log('');
83
+ }
79
84
  try {
80
85
  const { result, uploadError, projectId, userDeclined } = await handleProjectUpload({
81
86
  accountId: targetAccountId,
@@ -118,7 +123,7 @@ async function handler(args) {
118
123
  (!result.buildResult.isAutoDeployEnabled || preview || skipAutoDeploy)) {
119
124
  uiLogger.log(chalk.bold(commands.project.upload.logs.buildSucceeded(result.buildId)));
120
125
  if (!preview) {
121
- if (meetsMinimumPlatformVersion(result.buildResult.platformVersion, PLATFORM_VERSIONS.v2027_03_BETA)) {
126
+ if (meetsMinimumPlatformVersion(result.buildResult.platformVersion, PLATFORM_VERSIONS.v2027_03)) {
122
127
  const releaseCommand = `hs project release create --build=${result.buildId}`;
123
128
  uiLogger.log(commands.project.upload.logs.releaseManagementRequired(releaseCommand));
124
129
  }
@@ -132,17 +137,23 @@ async function handler(args) {
132
137
  }
133
138
  await displayWarnLogs(targetAccountId, projectConfig.name, result.buildId);
134
139
  }
140
+ if (result) {
141
+ addJsonOutput({
142
+ targetAccount: mapAccountToTargetAccount(targetAccountId, accountConfig),
143
+ buildId: result.buildId,
144
+ });
145
+ if (result.deployResult) {
146
+ addJsonOutput({ deployId: result.deployResult.deployId });
147
+ }
148
+ }
135
149
  if (result && result.succeeded && preview && targetPortalId) {
136
150
  const previewJson = await handlePreview(targetAccountId, projectId, result.buildId, targetPortalId);
137
151
  if (previewJson) {
138
152
  addJsonOutput({ preview: previewJson });
139
153
  }
140
154
  }
141
- if (result) {
142
- addJsonOutput({ buildId: result.buildId });
143
- if (result.deployResult) {
144
- addJsonOutput({ deployId: result.deployResult.deployId });
145
- }
155
+ if (result && result.succeeded) {
156
+ uiLogger.log(commands.project.upload.logs.uploadedToAccount(targetAccountId));
146
157
  }
147
158
  if (result && !result.succeeded) {
148
159
  return exit(EXIT_CODES.ERROR);
@@ -1,5 +1,6 @@
1
- import { CommonArgs, YargsCommandModule } from '../../types/Yargs.js';
2
- export type ProjectValidateArgs = CommonArgs & {
1
+ import { CommonArgs, JSONOutputArgs, YargsCommandModule } from '../../types/Yargs.js';
2
+ import { ValidateJsonOutput } from '../../lib/jsonOutput/validate.js';
3
+ export type ProjectValidateArgs = CommonArgs & JSONOutputArgs<ValidateJsonOutput> & {
3
4
  profile?: string;
4
5
  };
5
6
  declare const projectValidateCommand: YargsCommandModule<unknown, ProjectValidateArgs>;