@exadel/eslint-config-esl
Version:
Shared ESLint config used by ESL (@exadel/esl) team. Internal projects usage.
64 lines (53 loc) • 2.45 kB
JavaScript
import {createRequire} from 'module';
import semiver from 'semiver';
import {resolveRecommendedPluginVersion} from './version.js';
const require = createRequire(import.meta.url);
let _compatChecked = false; // ensures single auto check unless forced
const SEMVER_CORE_RE = /\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?/;
const parseMajor = (v) => Number((v || '0').split('.')[0].replace(/\D/g, ''));
function resolveCurrentVersion() {
try {
return require('../../../../package.json').version;
} catch {
return null;
}
}
/**
* Checks runtime compatibility between this installed config and the ESL package's declared recommendation.
*
* Logic:
* 1. Reads own package version (current config).
* 2. Reads devDependency range for @exadel/eslint-config-esl from resolved ESL package.
* 3. Extracts minimal core version token from the range (e.g. ^5.2.0 -> 5.2.0).
* 4. Warns when majors differ OR current version below minimal required inside same major.
* 5. Safe: never throws; silent on malformed or missing data.
*
* Caching: runs once per process unless force=true provided.
*
* @param {boolean} [force=false] Re-run the compatibility check even if it has already executed.
* @returns {void}
*/
export function checkCompatibility(force = false) {
if (!force && _compatChecked) return;
_compatChecked = true;
const currentVersion = resolveCurrentVersion();
if (!currentVersion) return;
const recommendedRange = resolveRecommendedPluginVersion();
if (!recommendedRange) return;
const coreMatch = recommendedRange.match(SEMVER_CORE_RE);
if (!coreMatch) return;
const minRequired = coreMatch[0];
const currentMajor = parseMajor(currentVersion);
const requiredMajor = parseMajor(minRequired);
if (currentMajor !== requiredMajor) {
// eslint-disable-next-line @stylistic/max-len
console.warn(`[@exadel/eslint-config-esl] Version mismatch: ESL recommends major ${requiredMajor} (range: ${recommendedRange}) but installed config is ${currentVersion}. Consider upgrading @exadel/eslint-config-esl.`);
return;
}
try {
if (semiver(currentVersion, minRequired) < 0) {
// eslint-disable-next-line @stylistic/max-len
console.warn(`[@exadel/eslint-config-esl] Outdated version: ESL requires at least ${minRequired} (range: ${recommendedRange}), but found ${currentVersion}. Please update @exadel/eslint-config-esl.`);
}
} catch { /* swallow unexpected parse issues */ }
}