From 41caea74086287d23b605a164636126aa8ce2da8 Mon Sep 17 00:00:00 2001 From: jorenbroekema Date: Tue, 1 Mar 2022 14:07:51 +0100 Subject: [PATCH] chore: lint-versions to do semver satisfy check --- .eslintrc.js | 1 + package.json | 1 + scripts/lint-versions.js | 23 ++++++++++++++--------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index dc4b294f7..a76158027 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -17,6 +17,7 @@ module.exports = { '**/demo/**/*.js', '**/docs/**/*.js', '**/*.config.js', + 'scripts/**/*.js', ], rules: { 'lit/binding-positions': 'off', diff --git a/package.json b/package.json index 0ae10fb2c..10b37b5aa 100644 --- a/package.json +++ b/package.json @@ -92,6 +92,7 @@ "remark-html": "^13.0.1", "rimraf": "^2.6.3", "rollup": "^2.0.0", + "semver": "^7.3.5", "sinon": "^7.2.2", "ssl-root-cas": "^1.3.1", "typescript": "4.5.5", diff --git a/scripts/lint-versions.js b/scripts/lint-versions.js index 344910ede..b994d88d5 100644 --- a/scripts/lint-versions.js +++ b/scripts/lint-versions.js @@ -1,5 +1,5 @@ -/* eslint-disable no-console */ const { readdirSync, existsSync, readFileSync } = require('fs'); +const semver = require('semver'); const getDirectories = source => readdirSync(source, { withFileTypes: true }) @@ -38,14 +38,19 @@ function compareVersions(versionsA, versionsB) { let output = ''; const newVersions = { ...versionsA }; Object.keys(versionsB).forEach(dep => { - if ( - versionsA[dep] && - versionsB[dep] && - `^${versionsA[dep]}` !== versionsB[dep] && // allow carets - `~${versionsA[dep]}` !== versionsB[dep] && // allow tildes - versionsA[dep] !== versionsB[dep] // allow fixed - ) { - output += ` - "${dep}" should be "${versionsA[dep]}" but is "${versionsB[dep]}"\n`; + if (versionsA[dep] && versionsB[dep] && versionsA[dep] !== versionsB[dep]) { + if (!semver.satisfies(versionsA[dep], versionsB[dep])) { + // if version doesn't satisfy range, check if they are both ranges, + // and if so, if either of them is entirely contained by the other, + // if so, then they are semver compatible and will resolve to the same thing + const rangeA = semver.validRange(versionsA[dep]); + const rangeB = semver.validRange(versionsB[dep]); + if ( + !(rangeA && rangeB && (semver.subset(rangeA, rangeB) || semver.subset(rangeB, rangeA))) + ) { + output += ` - "${dep}" "${versionsB[dep]}" does not seem semver compatible with "${versionsA[dep]}" and probably one of them needs a bump"\n`; + } + } } if (!newVersions[dep]) { newVersions[dep] = versionsB[dep];