1
1
import * as fs from 'fs' ;
2
2
import * as path from "path" ;
3
3
import * as resolve from 'resolve' ;
4
+ import { CliOptions } from './cli' ;
4
5
import { readJson } from './readJson' ;
5
6
6
7
interface PackageJson {
@@ -37,20 +38,27 @@ interface PackageDependencies {
37
38
38
39
type DependencyWalkVisitor = ( packagePath : string , packageJson : PackageJson , packageDependencies : PackageDependencies ) => void ;
39
40
40
- export function gatherPeerDependencies ( packagePath ) : Dependency [ ] {
41
+ export function gatherPeerDependencies ( packagePath , options : CliOptions ) : Dependency [ ] {
41
42
let peerDeps = [ ] ;
42
-
43
- walkPackageDependencyTree ( packagePath , ( path , json , deps ) => {
44
- peerDeps = peerDeps . concat ( deps . peerDependencies )
45
- } , [ ] ) ;
43
+ const visitor : DependencyWalkVisitor = ( path , json , deps ) => {
44
+ peerDeps = peerDeps . concat ( deps . peerDependencies ) ;
45
+ } ;
46
+ walkPackageDependencyTree ( packagePath , visitor , [ ] , options ) ;
46
47
47
48
// Eliminate duplicates
49
+ const isSame = ( dep : Dependency , dep2 : Dependency ) => {
50
+ return dep . name === dep2 . name
51
+ && dep . version === dep2 . version
52
+ && dep . depender === dep2 . depender
53
+ && dep . dependerVersion === dep2 . dependerVersion ;
54
+ } ;
55
+
48
56
return peerDeps . reduce ( ( acc : Dependency [ ] , dep : Dependency ) => {
49
- return acc . some ( dep2 => dep . name === dep2 . name && dep . version === dep2 . version ) ? acc : acc . concat ( dep ) ;
57
+ return acc . some ( dep2 => isSame ( dep , dep2 ) ) ? acc : acc . concat ( dep ) ;
50
58
} , [ ] as Dependency [ ] )
51
59
}
52
60
53
- export function walkPackageDependencyTree ( packagePath : string , visitor : DependencyWalkVisitor , visitedPaths : string [ ] ) {
61
+ export function walkPackageDependencyTree ( packagePath : string , visitor : DependencyWalkVisitor , visitedPaths : string [ ] , options : CliOptions ) {
54
62
if ( visitedPaths . includes ( packagePath ) ) {
55
63
return ;
56
64
}
@@ -65,6 +73,10 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
65
73
const packageJson = readJson ( packageJsonPath ) as PackageJson ;
66
74
const packageDependencies = getPackageDependencies ( packagePath , packageJson ) ;
67
75
76
+ if ( options . debug ) {
77
+ console . log ( packageJsonPath ) ;
78
+ packageDependencies . peerDependencies . forEach ( dep => console . log ( dep ) )
79
+ }
68
80
visitor ( packagePath , packageJson , packageDependencies ) ;
69
81
70
82
function walkDependency ( dependency ) {
@@ -76,7 +88,7 @@ export function walkPackageDependencyTree(packagePath: string, visitor: Dependen
76
88
if ( ! dependencyPath ) {
77
89
throw new Error ( `Unable to resolve package ${ dependency . name } from ${ packagePath } ` )
78
90
}
79
- walkPackageDependencyTree ( dependencyPath , visitor , visitedPaths ) ;
91
+ walkPackageDependencyTree ( dependencyPath , visitor , visitedPaths , options ) ;
80
92
}
81
93
82
94
packageDependencies . dependencies . forEach ( walkDependency ) ;
@@ -121,6 +133,7 @@ export function resolvePackageDir(basedir: string, packageName: string) {
121
133
// As long as we have a packagePath, it's fine
122
134
}
123
135
136
+ // noinspection JSUnusedAssignment
124
137
return packagePath ;
125
138
}
126
139
0 commit comments