nx 19.7.0-beta.3 → 19.7.0-beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. package/package.json +12 -12
  2. package/release/changelog-renderer/index.d.ts +1 -1
  3. package/release/changelog-renderer/index.js +46 -11
  4. package/schemas/nx-schema.json +5 -0
  5. package/src/command-line/add/command-object.js +2 -2
  6. package/src/command-line/affected/command-object.js +1 -1
  7. package/src/command-line/connect/command-object.js +11 -4
  8. package/src/command-line/connect/connect-to-nx-cloud.d.ts +3 -1
  9. package/src/command-line/connect/connect-to-nx-cloud.js +7 -4
  10. package/src/command-line/daemon/command-object.js +1 -1
  11. package/src/command-line/deprecated/command-objects.js +2 -2
  12. package/src/command-line/exec/command-object.js +1 -1
  13. package/src/command-line/format/command-object.js +4 -4
  14. package/src/command-line/generate/command-object.js +4 -4
  15. package/src/command-line/graph/command-object.js +6 -6
  16. package/src/command-line/import/command-object.js +9 -5
  17. package/src/command-line/import/import.d.ts +4 -0
  18. package/src/command-line/import/import.js +147 -12
  19. package/src/command-line/import/utils/prepare-source-repo.d.ts +1 -1
  20. package/src/command-line/import/utils/prepare-source-repo.js +31 -85
  21. package/src/command-line/list/command-object.js +1 -1
  22. package/src/command-line/login/command-object.js +1 -1
  23. package/src/command-line/logout/command-object.js +1 -1
  24. package/src/command-line/migrate/command-object.js +9 -9
  25. package/src/command-line/new/command-object.js +2 -2
  26. package/src/command-line/release/changelog.js +53 -12
  27. package/src/command-line/release/command-object.d.ts +2 -0
  28. package/src/command-line/release/command-object.js +37 -33
  29. package/src/command-line/release/config/version-plans.d.ts +14 -1
  30. package/src/command-line/release/config/version-plans.js +33 -1
  31. package/src/command-line/release/plan-check.js +8 -61
  32. package/src/command-line/release/plan.js +131 -37
  33. package/src/command-line/release/publish.js +3 -0
  34. package/src/command-line/release/release.js +1 -1
  35. package/src/command-line/release/utils/get-touched-projects-for-group.d.ts +7 -0
  36. package/src/command-line/release/utils/get-touched-projects-for-group.js +78 -0
  37. package/src/command-line/release/utils/git.d.ts +1 -1
  38. package/src/command-line/release/utils/git.js +46 -19
  39. package/src/command-line/release/version.js +1 -1
  40. package/src/command-line/report/command-object.js +1 -1
  41. package/src/command-line/reset/command-object.js +1 -1
  42. package/src/command-line/run/command-object.js +1 -1
  43. package/src/command-line/run-many/command-object.js +1 -1
  44. package/src/command-line/show/command-object.js +10 -10
  45. package/src/command-line/watch/command-object.js +1 -1
  46. package/src/command-line/yargs-utils/shared-options.d.ts +2 -1
  47. package/src/command-line/yargs-utils/shared-options.js +26 -29
  48. package/src/core/graph/main.js +1 -1
  49. package/src/daemon/server/sync-generators.d.ts +4 -0
  50. package/src/daemon/server/sync-generators.js +172 -52
  51. package/src/native/nx.wasm32-wasi.wasm +0 -0
  52. package/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.d.ts +2 -1
  53. package/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +25 -23
  54. package/src/nx-cloud/generators/connect-to-nx-cloud/schema.json +4 -0
  55. package/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +8 -1
  56. package/src/project-graph/plugins/isolation/plugin-pool.js +1 -1
  57. package/src/tasks-runner/cache.d.ts +2 -0
  58. package/src/tasks-runner/cache.js +15 -1
  59. package/src/tasks-runner/run-command.js +4 -1
  60. package/src/tasks-runner/task-orchestrator.js +1 -10
  61. package/src/utils/command-line-utils.d.ts +1 -0
  62. package/src/utils/git-utils.d.ts +7 -10
  63. package/src/utils/git-utils.js +61 -44
  64. package/src/utils/sync-generators.d.ts +2 -2
  65. package/src/utils/squash.d.ts +0 -1
  66. package/src/utils/squash.js +0 -12
@@ -103,6 +103,9 @@ async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, is
103
103
  if (args.otp) {
104
104
  overrides.otp = args.otp;
105
105
  }
106
+ if (args.access) {
107
+ overrides.access = args.access;
108
+ }
106
109
  if (args.dryRun) {
107
110
  overrides.dryRun = args.dryRun;
108
111
  /**
@@ -94,7 +94,7 @@ function createAPI(overrideReleaseConfig) {
94
94
  output_1.output.error(filterError);
95
95
  process.exit(1);
96
96
  }
97
- (0, version_plans_1.setResolvedVersionPlansOnGroups)(rawVersionPlans, releaseGroups, Object.keys(projectGraph.nodes));
97
+ await (0, version_plans_1.setResolvedVersionPlansOnGroups)(rawVersionPlans, releaseGroups, Object.keys(projectGraph.nodes), args.verbose);
98
98
  const planFiles = new Set();
99
99
  releaseGroups.forEach((group) => {
100
100
  if (group.resolvedVersionPlans) {
@@ -0,0 +1,7 @@
1
+ import { FileData, ProjectGraph } from '../../../config/project-graph';
2
+ import { NxArgs } from '../../../utils/command-line-utils';
3
+ import { ReleaseGroupWithName } from '../config/filter-release-groups';
4
+ /**
5
+ * Create a function that returns the touched projects for a given release group. Only relevant when version plans are enabled.
6
+ */
7
+ export declare function createGetTouchedProjectsForGroup(nxArgs: NxArgs, projectGraph: ProjectGraph, changedFiles: string[], fileData: FileData[]): (releaseGroup: ReleaseGroupWithName, releaseGroupFilteredProjectNames: string[], hasProjectsFilter: boolean) => Promise<string[]>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createGetTouchedProjectsForGroup = createGetTouchedProjectsForGroup;
4
+ const workspace_projects_1 = require("../../../project-graph/affected/locators/workspace-projects");
5
+ const file_utils_1 = require("../../../project-graph/file-utils");
6
+ const ignore_1 = require("../../../utils/ignore");
7
+ const output_1 = require("../../../utils/output");
8
+ const config_1 = require("../config/config");
9
+ /**
10
+ * Create a function that returns the touched projects for a given release group. Only relevant when version plans are enabled.
11
+ */
12
+ function createGetTouchedProjectsForGroup(nxArgs, projectGraph, changedFiles, fileData) {
13
+ /**
14
+ * Create a minimal subset of touched projects based on the configured ignore patterns, we only need
15
+ * to recompute when the ignorePatternsForPlanCheck differs between release groups.
16
+ */
17
+ const serializedIgnorePatternsToTouchedProjects = new Map();
18
+ return async function getTouchedProjectsForGroup(releaseGroup,
19
+ // We don't access releaseGroups.projects directly, because we need to take the --projects filter into account
20
+ releaseGroupFilteredProjectNames, hasProjectsFilter) {
21
+ // The current release group doesn't leverage version plans
22
+ if (!releaseGroup.versionPlans) {
23
+ return [];
24
+ }
25
+ // Exclude patterns from .nxignore, .gitignore and explicit version plan config
26
+ let serializedIgnorePatterns = '[]';
27
+ const ignore = (0, ignore_1.getIgnoreObject)();
28
+ if (typeof releaseGroup.versionPlans !== 'boolean' &&
29
+ Array.isArray(releaseGroup.versionPlans.ignorePatternsForPlanCheck) &&
30
+ releaseGroup.versionPlans.ignorePatternsForPlanCheck.length) {
31
+ output_1.output.note({
32
+ title: `Applying configured ignore patterns to changed files${releaseGroup.name !== config_1.IMPLICIT_DEFAULT_RELEASE_GROUP
33
+ ? ` for release group "${releaseGroup.name}"`
34
+ : ''}`,
35
+ bodyLines: [
36
+ ...releaseGroup.versionPlans.ignorePatternsForPlanCheck.map((pattern) => ` - ${pattern}`),
37
+ ],
38
+ });
39
+ ignore.add(releaseGroup.versionPlans.ignorePatternsForPlanCheck);
40
+ serializedIgnorePatterns = JSON.stringify(releaseGroup.versionPlans.ignorePatternsForPlanCheck);
41
+ }
42
+ let touchedProjects = {};
43
+ if (serializedIgnorePatternsToTouchedProjects.has(serializedIgnorePatterns)) {
44
+ touchedProjects = serializedIgnorePatternsToTouchedProjects.get(serializedIgnorePatterns);
45
+ }
46
+ else {
47
+ // We only care about directly touched projects, not implicitly affected ones etc
48
+ const touchedProjectsArr = await (0, workspace_projects_1.getTouchedProjects)((0, file_utils_1.calculateFileChanges)(changedFiles, fileData, nxArgs, undefined, ignore), projectGraph.nodes);
49
+ touchedProjects = touchedProjectsArr.reduce((acc, project) => ({ ...acc, [project]: true }), {});
50
+ serializedIgnorePatternsToTouchedProjects.set(serializedIgnorePatterns, touchedProjects);
51
+ }
52
+ const touchedProjectsUnderReleaseGroup = releaseGroupFilteredProjectNames.filter((project) => touchedProjects[project]);
53
+ if (touchedProjectsUnderReleaseGroup.length) {
54
+ output_1.output.log({
55
+ title: `Touched projects${hasProjectsFilter ? ` (after --projects filter applied)` : ''} based on changed files${releaseGroup.name !== config_1.IMPLICIT_DEFAULT_RELEASE_GROUP
56
+ ? ` under release group "${releaseGroup.name}"`
57
+ : ''}`,
58
+ bodyLines: [
59
+ ...touchedProjectsUnderReleaseGroup.map((project) => ` - ${project}`),
60
+ '',
61
+ 'NOTE: You can adjust your "versionPlans.ignorePatternsForPlanCheck" config to stop certain files from resulting in projects being classed as touched for the purposes of this command.',
62
+ ],
63
+ });
64
+ }
65
+ else {
66
+ output_1.output.log({
67
+ title: `No touched projects${hasProjectsFilter ? ` (after --projects filter applied)` : ''} found based on changed files${typeof releaseGroup.versionPlans !== 'boolean' &&
68
+ Array.isArray(releaseGroup.versionPlans.ignorePatternsForPlanCheck) &&
69
+ releaseGroup.versionPlans.ignorePatternsForPlanCheck.length
70
+ ? ' combined with configured ignore patterns'
71
+ : ''}${releaseGroup.name !== config_1.IMPLICIT_DEFAULT_RELEASE_GROUP
72
+ ? ` under release group "${releaseGroup.name}"`
73
+ : ''}`,
74
+ });
75
+ }
76
+ return touchedProjectsUnderReleaseGroup;
77
+ };
78
+ }
@@ -62,6 +62,6 @@ export declare function parseConventionalCommitsMessage(message: string): {
62
62
  description: string;
63
63
  breaking: boolean;
64
64
  } | null;
65
- export declare function parseGitCommit(commit: RawGitCommit): GitCommit | null;
65
+ export declare function parseGitCommit(commit: RawGitCommit, isVersionPlanCommit?: boolean): GitCommit | null;
66
66
  export declare function getCommitHash(ref: string): Promise<string>;
67
67
  export declare function getFirstGitCommit(): Promise<string>;
@@ -136,7 +136,7 @@ async function gitAdd({ changedFiles, deletedFiles, dryRun, verbose, logFn, cwd,
136
136
  ignoredFiles.push(f);
137
137
  // git add will fail if trying to add an untracked file that doesn't exist
138
138
  }
139
- else if (changedTrackedFiles.has(f)) {
139
+ else if (changedTrackedFiles.has(f) || dryRun) {
140
140
  filesToAdd.push(f);
141
141
  }
142
142
  }
@@ -281,6 +281,30 @@ function parseConventionalCommitsMessage(message) {
281
281
  breaking: Boolean(match.groups.breaking),
282
282
  };
283
283
  }
284
+ function extractReferencesFromCommitMessage(message, shortHash) {
285
+ const references = [];
286
+ for (const m of message.matchAll(PullRequestRE)) {
287
+ references.push({ type: 'pull-request', value: m[1] });
288
+ }
289
+ for (const m of message.matchAll(IssueRE)) {
290
+ if (!references.some((i) => i.value === m[1])) {
291
+ references.push({ type: 'issue', value: m[1] });
292
+ }
293
+ }
294
+ references.push({ value: shortHash, type: 'hash' });
295
+ return references;
296
+ }
297
+ function getAllAuthorsForCommit(commit) {
298
+ const authors = [commit.author];
299
+ // Additional authors can be specified in the commit body (depending on the VCS provider)
300
+ for (const match of commit.body.matchAll(CoAuthoredByRegex)) {
301
+ authors.push({
302
+ name: (match.groups.name || '').trim(),
303
+ email: (match.groups.email || '').trim(),
304
+ });
305
+ }
306
+ return authors;
307
+ }
284
308
  // https://www.conventionalcommits.org/en/v1.0.0/
285
309
  // https://regex101.com/r/FSfNvA/1
286
310
  const ConventionalCommitRegex = /(?<type>[a-z]+)(\((?<scope>.+)\))?(?<breaking>!)?: (?<description>.+)/i;
@@ -289,7 +313,25 @@ const PullRequestRE = /\([ a-z]*(#\d+)\s*\)/gm;
289
313
  const IssueRE = /(#\d+)/gm;
290
314
  const ChangedFileRegex = /(A|M|D|R\d*|C\d*)\t([^\t\n]*)\t?(.*)?/gm;
291
315
  const RevertHashRE = /This reverts commit (?<hash>[\da-f]{40})./gm;
292
- function parseGitCommit(commit) {
316
+ function parseGitCommit(commit, isVersionPlanCommit = false) {
317
+ // For version plans, we do not require conventional commits and therefore cannot extract data based on that format
318
+ if (isVersionPlanCommit) {
319
+ return {
320
+ ...commit,
321
+ description: commit.message,
322
+ type: '',
323
+ scope: '',
324
+ references: extractReferencesFromCommitMessage(commit.message, commit.shortHash),
325
+ // The commit message is not the source of truth for a breaking (major) change in version plans, so the value is not relevant
326
+ // TODO(v20): Make the current GitCommit interface more clearly tied to conventional commits
327
+ isBreaking: false,
328
+ authors: getAllAuthorsForCommit(commit),
329
+ // Not applicable to version plans
330
+ affectedFiles: [],
331
+ // Not applicable, a version plan cannot have been added in a commit that also reverts another commit
332
+ revertedHashes: [],
333
+ };
334
+ }
293
335
  const parsedMessage = parseConventionalCommitsMessage(commit.message);
294
336
  if (!parsedMessage) {
295
337
  return null;
@@ -298,16 +340,7 @@ function parseGitCommit(commit) {
298
340
  const isBreaking = parsedMessage.breaking || commit.body.includes('BREAKING CHANGE:');
299
341
  let description = parsedMessage.description;
300
342
  // Extract references from message
301
- const references = [];
302
- for (const m of description.matchAll(PullRequestRE)) {
303
- references.push({ type: 'pull-request', value: m[1] });
304
- }
305
- for (const m of description.matchAll(IssueRE)) {
306
- if (!references.some((i) => i.value === m[1])) {
307
- references.push({ type: 'issue', value: m[1] });
308
- }
309
- }
310
- references.push({ value: commit.shortHash, type: 'hash' });
343
+ const references = extractReferencesFromCommitMessage(description, commit.shortHash);
311
344
  // Remove references and normalize
312
345
  description = description.replace(PullRequestRE, '').trim();
313
346
  let type = parsedMessage.type;
@@ -322,13 +355,7 @@ function parseGitCommit(commit) {
322
355
  description = commit.message;
323
356
  }
324
357
  // Find all authors
325
- const authors = [commit.author];
326
- for (const match of commit.body.matchAll(CoAuthoredByRegex)) {
327
- authors.push({
328
- name: (match.groups.name || '').trim(),
329
- email: (match.groups.email || '').trim(),
330
- });
331
- }
358
+ const authors = getAllAuthorsForCommit(commit);
332
359
  // Extract file changes from commit body
333
360
  const affectedFiles = Array.from(commit.body.matchAll(ChangedFileRegex)).reduce((prev, [fullLine, changeType, file1, file2]) =>
334
361
  // file2 only exists for some change types, such as renames
@@ -82,7 +82,7 @@ function createAPI(overrideReleaseConfig) {
82
82
  }
83
83
  if (!args.specifier) {
84
84
  const rawVersionPlans = await (0, version_plans_1.readRawVersionPlans)();
85
- (0, version_plans_1.setResolvedVersionPlansOnGroups)(rawVersionPlans, releaseGroups, Object.keys(projectGraph.nodes));
85
+ await (0, version_plans_1.setResolvedVersionPlansOnGroups)(rawVersionPlans, releaseGroups, Object.keys(projectGraph.nodes), args.verbose);
86
86
  }
87
87
  else {
88
88
  if (args.verbose && releaseGroups.some((g) => !!g.versionPlans)) {
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.yargsReportCommand = void 0;
4
4
  exports.yargsReportCommand = {
5
5
  command: 'report',
6
- describe: 'Reports useful version numbers to copy into the Nx issue template',
6
+ describe: 'Reports useful version numbers to copy into the Nx issue template.',
7
7
  handler: async () => {
8
8
  await (await Promise.resolve().then(() => require('./report'))).reportHandler();
9
9
  process.exit(0);
@@ -19,7 +19,7 @@ exports.yargsResetCommand = {
19
19
  type: 'boolean',
20
20
  })
21
21
  .option('onlyWorkspaceData', {
22
- description: 'Clears the workspace data directory. Used by Nx to store cached data about the current workspace (e.g. partial results, incremental data, etc)',
22
+ description: 'Clears the workspace data directory. Used by Nx to store cached data about the current workspace (e.g. partial results, incremental data, etc).',
23
23
  type: 'boolean',
24
24
  }),
25
25
  handler: async (argv) => (await Promise.resolve().then(() => require('./reset'))).resetHandler(argv),
@@ -27,7 +27,7 @@ exports.yargsRunCommand = {
27
27
  exports.yargsNxInfixCommand = {
28
28
  ...exports.yargsRunCommand,
29
29
  command: '$0 <target> [project] [_..]',
30
- describe: 'Run a target for a project',
30
+ describe: 'Run a target for a project.',
31
31
  handler: async (args) => {
32
32
  const exitCode = await (0, params_1.handleErrors)(args.verbose ?? process.env.NX_VERBOSE_LOGGING === 'true', async () => {
33
33
  // Yargs parses <target> as 'undefined' if running just 'nx'
@@ -6,7 +6,7 @@ const shared_options_1 = require("../yargs-utils/shared-options");
6
6
  const params_1 = require("../../utils/params");
7
7
  exports.yargsRunManyCommand = {
8
8
  command: 'run-many',
9
- describe: 'Run target for multiple listed projects',
9
+ describe: 'Run target for multiple listed projects.',
10
10
  builder: (yargs) => (0, documentation_1.linkToNxDevAndExamples)((0, shared_options_1.withRunManyOptions)((0, shared_options_1.withOutputStyleOption)((0, shared_options_1.withTargetAndConfigurationOption)((0, shared_options_1.withBatch)(yargs)))), 'run-many'),
11
11
  handler: async (args) => {
12
12
  const exitCode = await (0, params_1.handleErrors)(args.verbose ?? process.env.NX_VERBOSE_LOGGING === 'true', async () => {
@@ -6,14 +6,14 @@ const shared_options_1 = require("../yargs-utils/shared-options");
6
6
  const params_1 = require("../../utils/params");
7
7
  exports.yargsShowCommand = {
8
8
  command: 'show',
9
- describe: 'Show information about the workspace (e.g., list of projects)',
9
+ describe: 'Show information about the workspace (e.g., list of projects).',
10
10
  builder: (yargs) => yargs
11
11
  .command(showProjectsCommand)
12
12
  .command(showProjectCommand)
13
13
  .demandCommand()
14
14
  .option('json', {
15
15
  type: 'boolean',
16
- description: 'Output JSON',
16
+ description: 'Output JSON.',
17
17
  })
18
18
  .example('$0 show projects', 'Show a list of all projects in the workspace')
19
19
  .example('$0 show projects --with-target serve', 'Show a list of all projects in the workspace that have a "serve" target')
@@ -25,11 +25,11 @@ exports.yargsShowCommand = {
25
25
  };
26
26
  const showProjectsCommand = {
27
27
  command: 'projects',
28
- describe: 'Show a list of projects in the workspace',
28
+ describe: 'Show a list of projects in the workspace.',
29
29
  builder: (yargs) => (0, shared_options_1.withVerbose)((0, shared_options_1.withAffectedOptions)(yargs))
30
30
  .option('affected', {
31
31
  type: 'boolean',
32
- description: 'Show only affected projects',
32
+ description: 'Show only affected projects.',
33
33
  })
34
34
  .option('projects', {
35
35
  type: 'string',
@@ -40,17 +40,17 @@ const showProjectsCommand = {
40
40
  .option('withTarget', {
41
41
  type: 'string',
42
42
  alias: ['t'],
43
- description: 'Show only projects that have a specific target',
43
+ description: 'Show only projects that have a specific target.',
44
44
  coerce: shared_options_1.parseCSV,
45
45
  })
46
46
  .option('type', {
47
47
  type: 'string',
48
- description: 'Select only projects of the given type',
48
+ description: 'Select only projects of the given type.',
49
49
  choices: ['app', 'lib', 'e2e'],
50
50
  })
51
51
  .option('sep', {
52
52
  type: 'string',
53
- description: 'Outputs projects with the specified seperator',
53
+ description: 'Outputs projects with the specified seperator.',
54
54
  })
55
55
  .implies('untracked', 'affected')
56
56
  .implies('uncommitted', 'affected')
@@ -79,15 +79,15 @@ const showProjectCommand = {
79
79
  .positional('projectName', {
80
80
  type: 'string',
81
81
  alias: 'p',
82
- description: 'Which project should be viewed?',
82
+ description: 'Which project should be viewed?.',
83
83
  })
84
84
  .option('web', {
85
85
  type: 'boolean',
86
- description: 'Show project details in the browser. (default when interactive)',
86
+ description: 'Show project details in the browser. (default when interactive).',
87
87
  })
88
88
  .option('open', {
89
89
  type: 'boolean',
90
- description: 'Set to false to prevent the browser from opening when using --web',
90
+ description: 'Set to false to prevent the browser from opening when using --web.',
91
91
  implies: 'web',
92
92
  })
93
93
  .check((argv) => {
@@ -5,7 +5,7 @@ const documentation_1 = require("../yargs-utils/documentation");
5
5
  const shared_options_1 = require("../yargs-utils/shared-options");
6
6
  exports.yargsWatchCommand = {
7
7
  command: 'watch',
8
- describe: 'Watch for changes within projects, and execute commands',
8
+ describe: 'Watch for changes within projects, and execute commands.',
9
9
  builder: (yargs) => (0, documentation_1.linkToNxDevAndExamples)(withWatchOptions(yargs), 'watch'),
10
10
  handler: async (args) => {
11
11
  await Promise.resolve().then(() => require('./watch')).then((m) => m.watch(args));
@@ -3,7 +3,7 @@ interface ExcludeOptions {
3
3
  exclude: string[];
4
4
  }
5
5
  export declare const defaultYargsParserConfiguration: Partial<ParserConfigurationOptions>;
6
- export declare function withExcludeOption(yargs: Argv): Argv<ExcludeOptions>;
6
+ export declare function withExcludeOption<T>(yargs: Argv<T>): Argv<T & ExcludeOptions>;
7
7
  export interface RunOptions {
8
8
  exclude: string;
9
9
  parallel: string;
@@ -20,6 +20,7 @@ export interface RunOptions {
20
20
  batch: boolean;
21
21
  useAgents: boolean;
22
22
  excludeTaskDependencies: boolean;
23
+ skipSync: boolean;
23
24
  }
24
25
  export declare function withRunOptions<T>(yargs: Argv<T>): Argv<T & RunOptions>;
25
26
  export declare function withTargetAndConfigurationOption(yargs: Argv, demandOption?: boolean): Argv<{
@@ -22,7 +22,7 @@ exports.defaultYargsParserConfiguration = {
22
22
  };
23
23
  function withExcludeOption(yargs) {
24
24
  return yargs.option('exclude', {
25
- describe: 'Exclude certain projects from being processed',
25
+ describe: 'Exclude certain projects from being processed.',
26
26
  type: 'string',
27
27
  coerce: parseCSV,
28
28
  });
@@ -30,7 +30,7 @@ function withExcludeOption(yargs) {
30
30
  function withRunOptions(yargs) {
31
31
  return withVerbose(withExcludeOption(yargs))
32
32
  .option('parallel', {
33
- describe: 'Max number of parallel processes [default is 3]',
33
+ describe: 'Max number of parallel processes [default is 3].',
34
34
  type: 'string',
35
35
  })
36
36
  .option('maxParallel', {
@@ -38,11 +38,11 @@ function withRunOptions(yargs) {
38
38
  hidden: true,
39
39
  })
40
40
  .options('runner', {
41
- describe: 'This is the name of the tasks runner configured in nx.json',
41
+ describe: 'This is the name of the tasks runner configured in nx.json.',
42
42
  type: 'string',
43
43
  })
44
44
  .option('prod', {
45
- describe: 'Use the production configuration',
45
+ describe: 'Use the production configuration.',
46
46
  type: 'boolean',
47
47
  default: false,
48
48
  hidden: true,
@@ -61,24 +61,29 @@ function withRunOptions(yargs) {
61
61
  : value,
62
62
  })
63
63
  .option('nxBail', {
64
- describe: 'Stop command execution after the first failed task',
64
+ describe: 'Stop command execution after the first failed task.',
65
65
  type: 'boolean',
66
66
  default: false,
67
67
  })
68
68
  .option('nxIgnoreCycles', {
69
- describe: 'Ignore cycles in the task graph',
69
+ describe: 'Ignore cycles in the task graph.',
70
70
  type: 'boolean',
71
71
  default: false,
72
72
  })
73
73
  .options('skipNxCache', {
74
- describe: 'Rerun the tasks even when the results are available in the cache',
74
+ describe: 'Rerun the tasks even when the results are available in the cache.',
75
75
  type: 'boolean',
76
76
  default: false,
77
77
  })
78
78
  .options('excludeTaskDependencies', {
79
- describe: 'Skips running dependent tasks first',
79
+ describe: 'Skips running dependent tasks first.',
80
80
  type: 'boolean',
81
81
  default: false,
82
+ })
83
+ .option('skipSync', {
84
+ type: 'boolean',
85
+ // TODO(leo): add description and make it visible once it is stable
86
+ hidden: true,
82
87
  })
83
88
  .options('cloud', {
84
89
  type: 'boolean',
@@ -96,7 +101,7 @@ function withRunOptions(yargs) {
96
101
  }
97
102
  function withTargetAndConfigurationOption(yargs, demandOption = true) {
98
103
  return withConfiguration(yargs).option('targets', {
99
- describe: 'Tasks to run for affected projects',
104
+ describe: 'Tasks to run for affected projects.',
100
105
  type: 'string',
101
106
  alias: ['target', 't'],
102
107
  requiresArg: true,
@@ -107,7 +112,7 @@ function withTargetAndConfigurationOption(yargs, demandOption = true) {
107
112
  }
108
113
  function withConfiguration(yargs) {
109
114
  return yargs.options('configuration', {
110
- describe: 'This is the configuration to use when performing tasks on projects',
115
+ describe: 'This is the configuration to use when performing tasks on projects.',
111
116
  type: 'string',
112
117
  alias: 'c',
113
118
  });
@@ -115,7 +120,7 @@ function withConfiguration(yargs) {
115
120
  function withVerbose(yargs) {
116
121
  return yargs
117
122
  .option('verbose', {
118
- describe: 'Prints additional information about the commands (e.g., stack traces)',
123
+ describe: 'Prints additional information about the commands (e.g., stack traces).',
119
124
  type: 'boolean',
120
125
  })
121
126
  .middleware((args) => {
@@ -127,7 +132,7 @@ function withVerbose(yargs) {
127
132
  function withBatch(yargs) {
128
133
  return yargs.options('batch', {
129
134
  type: 'boolean',
130
- describe: 'Run task(s) in batches for executors which support batches',
135
+ describe: 'Run task(s) in batches for executors which support batches.',
131
136
  coerce: (v) => {
132
137
  return v || process.env.NX_BATCH_MODE === 'true';
133
138
  },
@@ -138,26 +143,26 @@ function withAffectedOptions(yargs) {
138
143
  return withExcludeOption(yargs)
139
144
  .parserConfiguration(exports.defaultYargsParserConfiguration)
140
145
  .option('files', {
141
- describe: 'Change the way Nx is calculating the affected command by providing directly changed files, list of files delimited by commas or spaces',
146
+ describe: 'Change the way Nx is calculating the affected command by providing directly changed files, list of files delimited by commas or spaces.',
142
147
  type: 'string',
143
148
  requiresArg: true,
144
149
  coerce: parseCSV,
145
150
  })
146
151
  .option('uncommitted', {
147
- describe: 'Uncommitted changes',
152
+ describe: 'Uncommitted changes.',
148
153
  type: 'boolean',
149
154
  })
150
155
  .option('untracked', {
151
- describe: 'Untracked changes',
156
+ describe: 'Untracked changes.',
152
157
  type: 'boolean',
153
158
  })
154
159
  .option('base', {
155
- describe: 'Base of the current branch (usually main)',
160
+ describe: 'Base of the current branch (usually main).',
156
161
  type: 'string',
157
162
  requiresArg: true,
158
163
  })
159
164
  .option('head', {
160
- describe: 'Latest commit of the current branch (usually HEAD)',
165
+ describe: 'Latest commit of the current branch (usually HEAD).',
161
166
  type: 'string',
162
167
  requiresArg: true,
163
168
  })
@@ -178,7 +183,7 @@ function withRunManyOptions(yargs) {
178
183
  type: 'string',
179
184
  alias: 'p',
180
185
  coerce: parseCSV,
181
- describe: 'Projects to run. (comma/space delimited project names and/or patterns)',
186
+ describe: 'Projects to run. (comma/space delimited project names and/or patterns).',
182
187
  })
183
188
  .option('all', {
184
189
  describe: '[deprecated] `run-many` runs all targets on all projects in the workspace if no projects are provided. This option is no longer required.',
@@ -209,15 +214,7 @@ function withOutputStyleOption(yargs, choices = [
209
214
  'stream-without-prefixes',
210
215
  ]) {
211
216
  return yargs.option('output-style', {
212
- describe: `Defines how Nx emits outputs tasks logs
213
-
214
- | option | description |
215
- | --- | --- |
216
- | dynamic | use dynamic output life cycle, previous content is overwritten or modified as new outputs are added, display minimal logs by default, always show errors. This output format is recommended on your local development environments. |
217
- | static | uses static output life cycle, no previous content is rewritten or modified as new outputs are added. This output format is recommened for CI environments. |
218
- | stream | nx by default logs output to an internal output stream, enable this option to stream logs to stdout / stderr |
219
- | stream-without-prefixes | nx prefixes the project name the target is running on, use this option remove the project name prefix from output |
220
- `,
217
+ describe: `Defines how Nx emits outputs tasks logs. **dynamic**: use dynamic output life cycle, previous content is overwritten or modified as new outputs are added, display minimal logs by default, always show errors. This output format is recommended on your local development environments. **static**: uses static output life cycle, no previous content is rewritten or modified as new outputs are added. This output format is recommened for CI environments. **stream**: nx by default logs output to an internal output stream, enable this option to stream logs to stdout / stderr. **stream-without-prefixes**: nx prefixes the project name the target is running on, use this option remove the project name prefix from output.`,
221
218
  type: 'string',
222
219
  choices,
223
220
  });
@@ -227,11 +224,11 @@ function withRunOneOptions(yargs) {
227
224
  const res = withRunOptions(withOutputStyleOption(withConfiguration(yargs), allOutputStyles))
228
225
  .parserConfiguration(exports.defaultYargsParserConfiguration)
229
226
  .option('project', {
230
- describe: 'Target project',
227
+ describe: 'Target project.',
231
228
  type: 'string',
232
229
  })
233
230
  .option('help', {
234
- describe: 'Show Help',
231
+ describe: 'Show Help.',
235
232
  type: 'boolean',
236
233
  });
237
234
  if (executorShouldShowHelp) {