nx 19.8.1 → 19.8.3
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc.json +9 -1
- package/package.json +12 -13
- package/src/command-line/graph/graph.js +9 -9
- package/src/command-line/import/utils/prepare-source-repo.js +8 -3
- package/src/command-line/init/implementation/add-nx-to-nest.js +5 -5
- package/src/command-line/init/implementation/react/clean-up-files.js +7 -7
- package/src/command-line/init/implementation/react/index.js +19 -12
- package/src/command-line/init/implementation/react/rename-js-to-jsx.js +3 -3
- package/src/command-line/release/changelog.js +1 -2
- package/src/command-line/release/config/version-plans.js +6 -7
- package/src/command-line/release/plan.js +6 -5
- package/src/command-line/release/release.js +2 -2
- package/src/command-line/reset/reset.js +20 -13
- package/src/core/graph/main.js +1 -1
- package/src/daemon/cache.d.ts +1 -2
- package/src/daemon/cache.js +12 -21
- package/src/daemon/client/client.js +9 -8
- package/src/daemon/tmp-dir.js +6 -7
- package/src/executors/run-commands/run-commands.impl.js +15 -22
- package/src/generators/tree.d.ts +1 -1
- package/src/generators/tree.js +11 -11
- package/src/hasher/hash-task.d.ts +4 -2
- package/src/hasher/hash-task.js +6 -9
- package/src/native/nx.wasm32-wasi.wasm +0 -0
- package/src/plugins/js/index.js +1 -2
- package/src/project-graph/nx-deps-cache.js +5 -6
- package/src/tasks-runner/cache.js +17 -16
- package/src/tasks-runner/life-cycles/dynamic-run-many-terminal-output-life-cycle.js +5 -0
- package/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js +7 -0
- package/src/tasks-runner/remove-old-cache-records.js +2 -3
- package/src/tasks-runner/run-command.js +3 -1
- package/src/tasks-runner/task-orchestrator.d.ts +1 -0
- package/src/tasks-runner/task-orchestrator.js +6 -2
- package/src/tasks-runner/tasks-schedule.d.ts +1 -0
- package/src/tasks-runner/tasks-schedule.js +6 -2
- package/src/utils/fileutils.d.ts +9 -1
- package/src/utils/fileutils.js +29 -12
- package/src/utils/ignore.js +2 -2
- package/src/utils/package-manager.js +2 -2
- package/src/utils/plugins/output.js +1 -1
package/src/daemon/cache.d.ts
CHANGED
@@ -2,9 +2,8 @@ export interface DaemonProcessJson {
|
|
2
2
|
processId: number;
|
3
3
|
}
|
4
4
|
export declare const serverProcessJsonPath: string;
|
5
|
-
export declare function readDaemonProcessJsonCache():
|
5
|
+
export declare function readDaemonProcessJsonCache(): DaemonProcessJson | null;
|
6
6
|
export declare function deleteDaemonJsonProcessCache(): void;
|
7
7
|
export declare function writeDaemonJsonProcessCache(daemonJson: DaemonProcessJson): Promise<void>;
|
8
8
|
export declare function waitForDaemonToExitAndCleanupProcessJson(): Promise<void>;
|
9
|
-
export declare function safelyCleanUpExistingProcess(): Promise<void>;
|
10
9
|
export declare function getDaemonProcessIdSync(): number | null;
|
package/src/daemon/cache.js
CHANGED
@@ -5,31 +5,33 @@ exports.readDaemonProcessJsonCache = readDaemonProcessJsonCache;
|
|
5
5
|
exports.deleteDaemonJsonProcessCache = deleteDaemonJsonProcessCache;
|
6
6
|
exports.writeDaemonJsonProcessCache = writeDaemonJsonProcessCache;
|
7
7
|
exports.waitForDaemonToExitAndCleanupProcessJson = waitForDaemonToExitAndCleanupProcessJson;
|
8
|
-
exports.safelyCleanUpExistingProcess = safelyCleanUpExistingProcess;
|
9
8
|
exports.getDaemonProcessIdSync = getDaemonProcessIdSync;
|
10
|
-
const
|
9
|
+
const node_fs_1 = require("node:fs");
|
11
10
|
const path_1 = require("path");
|
12
11
|
const tmp_dir_1 = require("./tmp-dir");
|
12
|
+
const fileutils_1 = require("../utils/fileutils");
|
13
13
|
exports.serverProcessJsonPath = (0, path_1.join)(tmp_dir_1.DAEMON_DIR_FOR_CURRENT_WORKSPACE, 'server-process.json');
|
14
|
-
|
15
|
-
if (!(0,
|
14
|
+
function readDaemonProcessJsonCache() {
|
15
|
+
if (!(0, node_fs_1.existsSync)(exports.serverProcessJsonPath)) {
|
16
16
|
return null;
|
17
17
|
}
|
18
|
-
return
|
18
|
+
return (0, fileutils_1.readJsonFile)(exports.serverProcessJsonPath);
|
19
19
|
}
|
20
20
|
function deleteDaemonJsonProcessCache() {
|
21
21
|
try {
|
22
22
|
if (getDaemonProcessIdSync() === process.pid) {
|
23
|
-
(0,
|
23
|
+
(0, node_fs_1.unlinkSync)(exports.serverProcessJsonPath);
|
24
24
|
}
|
25
25
|
}
|
26
26
|
catch { }
|
27
27
|
}
|
28
28
|
async function writeDaemonJsonProcessCache(daemonJson) {
|
29
|
-
await (0,
|
29
|
+
await (0, fileutils_1.writeJsonFileAsync)(exports.serverProcessJsonPath, daemonJson, {
|
30
|
+
appendNewLine: true,
|
31
|
+
});
|
30
32
|
}
|
31
33
|
async function waitForDaemonToExitAndCleanupProcessJson() {
|
32
|
-
const daemonProcessJson =
|
34
|
+
const daemonProcessJson = readDaemonProcessJsonCache();
|
33
35
|
if (daemonProcessJson && daemonProcessJson.processId) {
|
34
36
|
await new Promise((resolve, reject) => {
|
35
37
|
let count = 0;
|
@@ -51,24 +53,13 @@ async function waitForDaemonToExitAndCleanupProcessJson() {
|
|
51
53
|
deleteDaemonJsonProcessCache();
|
52
54
|
}
|
53
55
|
}
|
54
|
-
async function safelyCleanUpExistingProcess() {
|
55
|
-
const daemonProcessJson = await readDaemonProcessJsonCache();
|
56
|
-
if (daemonProcessJson && daemonProcessJson.processId) {
|
57
|
-
try {
|
58
|
-
process.kill(daemonProcessJson.processId);
|
59
|
-
// we wait for the process to actually shut down before returning
|
60
|
-
await waitForDaemonToExitAndCleanupProcessJson();
|
61
|
-
}
|
62
|
-
catch { }
|
63
|
-
}
|
64
|
-
}
|
65
56
|
// Must be sync for the help output use case
|
66
57
|
function getDaemonProcessIdSync() {
|
67
|
-
if (!(0,
|
58
|
+
if (!(0, node_fs_1.existsSync)(exports.serverProcessJsonPath)) {
|
68
59
|
return null;
|
69
60
|
}
|
70
61
|
try {
|
71
|
-
const daemonProcessJson = (0,
|
62
|
+
const daemonProcessJson = (0, fileutils_1.readJsonFile)(exports.serverProcessJsonPath);
|
72
63
|
return daemonProcessJson.processId;
|
73
64
|
}
|
74
65
|
catch {
|
@@ -4,9 +4,8 @@ exports.daemonClient = exports.DaemonClient = void 0;
|
|
4
4
|
exports.isDaemonEnabled = isDaemonEnabled;
|
5
5
|
const workspace_root_1 = require("../../utils/workspace-root");
|
6
6
|
const child_process_1 = require("child_process");
|
7
|
-
const
|
7
|
+
const node_fs_1 = require("node:fs");
|
8
8
|
const promises_1 = require("fs/promises");
|
9
|
-
const fs_extra_1 = require("fs-extra");
|
10
9
|
const net_1 = require("net");
|
11
10
|
const path_1 = require("path");
|
12
11
|
const perf_hooks_1 = require("perf_hooks");
|
@@ -409,8 +408,10 @@ class DaemonClient {
|
|
409
408
|
}
|
410
409
|
}
|
411
410
|
async startInBackground() {
|
412
|
-
(0,
|
413
|
-
(0,
|
411
|
+
(0, node_fs_1.mkdirSync)(tmp_dir_1.DAEMON_DIR_FOR_CURRENT_WORKSPACE, { recursive: true });
|
412
|
+
if (!(0, node_fs_1.existsSync)(tmp_dir_1.DAEMON_OUTPUT_LOG_FILE)) {
|
413
|
+
(0, node_fs_1.writeFileSync)(tmp_dir_1.DAEMON_OUTPUT_LOG_FILE, '');
|
414
|
+
}
|
414
415
|
this._out = await (0, promises_1.open)(tmp_dir_1.DAEMON_OUTPUT_LOG_FILE, 'a');
|
415
416
|
this._err = await (0, promises_1.open)(tmp_dir_1.DAEMON_OUTPUT_LOG_FILE, 'a');
|
416
417
|
const backgroundProcess = (0, child_process_1.spawn)(process.execPath, [(0, path_1.join)(__dirname, `../server/start.js`)], {
|
@@ -454,7 +455,7 @@ class DaemonClient {
|
|
454
455
|
catch (err) {
|
455
456
|
output_1.output.error({
|
456
457
|
title: err?.message ||
|
457
|
-
'Something unexpected went wrong when stopping the server',
|
458
|
+
'Something unexpected went wrong when stopping the daemon server',
|
458
459
|
});
|
459
460
|
}
|
460
461
|
(0, tmp_dir_1.removeSocketDir)();
|
@@ -467,12 +468,12 @@ function isDaemonEnabled() {
|
|
467
468
|
}
|
468
469
|
function isDocker() {
|
469
470
|
try {
|
470
|
-
(0,
|
471
|
+
(0, node_fs_1.statSync)('/.dockerenv');
|
471
472
|
return true;
|
472
473
|
}
|
473
474
|
catch {
|
474
475
|
try {
|
475
|
-
return (0,
|
476
|
+
return (0, node_fs_1.readFileSync)('/proc/self/cgroup', 'utf8')?.includes('docker');
|
476
477
|
}
|
477
478
|
catch { }
|
478
479
|
return false;
|
@@ -483,7 +484,7 @@ function nxJsonIsNotPresent() {
|
|
483
484
|
}
|
484
485
|
function daemonProcessException(message) {
|
485
486
|
try {
|
486
|
-
let log = (0,
|
487
|
+
let log = (0, node_fs_1.readFileSync)(tmp_dir_1.DAEMON_OUTPUT_LOG_FILE).toString().split('\n');
|
487
488
|
if (log.length > 20) {
|
488
489
|
log = log.slice(log.length - 20);
|
489
490
|
}
|
package/src/daemon/tmp-dir.js
CHANGED
@@ -11,8 +11,7 @@ exports.removeSocketDir = removeSocketDir;
|
|
11
11
|
* location within the OS's tmp directory where we write log files for background processes
|
12
12
|
* and where we create the actual unix socket/named pipe for the daemon.
|
13
13
|
*/
|
14
|
-
const
|
15
|
-
const fs_extra_1 = require("fs-extra");
|
14
|
+
const node_fs_1 = require("node:fs");
|
16
15
|
const path_1 = require("path");
|
17
16
|
const cache_directory_1 = require("../utils/cache-directory");
|
18
17
|
const crypto_1 = require("crypto");
|
@@ -26,15 +25,15 @@ const getDaemonSocketDir = () => (0, path_1.join)(getSocketDir(),
|
|
26
25
|
exports.getDaemonSocketDir = getDaemonSocketDir;
|
27
26
|
function writeDaemonLogs(error) {
|
28
27
|
const file = (0, path_1.join)(exports.DAEMON_DIR_FOR_CURRENT_WORKSPACE, 'daemon-error.log');
|
29
|
-
(0,
|
28
|
+
(0, node_fs_1.writeFileSync)(file, error);
|
30
29
|
return file;
|
31
30
|
}
|
32
31
|
function markDaemonAsDisabled() {
|
33
|
-
(0,
|
32
|
+
(0, node_fs_1.writeFileSync)((0, path_1.join)(exports.DAEMON_DIR_FOR_CURRENT_WORKSPACE, 'disabled'), 'true');
|
34
33
|
}
|
35
34
|
function isDaemonDisabled() {
|
36
35
|
try {
|
37
|
-
(0,
|
36
|
+
(0, node_fs_1.statSync)((0, path_1.join)(exports.DAEMON_DIR_FOR_CURRENT_WORKSPACE, 'disabled'));
|
38
37
|
return true;
|
39
38
|
}
|
40
39
|
catch (e) {
|
@@ -56,7 +55,7 @@ function getSocketDir(alreadyUnique = false) {
|
|
56
55
|
const dir = process.env.NX_SOCKET_DIR ??
|
57
56
|
process.env.NX_DAEMON_SOCKET_DIR ??
|
58
57
|
(alreadyUnique ? tmp_1.tmpdir : socketDirName());
|
59
|
-
(0,
|
58
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
60
59
|
return dir;
|
61
60
|
}
|
62
61
|
catch (e) {
|
@@ -65,7 +64,7 @@ function getSocketDir(alreadyUnique = false) {
|
|
65
64
|
}
|
66
65
|
function removeSocketDir() {
|
67
66
|
try {
|
68
|
-
(0,
|
67
|
+
(0, node_fs_1.rmSync)(getSocketDir(), { recursive: true, force: true });
|
69
68
|
}
|
70
69
|
catch (e) { }
|
71
70
|
}
|
@@ -16,22 +16,11 @@ let pseudoTerminal;
|
|
16
16
|
const childProcesses = new Set();
|
17
17
|
function loadEnvVarsFile(path, env = {}) {
|
18
18
|
(0, task_env_1.unloadDotEnvFile)(path, env);
|
19
|
-
const result = (0, task_env_1.loadAndExpandDotEnvFile)(path, env
|
19
|
+
const result = (0, task_env_1.loadAndExpandDotEnvFile)(path, env);
|
20
20
|
if (result.error) {
|
21
21
|
throw result.error;
|
22
22
|
}
|
23
23
|
}
|
24
|
-
function loadEnvVars(path, env = {}) {
|
25
|
-
if (path) {
|
26
|
-
loadEnvVarsFile(path, env);
|
27
|
-
}
|
28
|
-
else {
|
29
|
-
try {
|
30
|
-
loadEnvVarsFile('.env', env);
|
31
|
-
}
|
32
|
-
catch { }
|
33
|
-
}
|
34
|
-
}
|
35
24
|
const propKeys = [
|
36
25
|
'command',
|
37
26
|
'commands',
|
@@ -292,20 +281,24 @@ function calculateCwd(cwd, context) {
|
|
292
281
|
return cwd;
|
293
282
|
return path.join(context.root, cwd);
|
294
283
|
}
|
295
|
-
|
296
|
-
|
297
|
-
|
284
|
+
/**
|
285
|
+
* Env variables are processed in the following order:
|
286
|
+
* - env option from executor options
|
287
|
+
* - env file from envFile option if provided
|
288
|
+
* - local env variables
|
289
|
+
*/
|
290
|
+
function processEnv(color, cwd, envOptionFromExecutor, envFile) {
|
291
|
+
let localEnv = (0, npm_run_path_1.env)({ cwd: cwd ?? process.cwd() });
|
292
|
+
localEnv = {
|
298
293
|
...process.env,
|
299
294
|
...localEnv,
|
300
295
|
};
|
301
|
-
|
302
|
-
|
303
|
-
loadEnvVars(envFile, res);
|
296
|
+
if (process.env.NX_LOAD_DOT_ENV_FILES !== 'false' && envFile) {
|
297
|
+
loadEnvVarsFile(envFile, localEnv);
|
304
298
|
}
|
305
|
-
|
306
|
-
|
307
|
-
...
|
308
|
-
...env,
|
299
|
+
let res = {
|
300
|
+
...localEnv,
|
301
|
+
...envOptionFromExecutor,
|
309
302
|
};
|
310
303
|
// need to override PATH to make sure we are using the local node_modules
|
311
304
|
if (localEnv.PATH)
|
package/src/generators/tree.d.ts
CHANGED
package/src/generators/tree.js
CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FsTree = void 0;
|
4
4
|
exports.flushChanges = flushChanges;
|
5
5
|
exports.printChanges = printChanges;
|
6
|
-
const
|
6
|
+
const node_fs_1 = require("node:fs");
|
7
7
|
const logger_1 = require("../utils/logger");
|
8
8
|
const output_1 = require("../utils/output");
|
9
9
|
const path_1 = require("path");
|
@@ -228,22 +228,22 @@ class FsTree {
|
|
228
228
|
}
|
229
229
|
fsReadDir(dirPath) {
|
230
230
|
try {
|
231
|
-
return (0,
|
231
|
+
return (0, node_fs_1.readdirSync)((0, path_1.join)(this.root, dirPath));
|
232
232
|
}
|
233
233
|
catch {
|
234
234
|
return [];
|
235
235
|
}
|
236
236
|
}
|
237
237
|
fsIsFile(filePath) {
|
238
|
-
const stat = (0,
|
238
|
+
const stat = (0, node_fs_1.statSync)((0, path_1.join)(this.root, filePath));
|
239
239
|
return stat.isFile();
|
240
240
|
}
|
241
241
|
fsReadFile(filePath) {
|
242
|
-
return (0,
|
242
|
+
return (0, node_fs_1.readFileSync)((0, path_1.join)(this.root, filePath));
|
243
243
|
}
|
244
244
|
fsExists(filePath) {
|
245
245
|
try {
|
246
|
-
const stat = (0,
|
246
|
+
const stat = (0, node_fs_1.statSync)((0, path_1.join)(this.root, filePath));
|
247
247
|
return stat.isFile() || stat.isDirectory();
|
248
248
|
}
|
249
249
|
catch {
|
@@ -279,18 +279,18 @@ function flushChanges(root, fileChanges) {
|
|
279
279
|
fileChanges.forEach((f) => {
|
280
280
|
const fpath = (0, path_1.join)(root, f.path);
|
281
281
|
if (f.type === 'CREATE') {
|
282
|
-
(0,
|
283
|
-
(0,
|
282
|
+
(0, node_fs_1.mkdirSync)((0, path_1.dirname)(fpath), { recursive: true });
|
283
|
+
(0, node_fs_1.writeFileSync)(fpath, f.content);
|
284
284
|
if (f.options?.mode)
|
285
|
-
(0,
|
285
|
+
(0, node_fs_1.chmodSync)(fpath, f.options.mode);
|
286
286
|
}
|
287
287
|
else if (f.type === 'UPDATE') {
|
288
|
-
(0,
|
288
|
+
(0, node_fs_1.writeFileSync)(fpath, f.content);
|
289
289
|
if (f.options?.mode)
|
290
|
-
(0,
|
290
|
+
(0, node_fs_1.chmodSync)(fpath, f.options.mode);
|
291
291
|
}
|
292
292
|
else if (f.type === 'DELETE') {
|
293
|
-
(0,
|
293
|
+
(0, node_fs_1.rmSync)(fpath, { recursive: true, force: true });
|
294
294
|
}
|
295
295
|
});
|
296
296
|
}
|
@@ -2,5 +2,7 @@ import { Task, TaskGraph } from '../config/task-graph';
|
|
2
2
|
import { TaskHasher } from './task-hasher';
|
3
3
|
import { ProjectGraph } from '../config/project-graph';
|
4
4
|
import { NxJsonConfiguration } from '../config/nx-json';
|
5
|
-
|
6
|
-
export declare function
|
5
|
+
import { TaskDetails } from '../native';
|
6
|
+
export declare function getTaskDetails(): TaskDetails | null;
|
7
|
+
export declare function hashTasksThatDoNotDependOnOutputsOfOtherTasks(hasher: TaskHasher, projectGraph: ProjectGraph, taskGraph: TaskGraph, nxJson: NxJsonConfiguration, tasksDetails: TaskDetails | null): Promise<void>;
|
8
|
+
export declare function hashTask(hasher: TaskHasher, projectGraph: ProjectGraph, taskGraph: TaskGraph, task: Task, env: NodeJS.ProcessEnv, taskDetails: TaskDetails | null): Promise<void>;
|
package/src/hasher/hash-task.js
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getTaskDetails = getTaskDetails;
|
3
4
|
exports.hashTasksThatDoNotDependOnOutputsOfOtherTasks = hashTasksThatDoNotDependOnOutputsOfOtherTasks;
|
4
5
|
exports.hashTask = hashTask;
|
5
6
|
const utils_1 = require("../tasks-runner/utils");
|
@@ -19,9 +20,8 @@ function getTaskDetails() {
|
|
19
20
|
}
|
20
21
|
return taskDetails;
|
21
22
|
}
|
22
|
-
async function hashTasksThatDoNotDependOnOutputsOfOtherTasks(hasher, projectGraph, taskGraph, nxJson) {
|
23
|
+
async function hashTasksThatDoNotDependOnOutputsOfOtherTasks(hasher, projectGraph, taskGraph, nxJson, tasksDetails) {
|
23
24
|
performance.mark('hashMultipleTasks:start');
|
24
|
-
const taskDetails = getTaskDetails();
|
25
25
|
const tasks = Object.values(taskGraph.tasks);
|
26
26
|
const tasksWithHashers = await Promise.all(tasks.map(async (task) => {
|
27
27
|
const customHasher = (0, utils_1.getCustomHasher)(task, projectGraph);
|
@@ -42,9 +42,8 @@ async function hashTasksThatDoNotDependOnOutputsOfOtherTasks(hasher, projectGrap
|
|
42
42
|
tasksToHash[i].hash = hashes[i].value;
|
43
43
|
tasksToHash[i].hashDetails = hashes[i].details;
|
44
44
|
}
|
45
|
-
|
46
|
-
|
47
|
-
taskDetails.recordTaskDetails(tasksToHash.map((task) => ({
|
45
|
+
if (tasksDetails?.recordTaskDetails) {
|
46
|
+
tasksDetails.recordTaskDetails(tasksToHash.map((task) => ({
|
48
47
|
hash: task.hash,
|
49
48
|
project: task.target.project,
|
50
49
|
target: task.target.target,
|
@@ -54,9 +53,8 @@ async function hashTasksThatDoNotDependOnOutputsOfOtherTasks(hasher, projectGrap
|
|
54
53
|
performance.mark('hashMultipleTasks:end');
|
55
54
|
performance.measure('hashMultipleTasks', 'hashMultipleTasks:start', 'hashMultipleTasks:end');
|
56
55
|
}
|
57
|
-
async function hashTask(hasher, projectGraph, taskGraph, task, env) {
|
56
|
+
async function hashTask(hasher, projectGraph, taskGraph, task, env, taskDetails) {
|
58
57
|
performance.mark('hashSingleTask:start');
|
59
|
-
const taskDetails = getTaskDetails();
|
60
58
|
const customHasher = (0, utils_1.getCustomHasher)(task, projectGraph);
|
61
59
|
const projectsConfigurations = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(projectGraph);
|
62
60
|
const { value, details } = await (customHasher
|
@@ -72,8 +70,7 @@ async function hashTask(hasher, projectGraph, taskGraph, task, env) {
|
|
72
70
|
: hasher.hashTask(task, taskGraph, env));
|
73
71
|
task.hash = value;
|
74
72
|
task.hashDetails = details;
|
75
|
-
|
76
|
-
if (taskDetails) {
|
73
|
+
if (taskDetails?.recordTaskDetails) {
|
77
74
|
taskDetails.recordTaskDetails([
|
78
75
|
{
|
79
76
|
hash: task.hash,
|
Binary file
|
package/src/plugins/js/index.js
CHANGED
@@ -2,7 +2,6 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.createDependencies = exports.createNodes = exports.name = void 0;
|
4
4
|
const fs_1 = require("fs");
|
5
|
-
const fs_extra_1 = require("fs-extra");
|
6
5
|
const path_1 = require("path");
|
7
6
|
const perf_hooks_1 = require("perf_hooks");
|
8
7
|
const cache_directory_1 = require("../../utils/cache-directory");
|
@@ -96,7 +95,7 @@ function lockFileNeedsReprocessing(lockHash) {
|
|
96
95
|
}
|
97
96
|
}
|
98
97
|
function writeLastProcessedLockfileHash(hash, lockFile) {
|
99
|
-
(0,
|
98
|
+
(0, fs_1.mkdirSync)((0, path_1.dirname)(lockFileHashFile), { recursive: true });
|
100
99
|
(0, fs_1.writeFileSync)(cachedParsedLockFile, JSON.stringify(lockFile, null, 2));
|
101
100
|
(0, fs_1.writeFileSync)(lockFileHashFile, hash);
|
102
101
|
}
|
@@ -8,8 +8,7 @@ exports.createProjectFileMapCache = createProjectFileMapCache;
|
|
8
8
|
exports.writeCache = writeCache;
|
9
9
|
exports.shouldRecomputeWholeGraph = shouldRecomputeWholeGraph;
|
10
10
|
exports.extractCachedFileData = extractCachedFileData;
|
11
|
-
const
|
12
|
-
const fs_extra_1 = require("fs-extra");
|
11
|
+
const node_fs_1 = require("node:fs");
|
13
12
|
const path_1 = require("path");
|
14
13
|
const perf_hooks_1 = require("perf_hooks");
|
15
14
|
const cache_directory_1 = require("../utils/cache-directory");
|
@@ -19,8 +18,8 @@ exports.nxProjectGraph = (0, path_1.join)(cache_directory_1.workspaceDataDirecto
|
|
19
18
|
exports.nxFileMap = (0, path_1.join)(cache_directory_1.workspaceDataDirectory, 'file-map.json');
|
20
19
|
function ensureCacheDirectory() {
|
21
20
|
try {
|
22
|
-
if (!(0,
|
23
|
-
(0,
|
21
|
+
if (!(0, node_fs_1.existsSync)(cache_directory_1.workspaceDataDirectory)) {
|
22
|
+
(0, node_fs_1.mkdirSync)(cache_directory_1.workspaceDataDirectory, { recursive: true });
|
24
23
|
}
|
25
24
|
}
|
26
25
|
catch (e) {
|
@@ -102,9 +101,9 @@ function writeCache(cache, projectGraph) {
|
|
102
101
|
const tmpFileMapPath = `${exports.nxFileMap}~${unique}`;
|
103
102
|
try {
|
104
103
|
(0, fileutils_1.writeJsonFile)(tmpProjectGraphPath, projectGraph);
|
105
|
-
(0,
|
104
|
+
(0, node_fs_1.renameSync)(tmpProjectGraphPath, exports.nxProjectGraph);
|
106
105
|
(0, fileutils_1.writeJsonFile)(tmpFileMapPath, cache);
|
107
|
-
(0,
|
106
|
+
(0, node_fs_1.renameSync)(tmpFileMapPath, exports.nxFileMap);
|
108
107
|
done = true;
|
109
108
|
}
|
110
109
|
catch (err) {
|
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Cache = exports.DbCache = void 0;
|
4
4
|
exports.getCache = getCache;
|
5
5
|
const workspace_root_1 = require("../utils/workspace-root");
|
6
|
-
const fs_extra_1 = require("fs-extra");
|
7
6
|
const path_1 = require("path");
|
8
7
|
const perf_hooks_1 = require("perf_hooks");
|
9
8
|
const default_tasks_runner_1 = require("./default-tasks-runner");
|
10
9
|
const child_process_1 = require("child_process");
|
10
|
+
const node_fs_1 = require("node:fs");
|
11
|
+
const promises_1 = require("node:fs/promises");
|
11
12
|
const cache_directory_1 = require("../utils/cache-directory");
|
12
13
|
const node_machine_id_1 = require("node-machine-id");
|
13
14
|
const native_1 = require("../native");
|
@@ -233,13 +234,13 @@ class Cache {
|
|
233
234
|
// might be left overs from partially-completed cache invocations
|
234
235
|
await this.remove(tdCommit);
|
235
236
|
await this.remove(td);
|
236
|
-
await (0,
|
237
|
-
await (0,
|
238
|
-
await (0,
|
237
|
+
await (0, promises_1.mkdir)(td, { recursive: true });
|
238
|
+
await (0, promises_1.writeFile)((0, path_1.join)(td, 'terminalOutput'), terminalOutput ?? 'no terminal output');
|
239
|
+
await (0, promises_1.mkdir)((0, path_1.join)(td, 'outputs'));
|
239
240
|
const expandedOutputs = await this.expandOutputsInWorkspace(outputs);
|
240
241
|
await Promise.all(expandedOutputs.map(async (f) => {
|
241
242
|
const src = (0, path_1.join)(this.root, f);
|
242
|
-
if (
|
243
|
+
if ((0, node_fs_1.existsSync)(src)) {
|
243
244
|
const cached = (0, path_1.join)(td, 'outputs', f);
|
244
245
|
await this.copy(src, cached);
|
245
246
|
}
|
@@ -248,15 +249,15 @@ class Cache {
|
|
248
249
|
// creating this file is atomic, whereas creating a folder is not.
|
249
250
|
// so if the process gets terminated while we are copying stuff into cache,
|
250
251
|
// the cache entry won't be used.
|
251
|
-
await (0,
|
252
|
-
await (0,
|
253
|
-
await (0,
|
252
|
+
await (0, promises_1.writeFile)((0, path_1.join)(td, 'code'), code.toString());
|
253
|
+
await (0, promises_1.writeFile)((0, path_1.join)(td, 'source'), await this.currentMachineId());
|
254
|
+
await (0, promises_1.writeFile)(tdCommit, 'true');
|
254
255
|
if (this.options.remoteCache) {
|
255
256
|
await this.options.remoteCache.store(task.hash, this.cachePath);
|
256
257
|
}
|
257
258
|
if (terminalOutput) {
|
258
259
|
const outputPath = this.temporaryOutputPath(task);
|
259
|
-
await (0,
|
260
|
+
await (0, promises_1.writeFile)(outputPath, terminalOutput);
|
260
261
|
}
|
261
262
|
});
|
262
263
|
}
|
@@ -265,7 +266,7 @@ class Cache {
|
|
265
266
|
const expandedOutputs = await this.expandOutputsInCache(outputs, cachedResult);
|
266
267
|
await Promise.all(expandedOutputs.map(async (f) => {
|
267
268
|
const cached = (0, path_1.join)(cachedResult.outputsPath, f);
|
268
|
-
if (
|
269
|
+
if ((0, node_fs_1.existsSync)(cached)) {
|
269
270
|
const src = (0, path_1.join)(this.root, f);
|
270
271
|
await this.remove(src);
|
271
272
|
await this.copy(cached, src);
|
@@ -321,11 +322,11 @@ class Cache {
|
|
321
322
|
async getFromLocalDir(task) {
|
322
323
|
const tdCommit = (0, path_1.join)(this.cachePath, `${task.hash}.commit`);
|
323
324
|
const td = (0, path_1.join)(this.cachePath, task.hash);
|
324
|
-
if (
|
325
|
-
const terminalOutput = await (0,
|
325
|
+
if ((0, node_fs_1.existsSync)(tdCommit)) {
|
326
|
+
const terminalOutput = await (0, promises_1.readFile)((0, path_1.join)(td, 'terminalOutput'), 'utf-8');
|
326
327
|
let code = 0;
|
327
328
|
try {
|
328
|
-
code = Number(await (0,
|
329
|
+
code = Number(await (0, promises_1.readFile)((0, path_1.join)(td, 'code'), 'utf-8'));
|
329
330
|
}
|
330
331
|
catch { }
|
331
332
|
return {
|
@@ -342,7 +343,7 @@ class Cache {
|
|
342
343
|
const td = (0, path_1.join)(this.cachePath, task.hash);
|
343
344
|
let sourceMachineId = null;
|
344
345
|
try {
|
345
|
-
sourceMachineId = await (0,
|
346
|
+
sourceMachineId = await (0, promises_1.readFile)((0, path_1.join)(td, 'source'), 'utf-8');
|
346
347
|
}
|
347
348
|
catch { }
|
348
349
|
if (sourceMachineId && sourceMachineId != (await this.currentMachineId())) {
|
@@ -361,12 +362,12 @@ class Cache {
|
|
361
362
|
}
|
362
363
|
}
|
363
364
|
createCacheDir() {
|
364
|
-
(0,
|
365
|
+
(0, node_fs_1.mkdirSync)(cache_directory_1.cacheDir, { recursive: true });
|
365
366
|
return cache_directory_1.cacheDir;
|
366
367
|
}
|
367
368
|
createTerminalOutputsDir() {
|
368
369
|
const path = (0, path_1.join)(this.cachePath, 'terminalOutputs');
|
369
|
-
(0,
|
370
|
+
(0, node_fs_1.mkdirSync)(path, { recursive: true });
|
370
371
|
return path;
|
371
372
|
}
|
372
373
|
}
|
@@ -224,6 +224,11 @@ async function createRunManyDynamicOutputRenderer({ projectNames, tasks, args, o
|
|
224
224
|
clearRenderInterval();
|
225
225
|
const timeTakenText = (0, pretty_time_1.prettyTime)(process.hrtime(start));
|
226
226
|
moveCursorToStartOfPinnedFooter();
|
227
|
+
if (totalTasks === 0) {
|
228
|
+
renderPinnedFooter([output_1.output.applyNxPrefix('gray', 'No tasks were run')]);
|
229
|
+
resolveRenderIsDonePromise();
|
230
|
+
return;
|
231
|
+
}
|
227
232
|
if (totalSuccessfulTasks === totalTasks) {
|
228
233
|
const text = `Successfully ran ${(0, formatting_utils_1.formatTargetsAndProjects)(projectNames, targets, tasks)}`;
|
229
234
|
const taskOverridesRows = [];
|
@@ -23,6 +23,9 @@ class StaticRunManyTerminalOutputLifeCycle {
|
|
23
23
|
this.allCompletedTasks = new Map();
|
24
24
|
}
|
25
25
|
startCommand() {
|
26
|
+
if (this.tasks.length === 0) {
|
27
|
+
return;
|
28
|
+
}
|
26
29
|
if (this.projectNames.length <= 0) {
|
27
30
|
output_1.output.logSingleLine(`No projects with ${(0, formatting_utils_1.formatTargetsAndProjects)(this.projectNames, this.args.targets, this.tasks)} were run`);
|
28
31
|
return;
|
@@ -45,6 +48,10 @@ class StaticRunManyTerminalOutputLifeCycle {
|
|
45
48
|
}
|
46
49
|
endCommand() {
|
47
50
|
output_1.output.addNewline();
|
51
|
+
if (this.tasks.length === 0) {
|
52
|
+
output_1.output.logSingleLine(`No tasks were run`);
|
53
|
+
return;
|
54
|
+
}
|
48
55
|
if (this.failedTasks.length === 0) {
|
49
56
|
output_1.output.addVerticalSeparatorWithoutNewLines('green');
|
50
57
|
const bodyLines = this.cachedTasks.length > 0
|
@@ -1,7 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const fs_1 = require("fs");
|
4
|
-
const fs_extra_1 = require("fs-extra");
|
5
4
|
const path_1 = require("path");
|
6
5
|
const WEEK_IN_MS = 1000 * 60 * 60 * 24 * 7;
|
7
6
|
const folder = process.argv[2];
|
@@ -34,11 +33,11 @@ function removeOld(records) {
|
|
34
33
|
if (time - s.mtimeMs > WEEK_IN_MS) {
|
35
34
|
if (s.isDirectory()) {
|
36
35
|
try {
|
37
|
-
(0,
|
36
|
+
(0, fs_1.rmSync)(`${r}.commit`, { recursive: true, force: true });
|
38
37
|
}
|
39
38
|
catch (e) { }
|
40
39
|
}
|
41
|
-
(0,
|
40
|
+
(0, fs_1.rmSync)(r, { recursive: true, force: true });
|
42
41
|
}
|
43
42
|
}
|
44
43
|
catch (e) { }
|
@@ -363,12 +363,14 @@ function setEnvVarsBasedOnArgs(nxArgs, loadDotEnvFiles) {
|
|
363
363
|
}
|
364
364
|
async function invokeTasksRunner({ tasks, projectGraph, taskGraph, lifeCycle, nxJson, nxArgs, loadDotEnvFiles, initiatingProject, }) {
|
365
365
|
setEnvVarsBasedOnArgs(nxArgs, loadDotEnvFiles);
|
366
|
+
// this needs to be done before we start to run the tasks
|
367
|
+
const taskDetails = (0, hash_task_1.getTaskDetails)();
|
366
368
|
const { tasksRunner, runnerOptions } = getRunner(nxArgs, nxJson);
|
367
369
|
let hasher = (0, create_task_hasher_1.createTaskHasher)(projectGraph, nxJson, runnerOptions);
|
368
370
|
// this is used for two reasons: to fetch all remote cache hits AND
|
369
371
|
// to submit everything that is known in advance to Nx Cloud to run in
|
370
372
|
// a distributed fashion
|
371
|
-
await (0, hash_task_1.hashTasksThatDoNotDependOnOutputsOfOtherTasks)(hasher, projectGraph, taskGraph, nxJson);
|
373
|
+
await (0, hash_task_1.hashTasksThatDoNotDependOnOutputsOfOtherTasks)(hasher, projectGraph, taskGraph, nxJson, taskDetails);
|
372
374
|
const taskResultsLifecycle = new task_results_life_cycle_1.TaskResultsLifeCycle();
|
373
375
|
const compositedLifeCycle = new life_cycle_1.CompositeLifeCycle([
|
374
376
|
...constructLifeCycles(lifeCycle),
|
@@ -27,6 +27,7 @@ class TaskOrchestrator {
|
|
27
27
|
this.bail = bail;
|
28
28
|
this.daemon = daemon;
|
29
29
|
this.outputStyle = outputStyle;
|
30
|
+
this.taskDetails = (0, hash_task_1.getTaskDetails)();
|
30
31
|
this.cache = (0, cache_1.getCache)(this.nxJson, this.options);
|
31
32
|
this.forkedProcessTaskRunner = new forked_process_task_runner_1.ForkedProcessTaskRunner(this.options);
|
32
33
|
this.tasksSchedule = new tasks_schedule_1.TasksSchedule(this.projectGraph, this.taskGraph, this.options);
|
@@ -93,7 +94,7 @@ class TaskOrchestrator {
|
|
93
94
|
const task = this.taskGraph.tasks[taskId];
|
94
95
|
const taskSpecificEnv = (0, task_env_1.getTaskSpecificEnv)(task);
|
95
96
|
if (!task.hash) {
|
96
|
-
await (0, hash_task_1.hashTask)(this.hasher, this.projectGraph, this.taskGraph, task, taskSpecificEnv);
|
97
|
+
await (0, hash_task_1.hashTask)(this.hasher, this.projectGraph, this.taskGraph, task, taskSpecificEnv, this.taskDetails);
|
97
98
|
}
|
98
99
|
await this.options.lifeCycle.scheduleTask(task);
|
99
100
|
return taskSpecificEnv;
|
@@ -101,7 +102,7 @@ class TaskOrchestrator {
|
|
101
102
|
async processScheduledBatch(batch) {
|
102
103
|
await Promise.all(Object.values(batch.taskGraph.tasks).map(async (task) => {
|
103
104
|
if (!task.hash) {
|
104
|
-
await (0, hash_task_1.hashTask)(this.hasher, this.projectGraph, this.taskGraph, task, this.batchEnv);
|
105
|
+
await (0, hash_task_1.hashTask)(this.hasher, this.projectGraph, this.taskGraph, task, this.batchEnv, this.taskDetails);
|
105
106
|
}
|
106
107
|
await this.options.lifeCycle.scheduleTask(task);
|
107
108
|
}));
|
@@ -321,6 +322,9 @@ class TaskOrchestrator {
|
|
321
322
|
};
|
322
323
|
}
|
323
324
|
catch (e) {
|
325
|
+
if (process.env.NX_VERBOSE_LOGGING === 'true') {
|
326
|
+
console.error(e);
|
327
|
+
}
|
324
328
|
return {
|
325
329
|
code: 1,
|
326
330
|
};
|