import fs from 'fs/promises'; import semver from 'semver'; import { VersionCompatibilityResult } from '../../types/transformer'; import { VersionRule, Warning } from '../../types/runner'; type PackageJson = { dependencies: Record; devDependencies: Record; }; /** * Checks for version mismatch between Flex UI dependencies and Plugin dependencies if it exists * @param packageJSONFilePath Path to package.json file of the plugin * @returns Results containing any warning messages/errors while reading the file */ export const checkDependencyVersionCompatibility = async ( packageJSONFilePath: string, rules: VersionRule[] = [], // eslint-disable-next-line sonarjs/cognitive-complexity ): Promise => { const warnings: Warning[] = []; let error!: string; try { const data = await fs.readFile(packageJSONFilePath, { encoding: 'utf8' }); const packageJSON = JSON.parse(data) as PackageJson; for (const rule of rules) { const { warningMessage, packageName, packageVersion, name, id, recommendation: { message: recommendationMessage = '' } = {}, } = rule; const packageToCheck = packageName.startsWith('!') ? packageName.substring(1) : packageName; const existingVersion = packageJSON.dependencies[packageToCheck] || packageJSON.devDependencies[packageToCheck]; const existingVersionSemver = semver.coerce(existingVersion); const incompatibleVersion = packageVersion && existingVersionSemver && !semver.satisfies(existingVersionSemver, packageVersion); const unsupportedPackage = packageName.startsWith('!') && existingVersion; if (incompatibleVersion || unsupportedPackage) { warnings.push({ id, name, warningMessage: incompatibleVersion ? `${warningMessage}. You are currently using ${existingVersion} of '${packageName}'.` : warningMessage, recommendation: { message: incompatibleVersion ? `Please use ${packageVersion} of '${packageName}' only.` : recommendationMessage, }, }); } } } catch (e: any) { error = e.message as string; } return { warnings, error, }; };