@@ -15,7 +15,14 @@ import {
15
15
callRule ,
16
16
chain ,
17
17
} from '@angular-devkit/schematics' ;
18
- import { DependencyType , ExistingBehavior , InstallBehavior , addDependency } from './dependency' ;
18
+ import {
19
+ DependencyType ,
20
+ ExistingBehavior ,
21
+ InstallBehavior ,
22
+ addDependency ,
23
+ getDependency ,
24
+ removeDependency ,
25
+ } from './dependency' ;
19
26
20
27
interface LogEntry {
21
28
type : 'warn' ;
@@ -484,3 +491,196 @@ describe('addDependency', () => {
484
491
) ;
485
492
} ) ;
486
493
} ) ;
494
+
495
+ describe ( 'removeDependency' , ( ) => {
496
+ it ( 'removes a package from "dependencies"' , async ( ) => {
497
+ const tree = new EmptyTree ( ) ;
498
+ tree . create (
499
+ '/package.json' ,
500
+ JSON . stringify ( {
501
+ dependencies : { '@angular/core' : '^14.0.0' } ,
502
+ } ) ,
503
+ ) ;
504
+
505
+ const rule = removeDependency ( '@angular/core' ) ;
506
+ await testRule ( rule , tree ) ;
507
+
508
+ expect ( tree . readJson ( '/package.json' ) ) . toEqual ( {
509
+ dependencies : { } ,
510
+ } ) ;
511
+ } ) ;
512
+
513
+ it ( 'removes a package from "devDependencies"' , async ( ) => {
514
+ const tree = new EmptyTree ( ) ;
515
+ tree . create (
516
+ '/package.json' ,
517
+ JSON . stringify ( {
518
+ devDependencies : { typescript : '~4.7.2' } ,
519
+ } ) ,
520
+ ) ;
521
+
522
+ const rule = removeDependency ( 'typescript' ) ;
523
+ await testRule ( rule , tree ) ;
524
+
525
+ expect ( tree . readJson ( '/package.json' ) ) . toEqual ( {
526
+ devDependencies : { } ,
527
+ } ) ;
528
+ } ) ;
529
+
530
+ it ( 'removes a package from "peerDependencies"' , async ( ) => {
531
+ const tree = new EmptyTree ( ) ;
532
+ tree . create (
533
+ '/package.json' ,
534
+ JSON . stringify ( {
535
+ peerDependencies : { rxjs : '^7.0.0' } ,
536
+ } ) ,
537
+ ) ;
538
+
539
+ const rule = removeDependency ( 'rxjs' ) ;
540
+ await testRule ( rule , tree ) ;
541
+
542
+ expect ( tree . readJson ( '/package.json' ) ) . toEqual ( {
543
+ peerDependencies : { } ,
544
+ } ) ;
545
+ } ) ;
546
+
547
+ it ( 'does not change manifest if package is not found' , async ( ) => {
548
+ const tree = new EmptyTree ( ) ;
549
+ const manifest = { dependencies : { '@angular/core' : '^14.0.0' } } ;
550
+ tree . create ( '/package.json' , JSON . stringify ( manifest ) ) ;
551
+
552
+ const rule = removeDependency ( 'typescript' ) ;
553
+ await testRule ( rule , tree ) ;
554
+
555
+ expect ( tree . readJson ( '/package.json' ) ) . toEqual ( manifest ) ;
556
+ } ) ;
557
+
558
+ it ( 'schedules a package install task by default' , async ( ) => {
559
+ const tree = new EmptyTree ( ) ;
560
+ tree . create ( '/package.json' , JSON . stringify ( { dependencies : { '@angular/core' : '1.0.0' } } ) ) ;
561
+
562
+ const rule = removeDependency ( '@angular/core' ) ;
563
+ const { tasks } = await testRule ( rule , tree ) ;
564
+
565
+ expect ( tasks . map ( ( task ) => task . toConfiguration ( ) ) ) . toEqual ( [
566
+ {
567
+ name : 'node-package' ,
568
+ options : jasmine . objectContaining ( { command : 'install' , workingDirectory : '/' } ) ,
569
+ } ,
570
+ ] ) ;
571
+ } ) ;
572
+
573
+ it ( 'does not schedule a package install task if package not found' , async ( ) => {
574
+ const tree = new EmptyTree ( ) ;
575
+ tree . create ( '/package.json' , JSON . stringify ( { dependencies : { } } ) ) ;
576
+
577
+ const rule = removeDependency ( '@angular/core' ) ;
578
+ const { tasks } = await testRule ( rule , tree ) ;
579
+
580
+ expect ( tasks ) . toEqual ( [ ] ) ;
581
+ } ) ;
582
+
583
+ it ( 'does not schedule a package install task when install behavior is none' , async ( ) => {
584
+ const tree = new EmptyTree ( ) ;
585
+ tree . create ( '/package.json' , JSON . stringify ( { dependencies : { '@angular/core' : '1.0.0' } } ) ) ;
586
+
587
+ const rule = removeDependency ( '@angular/core' , { install : InstallBehavior . None } ) ;
588
+ const { tasks } = await testRule ( rule , tree ) ;
589
+
590
+ expect ( tasks ) . toEqual ( [ ] ) ;
591
+ } ) ;
592
+
593
+ it ( 'uses specified manifest when provided via "packageJsonPath" option' , async ( ) => {
594
+ const tree = new EmptyTree ( ) ;
595
+ tree . create ( '/package.json' , JSON . stringify ( { dependencies : { '@angular/core' : '1.0.0' } } ) ) ;
596
+ tree . create (
597
+ '/abc/package.json' ,
598
+ JSON . stringify ( { dependencies : { '@angular/core' : '1.0.0' } } ) ,
599
+ ) ;
600
+
601
+ const rule = removeDependency ( '@angular/core' , { packageJsonPath : '/abc/package.json' } ) ;
602
+ await testRule ( rule , tree ) ;
603
+
604
+ expect ( tree . readJson ( '/package.json' ) ) . toEqual ( { dependencies : { '@angular/core' : '1.0.0' } } ) ;
605
+ expect ( tree . readJson ( '/abc/package.json' ) ) . toEqual ( { dependencies : { } } ) ;
606
+ } ) ;
607
+ } ) ;
608
+
609
+ describe ( 'getDependency' , ( ) => {
610
+ it ( 'returns a dependency found in "dependencies"' , ( ) => {
611
+ const tree = new EmptyTree ( ) ;
612
+ tree . create (
613
+ '/package.json' ,
614
+ JSON . stringify ( {
615
+ dependencies : { '@angular/core' : '^14.0.0' } ,
616
+ } ) ,
617
+ ) ;
618
+
619
+ const dep = getDependency ( tree , '@angular/core' ) ;
620
+ expect ( dep ) . toEqual ( {
621
+ type : DependencyType . Default ,
622
+ name : '@angular/core' ,
623
+ version : '^14.0.0' ,
624
+ } ) ;
625
+ } ) ;
626
+
627
+ it ( 'returns a dependency found in "devDependencies"' , ( ) => {
628
+ const tree = new EmptyTree ( ) ;
629
+ tree . create (
630
+ '/package.json' ,
631
+ JSON . stringify ( {
632
+ devDependencies : { typescript : '~4.7.2' } ,
633
+ } ) ,
634
+ ) ;
635
+
636
+ const dep = getDependency ( tree , 'typescript' ) ;
637
+ expect ( dep ) . toEqual ( {
638
+ type : DependencyType . Dev ,
639
+ name : 'typescript' ,
640
+ version : '~4.7.2' ,
641
+ } ) ;
642
+ } ) ;
643
+
644
+ it ( 'returns a dependency found in "peerDependencies"' , ( ) => {
645
+ const tree = new EmptyTree ( ) ;
646
+ tree . create (
647
+ '/package.json' ,
648
+ JSON . stringify ( {
649
+ peerDependencies : { rxjs : '^7.0.0' } ,
650
+ } ) ,
651
+ ) ;
652
+
653
+ const dep = getDependency ( tree , 'rxjs' ) ;
654
+ expect ( dep ) . toEqual ( {
655
+ type : DependencyType . Peer ,
656
+ name : 'rxjs' ,
657
+ version : '^7.0.0' ,
658
+ } ) ;
659
+ } ) ;
660
+
661
+ it ( 'returns null if a dependency is not found' , ( ) => {
662
+ const tree = new EmptyTree ( ) ;
663
+ tree . create ( '/package.json' , JSON . stringify ( { } ) ) ;
664
+
665
+ const dep = getDependency ( tree , '@angular/core' ) ;
666
+ expect ( dep ) . toBeNull ( ) ;
667
+ } ) ;
668
+
669
+ it ( 'returns a dependency from a specified manifest path' , ( ) => {
670
+ const tree = new EmptyTree ( ) ;
671
+ tree . create ( '/package.json' , JSON . stringify ( { } ) ) ;
672
+ tree . create (
673
+ '/abc/package.json' ,
674
+ JSON . stringify ( {
675
+ dependencies : { '@angular/core' : '^14.0.0' } ,
676
+ } ) ,
677
+ ) ;
678
+
679
+ const dep = getDependency ( tree , '@angular/core' , '/abc/package.json' ) ;
680
+ expect ( dep ) . toEqual ( {
681
+ type : DependencyType . Default ,
682
+ name : '@angular/core' ,
683
+ version : '^14.0.0' ,
684
+ } ) ;
685
+ } ) ;
686
+ } ) ;
0 commit comments