33const assert = require ( 'node:assert/strict' )
44
55const { describe, it } = require ( 'mocha' )
6- const { coerce, major } = require ( 'semver' )
6+ const { coerce, major, maxSatisfying } = require ( 'semver' )
77
8- const { getVersionList, resolvePluginVersions, brokenVersionReason } = require ( './versions' )
8+ const {
9+ brokenVersionReason,
10+ getVersionList,
11+ resolvePluginVersions,
12+ } = require ( './versions' )
913
1014const latests = require ( './versions/package.json' ) . dependencies
1115
@@ -80,32 +84,43 @@ describe('getVersionList', () => {
8084
8185describe ( 'resolvePluginVersions' , ( ) => {
8286 const versionKeys = result => result . versionList . map ( ( { versionKey } ) => versionKey )
83-
84- it ( 'expands the declared versions and points the unversioned folder at the newest in-scope key' , ( ) => {
85- const result = resolvePluginVersions ( { name : 'mongodb' , declaredVersions : [ '>=2 <5' ] , env : { } } )
87+ const declarations = [
88+ {
89+ versions : [ '>=7' ] ,
90+ node : '>=20.19.0' ,
91+ } ,
92+ {
93+ versions : [ '5' , '6' ] ,
94+ } ,
95+ ]
96+
97+ it ( 'expands the declared versions and uses every active range for the unversioned folder' , ( ) => {
98+ const result = resolvePluginVersions ( {
99+ name : 'mongodb' ,
100+ declarations : [ { versions : [ '>=2 <5' ] } ] ,
101+ env : { } ,
102+ } )
86103
87104 assert . deepEqual ( versionKeys ( result ) , [ '2.0.0' , '2' , '3' , '4' ] )
88- assert . equal ( result . unversioned , '4 ' )
105+ assert . equal ( result . unversioned , '>=2 <5 ' )
89106 } )
90107
91108 it ( 'includes declarations at the Node.js range boundary' , ( ) => {
92109 const result = resolvePluginVersions ( {
93110 name : 'mongodb' ,
94- declaredVersions : [ '>=2 <5' ] ,
95- nodeRange : '>=22' ,
111+ declarations : [ { versions : [ '>=2 <5' ] , node : '>=22' } ] ,
96112 nodeVersion : '22.0.0' ,
97113 env : { } ,
98114 } )
99115
100116 assert . deepEqual ( versionKeys ( result ) , [ '2.0.0' , '2' , '3' , '4' ] )
101- assert . equal ( result . unversioned , '4 ' )
117+ assert . equal ( result . unversioned , '>=2 <5 ' )
102118 } )
103119
104120 it ( 'excludes declarations outside the Node.js range before applying package range overrides' , ( ) => {
105121 const result = resolvePluginVersions ( {
106122 name : 'mongodb' ,
107- declaredVersions : [ '>=2 <5' ] ,
108- nodeRange : '>=22' ,
123+ declarations : [ { versions : [ '>=2 <5' ] , node : '>=22' } ] ,
109124 nodeVersion : '21.999.999' ,
110125 env : { PACKAGE_VERSION_RANGE : '>=3 <4' } ,
111126 } )
@@ -118,8 +133,7 @@ describe('resolvePluginVersions', () => {
118133 assert . throws (
119134 ( ) => resolvePluginVersions ( {
120135 name : 'mongodb' ,
121- declaredVersions : [ '>=2 <5' ] ,
122- nodeRange : 'not-a-version' ,
136+ declarations : [ { versions : [ '>=2 <5' ] , node : 'not-a-version' } ] ,
123137 nodeVersion : '22.0.0' ,
124138 env : { } ,
125139 } ) ,
@@ -130,18 +144,19 @@ describe('resolvePluginVersions', () => {
130144 it ( 'filters the installed keys by RANGE and follows the filtered tail' , ( ) => {
131145 const result = resolvePluginVersions ( {
132146 name : 'mongodb' ,
133- declaredVersions : [ '>=1 <6' ] ,
147+ declarations : [ { versions : [ '>=1 <6' ] } ] ,
134148 env : { RANGE : '>=2.0.0 <4.0.0' } ,
135149 } )
136150
137151 assert . deepEqual ( versionKeys ( result ) , [ '2' , '3' ] )
138- assert . equal ( result . unversioned , '3' )
152+ assert . equal ( result . unversioned , '2 || 3' )
153+ assert . equal ( maxSatisfying ( [ '2.12.0' , '3.9.0' ] , result . unversioned ) , '3.9.0' )
139154 } )
140155
141156 it ( 'replaces the declared versions with PACKAGE_VERSION_RANGE when the module is honoured' , ( ) => {
142157 const result = resolvePluginVersions ( {
143158 name : 'mongodb' ,
144- declaredVersions : [ '>=2 <5' ] ,
159+ declarations : [ { versions : [ '>=2 <5' ] } ] ,
145160 env : { PACKAGE_VERSION_RANGE : '>=3 <4' } ,
146161 } )
147162
@@ -152,19 +167,19 @@ describe('resolvePluginVersions', () => {
152167 it ( 'ignores PACKAGE_VERSION_RANGE for a sibling external that must not be sharded' , ( ) => {
153168 const result = resolvePluginVersions ( {
154169 name : 'mongodb' ,
155- declaredVersions : [ '>=2 <5' ] ,
170+ declarations : [ { versions : [ '>=2 <5' ] } ] ,
156171 honourEnvRange : false ,
157172 env : { PACKAGE_VERSION_RANGE : '>=3 <4' } ,
158173 } )
159174
160175 assert . deepEqual ( versionKeys ( result ) , [ '2.0.0' , '2' , '3' , '4' ] )
161- assert . equal ( result . unversioned , '4 ' )
176+ assert . equal ( result . unversioned , '>=2 <5 ' )
162177 } )
163178
164179 it ( 'keeps the unversioned folder on the raw shard while RANGE narrows the installed keys' , ( ) => {
165180 const result = resolvePluginVersions ( {
166181 name : 'mongodb' ,
167- declaredVersions : [ '>=1 <6' ] ,
182+ declarations : [ { versions : [ '>=1 <6' ] } ] ,
168183 env : { PACKAGE_VERSION_RANGE : '>=2 <5' , RANGE : '>=3.0.0 <4.0.0' } ,
169184 } )
170185
@@ -173,7 +188,7 @@ describe('resolvePluginVersions', () => {
173188 } )
174189
175190 it ( 'reports nothing in scope when no version is declared' , ( ) => {
176- const result = resolvePluginVersions ( { name : 'mongodb' , declaredVersions : [ ] , env : { } } )
191+ const result = resolvePluginVersions ( { name : 'mongodb' , declarations : [ { } ] , env : { } } )
177192
178193 assert . deepEqual ( result . versionList , [ ] )
179194 assert . equal ( result . unversioned , undefined )
@@ -182,13 +197,58 @@ describe('resolvePluginVersions', () => {
182197 it ( 'reports nothing in scope when RANGE excludes every declared key' , ( ) => {
183198 const result = resolvePluginVersions ( {
184199 name : 'mongodb' ,
185- declaredVersions : [ '>=2 <3' ] ,
200+ declarations : [ { versions : [ '>=2 <3' ] } ] ,
186201 env : { RANGE : '>=9.0.0 <10.0.0' } ,
187202 } )
188203
189204 assert . deepEqual ( result . versionList , [ ] )
190205 assert . equal ( result . unversioned , undefined )
191206 } )
207+
208+ it ( 'points the unversioned folder at the latest active declaration regardless of order' , ( ) => {
209+ const result = resolvePluginVersions ( {
210+ name : 'mongodb' ,
211+ declarations,
212+ nodeVersion : '20.19.0' ,
213+ env : { } ,
214+ } )
215+
216+ assert . deepEqual (
217+ versionKeys ( result ) ,
218+ [ '7.0.0' , '7' , '5.0.0' , '5' , '6.0.0' , '6' ]
219+ )
220+ assert . equal ( maxSatisfying ( [ '6.21.0' , '7.2.0' ] , result . unversioned ) , '7.2.0' )
221+ } )
222+
223+ it ( 'excludes declarations unsupported by the current Node.js version' , ( ) => {
224+ const result = resolvePluginVersions ( {
225+ name : 'mongodb' ,
226+ declarations,
227+ nodeVersion : '20.18.0' ,
228+ env : { } ,
229+ } )
230+
231+ assert . deepEqual (
232+ versionKeys ( result ) ,
233+ [ '5.0.0' , '5' , '6.0.0' , '6' ]
234+ )
235+ assert . equal ( result . unversioned , '5 || 6' )
236+ } )
237+
238+ it ( 'applies a package version override once across active declarations' , ( ) => {
239+ const result = resolvePluginVersions ( {
240+ name : 'mongodb' ,
241+ declarations,
242+ nodeVersion : '20.19.0' ,
243+ env : { PACKAGE_VERSION_RANGE : '>=6 <7' } ,
244+ } )
245+
246+ assert . deepEqual (
247+ versionKeys ( result ) ,
248+ [ '6.0.0' , '6' ]
249+ )
250+ assert . equal ( result . unversioned , '>=6 <7' )
251+ } )
192252} )
193253
194254describe ( 'brokenVersionReason' , ( ) => {
0 commit comments