UNPKG

@o3r/eslint-plugin

Version:

The module provides in-house eslint plugins to use in your own eslint configuration.

98 lines (97 loc) 4.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getBestRanges = exports.getBestRange = exports.findWorkspacePackageJsons = void 0; const fs = require("node:fs"); const node_fs_1 = require("node:fs"); const node_path_1 = require("node:path"); const globby_1 = require("globby"); const semver = require("semver"); /** * Find the closest package.json file containing workspace definition in the parent directories * @param directory Current directory to search for * @param rootDir First directory of the recursion */ const findWorkspacePackageJsons = (directory, rootDir) => { const parentFolder = (0, node_path_1.dirname)(directory); rootDir ||= directory; if (parentFolder === directory) { return undefined; } const packageJsonPath = (0, node_path_1.resolve)(directory, 'package.json'); const content = (0, node_fs_1.existsSync)(packageJsonPath) && JSON.parse((0, node_fs_1.readFileSync)(packageJsonPath, { encoding: 'utf8' })); if (!content || !content.workspaces) { return (0, exports.findWorkspacePackageJsons)(parentFolder, rootDir); } const packagePaths = (0, globby_1.sync)((Array.isArray(content.workspaces) ? content.workspaces : content.workspaces.packages || []).map((f) => node_path_1.posix.join(f, 'package.json')), { cwd: directory, onlyFiles: false, absolute: true, fs }); const isPackageWorkspace = packagePaths.some((workspacePath) => (0, node_path_1.normalize)(workspacePath) === rootDir); const getPackages = () => ([ { content, path: packageJsonPath, isWorkspace: true }, ...packagePaths.map((subPackageJsonPath) => ({ content: JSON.parse((0, node_fs_1.readFileSync)(subPackageJsonPath, { encoding: 'utf8' })), path: subPackageJsonPath })) ]); if (isPackageWorkspace) { return { packages: getPackages() }; } else { // In case we discover a workspace for which the package is not part of const parent = (0, exports.findWorkspacePackageJsons)(parentFolder, rootDir); if (!parent || parent.hasDefaulted) { return { hasDefaulted: true, packages: getPackages() }; } } }; exports.findWorkspacePackageJsons = findWorkspacePackageJsons; /** * Compare and return the best range in the both given onces * @param currentRange Current range in the memory stack * @param range Range to compare the current one to */ const getBestRange = (currentRange, range) => { if (!range || !semver.validRange(range)) { return currentRange && semver.validRange(currentRange) ? currentRange : undefined; } if (!currentRange || !semver.validRange(currentRange)) { return range; } if (currentRange !== range) { const minVersion = semver.minVersion(range); const currentMinVersion = semver.minVersion(currentRange); if (semver.gt(minVersion, currentMinVersion)) { return range; } else if (semver.eq(minVersion, currentMinVersion) && semver.subset(range, currentRange)) { return range; } } return currentRange; }; exports.getBestRange = getBestRange; /** * Retrieve the best ranges for each dependencies in the given package.json files * @param dependencyTypes Type of dependency files to analyze * @param packages List of the package.json files */ const getBestRanges = (dependencyTypes, packages) => { return packages.reduce((acc, pck) => { dependencyTypes.forEach((depType) => { const dependencies = pck.content[depType]; if (dependencies) { Object.entries(dependencies).forEach(([depName, range]) => { if (!acc[depName]) { if (range) { acc[depName] = { range, path: (0, node_path_1.normalize)(pck.path) }; } } else if ((0, exports.getBestRange)(acc[depName].range, range) !== acc[depName].range) { acc[depName] = { range: range, path: (0, node_path_1.normalize)(pck.path) }; } }); } }); return acc; }, {}); }; exports.getBestRanges = getBestRanges;