@nx/workspace
Version:
107 lines (106 loc) • 3.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.removeProjectReferencesInConfig = removeProjectReferencesInConfig;
const devkit_1 = require("@nx/devkit");
function removeProjectReferencesInConfig(tree, schema) {
const nxJson = (0, devkit_1.readNxJson)(tree);
let nxJsonChanged = false;
// Unset default project if deleting the default project
if (nxJson.defaultProject && nxJson.defaultProject === schema.projectName) {
delete nxJson.defaultProject;
nxJsonChanged = true;
}
// Remove project from conformance rules
if (removeProjectFromConformanceRules(nxJson, schema.projectName)) {
nxJsonChanged = true;
}
// Remove project from owners patterns
if (removeProjectFromOwnersPatterns(nxJson, schema.projectName)) {
nxJsonChanged = true;
}
if (nxJsonChanged) {
(0, devkit_1.updateNxJson)(tree, nxJson);
}
// Remove implicit dependencies onto removed project
(0, devkit_1.getProjects)(tree).forEach((project, projectName) => {
if (project.implicitDependencies &&
project.implicitDependencies.some((projectName) => projectName === schema.projectName)) {
project.implicitDependencies = project.implicitDependencies.filter((projectName) => projectName !== schema.projectName);
(0, devkit_1.updateProjectConfiguration)(tree, projectName, project);
}
});
}
function removeProjectFromConformanceRules(nxJson, projectName) {
const conformance = nxJson['conformance'];
if (!conformance?.rules) {
return false;
}
let changed = false;
// Iterate backwards so that splicing doesn't shift unvisited indices
for (let i = conformance.rules.length - 1; i >= 0; i--) {
const rule = conformance.rules[i];
if (!rule.projects) {
continue;
}
const originalLength = rule.projects.length;
rule.projects = rule.projects.filter((entry) => {
if (typeof entry === 'string') {
return entry !== projectName;
}
if (typeof entry === 'object' && entry.matcher) {
return entry.matcher !== projectName;
}
return true;
});
if (rule.projects.length !== originalLength) {
changed = true;
if (rule.projects.length === 0) {
conformance.rules.splice(i, 1);
}
}
}
return changed;
}
function removeProjectFromOwnersPatterns(nxJson, projectName) {
const owners = nxJson['owners'];
if (typeof owners !== 'object' || !owners) {
return false;
}
let changed = false;
// Filter top-level patterns
if (owners.patterns) {
if (filterOwnersPatternsList(owners.patterns, projectName)) {
changed = true;
}
}
// Filter section-level patterns (GitLab)
if (owners.sections) {
for (const section of owners.sections) {
if (section.patterns) {
if (filterOwnersPatternsList(section.patterns, projectName)) {
changed = true;
}
}
}
}
return changed;
}
function filterOwnersPatternsList(patterns, projectName) {
let changed = false;
// Iterate backwards so that splicing doesn't shift unvisited indices
for (let i = patterns.length - 1; i >= 0; i--) {
const pattern = patterns[i];
if (!pattern.projects) {
continue;
}
const originalLength = pattern.projects.length;
pattern.projects = pattern.projects.filter((entry) => entry !== projectName);
if (pattern.projects.length !== originalLength) {
changed = true;
if (pattern.projects.length === 0) {
patterns.splice(i, 1);
}
}
}
return changed;
}