nx 20.4.0-canary.20250125-15fc599 → 20.4.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/package.json +11 -11
  2. package/src/command-line/release/publish.js +11 -0
  3. package/src/core/graph/main.js +1 -1
  4. package/src/core/graph/styles.js +1 -1
  5. package/src/daemon/client/client.d.ts +3 -0
  6. package/src/daemon/client/client.js +15 -0
  7. package/src/daemon/message-types/run-tasks-execution-hooks.d.ts +13 -0
  8. package/src/daemon/message-types/run-tasks-execution-hooks.js +19 -0
  9. package/src/daemon/server/handle-tasks-execution-hooks.d.ts +19 -0
  10. package/src/daemon/server/handle-tasks-execution-hooks.js +35 -0
  11. package/src/daemon/server/server.js +8 -0
  12. package/src/devkit-exports.d.ts +6 -2
  13. package/src/native/nx.wasm32-wasi.wasm +0 -0
  14. package/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +1 -4
  15. package/src/plugins/js/utils/packages.js +2 -16
  16. package/src/project-graph/plugins/get-plugins.js +2 -17
  17. package/src/project-graph/plugins/isolation/enabled.d.ts +1 -0
  18. package/src/project-graph/plugins/isolation/enabled.js +19 -0
  19. package/src/project-graph/plugins/isolation/messaging.d.ts +46 -7
  20. package/src/project-graph/plugins/isolation/messaging.js +5 -1
  21. package/src/project-graph/plugins/isolation/plugin-pool.js +46 -0
  22. package/src/project-graph/plugins/isolation/plugin-worker.js +40 -0
  23. package/src/project-graph/plugins/load-resolved-plugin.js +4 -1
  24. package/src/project-graph/plugins/loaded-nx-plugin.d.ts +3 -5
  25. package/src/project-graph/plugins/loaded-nx-plugin.js +27 -0
  26. package/src/project-graph/plugins/public-api.d.ts +26 -6
  27. package/src/project-graph/plugins/tasks-execution-hooks.d.ts +3 -0
  28. package/src/project-graph/plugins/tasks-execution-hooks.js +65 -0
  29. package/src/project-graph/utils/retrieve-workspace-files.js +1 -1
  30. package/src/tasks-runner/life-cycle.d.ts +7 -0
  31. package/src/tasks-runner/run-command.d.ts +2 -4
  32. package/src/tasks-runner/run-command.js +18 -2
  33. package/src/tasks-runner/task-orchestrator.js +6 -2
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runPreTasksExecution = runPreTasksExecution;
4
+ exports.runPostTasksExecution = runPostTasksExecution;
5
+ const get_plugins_1 = require("./get-plugins");
6
+ const is_on_daemon_1 = require("../../daemon/is-on-daemon");
7
+ const client_1 = require("../../daemon/client/client");
8
+ async function runPreTasksExecution(pluginContext) {
9
+ if ((0, is_on_daemon_1.isOnDaemon)() || !(0, client_1.isDaemonEnabled)()) {
10
+ performance.mark(`preTasksExecution:start`);
11
+ const plugins = await (0, get_plugins_1.getPlugins)(pluginContext.workspaceRoot);
12
+ const envs = await Promise.all(plugins
13
+ .filter((p) => p.preTasksExecution)
14
+ .map(async (plugin) => {
15
+ performance.mark(`${plugin.name}:preTasksExecution:start`);
16
+ try {
17
+ return await plugin.preTasksExecution(pluginContext);
18
+ }
19
+ finally {
20
+ performance.mark(`${plugin.name}:preTasksExecution:end`);
21
+ performance.measure(`${plugin.name}:preTasksExecution`, `${plugin.name}:preTasksExecution:start`, `${plugin.name}:preTasksExecution:end`);
22
+ }
23
+ }));
24
+ if (!(0, client_1.isDaemonEnabled)()) {
25
+ applyProcessEnvs(envs);
26
+ }
27
+ performance.mark(`preTasksExecution:end`);
28
+ performance.measure(`preTasksExecution`, `preTasksExecution:start`, `preTasksExecution:end`);
29
+ return envs;
30
+ }
31
+ else {
32
+ const envs = await client_1.daemonClient.runPreTasksExecution(pluginContext);
33
+ applyProcessEnvs(envs);
34
+ }
35
+ }
36
+ function applyProcessEnvs(envs) {
37
+ for (const env of envs) {
38
+ for (const key in env) {
39
+ process.env[key] = env[key];
40
+ }
41
+ }
42
+ }
43
+ async function runPostTasksExecution(context) {
44
+ if ((0, is_on_daemon_1.isOnDaemon)() || !(0, client_1.isDaemonEnabled)()) {
45
+ performance.mark(`postTasksExecution:start`);
46
+ const plugins = await (0, get_plugins_1.getPlugins)();
47
+ await Promise.all(plugins
48
+ .filter((p) => p.postTasksExecution)
49
+ .map(async (plugin) => {
50
+ performance.mark(`${plugin.name}:postTasksExecution:start`);
51
+ try {
52
+ await plugin.postTasksExecution(context);
53
+ }
54
+ finally {
55
+ performance.mark(`${plugin.name}:postTasksExecution:end`);
56
+ performance.measure(`${plugin.name}:postTasksExecution`, `${plugin.name}:postTasksExecution:start`, `${plugin.name}:postTasksExecution:end`);
57
+ }
58
+ }));
59
+ performance.mark(`postTasksExecution:end`);
60
+ performance.measure(`postTasksExecution`, `postTasksExecution:start`, `postTasksExecution:end`);
61
+ }
62
+ else {
63
+ await client_1.daemonClient.runPostTasksExecution(context);
64
+ }
65
+ }
@@ -52,7 +52,7 @@ async function retrieveProjectConfigurationsWithAngularProjects(workspaceRoot, n
52
52
  (typeof p === 'object' && p.plugin === angular_json_1.NX_ANGULAR_JSON_PLUGIN_NAME))) {
53
53
  pluginsToLoad.push((0, path_1.join)(__dirname, '../../adapter/angular-json'));
54
54
  }
55
- const plugins = await (0, get_plugins_1.getPlugins)();
55
+ const plugins = await (0, get_plugins_1.getPlugins)(workspaceRoot);
56
56
  const res = await retrieveProjectConfigurations(plugins, workspaceRoot, nxJson);
57
57
  return res;
58
58
  }
@@ -1,11 +1,18 @@
1
1
  import { TaskStatus } from './tasks-runner';
2
2
  import { Task } from '../config/task-graph';
3
+ /**
4
+ * The result of a completed {@link Task}
5
+ */
3
6
  export interface TaskResult {
4
7
  task: Task;
5
8
  status: TaskStatus;
6
9
  code: number;
7
10
  terminalOutput?: string;
8
11
  }
12
+ /**
13
+ * A map of {@link TaskResult} keyed by the ID of the completed {@link Task}s
14
+ */
15
+ export type TaskResults = Record<string, TaskResult>;
9
16
  export interface TaskMetadata {
10
17
  groupId: number;
11
18
  }
@@ -3,7 +3,7 @@ import { ProjectGraph, ProjectGraphProjectNode } from '../config/project-graph';
3
3
  import { Task, TaskGraph } from '../config/task-graph';
4
4
  import { TargetDependencyConfig } from '../config/workspace-json-project-json';
5
5
  import { NxArgs } from '../utils/command-line-utils';
6
- import { LifeCycle, TaskResult } from './life-cycle';
6
+ import { LifeCycle, TaskResult, TaskResults } from './life-cycle';
7
7
  import { TasksRunner } from './tasks-runner';
8
8
  export declare function runCommand(projectsToRun: ProjectGraphProjectNode[], currentProjectGraph: ProjectGraph, { nxJson }: {
9
9
  nxJson: NxJsonConfiguration;
@@ -16,9 +16,7 @@ export declare function runCommandForTasks(projectsToRun: ProjectGraphProjectNod
16
16
  }, nxArgs: NxArgs, overrides: any, initiatingProject: string | null, extraTargetDependencies: Record<string, (TargetDependencyConfig | string)[]>, extraOptions: {
17
17
  excludeTaskDependencies: boolean;
18
18
  loadDotEnvFiles: boolean;
19
- }): Promise<{
20
- [id: string]: TaskResult;
21
- }>;
19
+ }): Promise<TaskResults>;
22
20
  export declare function invokeTasksRunner({ tasks, projectGraph, taskGraph, lifeCycle, nxJson, nxArgs, loadDotEnvFiles, initiatingProject, }: {
23
21
  tasks: Task[];
24
22
  projectGraph: ProjectGraph;
@@ -37,6 +37,7 @@ const task_graph_utils_1 = require("./task-graph-utils");
37
37
  const utils_1 = require("./utils");
38
38
  const chalk = require("chalk");
39
39
  const powerpack_1 = require("../utils/powerpack");
40
+ const tasks_execution_hooks_1 = require("../project-graph/plugins/tasks-execution-hooks");
40
41
  async function getTerminalOutputLifeCycle(initiatingProject, projectNames, tasks, nxArgs, nxJson, overrides) {
41
42
  const { runnerOptions } = getRunner(nxArgs, nxJson);
42
43
  const isRunOne = initiatingProject != null;
@@ -102,10 +103,25 @@ function createTaskGraphAndRunValidations(projectGraph, extraTargetDependencies,
102
103
  }
103
104
  async function runCommand(projectsToRun, currentProjectGraph, { nxJson }, nxArgs, overrides, initiatingProject, extraTargetDependencies, extraOptions) {
104
105
  const status = await (0, handle_errors_1.handleErrors)(process.env.NX_VERBOSE_LOGGING === 'true', async () => {
105
- const taskResults = await runCommandForTasks(projectsToRun, currentProjectGraph, { nxJson }, nxArgs, overrides, initiatingProject, extraTargetDependencies, extraOptions);
106
- return Object.values(taskResults).some((taskResult) => taskResult.status === 'failure' || taskResult.status === 'skipped')
106
+ await (0, tasks_execution_hooks_1.runPreTasksExecution)({
107
+ workspaceRoot: workspace_root_1.workspaceRoot,
108
+ nxJsonConfiguration: nxJson,
109
+ });
110
+ const taskResults = await runCommandForTasks(projectsToRun, currentProjectGraph, { nxJson }, {
111
+ ...nxArgs,
112
+ skipNxCache: nxArgs.skipNxCache ||
113
+ process.env.NX_SKIP_NX_CACHE === 'true' ||
114
+ process.env.NX_DISABLE_NX_CACHE === 'true',
115
+ }, overrides, initiatingProject, extraTargetDependencies, extraOptions);
116
+ const result = Object.values(taskResults).some((taskResult) => taskResult.status === 'failure' || taskResult.status === 'skipped')
107
117
  ? 1
108
118
  : 0;
119
+ await (0, tasks_execution_hooks_1.runPostTasksExecution)({
120
+ taskResults,
121
+ workspaceRoot: workspace_root_1.workspaceRoot,
122
+ nxJsonConfiguration: nxJson,
123
+ });
124
+ return result;
109
125
  });
110
126
  return status;
111
127
  }
@@ -127,7 +127,6 @@ class TaskOrchestrator {
127
127
  return res.filter((r) => r !== null);
128
128
  }
129
129
  async applyCachedResult(task) {
130
- task.startTime = Date.now();
131
130
  const cachedResult = await this.cache.get(task);
132
131
  if (!cachedResult || cachedResult.code !== 0)
133
132
  return null;
@@ -137,7 +136,6 @@ class TaskOrchestrator {
137
136
  if (shouldCopyOutputsFromCache) {
138
137
  await this.cache.copyFilesFromCache(task.hash, cachedResult, outputs);
139
138
  }
140
- task.endTime = Date.now();
141
139
  const status = cachedResult.remote
142
140
  ? 'remote-cache'
143
141
  : shouldCopyOutputsFromCache
@@ -333,10 +331,16 @@ class TaskOrchestrator {
333
331
  // endregion Single Task
334
332
  // region Lifecycle
335
333
  async preRunSteps(tasks, metadata) {
334
+ const now = Date.now();
335
+ for (const task of tasks) {
336
+ task.startTime = now;
337
+ }
336
338
  await this.options.lifeCycle.startTasks(tasks, metadata);
337
339
  }
338
340
  async postRunSteps(tasks, results, doNotSkipCache, { groupId }) {
341
+ const now = Date.now();
339
342
  for (const task of tasks) {
343
+ task.endTime = now;
340
344
  await this.recordOutputsHash(task);
341
345
  }
342
346
  if (doNotSkipCache) {