@@ -31,11 +31,13 @@ interface PackageJson {
31
31
} ;
32
32
}
33
33
34
+ export type DependencyType = 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies' ;
35
+
34
36
export interface Dependency {
35
37
name : string ;
36
38
version : string ;
37
39
depender : PackageMeta ;
38
- type : 'dependencies' | 'devDependencies' | 'peerDependencies' | 'optionalDependencies' ;
40
+ type : DependencyType
39
41
isPeerOptionalDependency : boolean ;
40
42
isPeerDevDependency : boolean ;
41
43
installedVersion ?: string | undefined ;
@@ -61,15 +63,15 @@ export function gatherPeerDependencies(packagePath, options: CliOptions): Depend
61
63
const visitor : DependencyWalkVisitor = ( path , json , deps ) => {
62
64
peerDeps = peerDeps . concat ( deps . peerDependencies ) ;
63
65
} ;
64
- walkPackageDependencyTree ( packagePath , visitor , [ ] , options ) ;
66
+ walkPackageDependencyTree ( packagePath , false , visitor , [ ] , options ) ;
65
67
66
68
// Eliminate duplicates
67
69
return peerDeps . reduce ( ( acc : Dependency [ ] , dep : Dependency ) => {
68
70
return acc . some ( dep2 => isSameDep ( dep , dep2 ) ) ? acc : acc . concat ( dep ) ;
69
71
} , [ ] as Dependency [ ] ) ;
70
72
}
71
73
72
- export function walkPackageDependencyTree ( packagePath : string , visitor : DependencyWalkVisitor , visitedPaths : string [ ] , options : CliOptions ) {
74
+ export function walkPackageDependencyTree ( packagePath : string , isAncestorDevDependency : boolean , visitor : DependencyWalkVisitor , visitedPaths : string [ ] , options : CliOptions ) {
73
75
const isRootPackage = visitedPaths . length === 0 ;
74
76
75
77
if ( visitedPaths . includes ( packagePath ) ) {
@@ -84,15 +86,16 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
84
86
}
85
87
86
88
const packageJson = readJson ( packageJsonPath ) as PackageJson ;
87
- const packageDependencies = getPackageMeta ( packagePath , packageJson ) ;
89
+ const packageDependencies = getPackageMeta ( packagePath , packageJson , isAncestorDevDependency ) ;
88
90
89
91
if ( options . debug ) {
90
92
console . log ( packageJsonPath ) ;
91
93
packageDependencies . peerDependencies . forEach ( dep => console . log ( dep ) )
92
94
}
95
+
93
96
visitor ( packagePath , packageJson , packageDependencies ) ;
94
97
95
- function walkDependency ( dependency ) {
98
+ function walkDependency ( dependency : Dependency , isAncestorDevDependency : boolean ) {
96
99
if ( resolve . isCore ( dependency . name ) ) {
97
100
return ;
98
101
}
@@ -111,14 +114,14 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
111
114
}
112
115
}
113
116
114
- walkPackageDependencyTree ( dependencyPath , visitor , visitedPaths , options ) ;
117
+ walkPackageDependencyTree ( dependencyPath , isAncestorDevDependency , visitor , visitedPaths , options ) ;
115
118
}
116
119
117
- if ( isRootPackage ) packageDependencies . devDependencies . forEach ( walkDependency ) ;
118
- if ( isRootPackage || ! options . runOnlyOnRootDependencies ) packageDependencies . dependencies . forEach ( walkDependency )
120
+ if ( isRootPackage ) packageDependencies . devDependencies . forEach ( dep => walkDependency ( dep , true ) ) ;
121
+ if ( isRootPackage || ! options . runOnlyOnRootDependencies ) packageDependencies . dependencies . forEach ( dep => walkDependency ( dep , false ) ) ;
119
122
}
120
123
121
- function buildDependencyArray ( type : Dependency [ "type" ] , pkgJson : PackageJson , depender : PackageMeta ) : Dependency [ ] {
124
+ function buildDependencyArray ( type : Dependency [ "type" ] , pkgJson : PackageJson , depender : PackageMeta , isAncestorDevDependency : boolean ) : Dependency [ ] {
122
125
const dependenciesObject = pkgJson [ type ] || { } ;
123
126
const peerDependenciesMeta = pkgJson . peerDependenciesMeta || { } ;
124
127
// backwards compat
@@ -128,7 +131,7 @@ function buildDependencyArray(type: Dependency["type"], pkgJson: PackageJson, de
128
131
129
132
return packageNames . map ( name => {
130
133
const isPeerOptionalDependency = ! ! peerDependenciesMeta [ name ] ?. optional ;
131
- const isPeerDevDependency = ! ! peerDependenciesMeta [ name ] ?. dev || ! ! peerDevDependencies . includes ( name ) ;
134
+ const isPeerDevDependency = isAncestorDevDependency || ! ! peerDependenciesMeta [ name ] ?. dev || ! ! peerDevDependencies . includes ( name ) ;
132
135
133
136
return {
134
137
name,
@@ -141,14 +144,14 @@ function buildDependencyArray(type: Dependency["type"], pkgJson: PackageJson, de
141
144
} ) ;
142
145
}
143
146
144
- export function getPackageMeta ( packagePath : string , packageJson : PackageJson ) : PackageMeta {
147
+ export function getPackageMeta ( packagePath : string , packageJson : PackageJson , isAncestorDevDependency : boolean ) : PackageMeta {
145
148
const { name, version} = packageJson ;
146
149
const packageMeta = { name, version, packagePath } as PackageMeta ;
147
150
148
- packageMeta . dependencies = buildDependencyArray ( "dependencies" , packageJson , packageMeta ) ;
149
- packageMeta . devDependencies = buildDependencyArray ( "devDependencies" , packageJson , packageMeta ) ;
150
- packageMeta . optionalDependencies = buildDependencyArray ( "optionalDependencies" , packageJson , packageMeta ) ;
151
- packageMeta . peerDependencies = buildDependencyArray ( "peerDependencies" , packageJson , packageMeta ) ;
151
+ packageMeta . dependencies = buildDependencyArray ( "dependencies" , packageJson , packageMeta , isAncestorDevDependency ) ;
152
+ packageMeta . devDependencies = buildDependencyArray ( "devDependencies" , packageJson , packageMeta , isAncestorDevDependency ) ;
153
+ packageMeta . optionalDependencies = buildDependencyArray ( "optionalDependencies" , packageJson , packageMeta , isAncestorDevDependency ) ;
154
+ packageMeta . peerDependencies = buildDependencyArray ( "peerDependencies" , packageJson , packageMeta , isAncestorDevDependency ) ;
152
155
153
156
return packageMeta ;
154
157
}
0 commit comments