nx 19.8.0 → 19.8.2
Sign up to get free protection for your applications and to get access to all the features.
- 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';
|