nx 20.1.0-canary.20241101-d4f4dac → 20.1.0-canary.20241102-c290b37

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -22,6 +22,21 @@ export declare class ProcessTasks {
22
22
  createTask(id: string, project: ProjectGraphProjectNode, target: string, resolvedConfiguration: string | undefined, overrides: Object): Task;
23
23
  resolveConfiguration(project: ProjectGraphProjectNode, target: string, configuration: string | undefined): string;
24
24
  getId(project: string, target: string, configuration: string | undefined): string;
25
+ /**
26
+ * this function is used to get the non dummy dependencies of a task recursively
27
+ * For example, when we have the following dependencies:
28
+ * {
29
+ * 'app1:compile': [ 'app2:__nx_dummy_task__' ],
30
+ * 'app2:__nx_dummy_task__': [ 'app3:__nx_dummy_task__' ],
31
+ * 'app3:__nx_dummy_task__': [ 'app4:precompile' ],
32
+ * 'app4:precompile': []
33
+ * }
34
+ * getNonDummyDeps('app1:compile') will return ['app1:compile']
35
+ * getNonDummyDeps('app2:__nx_dummy_task__') will return ['app4:precompile']
36
+ * getNonDummyDeps('app3:__nx_dummy_task__') will return ['app4:precompile']
37
+ * getNonDummyDeps('app4:precompile') will return ['app4:precompile']
38
+ */
39
+ private getNonDummyDeps;
25
40
  private filterDummyTasks;
26
41
  }
27
42
  export declare function createTaskGraph(projectGraph: ProjectGraph, extraTargetDependencies: TargetDependencies, projectNames: string[], targets: string[], configuration: string | undefined, overrides: Object, excludeTaskDependencies?: boolean): TaskGraph;
@@ -6,6 +6,7 @@ exports.mapTargetDefaultsToDependencies = mapTargetDefaultsToDependencies;
6
6
  const utils_1 = require("./utils");
7
7
  const project_graph_utils_1 = require("../utils/project-graph-utils");
8
8
  const output_1 = require("../utils/output");
9
+ const task_graph_utils_1 = require("./task-graph-utils");
9
10
  const DUMMY_TASK_TARGET = '__nx_dummy_task__';
10
11
  class ProcessTasks {
11
12
  constructor(extraTargetDependencies, projectGraph) {
@@ -139,7 +140,7 @@ class ProcessTasks {
139
140
  else {
140
141
  const dummyId = this.getId(depProject.name, DUMMY_TASK_TARGET, undefined);
141
142
  this.dependencies[task.id].push(dummyId);
142
- this.dependencies[dummyId] = [];
143
+ this.dependencies[dummyId] ??= [];
143
144
  const noopTask = this.createDummyTask(dummyId, task);
144
145
  this.processTask(noopTask, depProject.name, configuration, overrides);
145
146
  }
@@ -188,18 +189,45 @@ class ProcessTasks {
188
189
  }
189
190
  return id;
190
191
  }
192
+ /**
193
+ * this function is used to get the non dummy dependencies of a task recursively
194
+ * For example, when we have the following dependencies:
195
+ * {
196
+ * 'app1:compile': [ 'app2:__nx_dummy_task__' ],
197
+ * 'app2:__nx_dummy_task__': [ 'app3:__nx_dummy_task__' ],
198
+ * 'app3:__nx_dummy_task__': [ 'app4:precompile' ],
199
+ * 'app4:precompile': []
200
+ * }
201
+ * getNonDummyDeps('app1:compile') will return ['app1:compile']
202
+ * getNonDummyDeps('app2:__nx_dummy_task__') will return ['app4:precompile']
203
+ * getNonDummyDeps('app3:__nx_dummy_task__') will return ['app4:precompile']
204
+ * getNonDummyDeps('app4:precompile') will return ['app4:precompile']
205
+ */
206
+ getNonDummyDeps(currentTask, originalTask, cycle) {
207
+ if (currentTask === originalTask) {
208
+ return [];
209
+ }
210
+ else if (currentTask.endsWith(DUMMY_TASK_TARGET)) {
211
+ if (cycle?.length && cycle?.includes(currentTask)) {
212
+ return [];
213
+ }
214
+ // if not a cycle, recursively get the non dummy dependencies
215
+ return (this.dependencies[currentTask]?.flatMap((dep) => this.getNonDummyDeps(dep, originalTask, cycle)) ?? []);
216
+ }
217
+ else {
218
+ return [currentTask];
219
+ }
220
+ }
191
221
  filterDummyTasks() {
222
+ const cycle = (0, task_graph_utils_1.findCycle)({ dependencies: this.dependencies });
192
223
  for (const [key, deps] of Object.entries(this.dependencies)) {
193
- const normalizedDeps = [];
194
- for (const dep of deps) {
195
- if (dep.endsWith(DUMMY_TASK_TARGET)) {
196
- normalizedDeps.push(...this.dependencies[dep].filter((d) => !d.endsWith(DUMMY_TASK_TARGET)));
197
- }
198
- else {
199
- normalizedDeps.push(dep);
224
+ if (!key.endsWith(DUMMY_TASK_TARGET)) {
225
+ const normalizedDeps = [];
226
+ for (const dep of deps) {
227
+ normalizedDeps.push(...this.getNonDummyDeps(dep, key, cycle));
200
228
  }
229
+ this.dependencies[key] = normalizedDeps;
201
230
  }
202
- this.dependencies[key] = normalizedDeps;
203
231
  }
204
232
  for (const key of Object.keys(this.dependencies)) {
205
233
  if (key.endsWith(DUMMY_TASK_TARGET)) {