nx 22.0.0-beta.3 → 22.0.0-beta.5
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/migrations.json +5 -0
- package/package.json +11 -11
- package/release/changelog-renderer/index.d.ts +1 -0
- package/release/changelog-renderer/index.d.ts.map +1 -1
- package/release/changelog-renderer/index.js +46 -15
- package/schemas/nx-schema.json +254 -86
- package/src/command-line/configure-ai-agents/command-object.d.ts +1 -1
- package/src/command-line/configure-ai-agents/command-object.d.ts.map +1 -1
- package/src/command-line/configure-ai-agents/command-object.js +18 -4
- 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 +58 -31
- package/src/command-line/migrate/migrate.d.ts.map +1 -1
- package/src/command-line/migrate/migrate.js +0 -4
- package/src/command-line/nx-cloud/login/command-object.d.ts.map +1 -1
- package/src/command-line/nx-cloud/login/command-object.js +2 -2
- package/src/command-line/nx-cloud/logout/command-object.js +1 -1
- package/src/command-line/nx-commands.js +1 -1
- package/src/command-line/release/changelog.d.ts.map +1 -1
- package/src/command-line/release/changelog.js +58 -47
- package/src/command-line/release/command-object.d.ts +7 -3
- package/src/command-line/release/command-object.d.ts.map +1 -1
- package/src/command-line/release/config/config.d.ts +6 -2
- package/src/command-line/release/config/config.d.ts.map +1 -1
- package/src/command-line/release/config/config.js +124 -61
- package/src/command-line/release/config/version-plans.d.ts.map +1 -1
- package/src/command-line/release/config/version-plans.js +4 -1
- package/src/command-line/release/publish.d.ts.map +1 -1
- package/src/command-line/release/publish.js +35 -11
- package/src/command-line/release/release.d.ts.map +1 -1
- package/src/command-line/release/release.js +31 -30
- package/src/command-line/release/utils/git.d.ts +2 -2
- package/src/command-line/release/utils/git.d.ts.map +1 -1
- package/src/command-line/release/utils/git.js +5 -5
- package/src/command-line/release/utils/release-graph.d.ts +219 -0
- package/src/command-line/release/utils/release-graph.d.ts.map +1 -0
- package/src/command-line/release/utils/release-graph.js +658 -0
- package/src/command-line/release/utils/semver.d.ts +1 -2
- package/src/command-line/release/utils/semver.d.ts.map +1 -1
- package/src/command-line/release/utils/semver.js +3 -5
- package/src/command-line/release/utils/shared.d.ts +1 -1
- package/src/command-line/release/utils/shared.d.ts.map +1 -1
- package/src/command-line/release/utils/shared.js +53 -19
- package/src/command-line/release/version/release-group-processor.d.ts +3 -152
- package/src/command-line/release/version/release-group-processor.d.ts.map +1 -1
- package/src/command-line/release/version/release-group-processor.js +58 -569
- package/src/command-line/release/version/resolve-current-version.d.ts +1 -1
- package/src/command-line/release/version/resolve-current-version.d.ts.map +1 -1
- package/src/command-line/release/version/resolve-current-version.js +1 -1
- package/src/command-line/release/version/test-utils.d.ts +13 -4
- package/src/command-line/release/version/test-utils.d.ts.map +1 -1
- package/src/command-line/release/version/test-utils.js +26 -11
- package/src/command-line/release/version/version-actions.d.ts +12 -5
- package/src/command-line/release/version/version-actions.d.ts.map +1 -1
- package/src/command-line/release/version/version-actions.js +36 -19
- package/src/command-line/release/version.d.ts +6 -1
- package/src/command-line/release/version.d.ts.map +1 -1
- package/src/command-line/release/version.js +57 -28
- package/src/config/nx-json.d.ts +139 -58
- package/src/config/nx-json.d.ts.map +1 -1
- package/src/config/nx-json.js +8 -8
- package/src/core/graph/main.js +1 -1
- package/src/daemon/client/client.d.ts +4 -0
- package/src/daemon/client/client.d.ts.map +1 -1
- package/src/daemon/client/client.js +23 -0
- package/src/daemon/message-types/register-project-graph-listener.d.ts +6 -0
- package/src/daemon/message-types/register-project-graph-listener.d.ts.map +1 -0
- package/src/daemon/message-types/register-project-graph-listener.js +11 -0
- package/src/daemon/server/project-graph-incremental-recomputation.d.ts +3 -1
- package/src/daemon/server/project-graph-incremental-recomputation.d.ts.map +1 -1
- package/src/daemon/server/project-graph-incremental-recomputation.js +13 -5
- package/src/daemon/server/project-graph-listener-sockets.d.ts +8 -0
- package/src/daemon/server/project-graph-listener-sockets.d.ts.map +1 -0
- package/src/daemon/server/project-graph-listener-sockets.js +24 -0
- package/src/daemon/server/server.d.ts.map +1 -1
- package/src/daemon/server/server.js +9 -2
- package/src/migrations/update-22-0-0/consolidate-release-tag-config.d.ts +3 -0
- package/src/migrations/update-22-0-0/consolidate-release-tag-config.d.ts.map +1 -0
- package/src/migrations/update-22-0-0/consolidate-release-tag-config.js +100 -0
- package/src/native/nx.wasm32-wasi.wasm +0 -0
- package/src/tasks-runner/is-tui-enabled.d.ts.map +1 -1
- package/src/tasks-runner/is-tui-enabled.js +0 -1
- package/src/tasks-runner/run-command.d.ts.map +1 -1
- package/src/tasks-runner/run-command.js +5 -2
- package/src/utils/package-manager.d.ts.map +1 -1
- package/src/utils/package-manager.js +1 -3
|
@@ -2,17 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ReleaseGroupProcessor = exports.BUMP_TYPE_REASON_TEXT = void 0;
|
|
4
4
|
const semver = require("semver");
|
|
5
|
-
const config_1 = require("../config/config");
|
|
6
5
|
const workspace_root_1 = require("../../../utils/workspace-root");
|
|
7
|
-
const
|
|
6
|
+
const config_1 = require("../config/config");
|
|
8
7
|
const resolve_semver_specifier_1 = require("../utils/resolve-semver-specifier");
|
|
9
|
-
const shared_1 = require("../utils/shared");
|
|
10
|
-
const version_1 = require("../version");
|
|
11
8
|
const derive_specifier_from_conventional_commits_1 = require("./derive-specifier-from-conventional-commits");
|
|
12
9
|
const deriver_specifier_from_version_plans_1 = require("./deriver-specifier-from-version-plans");
|
|
13
|
-
const project_logger_1 = require("./project-logger");
|
|
14
|
-
const resolve_current_version_1 = require("./resolve-current-version");
|
|
15
|
-
const topological_sort_1 = require("./topological-sort");
|
|
16
10
|
const version_actions_1 = require("./version-actions");
|
|
17
11
|
exports.BUMP_TYPE_REASON_TEXT = {
|
|
18
12
|
DEPENDENCY_WAS_BUMPED: ', because a dependency was bumped, ',
|
|
@@ -25,19 +19,12 @@ exports.BUMP_TYPE_REASON_TEXT = {
|
|
|
25
19
|
NOOP_VERSION_ACTIONS: ', because this project uses docker and has been configured to skip VersionActions, ',
|
|
26
20
|
};
|
|
27
21
|
class ReleaseGroupProcessor {
|
|
28
|
-
constructor(tree, projectGraph, nxReleaseConfig,
|
|
22
|
+
constructor(tree, projectGraph, nxReleaseConfig, releaseGraph, options) {
|
|
29
23
|
this.tree = tree;
|
|
30
24
|
this.projectGraph = projectGraph;
|
|
31
25
|
this.nxReleaseConfig = nxReleaseConfig;
|
|
32
|
-
this.
|
|
33
|
-
this.releaseGroupToFilteredProjects = releaseGroupToFilteredProjects;
|
|
26
|
+
this.releaseGraph = releaseGraph;
|
|
34
27
|
this.options = options;
|
|
35
|
-
/**
|
|
36
|
-
* Stores the relationships between release groups, including their dependencies
|
|
37
|
-
* and dependents. This is used for determining processing order and propagating
|
|
38
|
-
* version changes between related groups.
|
|
39
|
-
*/
|
|
40
|
-
this.groupGraph = new Map();
|
|
41
28
|
/**
|
|
42
29
|
* Tracks which release groups have already been processed to avoid
|
|
43
30
|
* processing them multiple times. Used during the group traversal.
|
|
@@ -49,103 +36,15 @@ class ReleaseGroupProcessor {
|
|
|
49
36
|
* projects need their dependencies updated.
|
|
50
37
|
*/
|
|
51
38
|
this.bumpedProjects = new Set();
|
|
52
|
-
/**
|
|
53
|
-
* Cache of release groups sorted in topological order to ensure dependencies
|
|
54
|
-
* are processed before dependents. Computed once and reused throughout processing.
|
|
55
|
-
*/
|
|
56
|
-
this.sortedReleaseGroups = [];
|
|
57
|
-
/**
|
|
58
|
-
* Maps each release group to its projects sorted in topological order.
|
|
59
|
-
* Ensures projects are processed after their dependencies within each group.
|
|
60
|
-
*/
|
|
61
|
-
this.sortedProjects = new Map();
|
|
62
|
-
/**
|
|
63
|
-
* Track the unique afterAllProjectsVersioned functions involved in the current versioning process,
|
|
64
|
-
* so that we can ensure they are only invoked once per versioning execution.
|
|
65
|
-
*/
|
|
66
|
-
this.uniqueAfterAllProjectsVersioned = new Map();
|
|
67
|
-
/**
|
|
68
|
-
* Track the versionActions for each project so that we can invoke certain instance methods.
|
|
69
|
-
*/
|
|
70
|
-
this.projectsToVersionActions = new Map();
|
|
71
39
|
/**
|
|
72
40
|
* versionData that will ultimately be returned to the nx release version handler by getVersionData()
|
|
73
41
|
*/
|
|
74
42
|
this.versionData = new Map();
|
|
75
|
-
/**
|
|
76
|
-
* Set of all projects that are configured in the nx release config.
|
|
77
|
-
* Used to validate dependencies and identify projects that should be updated.
|
|
78
|
-
*/
|
|
79
|
-
this.allProjectsConfiguredForNxRelease = new Set();
|
|
80
|
-
/**
|
|
81
|
-
* Set of projects that will be processed in the current run.
|
|
82
|
-
* This is potentially a subset of allProjectsConfiguredForNxRelease based on filters
|
|
83
|
-
* and dependency relationships.
|
|
84
|
-
*/
|
|
85
|
-
this.allProjectsToProcess = new Set();
|
|
86
|
-
/**
|
|
87
|
-
* Caches the current version of each project to avoid repeated disk/registry/git tag lookups.
|
|
88
|
-
* Often used during new version calculation. Will be null if the current version resolver is set to 'none'.
|
|
89
|
-
*/
|
|
90
|
-
this.cachedCurrentVersions = new Map();
|
|
91
|
-
/**
|
|
92
|
-
* Caches git tag information for projects that resolve their version from git tags.
|
|
93
|
-
* This avoids performing expensive git operations multiple times for the same project.
|
|
94
|
-
*/
|
|
95
|
-
this.cachedLatestMatchingGitTag = new Map();
|
|
96
|
-
/**
|
|
97
|
-
* Temporary storage for dependent project names while building the dependency graph.
|
|
98
|
-
* This is used as an intermediate step before creating the full dependent projects data.
|
|
99
|
-
*/
|
|
100
|
-
this.tmpCachedDependentProjects = new Map();
|
|
101
|
-
/**
|
|
102
|
-
* Resolve the data regarding dependent projects for each project upfront so that it remains accurate
|
|
103
|
-
* even after updates are applied to manifests.
|
|
104
|
-
*/
|
|
105
|
-
this.originalDependentProjectsPerProject = new Map();
|
|
106
|
-
/**
|
|
107
|
-
* In the case of fixed release groups that are configured to resolve the current version from a registry
|
|
108
|
-
* or a git tag, it would be a waste of time and resources to resolve the current version for each individual
|
|
109
|
-
* project, therefore we maintain a cache of the current version for each applicable fixed release group here.
|
|
110
|
-
*/
|
|
111
|
-
this.currentVersionsPerFixedReleaseGroup = new Map();
|
|
112
|
-
/**
|
|
113
|
-
* Cache of project loggers for each project.
|
|
114
|
-
*/
|
|
115
|
-
this.projectLoggers = new Map();
|
|
116
43
|
/**
|
|
117
44
|
* Track any version plan files that have been processed so that we can delete them after versioning is complete,
|
|
118
45
|
* while leaving any unprocessed files in place.
|
|
119
46
|
*/
|
|
120
47
|
this.processedVersionPlanFiles = new Set();
|
|
121
|
-
/**
|
|
122
|
-
* Certain configuration options can be overridden at the project level, and otherwise fall back to the release group level.
|
|
123
|
-
* Many also have a specific default value if nothing is set at either level. To avoid applying this hierarchy for each project
|
|
124
|
-
* every time such a configuration option is needed, we cache the result per project here.
|
|
125
|
-
*/
|
|
126
|
-
this.finalConfigsByProject = new Map();
|
|
127
|
-
/**
|
|
128
|
-
* Maps each project to its release group for quick O(1) lookups.
|
|
129
|
-
* This avoids having to scan through all release groups to find a project.
|
|
130
|
-
*/
|
|
131
|
-
this.projectToReleaseGroup = new Map();
|
|
132
|
-
/**
|
|
133
|
-
* Maps each project to its dependents (projects that depend on it).
|
|
134
|
-
* This is the inverse of the projectToDependencies map and enables
|
|
135
|
-
* efficient lookup of dependent projects for propagating version changes.
|
|
136
|
-
*/
|
|
137
|
-
this.projectToDependents = new Map();
|
|
138
|
-
/**
|
|
139
|
-
* Maps each project to its dependencies (projects it depends on).
|
|
140
|
-
* Used for building dependency graphs and determining processing order.
|
|
141
|
-
*/
|
|
142
|
-
this.projectToDependencies = new Map();
|
|
143
|
-
/**
|
|
144
|
-
* Caches the updateDependents setting for each project to avoid repeated
|
|
145
|
-
* lookups and calculations. This determines if dependent projects should
|
|
146
|
-
* be automatically updated when a dependency changes.
|
|
147
|
-
*/
|
|
148
|
-
this.projectToUpdateDependentsSetting = new Map();
|
|
149
48
|
/**
|
|
150
49
|
* To match legacy versioning behavior in the case of semver versions with leading "v" characters,
|
|
151
50
|
* e.g. "v1.0.0", we strip the leading "v" and use the rest of the string as the user given specifier
|
|
@@ -163,249 +62,22 @@ class ReleaseGroupProcessor {
|
|
|
163
62
|
else {
|
|
164
63
|
this.userGivenSpecifier = options.userGivenSpecifier;
|
|
165
64
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.setupProjectReleaseGroupMapping();
|
|
174
|
-
// Setup projects to process and resolve version actions
|
|
175
|
-
await this.setupProjectsToProcess();
|
|
176
|
-
// Precompute dependency relationships
|
|
177
|
-
await this.precomputeDependencyRelationships();
|
|
178
|
-
// Process dependency graph to find dependents to process
|
|
179
|
-
this.findDependentsToProcess();
|
|
180
|
-
// Build the group graph structure
|
|
181
|
-
for (const group of this.releaseGroups) {
|
|
182
|
-
this.groupGraph.set(group.name, {
|
|
183
|
-
group,
|
|
184
|
-
dependencies: new Set(),
|
|
185
|
-
dependents: new Set(),
|
|
65
|
+
// Ensure that there is an entry in versionData for each project being processed
|
|
66
|
+
for (const projectName of this.releaseGraph.allProjectsToProcess) {
|
|
67
|
+
this.versionData.set(projectName, {
|
|
68
|
+
currentVersion: this.getCurrentCachedVersionForProject(projectName),
|
|
69
|
+
newVersion: null,
|
|
70
|
+
dockerVersion: null,
|
|
71
|
+
dependentProjects: this.getOriginalDependentProjects(projectName),
|
|
186
72
|
});
|
|
187
73
|
}
|
|
188
|
-
// Process each project within each release group
|
|
189
|
-
for (const [, releaseGroupNode] of this.groupGraph) {
|
|
190
|
-
for (const projectName of releaseGroupNode.group.projects) {
|
|
191
|
-
const projectGraphNode = this.projectGraph.nodes[projectName];
|
|
192
|
-
// Check if the project has been filtered out of explicit versioning before continuing any further
|
|
193
|
-
if (!this.allProjectsToProcess.has(projectName)) {
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
const versionActions = this.getVersionActionsForProject(projectName);
|
|
197
|
-
const finalConfigForProject = this.getFinalConfigForProject(projectName);
|
|
198
|
-
let latestMatchingGitTag;
|
|
199
|
-
const releaseTagPattern = releaseGroupNode.group.releaseTagPattern;
|
|
200
|
-
// Cache the last matching git tag for relevant projects
|
|
201
|
-
if (finalConfigForProject.currentVersionResolver === 'git-tag') {
|
|
202
|
-
latestMatchingGitTag = await (0, git_1.getLatestGitTagForPattern)(releaseTagPattern, {
|
|
203
|
-
projectName: projectGraphNode.name,
|
|
204
|
-
}, {
|
|
205
|
-
checkAllBranchesWhen: releaseGroupNode.group.releaseTagPatternCheckAllBranchesWhen,
|
|
206
|
-
preid: this.options.preid,
|
|
207
|
-
releaseTagPatternRequireSemver: releaseGroupNode.group.releaseTagPatternRequireSemver,
|
|
208
|
-
releaseTagPatternStrictPreid: releaseGroupNode.group.releaseTagPatternStrictPreid,
|
|
209
|
-
});
|
|
210
|
-
this.cachedLatestMatchingGitTag.set(projectName, latestMatchingGitTag);
|
|
211
|
-
}
|
|
212
|
-
// Cache the current version for the project
|
|
213
|
-
const currentVersion = await (0, resolve_current_version_1.resolveCurrentVersion)(this.tree, projectGraphNode, releaseGroupNode.group, versionActions, this.projectLoggers.get(projectName), this.currentVersionsPerFixedReleaseGroup, finalConfigForProject, releaseTagPattern, latestMatchingGitTag);
|
|
214
|
-
this.cachedCurrentVersions.set(projectName, currentVersion);
|
|
215
|
-
}
|
|
216
|
-
// Ensure that there is an entry in versionData for each project being processed, even if they don't end up being bumped
|
|
217
|
-
for (const projectName of this.allProjectsToProcess) {
|
|
218
|
-
this.versionData.set(projectName, {
|
|
219
|
-
currentVersion: this.getCurrentCachedVersionForProject(projectName),
|
|
220
|
-
newVersion: null,
|
|
221
|
-
dockerVersion: null,
|
|
222
|
-
dependentProjects: this.getOriginalDependentProjects(projectName),
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
// Build the dependency relationships between groups
|
|
227
|
-
this.buildGroupDependencyGraph();
|
|
228
|
-
// Topologically sort the release groups and projects for efficient processing
|
|
229
|
-
this.sortedReleaseGroups = this.topologicallySortReleaseGroups();
|
|
230
|
-
// Sort projects within each release group
|
|
231
|
-
for (const group of this.releaseGroups) {
|
|
232
|
-
this.sortedProjects.set(group.name, this.topologicallySortProjects(group));
|
|
233
|
-
}
|
|
234
|
-
// Populate the dependent projects data
|
|
235
|
-
await this.populateDependentProjectsData();
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Setup mapping from project to release group and cache updateDependents settings
|
|
239
|
-
*/
|
|
240
|
-
setupProjectReleaseGroupMapping() {
|
|
241
|
-
for (const group of this.releaseGroups) {
|
|
242
|
-
for (const project of group.projects) {
|
|
243
|
-
this.projectToReleaseGroup.set(project, group);
|
|
244
|
-
// Cache updateDependents setting relevant for each project
|
|
245
|
-
const updateDependents = group.version
|
|
246
|
-
?.updateDependents || 'auto';
|
|
247
|
-
this.projectToUpdateDependentsSetting.set(project, updateDependents);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Determine which projects should be processed and resolve their version actions
|
|
253
|
-
*/
|
|
254
|
-
async setupProjectsToProcess() {
|
|
255
|
-
// Track the projects being directly versioned
|
|
256
|
-
let projectsToProcess = new Set();
|
|
257
|
-
const resolveVersionActionsForProjectCallbacks = [];
|
|
258
|
-
// Precompute all projects in nx release config
|
|
259
|
-
for (const [groupName, group] of Object.entries(this.nxReleaseConfig.groups)) {
|
|
260
|
-
for (const project of group.projects) {
|
|
261
|
-
this.allProjectsConfiguredForNxRelease.add(project);
|
|
262
|
-
// Create a project logger for the project
|
|
263
|
-
this.projectLoggers.set(project, new project_logger_1.ProjectLogger(project));
|
|
264
|
-
// If group filtering is applied and the current group is captured by the filter, add the project to the projectsToProcess
|
|
265
|
-
if (this.options.filters.groups?.includes(groupName)) {
|
|
266
|
-
projectsToProcess.add(project);
|
|
267
|
-
// Otherwise, if project filtering is applied and the current project is captured by the filter, add the project to the projectsToProcess
|
|
268
|
-
}
|
|
269
|
-
else if (this.options.filters.projects?.includes(project)) {
|
|
270
|
-
projectsToProcess.add(project);
|
|
271
|
-
}
|
|
272
|
-
const projectGraphNode = this.projectGraph.nodes[project];
|
|
273
|
-
/**
|
|
274
|
-
* Try and resolve a cached ReleaseGroupWithName for the project. It may not be present
|
|
275
|
-
* if the user filtered by group and excluded this parent group from direct versioning,
|
|
276
|
-
* so fallback to the release group config and apply the name manually.
|
|
277
|
-
*/
|
|
278
|
-
let releaseGroup = this.projectToReleaseGroup.get(project);
|
|
279
|
-
if (!releaseGroup) {
|
|
280
|
-
releaseGroup = {
|
|
281
|
-
...group,
|
|
282
|
-
name: groupName,
|
|
283
|
-
resolvedVersionPlans: false,
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
// Resolve the final configuration for the project
|
|
287
|
-
const finalConfigForProject = this.resolveFinalConfigForProject(releaseGroup, projectGraphNode);
|
|
288
|
-
this.finalConfigsByProject.set(project, finalConfigForProject);
|
|
289
|
-
/**
|
|
290
|
-
* For our versionActions validation to accurate, we need to wait until the full allProjectsToProcess
|
|
291
|
-
* set is populated so that all dependencies, including those across release groups, are included.
|
|
292
|
-
*
|
|
293
|
-
* In order to save us fully traversing the graph again to arrive at this project level, schedule a callback
|
|
294
|
-
* to resolve the versionActions for the project only once we have all the projects to process.
|
|
295
|
-
*/
|
|
296
|
-
resolveVersionActionsForProjectCallbacks.push(async () => {
|
|
297
|
-
const { versionActionsPath, versionActions, afterAllProjectsVersioned, } = await (0, version_actions_1.resolveVersionActionsForProject)(this.tree, releaseGroup, projectGraphNode, finalConfigForProject,
|
|
298
|
-
// Will be fully populated by the time this callback is executed
|
|
299
|
-
this.allProjectsToProcess.has(project));
|
|
300
|
-
if (!this.uniqueAfterAllProjectsVersioned.has(versionActionsPath)) {
|
|
301
|
-
this.uniqueAfterAllProjectsVersioned.set(versionActionsPath, afterAllProjectsVersioned);
|
|
302
|
-
}
|
|
303
|
-
let versionActionsToUse = versionActions;
|
|
304
|
-
// Check if this project should skip version actions based on docker configuration
|
|
305
|
-
const shouldSkip = (0, shared_1.shouldSkipVersionActions)(finalConfigForProject.dockerOptions, project);
|
|
306
|
-
if (shouldSkip) {
|
|
307
|
-
versionActionsToUse = new version_actions_1.NOOP_VERSION_ACTIONS(releaseGroup, projectGraphNode, finalConfigForProject);
|
|
308
|
-
}
|
|
309
|
-
this.projectsToVersionActions.set(project, versionActionsToUse);
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// If no filters are applied, process all projects
|
|
314
|
-
if (!this.options.filters.groups?.length &&
|
|
315
|
-
!this.options.filters.projects?.length) {
|
|
316
|
-
projectsToProcess = this.allProjectsConfiguredForNxRelease;
|
|
317
|
-
}
|
|
318
|
-
// If no projects are set to be processed, throw an error. This should be impossible because the filter validation in version.ts should have already caught this
|
|
319
|
-
if (projectsToProcess.size === 0) {
|
|
320
|
-
throw new Error('No projects are set to be processed, please report this as a bug on https://github.com/nrwl/nx/issues');
|
|
321
|
-
}
|
|
322
|
-
this.allProjectsToProcess = new Set(projectsToProcess);
|
|
323
|
-
// Execute all the callbacks to resolve the version actions for the projects
|
|
324
|
-
for (const cb of resolveVersionActionsForProjectCallbacks) {
|
|
325
|
-
await cb();
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Find all dependents that should be processed due to dependency updates
|
|
330
|
-
*/
|
|
331
|
-
findDependentsToProcess() {
|
|
332
|
-
const projectsToProcess = Array.from(this.allProjectsToProcess);
|
|
333
|
-
const allTrackedDependents = new Set();
|
|
334
|
-
const dependentsToProcess = new Set();
|
|
335
|
-
// BFS traversal of dependency graph to find all transitive dependents
|
|
336
|
-
let currentLevel = [...projectsToProcess];
|
|
337
|
-
while (currentLevel.length > 0) {
|
|
338
|
-
const nextLevel = [];
|
|
339
|
-
// Get all dependents for the current level at once
|
|
340
|
-
const dependents = this.getAllNonImplicitDependents(currentLevel);
|
|
341
|
-
// Process each dependent
|
|
342
|
-
for (const dep of dependents) {
|
|
343
|
-
// Skip if we've already seen this dependent or it's already in projectsToProcess
|
|
344
|
-
if (allTrackedDependents.has(dep) ||
|
|
345
|
-
this.allProjectsToProcess.has(dep)) {
|
|
346
|
-
continue;
|
|
347
|
-
}
|
|
348
|
-
// Track that we've seen this dependent
|
|
349
|
-
allTrackedDependents.add(dep);
|
|
350
|
-
// If both the dependent and its dependency have updateDependents='auto',
|
|
351
|
-
// add the dependent to the projects to process
|
|
352
|
-
if (this.hasAutoUpdateDependents(dep)) {
|
|
353
|
-
// Check if any of its dependencies in the current level have auto update
|
|
354
|
-
const hasDependencyWithAutoUpdate = currentLevel.some((proj) => this.hasAutoUpdateDependents(proj) &&
|
|
355
|
-
this.getProjectDependents(proj).has(dep));
|
|
356
|
-
if (hasDependencyWithAutoUpdate) {
|
|
357
|
-
dependentsToProcess.add(dep);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// Add to next level for traversal
|
|
361
|
-
nextLevel.push(dep);
|
|
362
|
-
}
|
|
363
|
-
// Move to next level
|
|
364
|
-
currentLevel = nextLevel;
|
|
365
|
-
}
|
|
366
|
-
// Add all dependents that should be processed to allProjectsToProcess
|
|
367
|
-
dependentsToProcess.forEach((dep) => this.allProjectsToProcess.add(dep));
|
|
368
|
-
}
|
|
369
|
-
buildGroupDependencyGraph() {
|
|
370
|
-
for (const [releaseGroupName, releaseGroupNode] of this.groupGraph) {
|
|
371
|
-
for (const projectName of releaseGroupNode.group.projects) {
|
|
372
|
-
const projectDeps = this.getProjectDependencies(projectName);
|
|
373
|
-
for (const dep of projectDeps) {
|
|
374
|
-
const dependencyGroup = this.getReleaseGroupNameForProject(dep);
|
|
375
|
-
if (dependencyGroup && dependencyGroup !== releaseGroupName) {
|
|
376
|
-
releaseGroupNode.dependencies.add(dependencyGroup);
|
|
377
|
-
this.groupGraph
|
|
378
|
-
.get(dependencyGroup)
|
|
379
|
-
.dependents.add(releaseGroupName);
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
async populateDependentProjectsData() {
|
|
386
|
-
for (const [projectName, dependentProjectNames] of this
|
|
387
|
-
.tmpCachedDependentProjects) {
|
|
388
|
-
const dependentProjectsData = [];
|
|
389
|
-
for (const dependentProjectName of dependentProjectNames) {
|
|
390
|
-
const versionActions = this.getVersionActionsForProject(dependentProjectName);
|
|
391
|
-
const { currentVersion, dependencyCollection } = await versionActions.readCurrentVersionOfDependency(this.tree, this.projectGraph, projectName);
|
|
392
|
-
dependentProjectsData.push({
|
|
393
|
-
source: dependentProjectName,
|
|
394
|
-
target: projectName,
|
|
395
|
-
type: 'static',
|
|
396
|
-
dependencyCollection,
|
|
397
|
-
rawVersionSpec: currentVersion,
|
|
398
|
-
});
|
|
399
|
-
}
|
|
400
|
-
this.originalDependentProjectsPerProject.set(projectName, dependentProjectsData);
|
|
401
|
-
}
|
|
402
74
|
}
|
|
403
75
|
getReleaseGroupNameForProject(projectName) {
|
|
404
|
-
const group = this.projectToReleaseGroup.get(projectName);
|
|
76
|
+
const group = this.releaseGraph.projectToReleaseGroup.get(projectName);
|
|
405
77
|
return group ? group.name : null;
|
|
406
78
|
}
|
|
407
79
|
getNextGroup() {
|
|
408
|
-
for (const [groupName, groupNode] of this.groupGraph) {
|
|
80
|
+
for (const [groupName, groupNode] of this.releaseGraph.groupGraph) {
|
|
409
81
|
if (!this.processedGroups.has(groupName) &&
|
|
410
82
|
Array.from(groupNode.dependencies).every((dep) => this.processedGroups.has(dep))) {
|
|
411
83
|
return groupName;
|
|
@@ -415,19 +87,28 @@ class ReleaseGroupProcessor {
|
|
|
415
87
|
}
|
|
416
88
|
async processGroups() {
|
|
417
89
|
const processOrder = [];
|
|
418
|
-
// Use the topologically sorted groups
|
|
419
|
-
for (const nextGroup of this.sortedReleaseGroups) {
|
|
90
|
+
// Use the topologically sorted groups
|
|
91
|
+
for (const nextGroup of this.releaseGraph.sortedReleaseGroups) {
|
|
420
92
|
// Skip groups that have already been processed (could happen with circular dependencies)
|
|
421
93
|
if (this.processedGroups.has(nextGroup)) {
|
|
422
94
|
continue;
|
|
423
95
|
}
|
|
424
|
-
|
|
96
|
+
// The next group might not present in the groupGraph if it has been filtered out
|
|
97
|
+
if (!this.releaseGraph.groupGraph.has(nextGroup)) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const allDependenciesProcessed = Array.from(this.releaseGraph.groupGraph.get(nextGroup).dependencies).every((dep) => this.processedGroups.has(dep));
|
|
425
101
|
if (!allDependenciesProcessed) {
|
|
426
102
|
// If we encounter a group whose dependencies aren't all processed,
|
|
427
103
|
// it means there's a circular dependency that our topological sort broke.
|
|
428
104
|
// We need to process any unprocessed dependencies first.
|
|
429
|
-
for (const dep of this.groupGraph.get(nextGroup)
|
|
105
|
+
for (const dep of this.releaseGraph.groupGraph.get(nextGroup)
|
|
106
|
+
.dependencies) {
|
|
430
107
|
if (!this.processedGroups.has(dep)) {
|
|
108
|
+
// The next group might not present in the groupGraph if it has been filtered out
|
|
109
|
+
if (!this.releaseGraph.groupGraph.has(dep)) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
431
112
|
await this.processGroup(dep);
|
|
432
113
|
this.processedGroups.add(dep);
|
|
433
114
|
processOrder.push(dep);
|
|
@@ -441,7 +122,7 @@ class ReleaseGroupProcessor {
|
|
|
441
122
|
return processOrder;
|
|
442
123
|
}
|
|
443
124
|
flushAllProjectLoggers() {
|
|
444
|
-
for (const projectLogger of this.projectLoggers.values()) {
|
|
125
|
+
for (const projectLogger of this.releaseGraph.projectLoggers.values()) {
|
|
445
126
|
projectLogger.flush();
|
|
446
127
|
}
|
|
447
128
|
}
|
|
@@ -467,7 +148,7 @@ class ReleaseGroupProcessor {
|
|
|
467
148
|
async afterAllProjectsVersioned(rootVersionActionsOptions) {
|
|
468
149
|
const changedFiles = new Set();
|
|
469
150
|
const deletedFiles = new Set();
|
|
470
|
-
for (const [, afterAllProjectsVersioned] of this
|
|
151
|
+
for (const [, afterAllProjectsVersioned] of this.releaseGraph
|
|
471
152
|
.uniqueAfterAllProjectsVersioned) {
|
|
472
153
|
const { changedFiles: changedFilesForVersionActions, deletedFiles: deletedFilesForVersionActions, } = await afterAllProjectsVersioned(this.tree.root, {
|
|
473
154
|
dryRun: this.options.dryRun,
|
|
@@ -489,7 +170,7 @@ class ReleaseGroupProcessor {
|
|
|
489
170
|
async processDockerProjects(dockerVersionScheme, dockerVersion) {
|
|
490
171
|
const dockerProjects = new Map();
|
|
491
172
|
for (const project of this.versionData.keys()) {
|
|
492
|
-
const finalConfigForProject = this.finalConfigsByProject.get(project);
|
|
173
|
+
const finalConfigForProject = this.releaseGraph.finalConfigsByProject.get(project);
|
|
493
174
|
if (Object.keys(finalConfigForProject.dockerOptions).length === 0) {
|
|
494
175
|
continue;
|
|
495
176
|
}
|
|
@@ -524,8 +205,8 @@ class ReleaseGroupProcessor {
|
|
|
524
205
|
this.flushAllProjectLoggers();
|
|
525
206
|
}
|
|
526
207
|
async processGroup(releaseGroupName) {
|
|
527
|
-
const groupNode = this.groupGraph.get(releaseGroupName);
|
|
528
|
-
|
|
208
|
+
const groupNode = this.releaseGraph.groupGraph.get(releaseGroupName);
|
|
209
|
+
await this.bumpVersions(groupNode.group);
|
|
529
210
|
// Flush the project loggers for the group
|
|
530
211
|
for (const project of groupNode.group.projects) {
|
|
531
212
|
const projectLogger = this.getProjectLoggerForProject(project);
|
|
@@ -551,7 +232,7 @@ class ReleaseGroupProcessor {
|
|
|
551
232
|
// No direct bump for this group, but we may still need to bump if a dependency group has been bumped
|
|
552
233
|
let bumpedByDependency = false;
|
|
553
234
|
// Use sorted projects to check for dependencies in processed groups
|
|
554
|
-
const sortedProjects = this.sortedProjects.get(releaseGroup.name) || [];
|
|
235
|
+
const sortedProjects = this.releaseGraph.sortedProjects.get(releaseGroup.name) || [];
|
|
555
236
|
// Iterate through each project in the release group in topological order
|
|
556
237
|
for (const project of sortedProjects) {
|
|
557
238
|
const dependencies = this.projectGraph.dependencies[project] || [];
|
|
@@ -609,7 +290,8 @@ class ReleaseGroupProcessor {
|
|
|
609
290
|
}
|
|
610
291
|
const { newVersion } = await this.calculateNewVersion(firstProject, newVersionInput, newVersionInputReason, newVersionInputReasonData);
|
|
611
292
|
// Use sorted projects for processing projects in the right order
|
|
612
|
-
const sortedProjects = this.sortedProjects.get(releaseGroup.name) ||
|
|
293
|
+
const sortedProjects = this.releaseGraph.sortedProjects.get(releaseGroup.name) ||
|
|
294
|
+
releaseGroup.projects;
|
|
613
295
|
// First, update versions for all projects in the fixed group in topological order
|
|
614
296
|
for (const project of sortedProjects) {
|
|
615
297
|
const versionActions = this.getVersionActionsForProject(project);
|
|
@@ -645,12 +327,12 @@ class ReleaseGroupProcessor {
|
|
|
645
327
|
return bumped;
|
|
646
328
|
}
|
|
647
329
|
async bumpIndependentVersionGroup(releaseGroup) {
|
|
648
|
-
const releaseGroupFilteredProjects = this.releaseGroupToFilteredProjects.get(releaseGroup);
|
|
330
|
+
const releaseGroupFilteredProjects = this.releaseGraph.releaseGroupToFilteredProjects.get(releaseGroup);
|
|
649
331
|
let bumped = false;
|
|
650
332
|
const projectBumpTypes = new Map();
|
|
651
333
|
const projectsToUpdate = new Set();
|
|
652
|
-
// First pass: Determine bump types
|
|
653
|
-
for (const project of
|
|
334
|
+
// First pass: Determine bump types (only for projects in this release group)
|
|
335
|
+
for (const project of releaseGroupFilteredProjects) {
|
|
654
336
|
const { newVersionInput: bumpType, newVersionInputReason: bumpTypeReason, newVersionInputReasonData: bumpTypeReasonData, } = await this.determineVersionBumpForProject(releaseGroup, project);
|
|
655
337
|
projectBumpTypes.set(project, {
|
|
656
338
|
bumpType,
|
|
@@ -663,7 +345,7 @@ class ReleaseGroupProcessor {
|
|
|
663
345
|
}
|
|
664
346
|
// Second pass: Update versions using topologically sorted projects
|
|
665
347
|
// This ensures dependencies are processed before dependents
|
|
666
|
-
const sortedProjects = this.sortedProjects.get(releaseGroup.name) || [];
|
|
348
|
+
const sortedProjects = this.releaseGraph.sortedProjects.get(releaseGroup.name) || [];
|
|
667
349
|
// Process projects in topological order
|
|
668
350
|
for (const project of sortedProjects) {
|
|
669
351
|
if (projectsToUpdate.has(project) &&
|
|
@@ -699,7 +381,7 @@ class ReleaseGroupProcessor {
|
|
|
699
381
|
const cachedFinalConfigForProject = this.getCachedFinalConfigForProject(projectName);
|
|
700
382
|
if (cachedFinalConfigForProject.specifierSource === 'conventional-commits') {
|
|
701
383
|
const currentVersion = this.getCurrentCachedVersionForProject(projectName);
|
|
702
|
-
const bumpType = await (0, derive_specifier_from_conventional_commits_1.deriveSpecifierFromConventionalCommits)(this.nxReleaseConfig, this.projectGraph, projectLogger, releaseGroup, projectGraphNode, !!semver.prerelease(currentVersion ?? ''), this.cachedLatestMatchingGitTag.get(projectName), cachedFinalConfigForProject.fallbackCurrentVersionResolver, this.options.preid);
|
|
384
|
+
const bumpType = await (0, derive_specifier_from_conventional_commits_1.deriveSpecifierFromConventionalCommits)(this.nxReleaseConfig, this.projectGraph, projectLogger, releaseGroup, projectGraphNode, !!semver.prerelease(currentVersion ?? ''), this.releaseGraph.cachedLatestMatchingGitTag.get(projectName), cachedFinalConfigForProject.fallbackCurrentVersionResolver, this.options.preid);
|
|
703
385
|
return {
|
|
704
386
|
newVersionInput: bumpType,
|
|
705
387
|
newVersionInputReason: 'CONVENTIONAL_COMMITS',
|
|
@@ -753,151 +435,29 @@ class ReleaseGroupProcessor {
|
|
|
753
435
|
throw new Error(`Unhandled version bump config, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
754
436
|
}
|
|
755
437
|
getVersionActionsForProject(projectName) {
|
|
756
|
-
const versionActions = this.projectsToVersionActions.get(projectName);
|
|
438
|
+
const versionActions = this.releaseGraph.projectsToVersionActions.get(projectName);
|
|
757
439
|
if (!versionActions) {
|
|
758
440
|
throw new Error(`No versionActions found for project ${projectName}, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
759
441
|
}
|
|
760
442
|
return versionActions;
|
|
761
443
|
}
|
|
762
|
-
getFinalConfigForProject(projectName) {
|
|
763
|
-
const finalConfig = this.finalConfigsByProject.get(projectName);
|
|
764
|
-
if (!finalConfig) {
|
|
765
|
-
throw new Error(`No final config found for project ${projectName}, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
766
|
-
}
|
|
767
|
-
return finalConfig;
|
|
768
|
-
}
|
|
769
444
|
getProjectLoggerForProject(projectName) {
|
|
770
|
-
const projectLogger = this.projectLoggers.get(projectName);
|
|
445
|
+
const projectLogger = this.releaseGraph.projectLoggers.get(projectName);
|
|
771
446
|
if (!projectLogger) {
|
|
772
447
|
throw new Error(`No project logger found for project ${projectName}, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
773
448
|
}
|
|
774
449
|
return projectLogger;
|
|
775
450
|
}
|
|
776
451
|
getCurrentCachedVersionForProject(projectName) {
|
|
777
|
-
return this.cachedCurrentVersions.get(projectName);
|
|
452
|
+
return this.releaseGraph.cachedCurrentVersions.get(projectName);
|
|
778
453
|
}
|
|
779
454
|
getCachedFinalConfigForProject(projectName) {
|
|
780
|
-
const cachedFinalConfig = this.finalConfigsByProject.get(projectName);
|
|
455
|
+
const cachedFinalConfig = this.releaseGraph.finalConfigsByProject.get(projectName);
|
|
781
456
|
if (!cachedFinalConfig) {
|
|
782
457
|
throw new Error(`Unexpected error: No cached config found for project ${projectName}, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
783
458
|
}
|
|
784
459
|
return cachedFinalConfig;
|
|
785
460
|
}
|
|
786
|
-
/**
|
|
787
|
-
* Apply project and release group precedence and default values, as well as validate the final configuration,
|
|
788
|
-
* ready to be cached.
|
|
789
|
-
*/
|
|
790
|
-
resolveFinalConfigForProject(releaseGroup, projectGraphNode) {
|
|
791
|
-
const releaseGroupVersionConfig = releaseGroup.version;
|
|
792
|
-
const projectVersionConfig = projectGraphNode.data.release?.version;
|
|
793
|
-
const projectDockerConfig = projectGraphNode.data.release?.docker;
|
|
794
|
-
/**
|
|
795
|
-
* specifierSource
|
|
796
|
-
*
|
|
797
|
-
* If the user has provided a specifier, it always takes precedence,
|
|
798
|
-
* so the effective specifier source is 'prompt', regardless of what
|
|
799
|
-
* the project or release group config says.
|
|
800
|
-
*/
|
|
801
|
-
const specifierSource = this.userGivenSpecifier
|
|
802
|
-
? 'prompt'
|
|
803
|
-
: projectVersionConfig?.specifierSource ??
|
|
804
|
-
releaseGroupVersionConfig?.specifierSource ??
|
|
805
|
-
'prompt';
|
|
806
|
-
/**
|
|
807
|
-
* versionPrefix, defaults to auto
|
|
808
|
-
*/
|
|
809
|
-
const versionPrefix = projectVersionConfig?.versionPrefix ??
|
|
810
|
-
releaseGroupVersionConfig?.versionPrefix ??
|
|
811
|
-
'auto';
|
|
812
|
-
if (versionPrefix && !version_1.validReleaseVersionPrefixes.includes(versionPrefix)) {
|
|
813
|
-
throw new Error(`Invalid value for versionPrefix: "${versionPrefix}"
|
|
814
|
-
|
|
815
|
-
Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
816
|
-
.map((s) => `"${s}"`)
|
|
817
|
-
.join(', ')}`);
|
|
818
|
-
}
|
|
819
|
-
// Merge docker options configured in project with release group config
|
|
820
|
-
// Project level configuration should take preference
|
|
821
|
-
const dockerOptions = {
|
|
822
|
-
...(releaseGroup.docker ?? {}),
|
|
823
|
-
...(projectDockerConfig ?? {}),
|
|
824
|
-
};
|
|
825
|
-
/**
|
|
826
|
-
* currentVersionResolver, defaults to disk
|
|
827
|
-
*/
|
|
828
|
-
let currentVersionResolver = projectVersionConfig?.currentVersionResolver ??
|
|
829
|
-
releaseGroupVersionConfig?.currentVersionResolver ??
|
|
830
|
-
'disk';
|
|
831
|
-
// Check if this project should skip version actions based on docker configuration
|
|
832
|
-
const shouldSkip = (0, shared_1.shouldSkipVersionActions)(dockerOptions, projectGraphNode.name);
|
|
833
|
-
if (shouldSkip) {
|
|
834
|
-
// If the project skips version actions, it doesn't need to resolve a current version
|
|
835
|
-
currentVersionResolver = 'none';
|
|
836
|
-
}
|
|
837
|
-
else if (specifierSource === 'conventional-commits' &&
|
|
838
|
-
currentVersionResolver !== 'git-tag') {
|
|
839
|
-
throw new Error(`Invalid currentVersionResolver "${currentVersionResolver}" provided for project "${projectGraphNode.name}". Must be "git-tag" when "specifierSource" is "conventional-commits"`);
|
|
840
|
-
}
|
|
841
|
-
/**
|
|
842
|
-
* currentVersionResolverMetadata, defaults to {}
|
|
843
|
-
*/
|
|
844
|
-
const currentVersionResolverMetadata = projectVersionConfig?.currentVersionResolverMetadata ??
|
|
845
|
-
releaseGroupVersionConfig?.currentVersionResolverMetadata ??
|
|
846
|
-
{};
|
|
847
|
-
/**
|
|
848
|
-
* preserveLocalDependencyProtocols
|
|
849
|
-
*
|
|
850
|
-
* This was false by default in legacy versioning, but is true by default now.
|
|
851
|
-
*/
|
|
852
|
-
const preserveLocalDependencyProtocols = projectVersionConfig?.preserveLocalDependencyProtocols ??
|
|
853
|
-
releaseGroupVersionConfig?.preserveLocalDependencyProtocols ??
|
|
854
|
-
true;
|
|
855
|
-
const preserveMatchingDependencyRanges = projectVersionConfig?.preserveMatchingDependencyRanges ??
|
|
856
|
-
releaseGroupVersionConfig?.preserveMatchingDependencyRanges ??
|
|
857
|
-
true;
|
|
858
|
-
/**
|
|
859
|
-
* fallbackCurrentVersionResolver, defaults to disk when performing a first release, otherwise undefined
|
|
860
|
-
*/
|
|
861
|
-
const fallbackCurrentVersionResolver = projectVersionConfig?.fallbackCurrentVersionResolver ??
|
|
862
|
-
releaseGroupVersionConfig?.fallbackCurrentVersionResolver ??
|
|
863
|
-
// Always fall back to disk if this is the first release
|
|
864
|
-
(this.options.firstRelease ? 'disk' : undefined);
|
|
865
|
-
/**
|
|
866
|
-
* versionActionsOptions, defaults to {}
|
|
867
|
-
*/
|
|
868
|
-
let versionActionsOptions = projectVersionConfig?.versionActionsOptions ??
|
|
869
|
-
releaseGroupVersionConfig?.versionActionsOptions ??
|
|
870
|
-
{};
|
|
871
|
-
// Apply any optional overrides that may be passed in from the programmatic API
|
|
872
|
-
versionActionsOptions = {
|
|
873
|
-
...versionActionsOptions,
|
|
874
|
-
...(this.options.versionActionsOptionsOverrides ?? {}),
|
|
875
|
-
};
|
|
876
|
-
const manifestRootsToUpdate = (projectVersionConfig?.manifestRootsToUpdate ??
|
|
877
|
-
releaseGroupVersionConfig?.manifestRootsToUpdate ??
|
|
878
|
-
[]).map((manifestRoot) => {
|
|
879
|
-
if (typeof manifestRoot === 'string') {
|
|
880
|
-
return {
|
|
881
|
-
path: manifestRoot,
|
|
882
|
-
// Apply the project level preserveLocalDependencyProtocols setting that was already resolved
|
|
883
|
-
preserveLocalDependencyProtocols,
|
|
884
|
-
};
|
|
885
|
-
}
|
|
886
|
-
return manifestRoot;
|
|
887
|
-
});
|
|
888
|
-
return {
|
|
889
|
-
specifierSource,
|
|
890
|
-
currentVersionResolver,
|
|
891
|
-
currentVersionResolverMetadata,
|
|
892
|
-
fallbackCurrentVersionResolver,
|
|
893
|
-
versionPrefix,
|
|
894
|
-
preserveLocalDependencyProtocols,
|
|
895
|
-
preserveMatchingDependencyRanges,
|
|
896
|
-
versionActionsOptions,
|
|
897
|
-
manifestRootsToUpdate,
|
|
898
|
-
dockerOptions,
|
|
899
|
-
};
|
|
900
|
-
}
|
|
901
461
|
async calculateNewVersion(project, newVersionInput, // any arbitrary string, whether or not it is valid is dependent upon the version actions implementation
|
|
902
462
|
newVersionInputReason, newVersionInputReasonData) {
|
|
903
463
|
const currentVersion = this.getCurrentCachedVersionForProject(project);
|
|
@@ -908,7 +468,7 @@ Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
|
908
468
|
return { currentVersion, newVersion };
|
|
909
469
|
}
|
|
910
470
|
async updateDependenciesForProject(projectName) {
|
|
911
|
-
if (!this.allProjectsToProcess.has(projectName)) {
|
|
471
|
+
if (!this.releaseGraph.allProjectsToProcess.has(projectName)) {
|
|
912
472
|
throw new Error(`Unable to find ${projectName} in allProjectsToProcess, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
913
473
|
}
|
|
914
474
|
const versionActions = this.getVersionActionsForProject(projectName);
|
|
@@ -916,7 +476,7 @@ Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
|
916
476
|
const dependenciesToUpdate = {};
|
|
917
477
|
const dependencies = this.projectGraph.dependencies[projectName] || [];
|
|
918
478
|
for (const dep of dependencies) {
|
|
919
|
-
if (this.allProjectsToProcess.has(dep.target) &&
|
|
479
|
+
if (this.releaseGraph.allProjectsToProcess.has(dep.target) &&
|
|
920
480
|
this.bumpedProjects.has(dep.target)) {
|
|
921
481
|
const targetVersionData = this.versionData.get(dep.target);
|
|
922
482
|
if (targetVersionData) {
|
|
@@ -973,18 +533,18 @@ Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
|
973
533
|
projectLogger.buffer(`⚠️ Cannot find release group for ${projectName}, skipping dependent updates`);
|
|
974
534
|
return;
|
|
975
535
|
}
|
|
976
|
-
const releaseGroup = this.groupGraph.get(releaseGroupName).group;
|
|
536
|
+
const releaseGroup = this.releaseGraph.groupGraph.get(releaseGroupName).group;
|
|
977
537
|
const releaseGroupVersionConfig = releaseGroup.version;
|
|
978
538
|
// Get updateDependents from the release group level config
|
|
979
|
-
const updateDependents = releaseGroupVersionConfig?.updateDependents ||
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
if (updateDependents === 'auto') {
|
|
539
|
+
const updateDependents = releaseGroupVersionConfig?.updateDependents || 'always';
|
|
540
|
+
// Only update dependencies for dependents if the group's updateDependents is 'auto' or 'always'
|
|
541
|
+
if (updateDependents === 'auto' || updateDependents === 'always') {
|
|
983
542
|
const dependents = this.getNonImplicitDependentsForProject(projectName);
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
543
|
+
// Only process dependents that are actually being processed
|
|
544
|
+
const dependentsToProcess = dependents.filter((dep) => this.releaseGraph.allProjectsToProcess.has(dep));
|
|
545
|
+
await this.updateDependenciesForDependents(dependentsToProcess);
|
|
546
|
+
for (const dependent of dependentsToProcess) {
|
|
547
|
+
if (!this.bumpedProjects.has(dependent)) {
|
|
988
548
|
await this.bumpVersionForProject(dependent, 'patch', 'DEPENDENCY_WAS_BUMPED', {});
|
|
989
549
|
}
|
|
990
550
|
}
|
|
@@ -998,18 +558,18 @@ Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
|
998
558
|
}
|
|
999
559
|
async updateDependenciesForDependents(dependents) {
|
|
1000
560
|
for (const dependent of dependents) {
|
|
1001
|
-
if (!this.allProjectsToProcess.has(dependent)) {
|
|
561
|
+
if (!this.releaseGraph.allProjectsToProcess.has(dependent)) {
|
|
1002
562
|
throw new Error(`Unable to find project "${dependent}" in allProjectsToProcess, please report this as a bug on https://github.com/nrwl/nx/issues`);
|
|
1003
563
|
}
|
|
1004
564
|
await this.updateDependenciesForProject(dependent);
|
|
1005
565
|
}
|
|
1006
566
|
}
|
|
1007
567
|
getOriginalDependentProjects(project) {
|
|
1008
|
-
return this.originalDependentProjectsPerProject.get(project) || [];
|
|
568
|
+
return (this.releaseGraph.originalDependentProjectsPerProject.get(project) || []);
|
|
1009
569
|
}
|
|
1010
570
|
async getFixedReleaseGroupBumpType(releaseGroupName) {
|
|
1011
|
-
const releaseGroup = this.groupGraph.get(releaseGroupName).group;
|
|
1012
|
-
const releaseGroupFilteredProjects = this.releaseGroupToFilteredProjects.get(releaseGroup);
|
|
571
|
+
const releaseGroup = this.releaseGraph.groupGraph.get(releaseGroupName).group;
|
|
572
|
+
const releaseGroupFilteredProjects = this.releaseGraph.releaseGroupToFilteredProjects.get(releaseGroup);
|
|
1013
573
|
if (releaseGroupFilteredProjects.size === 0) {
|
|
1014
574
|
return 'none';
|
|
1015
575
|
}
|
|
@@ -1029,82 +589,11 @@ Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
|
1029
589
|
return sideEffectBump;
|
|
1030
590
|
}
|
|
1031
591
|
getProjectDependents(project) {
|
|
1032
|
-
return this.projectToDependents.get(project) || new Set();
|
|
1033
|
-
}
|
|
1034
|
-
getAllNonImplicitDependents(projects) {
|
|
1035
|
-
return projects
|
|
1036
|
-
.flatMap((project) => {
|
|
1037
|
-
const dependentProjectNames = this.getNonImplicitDependentsForProject(project);
|
|
1038
|
-
this.tmpCachedDependentProjects.set(project, dependentProjectNames);
|
|
1039
|
-
return dependentProjectNames;
|
|
1040
|
-
})
|
|
1041
|
-
.filter((dep) => !this.allProjectsToProcess.has(dep));
|
|
592
|
+
return this.releaseGraph.projectToDependents.get(project) || new Set();
|
|
1042
593
|
}
|
|
1043
594
|
getNonImplicitDependentsForProject(project) {
|
|
1044
595
|
// Use the cached dependents for O(1) lookup instead of O(n) scan
|
|
1045
596
|
return Array.from(this.getProjectDependents(project));
|
|
1046
597
|
}
|
|
1047
|
-
hasAutoUpdateDependents(projectName) {
|
|
1048
|
-
return this.projectToUpdateDependentsSetting.get(projectName) === 'auto';
|
|
1049
|
-
}
|
|
1050
|
-
topologicallySortReleaseGroups() {
|
|
1051
|
-
// Get all release group names
|
|
1052
|
-
const groupNames = Array.from(this.groupGraph.keys());
|
|
1053
|
-
// Function to get dependencies of a group
|
|
1054
|
-
const getGroupDependencies = (groupName) => {
|
|
1055
|
-
const groupNode = this.groupGraph.get(groupName);
|
|
1056
|
-
if (!groupNode) {
|
|
1057
|
-
return [];
|
|
1058
|
-
}
|
|
1059
|
-
return Array.from(groupNode.dependencies);
|
|
1060
|
-
};
|
|
1061
|
-
// Perform topological sort
|
|
1062
|
-
return (0, topological_sort_1.topologicalSort)(groupNames, getGroupDependencies);
|
|
1063
|
-
}
|
|
1064
|
-
topologicallySortProjects(releaseGroup) {
|
|
1065
|
-
// For fixed relationship groups, the order doesn't matter since all projects will
|
|
1066
|
-
// be versioned identically, but we still sort them for consistency
|
|
1067
|
-
const projects = releaseGroup.projects.filter((p) =>
|
|
1068
|
-
// Only include projects that are in allProjectsToProcess
|
|
1069
|
-
this.allProjectsToProcess.has(p));
|
|
1070
|
-
// Function to get dependencies of a project that are in the same release group
|
|
1071
|
-
const getProjectDependenciesInSameGroup = (project) => {
|
|
1072
|
-
const deps = this.getProjectDependencies(project);
|
|
1073
|
-
// Only include dependencies that are in the same release group and in allProjectsToProcess
|
|
1074
|
-
return Array.from(deps).filter((dep) => this.getReleaseGroupNameForProject(dep) === releaseGroup.name &&
|
|
1075
|
-
this.allProjectsToProcess.has(dep));
|
|
1076
|
-
};
|
|
1077
|
-
// Perform topological sort
|
|
1078
|
-
return (0, topological_sort_1.topologicalSort)(projects, getProjectDependenciesInSameGroup);
|
|
1079
|
-
}
|
|
1080
|
-
/**
|
|
1081
|
-
* Precompute project -> dependents/dependencies relationships for O(1) lookups
|
|
1082
|
-
*/
|
|
1083
|
-
async precomputeDependencyRelationships() {
|
|
1084
|
-
for (const projectName of this.allProjectsConfiguredForNxRelease) {
|
|
1085
|
-
const versionActions = this.projectsToVersionActions.get(projectName);
|
|
1086
|
-
// Create a new set for this project's dependencies
|
|
1087
|
-
if (!this.projectToDependencies.has(projectName)) {
|
|
1088
|
-
this.projectToDependencies.set(projectName, new Set());
|
|
1089
|
-
}
|
|
1090
|
-
const deps = await versionActions.readDependencies(this.tree, this.projectGraph);
|
|
1091
|
-
for (const dep of deps) {
|
|
1092
|
-
// Skip dependencies not covered by nx release
|
|
1093
|
-
if (!this.allProjectsConfiguredForNxRelease.has(dep.target)) {
|
|
1094
|
-
continue;
|
|
1095
|
-
}
|
|
1096
|
-
// Add this dependency to the project's dependencies
|
|
1097
|
-
this.projectToDependencies.get(projectName).add(dep.target);
|
|
1098
|
-
// Add this project as a dependent of the target
|
|
1099
|
-
if (!this.projectToDependents.has(dep.target)) {
|
|
1100
|
-
this.projectToDependents.set(dep.target, new Set());
|
|
1101
|
-
}
|
|
1102
|
-
this.projectToDependents.get(dep.target).add(projectName);
|
|
1103
|
-
}
|
|
1104
|
-
}
|
|
1105
|
-
}
|
|
1106
|
-
getProjectDependencies(project) {
|
|
1107
|
-
return this.projectToDependencies.get(project) || new Set();
|
|
1108
|
-
}
|
|
1109
598
|
}
|
|
1110
599
|
exports.ReleaseGroupProcessor = ReleaseGroupProcessor;
|