nx 22.1.0-canary.20251110-73ecb30 → 22.1.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +11 -11
- package/release/changelog-renderer/index.d.ts.map +1 -1
- package/release/changelog-renderer/index.js +13 -8
- package/src/command-line/configure-ai-agents/configure-ai-agents.d.ts.map +1 -1
- package/src/command-line/configure-ai-agents/configure-ai-agents.js +3 -1
- package/src/command-line/init/init-v2.d.ts +1 -1
- package/src/command-line/init/init-v2.d.ts.map +1 -1
- package/src/command-line/init/init-v2.js +29 -1
- package/src/command-line/migrate/migrate.d.ts.map +1 -1
- package/src/command-line/migrate/migrate.js +2 -1
- package/src/command-line/release/changelog/commit-utils.d.ts +14 -0
- package/src/command-line/release/changelog/commit-utils.d.ts.map +1 -0
- package/src/command-line/release/changelog/commit-utils.js +63 -0
- package/src/command-line/release/changelog/version-plan-filtering.d.ts +39 -0
- package/src/command-line/release/changelog/version-plan-filtering.d.ts.map +1 -0
- package/src/command-line/release/changelog/version-plan-filtering.js +151 -0
- package/src/command-line/release/changelog/version-plan-utils.d.ts +32 -0
- package/src/command-line/release/changelog/version-plan-utils.d.ts.map +1 -0
- package/src/command-line/release/changelog/version-plan-utils.js +92 -0
- package/src/command-line/release/changelog.d.ts +1 -16
- package/src/command-line/release/changelog.d.ts.map +1 -1
- package/src/command-line/release/changelog.js +127 -269
- package/src/command-line/release/command-object.d.ts +1 -0
- package/src/command-line/release/command-object.d.ts.map +1 -1
- package/src/command-line/release/command-object.js +6 -0
- package/src/command-line/release/utils/shared.d.ts.map +1 -1
- package/src/command-line/release/utils/shared.js +2 -2
- package/src/core/graph/main.js +1 -1
- package/src/core/graph/styles.css +2 -2
- package/src/native/index.d.ts +0 -10
- package/src/native/nx.wasi-browser.js +53 -45
- package/src/native/nx.wasm32-wasi.wasm +0 -0
- package/src/plugins/js/index.d.ts.map +1 -1
- package/src/plugins/js/index.js +55 -7
- package/src/plugins/js/lock-file/lock-file.d.ts +5 -2
- package/src/plugins/js/lock-file/lock-file.d.ts.map +1 -1
- package/src/plugins/js/lock-file/lock-file.js +8 -6
- package/src/plugins/js/lock-file/npm-parser.d.ts +5 -2
- package/src/plugins/js/lock-file/npm-parser.d.ts.map +1 -1
- package/src/plugins/js/lock-file/npm-parser.js +5 -8
- package/src/plugins/js/lock-file/pnpm-parser.d.ts +5 -2
- package/src/plugins/js/lock-file/pnpm-parser.d.ts.map +1 -1
- package/src/plugins/js/lock-file/pnpm-parser.js +5 -7
- package/src/plugins/js/lock-file/yarn-parser.d.ts +5 -2
- package/src/plugins/js/lock-file/yarn-parser.d.ts.map +1 -1
- package/src/plugins/js/lock-file/yarn-parser.js +5 -7
- package/src/tasks-runner/tasks-schedule.d.ts.map +1 -1
- package/src/tasks-runner/tasks-schedule.js +10 -3
|
@@ -59,7 +59,8 @@ function getLockFileNodes(packageManager, contents, lockFileHash, context) {
|
|
|
59
59
|
const lockFilePath = getLockFilePath(packageManager);
|
|
60
60
|
if (lockFilePath.endsWith(bun_parser_1.BUN_TEXT_LOCK_FILE)) {
|
|
61
61
|
// Use new text-based parser
|
|
62
|
-
|
|
62
|
+
const nodes = (0, bun_parser_1.getBunTextLockfileNodes)(contents, lockFileHash);
|
|
63
|
+
return { nodes, keyMap: new Map() };
|
|
63
64
|
}
|
|
64
65
|
else {
|
|
65
66
|
// Fallback to yarn parser for binary format
|
|
@@ -82,25 +83,26 @@ function getLockFileNodes(packageManager, contents, lockFileHash, context) {
|
|
|
82
83
|
/**
|
|
83
84
|
* Parses lock file and maps dependencies and metadata to {@link LockFileGraph}
|
|
84
85
|
*/
|
|
85
|
-
function getLockFileDependencies(packageManager, contents, lockFileHash, context) {
|
|
86
|
+
function getLockFileDependencies(packageManager, contents, lockFileHash, context, keyMap) {
|
|
86
87
|
try {
|
|
87
88
|
if (packageManager === 'yarn') {
|
|
88
|
-
return (0, yarn_parser_1.getYarnLockfileDependencies)(contents, lockFileHash, context);
|
|
89
|
+
return (0, yarn_parser_1.getYarnLockfileDependencies)(contents, lockFileHash, context, keyMap);
|
|
89
90
|
}
|
|
90
91
|
if (packageManager === 'pnpm') {
|
|
91
|
-
return (0, pnpm_parser_1.getPnpmLockfileDependencies)(contents, lockFileHash, context);
|
|
92
|
+
return (0, pnpm_parser_1.getPnpmLockfileDependencies)(contents, lockFileHash, context, keyMap);
|
|
92
93
|
}
|
|
93
94
|
if (packageManager === 'npm') {
|
|
94
|
-
return (0, npm_parser_1.getNpmLockfileDependencies)(contents, lockFileHash, context);
|
|
95
|
+
return (0, npm_parser_1.getNpmLockfileDependencies)(contents, lockFileHash, context, keyMap);
|
|
95
96
|
}
|
|
96
97
|
if (packageManager === 'bun') {
|
|
97
98
|
const lockFilePath = getLockFilePath(packageManager);
|
|
98
99
|
if (lockFilePath.endsWith(bun_parser_1.BUN_TEXT_LOCK_FILE)) {
|
|
100
|
+
// Bun parser doesn't use keyMap
|
|
99
101
|
return (0, bun_parser_1.getBunTextLockfileDependencies)(contents, lockFileHash, context);
|
|
100
102
|
}
|
|
101
103
|
else {
|
|
102
104
|
// Fallback to yarn parser for binary format
|
|
103
|
-
return (0, yarn_parser_1.getYarnLockfileDependencies)(contents, lockFileHash, context);
|
|
105
|
+
return (0, yarn_parser_1.getYarnLockfileDependencies)(contents, lockFileHash, context, keyMap);
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
}
|
|
@@ -2,7 +2,10 @@ import { NormalizedPackageJson } from './utils/package-json';
|
|
|
2
2
|
import { RawProjectGraphDependency } from '../../../project-graph/project-graph-builder';
|
|
3
3
|
import { ProjectGraph, ProjectGraphExternalNode } from '../../../config/project-graph';
|
|
4
4
|
import { CreateDependenciesContext } from '../../../project-graph/plugins';
|
|
5
|
-
export declare function getNpmLockfileNodes(lockFileContent: string, lockFileHash: string):
|
|
6
|
-
|
|
5
|
+
export declare function getNpmLockfileNodes(lockFileContent: string, lockFileHash: string): {
|
|
6
|
+
nodes: Record<string, ProjectGraphExternalNode>;
|
|
7
|
+
keyMap: Map<string, ProjectGraphExternalNode>;
|
|
8
|
+
};
|
|
9
|
+
export declare function getNpmLockfileDependencies(lockFileContent: string, lockFileHash: string, ctx: CreateDependenciesContext, keyMap: Map<string, ProjectGraphExternalNode>): RawProjectGraphDependency[];
|
|
7
10
|
export declare function stringifyNpmLockfile(graph: ProjectGraph, rootLockFileContent: string, packageJson: NormalizedPackageJson): string;
|
|
8
11
|
//# sourceMappingURL=npm-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-parser.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/plugins/js/lock-file/npm-parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAEL,YAAY,EACZ,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"npm-parser.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/plugins/js/lock-file/npm-parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAEL,YAAY,EACZ,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAyD3E,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB;IACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAC/C,CAOA;AAED,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,+BAQ9C;AAwSD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,YAAY,EACnB,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,qBAAqB,GACjC,MAAM,CA8BR"}
|
|
@@ -11,15 +11,12 @@ const project_graph_builder_1 = require("../../../project-graph/project-graph-bu
|
|
|
11
11
|
const project_graph_1 = require("../../../config/project-graph");
|
|
12
12
|
const file_hasher_1 = require("../../../hasher/file-hasher");
|
|
13
13
|
const get_workspace_packages_from_graph_1 = require("../utils/get-workspace-packages-from-graph");
|
|
14
|
-
// we use key => node map to avoid duplicate work when parsing keys
|
|
15
|
-
let keyMap = new Map();
|
|
16
14
|
let currentLockFileHash;
|
|
17
15
|
let parsedLockFile;
|
|
18
16
|
function parsePackageLockFile(lockFileContent, lockFileHash) {
|
|
19
17
|
if (lockFileHash === currentLockFileHash) {
|
|
20
18
|
return parsedLockFile;
|
|
21
19
|
}
|
|
22
|
-
keyMap.clear();
|
|
23
20
|
const results = JSON.parse(lockFileContent);
|
|
24
21
|
parsedLockFile = results;
|
|
25
22
|
currentLockFileHash = lockFileHash;
|
|
@@ -27,14 +24,14 @@ function parsePackageLockFile(lockFileContent, lockFileHash) {
|
|
|
27
24
|
}
|
|
28
25
|
function getNpmLockfileNodes(lockFileContent, lockFileHash) {
|
|
29
26
|
const data = parsePackageLockFile(lockFileContent, lockFileHash);
|
|
30
|
-
|
|
31
|
-
return getNodes(data, keyMap);
|
|
27
|
+
return getNodes(data);
|
|
32
28
|
}
|
|
33
|
-
function getNpmLockfileDependencies(lockFileContent, lockFileHash, ctx) {
|
|
29
|
+
function getNpmLockfileDependencies(lockFileContent, lockFileHash, ctx, keyMap) {
|
|
34
30
|
const data = parsePackageLockFile(lockFileContent, lockFileHash);
|
|
35
31
|
return getDependencies(data, keyMap, ctx);
|
|
36
32
|
}
|
|
37
|
-
function getNodes(data
|
|
33
|
+
function getNodes(data) {
|
|
34
|
+
const keyMap = new Map();
|
|
38
35
|
const nodes = new Map();
|
|
39
36
|
if (data.lockfileVersion > 1) {
|
|
40
37
|
Object.entries(data.packages).forEach(([path, snapshot]) => {
|
|
@@ -77,7 +74,7 @@ function getNodes(data, keyMap) {
|
|
|
77
74
|
results[node.name] = node;
|
|
78
75
|
});
|
|
79
76
|
}
|
|
80
|
-
return results;
|
|
77
|
+
return { nodes: results, keyMap };
|
|
81
78
|
}
|
|
82
79
|
function addV1Node(packageName, snapshot, path, nodes, keyMap) {
|
|
83
80
|
createNode(packageName, snapshot.version, path, nodes, keyMap, snapshot);
|
|
@@ -2,7 +2,10 @@ import { NormalizedPackageJson } from './utils/package-json';
|
|
|
2
2
|
import { RawProjectGraphDependency } from '../../../project-graph/project-graph-builder';
|
|
3
3
|
import { ProjectGraph, ProjectGraphExternalNode } from '../../../config/project-graph';
|
|
4
4
|
import { CreateDependenciesContext } from '../../../project-graph/plugins';
|
|
5
|
-
export declare function getPnpmLockfileNodes(lockFileContent: string, lockFileHash: string):
|
|
6
|
-
|
|
5
|
+
export declare function getPnpmLockfileNodes(lockFileContent: string, lockFileHash: string): {
|
|
6
|
+
nodes: Record<string, ProjectGraphExternalNode>;
|
|
7
|
+
keyMap: Map<string, Set<ProjectGraphExternalNode>>;
|
|
8
|
+
};
|
|
9
|
+
export declare function getPnpmLockfileDependencies(lockFileContent: string, lockFileHash: string, ctx: CreateDependenciesContext, keyMap: Map<string, Set<ProjectGraphExternalNode>>): RawProjectGraphDependency[];
|
|
7
10
|
export declare function stringifyPnpmLockfile(graph: ProjectGraph, rootLockFileContent: string, packageJson: NormalizedPackageJson, workspaceRoot: string): string;
|
|
8
11
|
//# sourceMappingURL=pnpm-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm-parser.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/plugins/js/lock-file/pnpm-parser.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAEL,YAAY,EACZ,wBAAwB,EACzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"pnpm-parser.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/plugins/js/lock-file/pnpm-parser.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAEL,YAAY,EACZ,wBAAwB,EACzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAuB3E,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB;IACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;CACpD,CASA;AAED,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,wBAAwB,CAAC,CAAC,+BAUnD;AAqUD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,qBAAqB,EAClC,aAAa,EAAE,MAAM,GACpB,MAAM,CAuCR"}
|
|
@@ -13,15 +13,12 @@ const catalog_1 = require("../../../utils/catalog");
|
|
|
13
13
|
const project_graph_pruning_1 = require("./project-graph-pruning");
|
|
14
14
|
const path_1 = require("path");
|
|
15
15
|
const get_workspace_packages_from_graph_1 = require("../utils/get-workspace-packages-from-graph");
|
|
16
|
-
// we use key => node map to avoid duplicate work when parsing keys
|
|
17
|
-
let keyMap = new Map();
|
|
18
16
|
let currentLockFileHash;
|
|
19
17
|
let parsedLockFile;
|
|
20
18
|
function parsePnpmLockFile(lockFileContent, lockFileHash) {
|
|
21
19
|
if (lockFileHash === currentLockFileHash) {
|
|
22
20
|
return parsedLockFile;
|
|
23
21
|
}
|
|
24
|
-
keyMap.clear();
|
|
25
22
|
const results = (0, pnpm_normalizer_1.parseAndNormalizePnpmLockfile)(lockFileContent);
|
|
26
23
|
parsedLockFile = results;
|
|
27
24
|
currentLockFileHash = lockFileHash;
|
|
@@ -33,9 +30,9 @@ function getPnpmLockfileNodes(lockFileContent, lockFileHash) {
|
|
|
33
30
|
console.warn('Nx was tested only with pnpm lockfile version 5-9. If you encounter any issues, please report them and downgrade to older version of pnpm.');
|
|
34
31
|
}
|
|
35
32
|
const isV5 = (0, pnpm_normalizer_1.isV5Syntax)(data);
|
|
36
|
-
return getNodes(data,
|
|
33
|
+
return getNodes(data, isV5);
|
|
37
34
|
}
|
|
38
|
-
function getPnpmLockfileDependencies(lockFileContent, lockFileHash, ctx) {
|
|
35
|
+
function getPnpmLockfileDependencies(lockFileContent, lockFileHash, ctx, keyMap) {
|
|
39
36
|
const data = parsePnpmLockFile(lockFileContent, lockFileHash);
|
|
40
37
|
if (+data.lockfileVersion.toString() >= 10) {
|
|
41
38
|
console.warn('Nx was tested only with pnpm lockfile version 5-9. If you encounter any issues, please report them and downgrade to older version of pnpm.');
|
|
@@ -71,7 +68,8 @@ function createHashFromSnapshot(snapshot) {
|
|
|
71
68
|
function isAliasVersion(depVersion) {
|
|
72
69
|
return depVersion.startsWith('/') || depVersion.includes('@');
|
|
73
70
|
}
|
|
74
|
-
function getNodes(data,
|
|
71
|
+
function getNodes(data, isV5) {
|
|
72
|
+
const keyMap = new Map();
|
|
75
73
|
const nodes = new Map();
|
|
76
74
|
const maybeAliasedPackageVersions = new Map(); // <version, alias>
|
|
77
75
|
if (data.importers['.'].optionalDependencies) {
|
|
@@ -232,7 +230,7 @@ function getNodes(data, keyMap, isV5) {
|
|
|
232
230
|
results[node.name] = node;
|
|
233
231
|
});
|
|
234
232
|
}
|
|
235
|
-
return results;
|
|
233
|
+
return { nodes: results, keyMap };
|
|
236
234
|
}
|
|
237
235
|
function getHoistedVersion(hoistedDependencies, packageName, isV5) {
|
|
238
236
|
let version = (0, package_json_1.getHoistedPackageVersion)(packageName);
|
|
@@ -2,7 +2,10 @@ import { NormalizedPackageJson } from './utils/package-json';
|
|
|
2
2
|
import { RawProjectGraphDependency } from '../../../project-graph/project-graph-builder';
|
|
3
3
|
import { ProjectGraph, ProjectGraphExternalNode } from '../../../config/project-graph';
|
|
4
4
|
import { CreateDependenciesContext } from '../../../project-graph/plugins';
|
|
5
|
-
export declare function getYarnLockfileNodes(lockFileContent: string, lockFileHash: string, packageJson: NormalizedPackageJson):
|
|
6
|
-
|
|
5
|
+
export declare function getYarnLockfileNodes(lockFileContent: string, lockFileHash: string, packageJson: NormalizedPackageJson): {
|
|
6
|
+
nodes: Record<string, ProjectGraphExternalNode>;
|
|
7
|
+
keyMap: Map<string, ProjectGraphExternalNode>;
|
|
8
|
+
};
|
|
9
|
+
export declare function getYarnLockfileDependencies(lockFileContent: string, lockFileHash: string, ctx: CreateDependenciesContext, keyMap: Map<string, ProjectGraphExternalNode>): RawProjectGraphDependency[];
|
|
7
10
|
export declare function stringifyYarnLockfile(graph: ProjectGraph, rootLockFileContent: string, packageJson: NormalizedPackageJson): string;
|
|
8
11
|
//# sourceMappingURL=yarn-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yarn-parser.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/plugins/js/lock-file/yarn-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAEL,YAAY,EACZ,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"yarn-parser.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/plugins/js/lock-file/yarn-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,EAE1B,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAEL,YAAY,EACZ,wBAAwB,EAEzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AA0C3E,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,qBAAqB,GACjC;IACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CAC/C,CAYA;AAED,wBAAgB,2BAA2B,CACzC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,wBAAwB,CAAC,+BAa9C;AAsQD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,qBAAqB,GACjC,MAAM,CA8BR"}
|
|
@@ -12,14 +12,11 @@ const object_sort_1 = require("../../../utils/object-sort");
|
|
|
12
12
|
const get_workspace_packages_from_graph_1 = require("../utils/get-workspace-packages-from-graph");
|
|
13
13
|
let currentLockFileHash;
|
|
14
14
|
let cachedParsedLockFile;
|
|
15
|
-
// we use key => node map to avoid duplicate work when parsing keys
|
|
16
|
-
let keyMap = new Map();
|
|
17
15
|
function parseLockFile(lockFileContent, lockFileHash) {
|
|
18
16
|
if (currentLockFileHash === lockFileHash) {
|
|
19
17
|
return cachedParsedLockFile;
|
|
20
18
|
}
|
|
21
19
|
const { parseSyml } = require('@yarnpkg/parsers');
|
|
22
|
-
keyMap.clear();
|
|
23
20
|
const result = parseSyml(lockFileContent);
|
|
24
21
|
cachedParsedLockFile = result;
|
|
25
22
|
currentLockFileHash = lockFileHash;
|
|
@@ -32,12 +29,12 @@ function getYarnLockfileNodes(lockFileContent, lockFileHash, packageJson) {
|
|
|
32
29
|
const groupedDependencies = groupDependencies(dependencies, isBerry);
|
|
33
30
|
return getNodes(groupedDependencies, packageJson, isBerry);
|
|
34
31
|
}
|
|
35
|
-
function getYarnLockfileDependencies(lockFileContent, lockFileHash, ctx) {
|
|
32
|
+
function getYarnLockfileDependencies(lockFileContent, lockFileHash, ctx, keyMap) {
|
|
36
33
|
const { __metadata, ...dependencies } = parseLockFile(lockFileContent, lockFileHash);
|
|
37
34
|
const isBerry = !!__metadata;
|
|
38
35
|
// yarn classic splits keys when parsing so we need to stich them back together
|
|
39
36
|
const groupedDependencies = groupDependencies(dependencies, isBerry);
|
|
40
|
-
return getDependencies(groupedDependencies, ctx);
|
|
37
|
+
return getDependencies(groupedDependencies, ctx, keyMap);
|
|
41
38
|
}
|
|
42
39
|
function getPackageNameKeyPairs(keys) {
|
|
43
40
|
const result = new Map();
|
|
@@ -53,6 +50,7 @@ function getPackageNameKeyPairs(keys) {
|
|
|
53
50
|
return result;
|
|
54
51
|
}
|
|
55
52
|
function getNodes(dependencies, packageJson, isBerry) {
|
|
53
|
+
const keyMap = new Map();
|
|
56
54
|
const nodes = new Map();
|
|
57
55
|
const combinedDeps = {
|
|
58
56
|
...packageJson.dependencies,
|
|
@@ -115,7 +113,7 @@ function getNodes(dependencies, packageJson, isBerry) {
|
|
|
115
113
|
externalNodes[node.name] = node;
|
|
116
114
|
});
|
|
117
115
|
}
|
|
118
|
-
return externalNodes;
|
|
116
|
+
return { nodes: externalNodes, keyMap };
|
|
119
117
|
}
|
|
120
118
|
function findHoistedNode(packageName, versionMap, combinedDeps) {
|
|
121
119
|
const hoistedVersion = getHoistedVersion(packageName);
|
|
@@ -194,7 +192,7 @@ function getHoistedVersion(packageName) {
|
|
|
194
192
|
return version;
|
|
195
193
|
}
|
|
196
194
|
}
|
|
197
|
-
function getDependencies(dependencies, ctx) {
|
|
195
|
+
function getDependencies(dependencies, ctx, keyMap) {
|
|
198
196
|
const projectGraphDependencies = [];
|
|
199
197
|
Object.keys(dependencies).forEach((keys) => {
|
|
200
198
|
const snapshot = dependencies[keys];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-schedule.d.ts","sourceRoot":"","sources":["../../../../../packages/nx/src/tasks-runner/tasks-schedule.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKvD,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,qBAAa,aAAa;IAetB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhB1B,OAAO,CAAC,qBAAqB,CAAkB;IAC/C,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,WAAW,CAAwC;IAE3D,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,mBAAmB,CAA8B;gBAGtC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,yBAAyB;IAGxC,IAAI;IAkBJ,iBAAiB;IAMvB,QAAQ;IASR,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;IAW1B,oBAAoB;;;;IAOpB,QAAQ;IAQR,SAAS,IAAI,KAAK;IAMlB,kBAAkB,IAAI,IAAI,EAAE;YAUrB,aAAa;YAWb,YAAY;YAkDZ,eAAe;
|
|
1
|
+
{"version":3,"file":"tasks-schedule.d.ts","sourceRoot":"","sources":["../../../../../packages/nx/src/tasks-runner/tasks-schedule.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAKvD,MAAM,WAAW,KAAK;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,qBAAa,aAAa;IAetB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhB1B,OAAO,CAAC,qBAAqB,CAAkB;IAC/C,OAAO,CAAC,eAAe,CAAwC;IAC/D,OAAO,CAAC,mBAAmB,CAA8B;IACzD,OAAO,CAAC,WAAW,CAAwC;IAE3D,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,8BAA8B,CAAqB;IAC3D,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,mBAAmB,CAA8B;gBAGtC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,yBAAyB;IAGxC,IAAI;IAkBJ,iBAAiB;IAMvB,QAAQ;IASR,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;IAW1B,oBAAoB;;;;IAOpB,QAAQ;IAQR,SAAS,IAAI,KAAK;IAMlB,kBAAkB,IAAI,IAAI,EAAE;YAUrB,aAAa;YAWb,YAAY;YAkDZ,eAAe;IAkB7B,OAAO,CAAC,aAAa;YAUP,qBAAqB;IA+DnC,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,cAAc;IAiCf,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAGzD"}
|
|
@@ -128,7 +128,7 @@ class TasksSchedule {
|
|
|
128
128
|
for (const root of this.notScheduledTaskGraph.roots) {
|
|
129
129
|
const rootTask = this.notScheduledTaskGraph.tasks[root];
|
|
130
130
|
const executorName = (0, utils_1.getExecutorNameForTask)(rootTask, this.projectGraph);
|
|
131
|
-
await this.processTaskForBatches(batchMap, rootTask, executorName, true);
|
|
131
|
+
await this.processTaskForBatches(batchMap, rootTask, executorName, true, new Set());
|
|
132
132
|
}
|
|
133
133
|
for (const [executorName, taskGraph] of Object.entries(batchMap)) {
|
|
134
134
|
this.scheduleBatch({ executorName, taskGraph });
|
|
@@ -139,7 +139,11 @@ class TasksSchedule {
|
|
|
139
139
|
this.notScheduledTaskGraph = (0, utils_1.removeTasksFromTaskGraph)(this.notScheduledTaskGraph, Object.keys(taskGraph.tasks));
|
|
140
140
|
this.scheduledBatches.push({ executorName, taskGraph });
|
|
141
141
|
}
|
|
142
|
-
async processTaskForBatches(batches, task, rootExecutorName, isRoot) {
|
|
142
|
+
async processTaskForBatches(batches, task, rootExecutorName, isRoot, visitedInBatch) {
|
|
143
|
+
// Skip if already processed in this batch - prevents redundant traversals
|
|
144
|
+
if (visitedInBatch.has(task.id)) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
143
147
|
if (!this.canBatchTaskBeScheduled(task, batches[rootExecutorName])) {
|
|
144
148
|
return;
|
|
145
149
|
}
|
|
@@ -151,6 +155,9 @@ class TasksSchedule {
|
|
|
151
155
|
if (!batchImplementationFactory) {
|
|
152
156
|
return;
|
|
153
157
|
}
|
|
158
|
+
// Mark as visited only after all checks pass and we're actually adding to batch
|
|
159
|
+
// This ensures tasks can be added if they pass checks from any path
|
|
160
|
+
visitedInBatch.add(task.id);
|
|
154
161
|
const batch = (batches[rootExecutorName] =
|
|
155
162
|
batches[rootExecutorName] ??
|
|
156
163
|
{
|
|
@@ -169,7 +176,7 @@ class TasksSchedule {
|
|
|
169
176
|
}
|
|
170
177
|
for (const dep of this.reverseTaskDeps[task.id]) {
|
|
171
178
|
const depTask = this.taskGraph.tasks[dep];
|
|
172
|
-
await this.processTaskForBatches(batches, depTask, rootExecutorName, false);
|
|
179
|
+
await this.processTaskForBatches(batches, depTask, rootExecutorName, false, visitedInBatch);
|
|
173
180
|
}
|
|
174
181
|
}
|
|
175
182
|
canBatchTaskBeScheduled(task, batchTaskGraph) {
|