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.
- package/package.json +11 -11
- package/src/command-line/release/publish.js +11 -0
- package/src/core/graph/main.js +1 -1
- package/src/core/graph/styles.js +1 -1
- package/src/daemon/client/client.d.ts +3 -0
- package/src/daemon/client/client.js +15 -0
- package/src/daemon/message-types/run-tasks-execution-hooks.d.ts +13 -0
- package/src/daemon/message-types/run-tasks-execution-hooks.js +19 -0
- package/src/daemon/server/handle-tasks-execution-hooks.d.ts +19 -0
- package/src/daemon/server/handle-tasks-execution-hooks.js +35 -0
- package/src/daemon/server/server.js +8 -0
- package/src/devkit-exports.d.ts +6 -2
- package/src/native/nx.wasm32-wasi.wasm +0 -0
- package/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +1 -4
- package/src/plugins/js/utils/packages.js +2 -16
- package/src/project-graph/plugins/get-plugins.js +2 -17
- package/src/project-graph/plugins/isolation/enabled.d.ts +1 -0
- package/src/project-graph/plugins/isolation/enabled.js +19 -0
- package/src/project-graph/plugins/isolation/messaging.d.ts +46 -7
- package/src/project-graph/plugins/isolation/messaging.js +5 -1
- package/src/project-graph/plugins/isolation/plugin-pool.js +46 -0
- package/src/project-graph/plugins/isolation/plugin-worker.js +40 -0
- package/src/project-graph/plugins/load-resolved-plugin.js +4 -1
- package/src/project-graph/plugins/loaded-nx-plugin.d.ts +3 -5
- package/src/project-graph/plugins/loaded-nx-plugin.js +27 -0
- package/src/project-graph/plugins/public-api.d.ts +26 -6
- package/src/project-graph/plugins/tasks-execution-hooks.d.ts +3 -0
- package/src/project-graph/plugins/tasks-execution-hooks.js +65 -0
- package/src/project-graph/utils/retrieve-workspace-files.js +1 -1
- package/src/tasks-runner/life-cycle.d.ts +7 -0
- package/src/tasks-runner/run-command.d.ts +2 -4
- package/src/tasks-runner/run-command.js +18 -2
- 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
|
-
|
106
|
-
|
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) {
|