@@ -169,5 +169,101 @@ suite('packageChanges', () => {
169169 assert . ok ( changes . some ( ( c : { kind : PackageChangeKind } ) => c . kind === PackageChangeKind . add ) ) ;
170170 assert . ok ( changes . some ( ( c : { kind : PackageChangeKind } ) => c . kind === PackageChangeKind . remove ) ) ;
171171 } ) ;
172+
173+ test ( 'marks transitive packages when getDirectPackageNames is provided' , async ( ) => {
174+ const after = [
175+ { name : 'requests' , version : '2.31.0' } as Package ,
176+ { name : 'urllib3' , version : '2.0.0' } as Package ,
177+ { name : 'charset-normalizer' , version : '3.0.0' } as Package ,
178+ ] ;
179+ getPackagesStub . resolves ( after ) ;
180+ const getDirectPackageNamesStub = sinon . stub ( ) . resolves ( new Set ( [ 'requests' ] ) ) ;
181+ ( packageManager as unknown as Record < string , unknown > ) . getDirectPackageNames = getDirectPackageNamesStub ;
182+ const onChanges = sinon . stub ( ) ;
183+
184+ await updatePackagesAndNotify ( packageManager , environment , undefined , onChanges ) ;
185+
186+ assert . strictEqual ( after [ 0 ] . isTransitive , false , 'requests should be direct' ) ;
187+ assert . strictEqual ( after [ 1 ] . isTransitive , true , 'urllib3 should be transitive' ) ;
188+ assert . strictEqual ( after [ 2 ] . isTransitive , true , 'charset-normalizer should be transitive' ) ;
189+ } ) ;
190+
191+ test ( 'does not mark packages transitive when getDirectPackageNames is not implemented' , async ( ) => {
192+ const after = [
193+ { name : 'requests' , version : '2.31.0' } as Package ,
194+ { name : 'urllib3' , version : '2.0.0' } as Package ,
195+ ] ;
196+ getPackagesStub . resolves ( after ) ;
197+ const onChanges = sinon . stub ( ) ;
198+
199+ await updatePackagesAndNotify ( packageManager , environment , undefined , onChanges ) ;
200+
201+ assert . strictEqual ( after [ 0 ] . isTransitive , undefined , 'should not be set' ) ;
202+ assert . strictEqual ( after [ 1 ] . isTransitive , undefined , 'should not be set' ) ;
203+ } ) ;
204+
205+ test ( 'does not mark packages transitive when getDirectPackageNames returns undefined' , async ( ) => {
206+ const after = [
207+ { name : 'requests' , version : '2.31.0' } as Package ,
208+ { name : 'urllib3' , version : '2.0.0' } as Package ,
209+ ] ;
210+ getPackagesStub . resolves ( after ) ;
211+ const getDirectPackageNamesStub = sinon . stub ( ) . resolves ( undefined ) ;
212+ ( packageManager as unknown as Record < string , unknown > ) . getDirectPackageNames = getDirectPackageNamesStub ;
213+ const onChanges = sinon . stub ( ) ;
214+
215+ await updatePackagesAndNotify ( packageManager , environment , undefined , onChanges ) ;
216+
217+ assert . strictEqual ( after [ 0 ] . isTransitive , undefined , 'should not be set' ) ;
218+ assert . strictEqual ( after [ 1 ] . isTransitive , undefined , 'should not be set' ) ;
219+ } ) ;
220+
221+ test ( 'does not mark packages transitive when getDirectPackageNames returns empty set' , async ( ) => {
222+ const after = [
223+ { name : 'requests' , version : '2.31.0' } as Package ,
224+ { name : 'urllib3' , version : '2.0.0' } as Package ,
225+ ] ;
226+ getPackagesStub . resolves ( after ) ;
227+ const getDirectPackageNamesStub = sinon . stub ( ) . resolves ( new Set < string > ( ) ) ;
228+ ( packageManager as unknown as Record < string , unknown > ) . getDirectPackageNames = getDirectPackageNamesStub ;
229+ const onChanges = sinon . stub ( ) ;
230+
231+ await updatePackagesAndNotify ( packageManager , environment , undefined , onChanges ) ;
232+
233+ assert . strictEqual ( after [ 0 ] . isTransitive , undefined , 'should not be set' ) ;
234+ assert . strictEqual ( after [ 1 ] . isTransitive , undefined , 'should not be set' ) ;
235+ } ) ;
236+
237+ test ( 'all packages marked direct when all are in direct set' , async ( ) => {
238+ const after = [
239+ { name : 'requests' , version : '2.31.0' } as Package ,
240+ { name : 'flask' , version : '3.0.0' } as Package ,
241+ ] ;
242+ getPackagesStub . resolves ( after ) ;
243+ const getDirectPackageNamesStub = sinon . stub ( ) . resolves ( new Set ( [ 'requests' , 'flask' ] ) ) ;
244+ ( packageManager as unknown as Record < string , unknown > ) . getDirectPackageNames = getDirectPackageNamesStub ;
245+ const onChanges = sinon . stub ( ) ;
246+
247+ await updatePackagesAndNotify ( packageManager , environment , undefined , onChanges ) ;
248+
249+ assert . strictEqual ( after [ 0 ] . isTransitive , false , 'requests should be direct' ) ;
250+ assert . strictEqual ( after [ 1 ] . isTransitive , false , 'flask should be direct' ) ;
251+ } ) ;
252+
253+ test ( 'all packages marked transitive when none are in direct set' , async ( ) => {
254+ const after = [
255+ { name : 'urllib3' , version : '2.0.0' } as Package ,
256+ { name : 'charset-normalizer' , version : '3.0.0' } as Package ,
257+ ] ;
258+ getPackagesStub . resolves ( after ) ;
259+ const getDirectPackageNamesStub = sinon . stub ( ) . resolves ( new Set ( [ 'requests' ] ) ) ;
260+ ( packageManager as unknown as Record < string , unknown > ) . getDirectPackageNames = getDirectPackageNamesStub ;
261+ const onChanges = sinon . stub ( ) ;
262+
263+ await updatePackagesAndNotify ( packageManager , environment , undefined , onChanges ) ;
264+
265+ assert . strictEqual ( after [ 0 ] . isTransitive , true , 'urllib3 should be transitive' ) ;
266+ assert . strictEqual ( after [ 1 ] . isTransitive , true , 'charset-normalizer should be transitive' ) ;
267+ } ) ;
172268 } ) ;
173269} ) ;
0 commit comments