@@ -15,7 +15,14 @@ import {
1515 callRule ,
1616 chain ,
1717} 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' ;
1926
2027interface LogEntry {
2128 type : 'warn' ;
@@ -484,3 +491,196 @@ describe('addDependency', () => {
484491 ) ;
485492 } ) ;
486493} ) ;
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