nx 19.8.0 → 19.8.2
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/.eslintrc.json +11 -2
- package/bin/nx.js +10 -2
- package/package.json +12 -13
- package/schemas/nx-schema.json +26 -21
- package/src/adapter/compat.d.ts +1 -1
- package/src/adapter/compat.js +1 -0
- package/src/command-line/activate-powerpack/activate-powerpack.js +3 -1
- package/src/command-line/add/add.js +4 -2
- package/src/command-line/connect/view-logs.js +1 -0
- package/src/command-line/exec/exec.js +6 -1
- package/src/command-line/format/format.js +3 -1
- package/src/command-line/graph/graph.js +10 -9
- package/src/command-line/init/implementation/add-nx-to-nest.js +5 -5
- package/src/command-line/init/implementation/angular/integrated-workspace.js +4 -1
- package/src/command-line/init/implementation/angular/legacy-angular-versions.js +5 -2
- package/src/command-line/init/implementation/dot-nx/add-nx-scripts.js +3 -1
- package/src/command-line/init/implementation/dot-nx/nxw.js +1 -0
- package/src/command-line/init/implementation/react/check-for-uncommitted-changes.js +3 -1
- package/src/command-line/init/implementation/react/clean-up-files.js +7 -7
- package/src/command-line/init/implementation/react/index.js +36 -17
- package/src/command-line/init/implementation/react/rename-js-to-jsx.js +3 -3
- package/src/command-line/init/implementation/utils.js +5 -1
- package/src/command-line/init/init-v1.js +1 -0
- package/src/command-line/init/init-v2.js +2 -1
- package/src/command-line/migrate/command-object.js +4 -0
- package/src/command-line/migrate/migrate.js +1 -1
- package/src/command-line/release/changelog.js +1 -2
- package/src/command-line/release/config/version-plans.js +9 -8
- package/src/command-line/release/plan.js +6 -5
- package/src/command-line/release/release.js +2 -2
- package/src/command-line/release/utils/exec-command.js +1 -0
- package/src/command-line/release/utils/github.js +1 -0
- package/src/command-line/release/utils/launch-editor.js +6 -1
- package/src/command-line/release/version.js +6 -3
- package/src/command-line/report/report.d.ts +3 -1
- package/src/command-line/report/report.js +17 -2
- package/src/command-line/reset/reset.js +4 -4
- package/src/command-line/run/run.js +1 -0
- package/src/command-line/sync/sync.js +5 -4
- package/src/command-line/watch/watch.js +1 -0
- package/src/config/nx-json.d.ts +4 -0
- package/src/daemon/cache.d.ts +1 -2
- package/src/daemon/cache.js +12 -21
- package/src/daemon/client/client.d.ts +4 -1
- package/src/daemon/client/client.js +9 -8
- package/src/daemon/client/generate-help-output.js +1 -0
- package/src/daemon/server/sync-generators.d.ts +4 -1
- package/src/daemon/server/sync-generators.js +33 -15
- package/src/daemon/tmp-dir.js +6 -7
- package/src/executors/run-commands/run-commands.impl.js +1 -0
- package/src/executors/run-script/run-script.impl.js +1 -0
- package/src/generators/tree.d.ts +1 -1
- package/src/generators/tree.js +11 -11
- package/src/native/index.d.ts +1 -1
- package/src/native/nx.wasm32-wasi.wasm +0 -0
- package/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +1 -1
- package/src/plugins/js/index.js +1 -2
- package/src/project-graph/file-utils.js +1 -0
- package/src/project-graph/nx-deps-cache.js +5 -6
- package/src/tasks-runner/cache.d.ts +3 -1
- package/src/tasks-runner/cache.js +29 -29
- package/src/tasks-runner/default-tasks-runner.js +1 -1
- package/src/tasks-runner/life-cycles/formatting-utils.d.ts +1 -1
- package/src/tasks-runner/life-cycles/formatting-utils.js +27 -15
- package/src/tasks-runner/life-cycles/task-history-life-cycle.js +3 -0
- package/src/tasks-runner/remove-old-cache-records.js +2 -3
- package/src/tasks-runner/task-orchestrator.d.ts +3 -1
- package/src/tasks-runner/task-orchestrator.js +3 -2
- package/src/tasks-runner/tasks-schedule.js +1 -1
- package/src/utils/ab-testing.js +4 -1
- package/src/utils/child-process.js +5 -3
- package/src/utils/command-line-utils.js +7 -1
- package/src/utils/default-base.js +5 -2
- package/src/utils/fileutils.d.ts +9 -1
- package/src/utils/fileutils.js +29 -12
- package/src/utils/git-utils.index-filter.js +2 -1
- package/src/utils/git-utils.js +4 -0
- package/src/utils/git-utils.tree-filter.js +3 -1
- package/src/utils/ignore.js +2 -2
- package/src/utils/package-manager.js +2 -2
- package/src/utils/powerpack.d.ts +1 -1
- package/src/utils/powerpack.js +3 -8
- package/src/utils/sync-generators.d.ts +13 -3
- package/src/utils/sync-generators.js +99 -25
- package/src/utils/task-history.d.ts +2 -2
- package/src/utils/task-history.js +4 -1
@@ -72,11 +72,16 @@ function collectAndScheduleSyncGenerators(projectGraph) {
|
|
72
72
|
// a change imply we need to re-run all the generators
|
73
73
|
// make sure to schedule all the collected generators
|
74
74
|
scheduledGenerators.clear();
|
75
|
-
if (!registeredSyncGenerators.size
|
75
|
+
if (!registeredSyncGenerators.globalGenerators.size &&
|
76
|
+
!registeredSyncGenerators.taskGenerators.size) {
|
76
77
|
// there are no generators to run
|
77
78
|
return;
|
78
79
|
}
|
79
|
-
|
80
|
+
const uniqueSyncGenerators = new Set([
|
81
|
+
...registeredSyncGenerators.globalGenerators,
|
82
|
+
...registeredSyncGenerators.taskGenerators,
|
83
|
+
]);
|
84
|
+
for (const generator of uniqueSyncGenerators) {
|
80
85
|
scheduledGenerators.add(generator);
|
81
86
|
}
|
82
87
|
log('scheduling:', [...scheduledGenerators]);
|
@@ -102,7 +107,7 @@ function collectAndScheduleSyncGenerators(projectGraph) {
|
|
102
107
|
}
|
103
108
|
async function getCachedRegisteredSyncGenerators() {
|
104
109
|
log('get registered sync generators');
|
105
|
-
if (!
|
110
|
+
if (!registeredGlobalSyncGenerators && !registeredTaskSyncGenerators) {
|
106
111
|
log('no registered sync generators, collecting them');
|
107
112
|
const { projectGraph } = await (0, project_graph_incremental_recomputation_1.getCachedSerializedProjectGraphPromise)();
|
108
113
|
collectAllRegisteredSyncGenerators(projectGraph);
|
@@ -110,7 +115,10 @@ async function getCachedRegisteredSyncGenerators() {
|
|
110
115
|
else {
|
111
116
|
log('registered sync generators already collected, returning them');
|
112
117
|
}
|
113
|
-
return
|
118
|
+
return {
|
119
|
+
globalGenerators: [...registeredGlobalSyncGenerators],
|
120
|
+
taskGenerators: [...registeredTaskSyncGenerators],
|
121
|
+
};
|
114
122
|
}
|
115
123
|
async function getFromCacheOrRunGenerators(generators) {
|
116
124
|
let projects;
|
@@ -296,23 +304,33 @@ function collectAllRegisteredSyncGenerators(projectGraph) {
|
|
296
304
|
else {
|
297
305
|
log('nx.json hash is the same, not collecting global sync generators');
|
298
306
|
}
|
299
|
-
const generators = new Set([
|
300
|
-
...registeredTaskSyncGenerators,
|
301
|
-
...registeredGlobalSyncGenerators,
|
302
|
-
]);
|
303
307
|
if (!registeredSyncGenerators) {
|
304
|
-
registeredSyncGenerators =
|
308
|
+
registeredSyncGenerators = {
|
309
|
+
globalGenerators: registeredGlobalSyncGenerators,
|
310
|
+
taskGenerators: registeredTaskSyncGenerators,
|
311
|
+
};
|
305
312
|
return;
|
306
313
|
}
|
307
|
-
for (const generator of registeredSyncGenerators) {
|
308
|
-
if (!
|
309
|
-
registeredSyncGenerators.delete(generator);
|
314
|
+
for (const generator of registeredSyncGenerators.globalGenerators) {
|
315
|
+
if (!registeredGlobalSyncGenerators.has(generator)) {
|
316
|
+
registeredSyncGenerators.globalGenerators.delete(generator);
|
310
317
|
syncGeneratorsCacheResultPromises.delete(generator);
|
311
318
|
}
|
312
319
|
}
|
313
|
-
for (const generator of
|
314
|
-
if (!
|
315
|
-
registeredSyncGenerators.
|
320
|
+
for (const generator of registeredSyncGenerators.taskGenerators) {
|
321
|
+
if (!registeredTaskSyncGenerators.has(generator)) {
|
322
|
+
registeredSyncGenerators.taskGenerators.delete(generator);
|
323
|
+
syncGeneratorsCacheResultPromises.delete(generator);
|
324
|
+
}
|
325
|
+
}
|
326
|
+
for (const generator of registeredGlobalSyncGenerators) {
|
327
|
+
if (!registeredSyncGenerators.globalGenerators.has(generator)) {
|
328
|
+
registeredSyncGenerators.globalGenerators.add(generator);
|
329
|
+
}
|
330
|
+
}
|
331
|
+
for (const generator of registeredTaskSyncGenerators) {
|
332
|
+
if (!registeredSyncGenerators.taskGenerators.has(generator)) {
|
333
|
+
registeredSyncGenerators.taskGenerators.add(generator);
|
316
334
|
}
|
317
335
|
}
|
318
336
|
}
|
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
|
}
|
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
|
}
|
package/src/native/index.d.ts
CHANGED
@@ -28,7 +28,7 @@ export declare class ImportResult {
|
|
28
28
|
|
29
29
|
export declare class NxCache {
|
30
30
|
cacheDirectory: string
|
31
|
-
constructor(workspaceRoot: string, cachePath: string, dbConnection: ExternalObject<Connection
|
31
|
+
constructor(workspaceRoot: string, cachePath: string, dbConnection: ExternalObject<Connection>, linkTaskDetails?: boolean | undefined | null)
|
32
32
|
get(hash: string): CachedResult | null
|
33
33
|
put(hash: string, terminalOutput: string, outputs: Array<string>, code: number): void
|
34
34
|
applyRemoteCacheResults(hash: string, result: CachedResult): void
|
Binary file
|
@@ -32,7 +32,7 @@ function getRootPackageName(tree) {
|
|
32
32
|
}
|
33
33
|
function getNxInitDate() {
|
34
34
|
try {
|
35
|
-
const nxInitIso = (0, child_process_1.execSync)('git log --diff-filter=A --follow --format=%aI -- nx.json | tail -1', { stdio: 'pipe' })
|
35
|
+
const nxInitIso = (0, child_process_1.execSync)('git log --diff-filter=A --follow --format=%aI -- nx.json | tail -1', { stdio: 'pipe', windowsHide: true })
|
36
36
|
.toString()
|
37
37
|
.trim();
|
38
38
|
const nxInitDate = new Date(nxInitIso);
|
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
|
}
|
@@ -91,6 +91,7 @@ function defaultReadFileAtRevision(file, revision) {
|
|
91
91
|
: (0, child_process_1.execSync)(`git show ${revision}:${filePathInGitRepository}`, {
|
92
92
|
maxBuffer: exports.TEN_MEGABYTES,
|
93
93
|
stdio: ['pipe', 'pipe', 'ignore'],
|
94
|
+
windowsHide: true,
|
94
95
|
})
|
95
96
|
.toString()
|
96
97
|
.trim();
|
@@ -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) {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { DefaultTasksRunnerOptions, RemoteCache } from './default-tasks-runner';
|
2
2
|
import { Task } from '../config/task-graph';
|
3
|
+
import { NxJsonConfiguration } from '../config/nx-json';
|
3
4
|
export type CachedResult = {
|
4
5
|
terminalOutput: string;
|
5
6
|
outputsPath: string;
|
@@ -10,7 +11,7 @@ export type TaskWithCachedResult = {
|
|
10
11
|
task: Task;
|
11
12
|
cachedResult: CachedResult;
|
12
13
|
};
|
13
|
-
export declare function getCache(options: DefaultTasksRunnerOptions): DbCache | Cache;
|
14
|
+
export declare function getCache(nxJson: NxJsonConfiguration, options: DefaultTasksRunnerOptions): DbCache | Cache;
|
14
15
|
export declare class DbCache {
|
15
16
|
private readonly options;
|
16
17
|
private cache;
|
@@ -30,6 +31,7 @@ export declare class DbCache {
|
|
30
31
|
private _getRemoteCache;
|
31
32
|
private getPowerpackS3Cache;
|
32
33
|
private getPowerpackSharedCache;
|
34
|
+
private getPowerpackCache;
|
33
35
|
private resolvePackage;
|
34
36
|
private assertCacheIsValid;
|
35
37
|
}
|
@@ -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");
|
@@ -18,9 +19,9 @@ const update_manager_1 = require("../nx-cloud/update-manager");
|
|
18
19
|
const get_cloud_options_1 = require("../nx-cloud/utilities/get-cloud-options");
|
19
20
|
const is_ci_1 = require("../utils/is-ci");
|
20
21
|
const output_1 = require("../utils/output");
|
21
|
-
function getCache(options) {
|
22
|
+
function getCache(nxJson, options) {
|
22
23
|
return process.env.NX_DISABLE_DB !== 'true' &&
|
23
|
-
process.env.NX_DB_CACHE === 'true'
|
24
|
+
(nxJson.enableDbCache === true || process.env.NX_DB_CACHE === 'true')
|
24
25
|
? new DbCache({
|
25
26
|
// Remove this in Nx 21
|
26
27
|
nxCloudRemoteCache: (0, nx_cloud_utils_1.isNxCloudUsed)((0, nx_json_1.readNxJson)())
|
@@ -114,23 +115,21 @@ class DbCache {
|
|
114
115
|
null);
|
115
116
|
}
|
116
117
|
}
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
catch {
|
123
|
-
return null;
|
124
|
-
}
|
118
|
+
getPowerpackS3Cache() {
|
119
|
+
return this.getPowerpackCache('@nx/powerpack-s3-cache');
|
120
|
+
}
|
121
|
+
getPowerpackSharedCache() {
|
122
|
+
return this.getPowerpackCache('@nx/powerpack-shared-fs-cache');
|
125
123
|
}
|
126
|
-
async
|
124
|
+
async getPowerpackCache(pkg) {
|
125
|
+
let getRemoteCache = null;
|
127
126
|
try {
|
128
|
-
|
129
|
-
return getRemoteCache();
|
127
|
+
getRemoteCache = (await Promise.resolve(`${this.resolvePackage(pkg)}`).then(s => require(s))).getRemoteCache;
|
130
128
|
}
|
131
129
|
catch {
|
132
130
|
return null;
|
133
131
|
}
|
132
|
+
return getRemoteCache();
|
134
133
|
}
|
135
134
|
resolvePackage(pkg) {
|
136
135
|
return require.resolve(pkg, {
|
@@ -183,6 +182,7 @@ class Cache {
|
|
183
182
|
stdio: 'ignore',
|
184
183
|
detached: true,
|
185
184
|
shell: false,
|
185
|
+
windowsHide: true,
|
186
186
|
});
|
187
187
|
p.unref();
|
188
188
|
}
|
@@ -234,13 +234,13 @@ class Cache {
|
|
234
234
|
// might be left overs from partially-completed cache invocations
|
235
235
|
await this.remove(tdCommit);
|
236
236
|
await this.remove(td);
|
237
|
-
await (0,
|
238
|
-
await (0,
|
239
|
-
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'));
|
240
240
|
const expandedOutputs = await this.expandOutputsInWorkspace(outputs);
|
241
241
|
await Promise.all(expandedOutputs.map(async (f) => {
|
242
242
|
const src = (0, path_1.join)(this.root, f);
|
243
|
-
if (
|
243
|
+
if ((0, node_fs_1.existsSync)(src)) {
|
244
244
|
const cached = (0, path_1.join)(td, 'outputs', f);
|
245
245
|
await this.copy(src, cached);
|
246
246
|
}
|
@@ -249,15 +249,15 @@ class Cache {
|
|
249
249
|
// creating this file is atomic, whereas creating a folder is not.
|
250
250
|
// so if the process gets terminated while we are copying stuff into cache,
|
251
251
|
// the cache entry won't be used.
|
252
|
-
await (0,
|
253
|
-
await (0,
|
254
|
-
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');
|
255
255
|
if (this.options.remoteCache) {
|
256
256
|
await this.options.remoteCache.store(task.hash, this.cachePath);
|
257
257
|
}
|
258
258
|
if (terminalOutput) {
|
259
259
|
const outputPath = this.temporaryOutputPath(task);
|
260
|
-
await (0,
|
260
|
+
await (0, promises_1.writeFile)(outputPath, terminalOutput);
|
261
261
|
}
|
262
262
|
});
|
263
263
|
}
|
@@ -266,7 +266,7 @@ class Cache {
|
|
266
266
|
const expandedOutputs = await this.expandOutputsInCache(outputs, cachedResult);
|
267
267
|
await Promise.all(expandedOutputs.map(async (f) => {
|
268
268
|
const cached = (0, path_1.join)(cachedResult.outputsPath, f);
|
269
|
-
if (
|
269
|
+
if ((0, node_fs_1.existsSync)(cached)) {
|
270
270
|
const src = (0, path_1.join)(this.root, f);
|
271
271
|
await this.remove(src);
|
272
272
|
await this.copy(cached, src);
|
@@ -322,11 +322,11 @@ class Cache {
|
|
322
322
|
async getFromLocalDir(task) {
|
323
323
|
const tdCommit = (0, path_1.join)(this.cachePath, `${task.hash}.commit`);
|
324
324
|
const td = (0, path_1.join)(this.cachePath, task.hash);
|
325
|
-
if (
|
326
|
-
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');
|
327
327
|
let code = 0;
|
328
328
|
try {
|
329
|
-
code = Number(await (0,
|
329
|
+
code = Number(await (0, promises_1.readFile)((0, path_1.join)(td, 'code'), 'utf-8'));
|
330
330
|
}
|
331
331
|
catch { }
|
332
332
|
return {
|
@@ -343,7 +343,7 @@ class Cache {
|
|
343
343
|
const td = (0, path_1.join)(this.cachePath, task.hash);
|
344
344
|
let sourceMachineId = null;
|
345
345
|
try {
|
346
|
-
sourceMachineId = await (0,
|
346
|
+
sourceMachineId = await (0, promises_1.readFile)((0, path_1.join)(td, 'source'), 'utf-8');
|
347
347
|
}
|
348
348
|
catch { }
|
349
349
|
if (sourceMachineId && sourceMachineId != (await this.currentMachineId())) {
|
@@ -362,12 +362,12 @@ class Cache {
|
|
362
362
|
}
|
363
363
|
}
|
364
364
|
createCacheDir() {
|
365
|
-
(0,
|
365
|
+
(0, node_fs_1.mkdirSync)(cache_directory_1.cacheDir, { recursive: true });
|
366
366
|
return cache_directory_1.cacheDir;
|
367
367
|
}
|
368
368
|
createTerminalOutputsDir() {
|
369
369
|
const path = (0, path_1.join)(this.cachePath, 'terminalOutputs');
|
370
|
-
(0,
|
370
|
+
(0, node_fs_1.mkdirSync)(path, { recursive: true });
|
371
371
|
return path;
|
372
372
|
}
|
373
373
|
}
|
@@ -56,7 +56,7 @@ const defaultTasksRunner = async (tasks, options, context) => {
|
|
56
56
|
};
|
57
57
|
exports.defaultTasksRunner = defaultTasksRunner;
|
58
58
|
async function runAllTasks(tasks, options, context) {
|
59
|
-
const orchestrator = new task_orchestrator_1.TaskOrchestrator(context.hasher, context.initiatingProject, context.projectGraph, context.taskGraph, options, context.nxArgs?.nxBail, context.daemon, context.nxArgs?.outputStyle);
|
59
|
+
const orchestrator = new task_orchestrator_1.TaskOrchestrator(context.hasher, context.initiatingProject, context.projectGraph, context.taskGraph, context.nxJson, options, context.nxArgs?.nxBail, context.daemon, context.nxArgs?.outputStyle);
|
60
60
|
return orchestrator.run();
|
61
61
|
}
|
62
62
|
exports.default = exports.defaultTasksRunner;
|
@@ -1,3 +1,3 @@
|
|
1
1
|
import { Task } from '../../config/task-graph';
|
2
2
|
export declare function formatFlags(leftPadding: string, flag: string, value: any): string;
|
3
|
-
export declare function formatTargetsAndProjects(projectNames: string[], targets: string[], tasks: Task[]):
|
3
|
+
export declare function formatTargetsAndProjects(projectNames: string[], targets: string[], tasks: Task[]): string;
|
@@ -20,24 +20,36 @@ function formatValue(value) {
|
|
20
20
|
}
|
21
21
|
}
|
22
22
|
function formatTargetsAndProjects(projectNames, targets, tasks) {
|
23
|
-
|
24
|
-
|
25
|
-
let
|
26
|
-
const
|
27
|
-
|
28
|
-
|
23
|
+
let targetsText = '';
|
24
|
+
let projectsText = '';
|
25
|
+
let dependentTasksText = '';
|
26
|
+
const tasksTargets = new Set();
|
27
|
+
const tasksProjects = new Set();
|
28
|
+
const dependentTasks = new Set();
|
29
|
+
tasks.forEach((task) => {
|
30
|
+
tasksTargets.add(task.target.target);
|
31
|
+
tasksProjects.add(task.target.project);
|
32
|
+
if (!projectNames.includes(task.target.project) ||
|
33
|
+
!targets.includes(task.target.target)) {
|
34
|
+
dependentTasks.add(task);
|
35
|
+
}
|
36
|
+
});
|
37
|
+
targets = targets.filter((t) => tasksTargets.has(t)); // filter out targets that don't exist
|
38
|
+
projectNames = projectNames.filter((p) => tasksProjects.has(p)); // filter out projects that don't exist
|
29
39
|
if (targets.length === 1) {
|
30
|
-
|
40
|
+
targetsText = `target ${output_1.output.bold(targets[0])}`;
|
31
41
|
}
|
32
42
|
else {
|
33
|
-
|
34
|
-
.map((t) => output_1.output.bold(t))
|
35
|
-
.join(', ')} for ${project}`;
|
43
|
+
targetsText = `targets ${targets.map((t) => output_1.output.bold(t)).join(', ')}`;
|
36
44
|
}
|
37
|
-
|
38
|
-
|
39
|
-
if (dependentTasks > 0) {
|
40
|
-
text += ` and ${output_1.output.bold(dependentTasks)} ${dependentTasks === 1 ? 'task' : 'tasks'} ${projectNames.length === 1 ? 'it depends on' : 'they depend on'}`;
|
45
|
+
if (projectNames.length === 1) {
|
46
|
+
projectsText = `project ${projectNames[0]}`;
|
41
47
|
}
|
42
|
-
|
48
|
+
else {
|
49
|
+
projectsText = `${projectNames.length} projects`;
|
50
|
+
}
|
51
|
+
if (dependentTasks.size > 0) {
|
52
|
+
dependentTasksText = ` and ${output_1.output.bold(dependentTasks.size)} ${dependentTasks.size === 1 ? 'task' : 'tasks'} ${projectNames.length === 1 ? 'it depends on' : 'they depend on'}`;
|
53
|
+
}
|
54
|
+
return `${targetsText} for ${projectsText}${dependentTasksText}`;
|
43
55
|
}
|
@@ -31,6 +31,9 @@ class TaskHistoryLifeCycle {
|
|
31
31
|
}
|
32
32
|
async endCommand() {
|
33
33
|
const entries = Array.from(this.taskRuns);
|
34
|
+
if (!this.taskHistory) {
|
35
|
+
return;
|
36
|
+
}
|
34
37
|
await this.taskHistory.recordTaskRuns(entries.map(([_, v]) => v));
|
35
38
|
const flakyTasks = await this.taskHistory.getFlakyTasks(entries.map(([hash]) => hash));
|
36
39
|
if (flakyTasks.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) { }
|
@@ -4,11 +4,13 @@ import { TaskStatus } from './tasks-runner';
|
|
4
4
|
import { ProjectGraph } from '../config/project-graph';
|
5
5
|
import { TaskGraph } from '../config/task-graph';
|
6
6
|
import { DaemonClient } from '../daemon/client/client';
|
7
|
+
import { NxJsonConfiguration } from '../config/nx-json';
|
7
8
|
export declare class TaskOrchestrator {
|
8
9
|
private readonly hasher;
|
9
10
|
private readonly initiatingProject;
|
10
11
|
private readonly projectGraph;
|
11
12
|
private readonly taskGraph;
|
13
|
+
private readonly nxJson;
|
12
14
|
private readonly options;
|
13
15
|
private readonly bail;
|
14
16
|
private readonly daemon;
|
@@ -24,7 +26,7 @@ export declare class TaskOrchestrator {
|
|
24
26
|
private waitingForTasks;
|
25
27
|
private groups;
|
26
28
|
private bailed;
|
27
|
-
constructor(hasher: TaskHasher, initiatingProject: string | undefined, projectGraph: ProjectGraph, taskGraph: TaskGraph, options: DefaultTasksRunnerOptions, bail: boolean, daemon: DaemonClient, outputStyle: string);
|
29
|
+
constructor(hasher: TaskHasher, initiatingProject: string | undefined, projectGraph: ProjectGraph, taskGraph: TaskGraph, nxJson: NxJsonConfiguration, options: DefaultTasksRunnerOptions, bail: boolean, daemon: DaemonClient, outputStyle: string);
|
28
30
|
run(): Promise<{
|
29
31
|
[id: string]: TaskStatus;
|
30
32
|
}>;
|
@@ -17,16 +17,17 @@ const output_1 = require("../utils/output");
|
|
17
17
|
const params_1 = require("../utils/params");
|
18
18
|
class TaskOrchestrator {
|
19
19
|
// endregion internal state
|
20
|
-
constructor(hasher, initiatingProject, projectGraph, taskGraph, options, bail, daemon, outputStyle) {
|
20
|
+
constructor(hasher, initiatingProject, projectGraph, taskGraph, nxJson, options, bail, daemon, outputStyle) {
|
21
21
|
this.hasher = hasher;
|
22
22
|
this.initiatingProject = initiatingProject;
|
23
23
|
this.projectGraph = projectGraph;
|
24
24
|
this.taskGraph = taskGraph;
|
25
|
+
this.nxJson = nxJson;
|
25
26
|
this.options = options;
|
26
27
|
this.bail = bail;
|
27
28
|
this.daemon = daemon;
|
28
29
|
this.outputStyle = outputStyle;
|
29
|
-
this.cache = (0, cache_1.getCache)(this.options);
|
30
|
+
this.cache = (0, cache_1.getCache)(this.nxJson, this.options);
|
30
31
|
this.forkedProcessTaskRunner = new forked_process_task_runner_1.ForkedProcessTaskRunner(this.options);
|
31
32
|
this.tasksSchedule = new tasks_schedule_1.TasksSchedule(this.projectGraph, this.taskGraph, this.options);
|
32
33
|
// region internal state
|
@@ -13,7 +13,7 @@ class TasksSchedule {
|
|
13
13
|
this.notScheduledTaskGraph = this.taskGraph;
|
14
14
|
this.reverseTaskDeps = (0, utils_1.calculateReverseDeps)(this.taskGraph);
|
15
15
|
this.reverseProjectGraph = (0, operators_1.reverse)(this.projectGraph);
|
16
|
-
this.taskHistory =
|
16
|
+
this.taskHistory = (0, task_history_1.getTaskHistory)();
|
17
17
|
this.scheduledBatches = [];
|
18
18
|
this.scheduledTasks = [];
|
19
19
|
this.runningTasks = new Set();
|
package/src/utils/ab-testing.js
CHANGED
@@ -97,7 +97,10 @@ function shouldRecordStats() {
|
|
97
97
|
return true;
|
98
98
|
}
|
99
99
|
try {
|
100
|
-
const stdout = (0, node_child_process_1.execSync)(pmc.getRegistryUrl, {
|
100
|
+
const stdout = (0, node_child_process_1.execSync)(pmc.getRegistryUrl, {
|
101
|
+
encoding: 'utf-8',
|
102
|
+
windowsHide: true,
|
103
|
+
});
|
101
104
|
const url = new URL(stdout.trim());
|
102
105
|
// don't record stats when testing locally
|
103
106
|
return url.hostname !== 'localhost';
|