UNPKG

eslint-plugin-sonarjs

Version:
93 lines (92 loc) 4.42 kB
"use strict"; 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>'; }