nx 20.7.2 → 20.8.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 (67) hide show
  1. package/.eslintrc.json +3 -1
  2. package/package.json +11 -11
  3. package/release/index.d.ts +1 -1
  4. package/release/index.js +2 -1
  5. package/schemas/nx-schema.json +133 -33
  6. package/src/command-line/release/changelog.js +15 -10
  7. package/src/command-line/release/command-object.d.ts +1 -0
  8. package/src/command-line/release/command-object.js +4 -0
  9. package/src/command-line/release/config/config.d.ts +8 -7
  10. package/src/command-line/release/config/config.js +122 -42
  11. package/src/command-line/release/config/use-legacy-versioning.d.ts +2 -0
  12. package/src/command-line/release/config/use-legacy-versioning.js +9 -0
  13. package/src/command-line/release/index.d.ts +4 -0
  14. package/src/command-line/release/index.js +6 -1
  15. package/src/command-line/release/plan-check.js +6 -3
  16. package/src/command-line/release/plan.js +7 -3
  17. package/src/command-line/release/publish.js +5 -3
  18. package/src/command-line/release/release.js +8 -3
  19. package/src/command-line/release/utils/batch-projects-by-generator-config.js +6 -3
  20. package/src/command-line/release/utils/git.d.ts +2 -1
  21. package/src/command-line/release/utils/git.js +10 -2
  22. package/src/command-line/release/utils/github.js +3 -1
  23. package/src/command-line/release/utils/resolve-semver-specifier.d.ts +2 -1
  24. package/src/command-line/release/utils/resolve-semver-specifier.js +2 -1
  25. package/src/command-line/release/utils/semver.d.ts +8 -0
  26. package/src/command-line/release/utils/semver.js +8 -0
  27. package/src/command-line/release/utils/shared-legacy.d.ts +25 -0
  28. package/src/command-line/release/utils/shared-legacy.js +2 -0
  29. package/src/command-line/release/utils/shared.d.ts +11 -17
  30. package/src/command-line/release/version/derive-specifier-from-conventional-commits.d.ts +7 -0
  31. package/src/command-line/release/version/derive-specifier-from-conventional-commits.js +47 -0
  32. package/src/command-line/release/version/deriver-specifier-from-version-plans.d.ts +8 -0
  33. package/src/command-line/release/version/deriver-specifier-from-version-plans.js +59 -0
  34. package/src/command-line/release/version/project-logger.d.ts +8 -0
  35. package/src/command-line/release/version/project-logger.js +45 -0
  36. package/src/command-line/release/version/release-group-processor.d.ts +251 -0
  37. package/src/command-line/release/version/release-group-processor.js +1040 -0
  38. package/src/command-line/release/version/resolve-current-version.d.ts +32 -0
  39. package/src/command-line/release/version/resolve-current-version.js +241 -0
  40. package/src/command-line/release/version/test-utils.d.ts +95 -0
  41. package/src/command-line/release/version/test-utils.js +416 -0
  42. package/src/command-line/release/version/topological-sort.d.ts +9 -0
  43. package/src/command-line/release/version/topological-sort.js +41 -0
  44. package/src/command-line/release/version/version-actions.d.ts +170 -0
  45. package/src/command-line/release/version/version-actions.js +183 -0
  46. package/src/command-line/release/version-legacy.d.ts +46 -0
  47. package/src/command-line/release/version-legacy.js +453 -0
  48. package/src/command-line/release/version.d.ts +0 -40
  49. package/src/command-line/release/version.js +80 -262
  50. package/src/config/nx-json.d.ts +110 -12
  51. package/src/config/workspace-json-project-json.d.ts +2 -2
  52. package/src/core/graph/main.js +1 -1
  53. package/src/core/graph/styles.css +1 -1
  54. package/src/native/index.d.ts +6 -0
  55. package/src/native/native-bindings.js +1 -0
  56. package/src/native/nx.wasi-browser.js +7 -7
  57. package/src/native/nx.wasm32-wasi.wasm +0 -0
  58. package/src/plugins/js/lock-file/utils/package-json.d.ts +1 -1
  59. package/src/plugins/js/lock-file/utils/package-json.js +2 -1
  60. package/src/plugins/js/lock-file/yarn-parser.js +75 -29
  61. package/src/plugins/js/project-graph/build-dependencies/target-project-locator.d.ts +10 -1
  62. package/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +59 -6
  63. package/src/project-graph/error-types.js +28 -1
  64. package/src/project-graph/utils/project-configuration-utils.js +14 -2
  65. package/src/tasks-runner/cache.d.ts +1 -0
  66. package/src/tasks-runner/cache.js +11 -0
  67. package/src/utils/handle-errors.js +15 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultCreateReleaseProvider = exports.IMPLICIT_DEFAULT_RELEASE_GROUP = void 0;
3
+ exports.defaultCreateReleaseProvider = exports.DEFAULT_VERSION_ACTIONS_PATH = exports.IMPLICIT_DEFAULT_RELEASE_GROUP = void 0;
4
4
  exports.createNxReleaseConfig = createNxReleaseConfig;
5
5
  exports.handleNxReleaseConfigError = handleNxReleaseConfigError;
6
6
  /**
@@ -21,12 +21,14 @@ const node_url_1 = require("node:url");
21
21
  const fileutils_1 = require("../../../utils/fileutils");
22
22
  const find_matching_projects_1 = require("../../../utils/find-matching-projects");
23
23
  const output_1 = require("../../../utils/output");
24
- const workspace_root_1 = require("../../../utils/workspace-root");
25
24
  const path_1 = require("../../../utils/path");
25
+ const workspace_root_1 = require("../../../utils/workspace-root");
26
26
  const resolve_changelog_renderer_1 = require("../utils/resolve-changelog-renderer");
27
27
  const resolve_nx_json_error_message_1 = require("../utils/resolve-nx-json-error-message");
28
28
  const conventional_commits_1 = require("./conventional-commits");
29
+ const use_legacy_versioning_1 = require("./use-legacy-versioning");
29
30
  exports.IMPLICIT_DEFAULT_RELEASE_GROUP = '__default__';
31
+ exports.DEFAULT_VERSION_ACTIONS_PATH = '@nx/js/src/release/version-actions';
30
32
  // Apply default configuration to any optional user configuration and handle known errors
31
33
  async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig = {}) {
32
34
  if (userConfig.projects && userConfig.groups) {
@@ -50,12 +52,13 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
50
52
  if (hasInvalidConventionalCommitsConfig(userConfig)) {
51
53
  return {
52
54
  error: {
53
- code: 'CONVENTIONAL_COMMITS_SHORTHAND_MIXED_WITH_OVERLAPPING_GENERATOR_OPTIONS',
55
+ code: 'CONVENTIONAL_COMMITS_SHORTHAND_MIXED_WITH_OVERLAPPING_OPTIONS',
54
56
  data: {},
55
57
  },
56
58
  nxReleaseConfig: null,
57
59
  };
58
60
  }
61
+ const USE_LEGACY_VERSIONING = (0, use_legacy_versioning_1.shouldUseLegacyVersioning)(userConfig);
59
62
  const gitDefaults = {
60
63
  commit: false,
61
64
  commitMessage: 'chore(release): publish {version}',
@@ -65,6 +68,7 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
65
68
  tagArgs: '',
66
69
  stageChanges: false,
67
70
  push: false,
71
+ pushArgs: '',
68
72
  };
69
73
  const versionGitDefaults = {
70
74
  ...gitDefaults,
@@ -133,11 +137,24 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
133
137
  projectsRelationship: workspaceProjectsRelationship,
134
138
  git: gitDefaults,
135
139
  version: {
140
+ useLegacyVersioning: USE_LEGACY_VERSIONING,
136
141
  git: versionGitDefaults,
137
142
  conventionalCommits: userConfig.version?.conventionalCommits || false,
138
- generator: '@nx/js:release-version',
139
- generatorOptions: defaultGeneratorOptions,
140
143
  preVersionCommand: userConfig.version?.preVersionCommand || '',
144
+ ...(USE_LEGACY_VERSIONING
145
+ ? {
146
+ generator: '@nx/js:release-version',
147
+ generatorOptions: defaultGeneratorOptions,
148
+ }
149
+ : {
150
+ versionActions: exports.DEFAULT_VERSION_ACTIONS_PATH,
151
+ versionActionsOptions: {},
152
+ currentVersionResolver: defaultGeneratorOptions.currentVersionResolver,
153
+ specifierSource: defaultGeneratorOptions.specifierSource,
154
+ preserveLocalDependencyProtocols: userConfig.version?.preserveLocalDependencyProtocols ?? true,
155
+ logUnchangedProjects: userConfig.version?.logUnchangedProjects ?? true,
156
+ updateDependents: userConfig.version?.updateDependents ?? 'auto',
157
+ }),
141
158
  },
142
159
  changelog: {
143
160
  git: changelogGitDefaults,
@@ -185,12 +202,19 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
185
202
  const groupProjectsRelationship = userConfig.projectsRelationship || WORKSPACE_DEFAULTS.projectsRelationship;
186
203
  const GROUP_DEFAULTS = {
187
204
  projectsRelationship: groupProjectsRelationship,
188
- version: {
189
- conventionalCommits: false,
190
- generator: '@nx/js:release-version',
191
- generatorOptions: {},
192
- groupPreVersionCommand: '',
193
- },
205
+ version: USE_LEGACY_VERSIONING
206
+ ? {
207
+ conventionalCommits: false,
208
+ generator: '@nx/js:release-version',
209
+ generatorOptions: {},
210
+ groupPreVersionCommand: '',
211
+ }
212
+ : {
213
+ conventionalCommits: false,
214
+ versionActions: exports.DEFAULT_VERSION_ACTIONS_PATH,
215
+ versionActionsOptions: {},
216
+ groupPreVersionCommand: '',
217
+ },
194
218
  changelog: {
195
219
  createRelease: false,
196
220
  entryWhenNoChanges: 'This was a version bump only for {projectName} to align it with other projects, there were no code changes.',
@@ -219,7 +243,9 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
219
243
  const rootVersionConfig = deepMergeDefaults([
220
244
  WORKSPACE_DEFAULTS.version,
221
245
  // Merge in the git defaults from the top level
222
- { git: versionGitDefaults },
246
+ {
247
+ git: versionGitDefaults,
248
+ },
223
249
  {
224
250
  git: userConfig.git,
225
251
  },
@@ -242,33 +268,50 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
242
268
  WORKSPACE_DEFAULTS.versionPlans);
243
269
  const rootConventionalCommitsConfig = deepMergeDefaults([WORKSPACE_DEFAULTS.conventionalCommits], fillUnspecifiedConventionalCommitsProperties(normalizeConventionalCommitsConfig(userConfig.conventionalCommits)));
244
270
  // these options are not supported at the group level, only the root/command level
245
- const rootVersionWithoutGlobalOptions = {
271
+ let rootVersionWithoutGlobalOptions = {
246
272
  ...rootVersionConfig,
247
273
  };
248
274
  delete rootVersionWithoutGlobalOptions.git;
249
275
  delete rootVersionWithoutGlobalOptions.preVersionCommand;
250
276
  // Apply conventionalCommits shorthand to the final group defaults if explicitly configured in the original user config
251
277
  if (userConfig.version?.conventionalCommits === true) {
252
- rootVersionWithoutGlobalOptions.generatorOptions = {
253
- ...rootVersionWithoutGlobalOptions.generatorOptions,
254
- currentVersionResolver: 'git-tag',
255
- specifierSource: 'conventional-commits',
256
- };
278
+ if (USE_LEGACY_VERSIONING) {
279
+ rootVersionWithoutGlobalOptions.generatorOptions = {
280
+ ...rootVersionWithoutGlobalOptions.generatorOptions,
281
+ currentVersionResolver: 'git-tag',
282
+ specifierSource: 'conventional-commits',
283
+ };
284
+ }
285
+ else {
286
+ rootVersionWithoutGlobalOptions.currentVersionResolver = 'git-tag';
287
+ rootVersionWithoutGlobalOptions.specifierSource = 'conventional-commits';
288
+ }
257
289
  }
258
290
  if (userConfig.version?.conventionalCommits === false) {
259
291
  delete rootVersionWithoutGlobalOptions.generatorOptions
260
292
  .currentVersionResolver;
261
293
  delete rootVersionWithoutGlobalOptions.generatorOptions.specifierSource;
294
+ delete rootVersionWithoutGlobalOptions
295
+ .currentVersionResolver;
296
+ delete rootVersionWithoutGlobalOptions
297
+ .specifierSource;
262
298
  }
263
299
  // Apply versionPlans shorthand to the final group defaults if explicitly configured in the original user config
264
300
  if (userConfig.versionPlans) {
265
- rootVersionWithoutGlobalOptions.generatorOptions = {
266
- ...rootVersionWithoutGlobalOptions.generatorOptions,
267
- specifierSource: 'version-plans',
268
- };
301
+ if (USE_LEGACY_VERSIONING) {
302
+ rootVersionWithoutGlobalOptions.generatorOptions = {
303
+ ...rootVersionWithoutGlobalOptions.generatorOptions,
304
+ specifierSource: 'version-plans',
305
+ };
306
+ }
307
+ else {
308
+ rootVersionWithoutGlobalOptions.specifierSource = 'version-plans';
309
+ }
269
310
  }
270
311
  if (userConfig.versionPlans === false) {
271
312
  delete rootVersionWithoutGlobalOptions.generatorOptions.specifierSource;
313
+ delete rootVersionWithoutGlobalOptions
314
+ .specifierSource;
272
315
  }
273
316
  const groups = userConfig.groups && Object.keys(userConfig.groups).length
274
317
  ? ensureProjectsConfigIsArray(userConfig.groups)
@@ -377,32 +420,51 @@ async function createNxReleaseConfig(projectGraph, projectFileMap, userConfig =
377
420
  // Ensure that the resolved project names take priority over the original user config (which could have contained unresolved globs etc)
378
421
  projects: matchingProjects,
379
422
  });
423
+ finalReleaseGroup.version =
424
+ finalReleaseGroup.version;
380
425
  // Apply conventionalCommits shorthand to the final group if explicitly configured in the original group
381
426
  if (releaseGroup.version?.conventionalCommits === true) {
382
- finalReleaseGroup.version.generatorOptions = {
383
- ...finalReleaseGroup.version.generatorOptions,
384
- currentVersionResolver: 'git-tag',
385
- specifierSource: 'conventional-commits',
386
- };
427
+ if (USE_LEGACY_VERSIONING) {
428
+ finalReleaseGroup.version.generatorOptions = {
429
+ ...finalReleaseGroup.version.generatorOptions,
430
+ currentVersionResolver: 'git-tag',
431
+ specifierSource: 'conventional-commits',
432
+ };
433
+ }
434
+ else {
435
+ finalReleaseGroup.version.currentVersionResolver = 'git-tag';
436
+ finalReleaseGroup.version.specifierSource = 'conventional-commits';
437
+ }
387
438
  }
388
439
  if (releaseGroup.version?.conventionalCommits === false &&
389
440
  releaseGroupName !== exports.IMPLICIT_DEFAULT_RELEASE_GROUP) {
390
441
  delete finalReleaseGroup.version.generatorOptions.currentVersionResolver;
391
442
  delete finalReleaseGroup.version.generatorOptions.specifierSource;
443
+ delete finalReleaseGroup.version
444
+ .currentVersionResolver;
445
+ delete finalReleaseGroup.version
446
+ .specifierSource;
392
447
  }
393
448
  // Apply versionPlans shorthand to the final group if explicitly configured in the original group
394
449
  if (releaseGroup.versionPlans) {
395
- finalReleaseGroup.version = {
396
- ...finalReleaseGroup.version,
397
- generatorOptions: {
398
- ...finalReleaseGroup.version?.generatorOptions,
399
- specifierSource: 'version-plans',
400
- },
401
- };
450
+ if (USE_LEGACY_VERSIONING) {
451
+ finalReleaseGroup.version = {
452
+ ...finalReleaseGroup.version,
453
+ generatorOptions: {
454
+ ...finalReleaseGroup.version?.generatorOptions,
455
+ specifierSource: 'version-plans',
456
+ },
457
+ };
458
+ }
459
+ else {
460
+ finalReleaseGroup.version.specifierSource = 'version-plans';
461
+ }
402
462
  }
403
463
  if (releaseGroup.versionPlans === false &&
404
464
  releaseGroupName !== exports.IMPLICIT_DEFAULT_RELEASE_GROUP) {
405
465
  delete finalReleaseGroup.version.generatorOptions.specifierSource;
466
+ delete finalReleaseGroup.version
467
+ .specifierSource;
406
468
  }
407
469
  releaseGroups[releaseGroupName] = finalReleaseGroup;
408
470
  }
@@ -517,7 +579,7 @@ function fillUnspecifiedConventionalCommitsProperties(config) {
517
579
  types,
518
580
  };
519
581
  }
520
- async function handleNxReleaseConfigError(error) {
582
+ async function handleNxReleaseConfigError(error, useLegacyVersioning) {
521
583
  switch (error.code) {
522
584
  case 'PROJECTS_AND_GROUPS_DEFINED':
523
585
  {
@@ -569,13 +631,16 @@ async function handleNxReleaseConfigError(error) {
569
631
  });
570
632
  }
571
633
  break;
572
- case 'CONVENTIONAL_COMMITS_SHORTHAND_MIXED_WITH_OVERLAPPING_GENERATOR_OPTIONS':
634
+ case 'CONVENTIONAL_COMMITS_SHORTHAND_MIXED_WITH_OVERLAPPING_OPTIONS':
573
635
  {
574
636
  const nxJsonMessage = await (0, resolve_nx_json_error_message_1.resolveNxJsonConfigErrorMessage)([
575
637
  'release',
576
638
  ]);
639
+ const text = useLegacyVersioning
640
+ ? '"version.generatorOptions"'
641
+ : 'configuration options';
577
642
  output_1.output.error({
578
- title: `You have configured both the shorthand "version.conventionalCommits" and one or more of the related "version.generatorOptions" that it sets for you. Please use one or the other:`,
643
+ title: `You have configured both the shorthand "version.conventionalCommits" and one or more of the related ${text} that it sets for you. Please use one or the other:`,
579
644
  bodyLines: [nxJsonMessage],
580
645
  });
581
646
  }
@@ -723,21 +788,36 @@ function deepMergeDefaults(defaultConfigs, userConfig) {
723
788
  }
724
789
  /**
725
790
  * We want to prevent users from setting both the conventionalCommits shorthand and any of the related
726
- * generatorOptions at the same time, since it is at best redundant, and at worst invalid.
791
+ * configuration options at the same time, since it is at best redundant, and at worst invalid.
727
792
  */
728
793
  function hasInvalidConventionalCommitsConfig(userConfig) {
729
794
  // at the root
730
795
  if (userConfig.version?.conventionalCommits === true &&
731
- (userConfig.version?.generatorOptions?.currentVersionResolver ||
732
- userConfig.version?.generatorOptions?.specifierSource)) {
796
+ // v2 config - directly on version config
797
+ (userConfig.version
798
+ ?.currentVersionResolver ||
799
+ userConfig.version
800
+ ?.specifierSource ||
801
+ // Legacy config - on generatorOptions
802
+ userConfig.version
803
+ ?.generatorOptions?.currentVersionResolver ||
804
+ userConfig.version
805
+ ?.generatorOptions?.specifierSource)) {
733
806
  return true;
734
807
  }
735
808
  // within any groups
736
809
  if (userConfig.groups) {
737
810
  for (const group of Object.values(userConfig.groups)) {
738
811
  if (group.version?.conventionalCommits === true &&
739
- (group.version?.generatorOptions?.currentVersionResolver ||
740
- group.version?.generatorOptions?.specifierSource)) {
812
+ // v2 config - directly on version config
813
+ (group.version
814
+ ?.currentVersionResolver ||
815
+ group.version?.specifierSource ||
816
+ // Legacy config - on generatorOptions
817
+ group.version
818
+ ?.generatorOptions?.currentVersionResolver ||
819
+ group.version
820
+ ?.generatorOptions?.specifierSource)) {
741
821
  return true;
742
822
  }
743
823
  }
@@ -0,0 +1,2 @@
1
+ import type { NxJsonConfiguration } from '../../../config/nx-json';
2
+ export declare function shouldUseLegacyVersioning(releaseConfig: NxJsonConfiguration['release'] | undefined): boolean;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shouldUseLegacyVersioning = shouldUseLegacyVersioning;
4
+ function shouldUseLegacyVersioning(releaseConfig) {
5
+ return process.env.NX_INTERNAL_USE_LEGACY_VERSIONING === 'false'
6
+ ? false
7
+ : // TODO(v21): switch this to false by default in Nx v21 and remove this function in v22
8
+ releaseConfig?.version?.useLegacyVersioning ?? true;
9
+ }
@@ -31,3 +31,7 @@ export declare const releaseVersion: typeof defaultClient.releaseVersion;
31
31
  * @public
32
32
  */
33
33
  export declare const release: typeof defaultClient.release;
34
+ /**
35
+ * @public
36
+ */
37
+ export { AfterAllProjectsVersioned, VersionActions, } from './version/version-actions';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.release = exports.releaseVersion = exports.releasePublish = exports.releaseChangelog = exports.ReleaseClient = void 0;
3
+ exports.VersionActions = exports.release = exports.releaseVersion = exports.releasePublish = exports.releaseChangelog = exports.ReleaseClient = void 0;
4
4
  const changelog_1 = require("./changelog");
5
5
  const publish_1 = require("./publish");
6
6
  const release_1 = require("./release");
@@ -35,3 +35,8 @@ exports.releaseVersion = defaultClient.releaseVersion.bind(defaultClient);
35
35
  * @public
36
36
  */
37
37
  exports.release = defaultClient.release.bind(defaultClient);
38
+ /**
39
+ * @public
40
+ */
41
+ var version_actions_1 = require("./version/version-actions");
42
+ Object.defineProperty(exports, "VersionActions", { enumerable: true, get: function () { return version_actions_1.VersionActions; } });
@@ -7,11 +7,12 @@ const file_map_utils_1 = require("../../project-graph/file-map-utils");
7
7
  const project_graph_1 = require("../../project-graph/project-graph");
8
8
  const all_file_data_1 = require("../../utils/all-file-data");
9
9
  const command_line_utils_1 = require("../../utils/command-line-utils");
10
- const output_1 = require("../../utils/output");
11
10
  const handle_errors_1 = require("../../utils/handle-errors");
11
+ const output_1 = require("../../utils/output");
12
12
  const config_1 = require("./config/config");
13
13
  const deep_merge_json_1 = require("./config/deep-merge-json");
14
14
  const filter_release_groups_1 = require("./config/filter-release-groups");
15
+ const use_legacy_versioning_1 = require("./config/use-legacy-versioning");
15
16
  const version_plans_1 = require("./config/version-plans");
16
17
  const get_touched_projects_for_group_1 = require("./utils/get-touched-projects-for-group");
17
18
  const print_config_1 = require("./utils/print-config");
@@ -25,7 +26,8 @@ function createAPI(overrideReleaseConfig) {
25
26
  // Apply default configuration to any optional user configuration
26
27
  const { error: configError, nxReleaseConfig } = await (0, config_1.createNxReleaseConfig)(projectGraph, await (0, file_map_utils_1.createProjectFileMapUsingProjectGraph)(projectGraph), userProvidedReleaseConfig);
27
28
  if (configError) {
28
- return await (0, config_1.handleNxReleaseConfigError)(configError);
29
+ const USE_LEGACY_VERSIONING = (0, use_legacy_versioning_1.shouldUseLegacyVersioning)(userProvidedReleaseConfig);
30
+ return await (0, config_1.handleNxReleaseConfigError)(configError, USE_LEGACY_VERSIONING);
29
31
  }
30
32
  // --print-config exits directly as it is not designed to be combined with any other programmatic operations
31
33
  if (args.printConfig) {
@@ -47,7 +49,8 @@ function createAPI(overrideReleaseConfig) {
47
49
  title: 'Version plans are not enabled',
48
50
  bodyLines: [
49
51
  'Please ensure at least one release group has version plans enabled in your Nx release configuration if you want to use this command.',
50
- // TODO: Add docs link here once it is available
52
+ '',
53
+ 'Learn more about version plans here: https://nx.dev/recipes/nx-release/file-based-versioning-version-plans',
51
54
  ],
52
55
  });
53
56
  return 1;
@@ -13,11 +13,12 @@ const file_map_utils_1 = require("../../project-graph/file-map-utils");
13
13
  const project_graph_1 = require("../../project-graph/project-graph");
14
14
  const all_file_data_1 = require("../../utils/all-file-data");
15
15
  const command_line_utils_1 = require("../../utils/command-line-utils");
16
- const output_1 = require("../../utils/output");
17
16
  const handle_errors_1 = require("../../utils/handle-errors");
17
+ const output_1 = require("../../utils/output");
18
18
  const config_1 = require("./config/config");
19
19
  const deep_merge_json_1 = require("./config/deep-merge-json");
20
20
  const filter_release_groups_1 = require("./config/filter-release-groups");
21
+ const use_legacy_versioning_1 = require("./config/use-legacy-versioning");
21
22
  const version_plans_1 = require("./config/version-plans");
22
23
  const generate_version_plan_content_1 = require("./utils/generate-version-plan-content");
23
24
  const get_touched_projects_for_group_1 = require("./utils/get-touched-projects-for-group");
@@ -34,7 +35,8 @@ function createAPI(overrideReleaseConfig) {
34
35
  // Apply default configuration to any optional user configuration
35
36
  const { error: configError, nxReleaseConfig } = await (0, config_1.createNxReleaseConfig)(projectGraph, await (0, file_map_utils_1.createProjectFileMapUsingProjectGraph)(projectGraph), userProvidedReleaseConfig);
36
37
  if (configError) {
37
- return await (0, config_1.handleNxReleaseConfigError)(configError);
38
+ const USE_LEGACY_VERSIONING = (0, use_legacy_versioning_1.shouldUseLegacyVersioning)(userProvidedReleaseConfig);
39
+ return await (0, config_1.handleNxReleaseConfigError)(configError, USE_LEGACY_VERSIONING);
38
40
  }
39
41
  // --print-config exits directly as it is not designed to be combined with any other programmatic operations
40
42
  if (args.printConfig) {
@@ -210,10 +212,12 @@ async function promptForVersion(message) {
210
212
  ]);
211
213
  return reply.version;
212
214
  }
213
- catch (e) {
215
+ catch {
214
216
  output_1.output.log({
215
217
  title: 'Cancelled version plan creation.',
216
218
  });
219
+ // Ensure the cursor is always restored before exiting
220
+ process.stdout.write('\u001b[?25h');
217
221
  process.exit(0);
218
222
  }
219
223
  }
@@ -4,19 +4,20 @@ exports.releasePublishCLIHandler = void 0;
4
4
  exports.createAPI = createAPI;
5
5
  const nx_json_1 = require("../../config/nx-json");
6
6
  const file_map_utils_1 = require("../../project-graph/file-map-utils");
7
+ const tasks_execution_hooks_1 = require("../../project-graph/plugins/tasks-execution-hooks");
7
8
  const project_graph_1 = require("../../project-graph/project-graph");
8
9
  const run_command_1 = require("../../tasks-runner/run-command");
9
10
  const command_line_utils_1 = require("../../utils/command-line-utils");
10
11
  const handle_errors_1 = require("../../utils/handle-errors");
11
12
  const output_1 = require("../../utils/output");
12
13
  const project_graph_utils_1 = require("../../utils/project-graph-utils");
14
+ const workspace_root_1 = require("../../utils/workspace-root");
13
15
  const graph_1 = require("../graph/graph");
14
16
  const config_1 = require("./config/config");
15
17
  const deep_merge_json_1 = require("./config/deep-merge-json");
16
18
  const filter_release_groups_1 = require("./config/filter-release-groups");
19
+ const use_legacy_versioning_1 = require("./config/use-legacy-versioning");
17
20
  const print_config_1 = require("./utils/print-config");
18
- const workspace_root_1 = require("../../utils/workspace-root");
19
- const tasks_execution_hooks_1 = require("../../project-graph/plugins/tasks-execution-hooks");
20
21
  const releasePublishCLIHandler = (args) => (0, handle_errors_1.handleErrors)(args.verbose, async () => {
21
22
  const publishProjectsResult = await createAPI({})(args);
22
23
  // If all projects are published successfully, return 0, otherwise return 1
@@ -46,7 +47,8 @@ function createAPI(overrideReleaseConfig) {
46
47
  // Apply default configuration to any optional user configuration
47
48
  const { error: configError, nxReleaseConfig } = await (0, config_1.createNxReleaseConfig)(projectGraph, await (0, file_map_utils_1.createProjectFileMapUsingProjectGraph)(projectGraph), userProvidedReleaseConfig);
48
49
  if (configError) {
49
- return await (0, config_1.handleNxReleaseConfigError)(configError);
50
+ const USE_LEGACY_VERSIONING = (0, use_legacy_versioning_1.shouldUseLegacyVersioning)(userProvidedReleaseConfig);
51
+ return await (0, config_1.handleNxReleaseConfigError)(configError, USE_LEGACY_VERSIONING);
50
52
  }
51
53
  // --print-config exits directly as it is not designed to be combined with any other programmatic operations
52
54
  if (args.printConfig) {
@@ -7,12 +7,13 @@ const node_fs_1 = require("node:fs");
7
7
  const nx_json_1 = require("../../config/nx-json");
8
8
  const file_map_utils_1 = require("../../project-graph/file-map-utils");
9
9
  const project_graph_1 = require("../../project-graph/project-graph");
10
- const output_1 = require("../../utils/output");
11
10
  const handle_errors_1 = require("../../utils/handle-errors");
11
+ const output_1 = require("../../utils/output");
12
12
  const changelog_1 = require("./changelog");
13
13
  const config_1 = require("./config/config");
14
14
  const deep_merge_json_1 = require("./config/deep-merge-json");
15
15
  const filter_release_groups_1 = require("./config/filter-release-groups");
16
+ const use_legacy_versioning_1 = require("./config/use-legacy-versioning");
16
17
  const version_plans_1 = require("./config/version-plans");
17
18
  const publish_1 = require("./publish");
18
19
  const git_1 = require("./utils/git");
@@ -47,7 +48,8 @@ function createAPI(overrideReleaseConfig) {
47
48
  // Apply default configuration to any optional user configuration
48
49
  const { error: configError, nxReleaseConfig } = await (0, config_1.createNxReleaseConfig)(projectGraph, await (0, file_map_utils_1.createProjectFileMapUsingProjectGraph)(projectGraph), userProvidedReleaseConfig);
49
50
  if (configError) {
50
- return await (0, config_1.handleNxReleaseConfigError)(configError);
51
+ const USE_LEGACY_VERSIONING = (0, use_legacy_versioning_1.shouldUseLegacyVersioning)(userProvidedReleaseConfig);
52
+ return await (0, config_1.handleNxReleaseConfigError)(configError, USE_LEGACY_VERSIONING);
51
53
  }
52
54
  // --print-config exits directly as it is not designed to be combined with any other programmatic operations
53
55
  if (args.printConfig) {
@@ -172,6 +174,7 @@ function createAPI(overrideReleaseConfig) {
172
174
  await (0, git_1.gitPush)({
173
175
  dryRun: args.dryRun,
174
176
  verbose: args.verbose,
177
+ additionalArgs: nxReleaseConfig.git.pushArgs,
175
178
  });
176
179
  hasPushedChanges = true;
177
180
  }
@@ -243,7 +246,9 @@ async function promptForPublish() {
243
246
  ]);
244
247
  return reply.confirmation;
245
248
  }
246
- catch (e) {
249
+ catch {
250
+ // Ensure the cursor is always restored before exiting
251
+ process.stdout.write('\u001b[?25h');
247
252
  // Handle the case where the user exits the prompt with ctrl+c
248
253
  return false;
249
254
  }
@@ -10,11 +10,14 @@ function batchProjectsByGeneratorConfig(projectGraph, releaseGroup, projectNames
10
10
  const configBatches = new Map();
11
11
  for (const projectName of projectNamesToBatch) {
12
12
  const project = projectGraph.nodes[projectName];
13
- const generator = project.data.release?.version?.generator ||
13
+ const generator = project.data.release?.version
14
+ ?.generator ||
14
15
  releaseGroup.version.generator;
15
16
  const generatorOptions = {
16
- ...releaseGroup.version.generatorOptions,
17
- ...project.data.release?.version?.generatorOptions,
17
+ ...releaseGroup.version
18
+ .generatorOptions,
19
+ ...project.data.release?.version
20
+ ?.generatorOptions,
18
21
  };
19
22
  let found = false;
20
23
  for (const [key, projects] of configBatches) {
@@ -50,10 +50,11 @@ export declare function gitTag({ tag, message, additionalArgs, dryRun, verbose,
50
50
  verbose?: boolean;
51
51
  logFn?: (message: string) => void;
52
52
  }): Promise<string>;
53
- export declare function gitPush({ gitRemote, dryRun, verbose, }: {
53
+ export declare function gitPush({ gitRemote, dryRun, verbose, additionalArgs, }: {
54
54
  gitRemote?: string;
55
55
  dryRun?: boolean;
56
56
  verbose?: boolean;
57
+ additionalArgs?: string | string[];
57
58
  }): Promise<void>;
58
59
  export declare function parseCommits(commits: RawGitCommit[]): GitCommit[];
59
60
  export declare function parseConventionalCommitsMessage(message: string): {
@@ -308,7 +308,7 @@ async function gitTag({ tag, message, additionalArgs, dryRun, verbose, logFn, })
308
308
  throw new Error(`Unexpected error when creating tag ${tag}:\n\n${err}`);
309
309
  }
310
310
  }
311
- async function gitPush({ gitRemote, dryRun, verbose, }) {
311
+ async function gitPush({ gitRemote, dryRun, verbose, additionalArgs, }) {
312
312
  const commandArgs = [
313
313
  'push',
314
314
  // NOTE: It's important we use --follow-tags, and not --tags, so that we are precise about what we are pushing
@@ -318,6 +318,14 @@ async function gitPush({ gitRemote, dryRun, verbose, }) {
318
318
  // Set custom git remote if provided
319
319
  ...(gitRemote ? [gitRemote] : []),
320
320
  ];
321
+ if (additionalArgs) {
322
+ if (Array.isArray(additionalArgs)) {
323
+ commandArgs.push(...additionalArgs);
324
+ }
325
+ else {
326
+ commandArgs.push(...additionalArgs.split(' '));
327
+ }
328
+ }
321
329
  if (verbose) {
322
330
  console.log(dryRun
323
331
  ? `Would push the current branch to the remote with the following command, but --dry-run was set:`
@@ -396,7 +404,7 @@ function parseGitCommit(commit, isVersionPlanCommit = false) {
396
404
  scope: '',
397
405
  references: extractReferencesFromCommitMessage(commit.message, commit.shortHash),
398
406
  // The commit message is not the source of truth for a breaking (major) change in version plans, so the value is not relevant
399
- // TODO(v20): Make the current GitCommit interface more clearly tied to conventional commits
407
+ // TODO(v22): Make the current GitCommit interface more clearly tied to conventional commits
400
408
  isBreaking: false,
401
409
  authors: getAllAuthorsForCommit(commit),
402
410
  // Not applicable to version plans
@@ -198,7 +198,9 @@ async function promptForContinueInGitHub() {
198
198
  ]);
199
199
  return reply.open === 'Yes';
200
200
  }
201
- catch (e) {
201
+ catch {
202
+ // Ensure the cursor is always restored before exiting
203
+ process.stdout.write('\u001b[?25h');
202
204
  // Handle the case where the user exits the prompt with ctrl+c
203
205
  process.exit(1);
204
206
  }
@@ -1,4 +1,5 @@
1
1
  import { ProjectGraph } from '../../../config/project-graph';
2
2
  import { NxReleaseConfig } from '../config/config';
3
+ import { SemverBumpType } from '../version/version-actions';
3
4
  export declare function resolveSemverSpecifierFromConventionalCommits(from: string, projectGraph: ProjectGraph, projectNames: string[], conventionalCommitsConfig: NxReleaseConfig['conventionalCommits']): Promise<string | null>;
4
- export declare function resolveSemverSpecifierFromPrompt(selectionMessage: string, customVersionMessage: string): Promise<string>;
5
+ export declare function resolveSemverSpecifierFromPrompt(selectionMessage: string, customVersionMessage: string): Promise<SemverBumpType | string>;
@@ -50,7 +50,8 @@ async function resolveSemverSpecifierFromPrompt(selectionMessage, customVersionM
50
50
  }
51
51
  }
52
52
  catch {
53
- // TODO: log the error to the user?
53
+ // Ensure the cursor is always restored before exiting
54
+ process.stdout.write('\u001b[?25h');
54
55
  // We need to catch the error from enquirer prompt, otherwise yargs will print its help
55
56
  process.exit(1);
56
57
  }
@@ -7,5 +7,13 @@ import { NxReleaseConfig } from '../config/config';
7
7
  import { GitCommit } from './git';
8
8
  export declare function isRelativeVersionKeyword(val: string): val is ReleaseType;
9
9
  export declare function isValidSemverSpecifier(specifier: string): boolean;
10
+ /**
11
+ * TODO: We would be able to make the logging for the conventional commits use-case
12
+ * for fixed release groups more clear/precise if we passed through which project
13
+ * the conventional commits were detected for.
14
+ *
15
+ * It would then flow up through deriveSpecifierFromConventionalCommits back to
16
+ * ReleaseGroupProcessor.
17
+ */
10
18
  export declare function determineSemverChange(commits: GitCommit[], config: NxReleaseConfig['conventionalCommits']): 'patch' | 'minor' | 'major' | null;
11
19
  export declare function deriveNewSemverVersion(currentSemverVersion: string, semverSpecifier: string, preid?: string): string;
@@ -15,6 +15,14 @@ function isRelativeVersionKeyword(val) {
15
15
  function isValidSemverSpecifier(specifier) {
16
16
  return (specifier && !!((0, semver_1.valid)(specifier) || isRelativeVersionKeyword(specifier)));
17
17
  }
18
+ /**
19
+ * TODO: We would be able to make the logging for the conventional commits use-case
20
+ * for fixed release groups more clear/precise if we passed through which project
21
+ * the conventional commits were detected for.
22
+ *
23
+ * It would then flow up through deriveSpecifierFromConventionalCommits back to
24
+ * ReleaseGroupProcessor.
25
+ */
18
26
  // https://github.com/unjs/changelogen/blob/main/src/semver.ts
19
27
  function determineSemverChange(commits, config) {
20
28
  let [hasMajor, hasMinor, hasPatch] = [false, false, false];