@@ -42,9 +42,9 @@ export function createLazyProductionDeps(projectDir: string) {
42
42
43
43
/** @internal */
44
44
export async function getProductionDependencies ( folder : string ) : Promise < Array < Dependency > > {
45
- const sorted : Array < Dependency > = [ ]
46
- computeSortedPaths ( await new Collector ( ) . collect ( folder ) , sorted , false )
47
- return sorted
45
+ const result : Array < Dependency > = [ ]
46
+ computeSortedPaths ( await new Collector ( ) . collect ( folder ) , result , false )
47
+ return result
48
48
}
49
49
50
50
const ignoredProperties = new Set ( [ "description" , "author" , "bugs" , "engines" , "repository" , "build" , "main" , "license" , "homepage" , "scripts" , "maintainers" , "contributors" , "keywords" , "devDependencies" , "files" , "typings" , "types" , "xo" , "resolutions" ] )
@@ -78,13 +78,13 @@ class Collector {
78
78
this . unmarkExtraneous ( rootDependency )
79
79
80
80
if ( this . unresolved . size > 0 ) {
81
- log . debug ( { unresolved : Array . from ( this . unresolved . keys ( ) ) . join ( ", " ) } , "Unresolved dependencies after first round" )
81
+ log . debug ( { unresolved : Array . from ( this . unresolved . keys ( ) ) . join ( ", " ) } , "unresolved dependencies after first round" )
82
82
await this . resolveUnresolvedHoisted ( rootDependency , dir )
83
83
}
84
84
return rootDependency
85
85
}
86
86
87
- private async resolveUnresolvedHoisted ( rootDependency : Dependency , dir : string ) {
87
+ private async resolveUnresolvedHoisted ( rootDependency : Dependency , dir : string ) : Promise < void > {
88
88
let nameToMetadata = rootDependency . dependencies
89
89
if ( nameToMetadata == null ) {
90
90
rootDependency . dependencies = new Map < string , Dependency > ( )
@@ -112,30 +112,50 @@ class Collector {
112
112
const parentNodeModulesDir = parentDir + path . sep + "node_modules"
113
113
const dirStat = await statOrNull ( parentNodeModulesDir )
114
114
if ( dirStat == null || ! dirStat . isDirectory ( ) ) {
115
- continue
115
+ if ( dirStat == null || ! dirStat . isDirectory ( ) ) {
116
+ continue
117
+ }
116
118
}
117
119
118
- const unresolved = Array . from ( this . unresolved . keys ( ) )
119
- this . unresolved . clear ( )
120
-
121
- const resolved = await BluebirdPromise . map ( unresolved , it => {
122
- return this . readChildPackage ( it , parentNodeModulesDir , rootDependency )
123
- . catch ( e => {
124
- if ( ( e as any ) . code === "ENOENT" ) {
125
- return null
126
- }
127
- else {
128
- throw e
129
- }
130
- } )
131
- } , CONCURRENCY )
132
- for ( const dep of resolved ) {
133
- if ( dep != null ) {
134
- nameToMetadata . set ( dep . realName , dep )
120
+ // https://github.com/electron-userland/electron-builder/issues/2222#issuecomment-339060335
121
+ // step 1: resolve current unresolved
122
+ // step n: try to resolve new unresolved in the same parent dir until at least something is resolved in the dir
123
+ while ( true ) {
124
+ const unresolved = Array . from ( this . unresolved . keys ( ) )
125
+ this . unresolved . clear ( )
126
+
127
+ const resolved = await BluebirdPromise . map ( unresolved , it => {
128
+ return this . readChildPackage ( it , parentNodeModulesDir , rootDependency )
129
+ . catch ( e => {
130
+ if ( ( e as any ) . code === "ENOENT" ) {
131
+ return null
132
+ }
133
+ else {
134
+ throw e
135
+ }
136
+ } )
137
+ } , CONCURRENCY )
138
+
139
+ let hasResolved = false
140
+
141
+ for ( const dep of resolved ) {
142
+ if ( dep != null ) {
143
+ hasResolved = true
144
+ this . unmarkExtraneous ( dep )
145
+ nameToMetadata . set ( dep . realName , dep )
146
+ }
135
147
}
136
- }
137
148
138
- this . unmarkExtraneous ( rootDependency )
149
+ if ( ! hasResolved ) {
150
+ break
151
+ }
152
+
153
+ this . unmarkExtraneous ( rootDependency )
154
+
155
+ if ( this . unresolved . size === 0 ) {
156
+ return
157
+ }
158
+ }
139
159
}
140
160
while ( this . unresolved . size > 0 )
141
161
}
0 commit comments