@@ -3,15 +3,20 @@ import {
33 calculateVersionsForEachDependency ,
44 calculateMismatchingVersions ,
55 filterOutIgnoredDependencies ,
6+ fixMismatchingVersions ,
7+ compareRanges ,
68} from '../../lib/dependency-versions.js' ;
7- import { deepStrictEqual , throws } from 'node:assert' ;
9+ import { strictEqual , deepStrictEqual , throws } from 'node:assert' ;
810import {
911 FIXTURE_PATH_VALID ,
1012 FIXTURE_PATH_INCONSISTENT_VERSIONS ,
1113 FIXTURE_PATH_NO_PACKAGES ,
1214 FIXTURE_PATH_NO_DEPENDENCIES ,
1315 FIXTURE_PATH_PACKAGE_MISSING_PACKAGE_JSON ,
1416} from '../fixtures/index.js' ;
17+ import mockFs from 'mock-fs' ;
18+ import { readFileSync } from 'node:fs' ;
19+ import type { PackageJson } from 'type-fest' ;
1520
1621describe ( 'Utils | dependency-versions' , function ( ) {
1722 describe ( '#calculateMismatchingVersions' , function ( ) {
@@ -115,4 +120,124 @@ describe('Utils | dependency-versions', function () {
115120 ) ;
116121 } ) ;
117122 } ) ;
123+
124+ describe ( '#fixMismatchingVersions' , function ( ) {
125+ beforeEach ( function ( ) {
126+ // Create a mock workspace filesystem for temporary usage in this test because changes will be written to some files.
127+ mockFs ( {
128+ 'package.json' : '{"workspaces": ["scope1/*"]}' ,
129+ 'scope1/package1' : {
130+ 'package.json' :
131+ '{"dependencies": {"foo": "^1.0.0", "bar": "^3.0.0" }}' ,
132+ } ,
133+ 'scope1/package2' : {
134+ 'package.json' :
135+ '{"dependencies": {"foo": "^2.0.0", "bar": "invalidVersion" }}' ,
136+ } ,
137+ } ) ;
138+ } ) ;
139+
140+ afterEach ( function ( ) {
141+ mockFs . restore ( ) ;
142+ } ) ;
143+
144+ it ( 'fixes the fixable inconsistencies' , function ( ) {
145+ const mismatchingVersions = calculateMismatchingVersions (
146+ calculateVersionsForEachDependency ( '.' )
147+ ) ;
148+ const fixedMismatchingVersions = fixMismatchingVersions (
149+ '.' ,
150+ mismatchingVersions
151+ ) ;
152+
153+ const packageJson1 : PackageJson = JSON . parse (
154+ readFileSync ( 'scope1/package1/package.json' , 'utf-8' )
155+ ) ;
156+ const packageJson2 : PackageJson = JSON . parse (
157+ readFileSync ( 'scope1/package2/package.json' , 'utf-8' )
158+ ) ;
159+
160+ strictEqual (
161+ packageJson1 . dependencies && packageJson1 . dependencies . foo ,
162+ '^2.0.0' ,
163+ 'updates the package1 `foo` version to the highest version'
164+ ) ;
165+ strictEqual (
166+ packageJson1 . dependencies && packageJson1 . dependencies . bar ,
167+ '^3.0.0' ,
168+ 'does not change package1 `bar` version due to abnormal version present'
169+ ) ;
170+ strictEqual (
171+ packageJson2 . dependencies && packageJson2 . dependencies . foo ,
172+ '^2.0.0' ,
173+ 'does not change package1 `foo` version since already at highest version'
174+ ) ;
175+ strictEqual (
176+ packageJson2 . dependencies && packageJson2 . dependencies . bar ,
177+ 'invalidVersion' ,
178+ 'does not change package1 `bar` version due to abnormal version present'
179+ ) ;
180+
181+ deepStrictEqual (
182+ fixedMismatchingVersions ,
183+ [
184+ {
185+ dependency : 'bar' ,
186+ versions : [
187+ {
188+ count : 1 ,
189+ version : '^3.0.0' ,
190+ } ,
191+ {
192+ count : 1 ,
193+ version : 'invalidVersion' ,
194+ } ,
195+ ] ,
196+ } ,
197+ ] ,
198+ 'should return only the dependency that could not be fixed due to the abnormal version present'
199+ ) ;
200+ } ) ;
201+ } ) ;
202+
203+ describe ( '#compareRanges' , function ( ) {
204+ it ( 'correctly chooses the higher range' , function ( ) {
205+ // 1 (greater than)
206+ strictEqual ( compareRanges ( '1.2.3' , '1.2.2' ) , 1 ) ;
207+ strictEqual ( compareRanges ( '5.0.0' , '4.0.0' ) , 1 ) ;
208+ strictEqual ( compareRanges ( '8.0.0-beta.1' , '^7' ) , 1 ) ;
209+ strictEqual ( compareRanges ( '^5.0.0' , '4.0.0' ) , 1 ) ;
210+ strictEqual ( compareRanges ( '^5.0.0' , '^4.0.0' ) , 1 ) ;
211+ strictEqual ( compareRanges ( '^5.0.0' , '~4.0.0' ) , 1 ) ;
212+ strictEqual ( compareRanges ( '^5.0.0' , '~5.0.0' ) , 1 ) ;
213+ strictEqual ( compareRanges ( '~5.0.0' , '5.0.0' ) , 1 ) ;
214+ strictEqual ( compareRanges ( '~5.0.0' , '~4.0.0' ) , 1 ) ;
215+
216+ // -1 (less than)
217+ strictEqual ( compareRanges ( '4.0.0' , '5.0.0' ) , - 1 ) ;
218+ strictEqual ( compareRanges ( '5.0.0' , '~5.0.0' ) , - 1 ) ;
219+ strictEqual ( compareRanges ( '^4.0.0' , '^5.0.0' ) , - 1 ) ;
220+ strictEqual ( compareRanges ( '~4.0.0' , '~5.0.0' ) , - 1 ) ;
221+ strictEqual ( compareRanges ( '~5.0.0' , '^5.0.0' ) , - 1 ) ;
222+
223+ // 0 (equal)
224+ strictEqual ( compareRanges ( '6' , '6' ) , 0 ) ;
225+ strictEqual ( compareRanges ( '6.0' , '6.0' ) , 0 ) ;
226+ strictEqual ( compareRanges ( '6.0.0' , '6.0.0' ) , 0 ) ;
227+ strictEqual ( compareRanges ( '^6.0.0' , '^6.0.0' ) , 0 ) ;
228+ strictEqual ( compareRanges ( 'v6' , '6' ) , 0 ) ;
229+ strictEqual ( compareRanges ( '~6.0.0' , '~6.0.0' ) , 0 ) ;
230+ } ) ;
231+
232+ it ( 'throws with invalid ranges' , function ( ) {
233+ throws (
234+ ( ) => compareRanges ( 'foo' , '~6.0.0' ) ,
235+ new Error ( 'Invalid Version: foo' )
236+ ) ;
237+ throws (
238+ ( ) => compareRanges ( '~6.0.0' , 'foo' ) ,
239+ new Error ( 'Invalid Version: foo' )
240+ ) ;
241+ } ) ;
242+ } ) ;
118243} ) ;
0 commit comments