@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
JavaScript
;
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;