eslint-plugin-sonarjs
Version:
93 lines (92 loc) • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDependencyManifests = exports.getPackageJsonManifestsSanitizePaths = exports.getPackageJsonManifests = void 0;
const files_js_1 = require("../files.js");
const index_js_1 = require("./index.js");
const all_in_parent_dirs_js_1 = require("../find-up/all-in-parent-dirs.js");
const deno_js_1 = require("./resolvers/deno.js");
const parsed_dependency_files_js_1 = require("./parsed-dependency-files.js");
const package_json_js_1 = require("./resolvers/package-json.js");
/**
* Returns the project manifests that are used to resolve the dependencies imported by
* the module named `filename`, up to the passed working directory.
*/
const getPackageJsonManifests = (dir, topDir, fileSystem) => {
const files = all_in_parent_dirs_js_1.patternInParentsCache
.get(index_js_1.PACKAGE_JSON, fileSystem)
.get(topDir ?? (0, files_js_1.getPathRoot)(dir))
.get(dir);
return files.map(file => (0, parsed_dependency_files_js_1.parsePackageJson)(file) ?? {});
};
exports.getPackageJsonManifests = getPackageJsonManifests;
const getPackageJsonManifestsSanitizePaths = (context, fileSystem) => {
return (0, exports.getPackageJsonManifests)((0, files_js_1.dirnamePath)((0, files_js_1.normalizeToAbsolutePath)(context.filename)), (0, files_js_1.normalizeToAbsolutePath)(context.cwd), fileSystem);
};
exports.getPackageJsonManifestsSanitizePaths = getPackageJsonManifestsSanitizePaths;
/**
* Registry of manifest resolvers. Add a new entry here to support a new package manager
* or manifest format (e.g., Bun).
*/
const MANIFEST_RESOLVERS = [deno_js_1.denoManifestResolver, package_json_js_1.packageJsonManifestResolver];
/**
* Returns dependency manifest files from closest-to-file and then up to root.
*
* For each directory, at most one Deno manifest is selected (`deno.json` > `deno.jsonc`)
* and `package.json` is always included when present.
*/
const getDependencyManifests = (dir, topDir, fileSystem) => {
const rootDir = topDir ?? (0, files_js_1.getPathRoot)(dir);
const manifests = [];
let currentDir = dir;
do {
const manifestsInDir = MANIFEST_RESOLVERS.flatMap(manifestResolver => manifestResolver.resolve(currentDir, rootDir, fileSystem));
logDuplicateDependenciesInManifests(manifestsInDir);
manifests.push(...manifestsInDir);
if (currentDir === rootDir || (0, files_js_1.isRoot)(currentDir)) {
break;
}
currentDir = (0, files_js_1.dirnamePath)(currentDir);
} while (true);
return manifests;
};
exports.getDependencyManifests = getDependencyManifests;
/**
* Checks for duplicate dependencies across manifests and logs them.
*/
function logDuplicateDependenciesInManifests(manifests) {
const dependencyDefinitions = new Map();
for (const { dependencies, type: manifestType } of manifests) {
const dependenciesByNameInManifest = new Map();
for (const [name, version] of dependencies) {
if (typeof name !== 'string') {
continue;
}
dependenciesByNameInManifest.set(name, version);
}
for (const [dependencyName, version] of dependenciesByNameInManifest) {
const firstDefinition = dependencyDefinitions.get(dependencyName);
if (firstDefinition) {
logDuplicateDependencyDefinition(dependencyName, firstDefinition, {
manifestType,
version,
});
continue;
}
dependencyDefinitions.set(dependencyName, { manifestType, version });
}
}
}
function logDuplicateDependencyDefinition(dependencyName, firstDefinition, secondDefinition) {
if (firstDefinition.version === secondDefinition.version) {
console.debug(`Dependency "${dependencyName}" is defined in multiple manifests ` +
`(${firstDefinition.manifestType}, ${secondDefinition.manifestType}).`);
}
else {
console.debug(`Dependency "${dependencyName}" is defined in multiple manifests with different versions ` +
`(${firstDefinition.manifestType}: ${formatVersion(firstDefinition.version)}, ` +
`${secondDefinition.manifestType}: ${formatVersion(secondDefinition.version)}).`);
}
}
function formatVersion(version) {
return version ?? '<unspecified>';
}