@@ -58,49 +58,59 @@ export class FileAnalyzer {
58
58
59
59
imports . forEach ( imp => {
60
60
this . dependencies . addDependency ( fileName , imp ) ;
61
- this . checkDependencies ( imp . resolvedFileName ) ;
61
+ this . checkDependencies ( imp ) ;
62
62
} ) ;
63
63
64
64
return null ;
65
65
}
66
66
67
- findImportDeclarations ( fileName : string ) : ts . ResolvedModule [ ] {
67
+ findImportDeclarations ( fileName : string ) {
68
68
let sourceFile = this . state . getSourceFile ( fileName ) ;
69
69
let isJavaScript = sourceFile . flags & this . state . ts . NodeFlags . JavaScriptFile ;
70
70
let info = this . state . ts . preProcessFile ( sourceFile . text , true , ! ! isJavaScript ) ;
71
+ let options = this . state . compilerConfig . options ;
72
+ let ts = this . state . ts ;
73
+ let deps = this . state . fileAnalyzer . dependencies ;
71
74
72
- return info . importedFiles
73
- . map ( file => file . fileName )
74
- . map ( depName => this . resolve ( fileName , depName ) )
75
- . filter ( Boolean ) ;
76
- }
77
-
78
- resolve ( fileName : string , depName : string ) : ts . ResolvedModule {
75
+ let imports : string [ ] = [ ] ;
79
76
80
- if ( / ^ [ a - z 0 - 9 ] .* \. d \. t s $ / . test ( depName ) ) {
81
- // Make import relative
82
- // We need this to be able to resolve directives like
83
- //
84
- // <reference path="lib.d.ts" />
85
- //
86
- // with resolver.
87
- depName = './' + depName ;
88
- }
89
-
90
- let resolution = this . state . ts . resolveModuleName (
91
- depName ,
92
- fileName ,
93
- this . state . compilerConfig . options ,
94
- this . state . ts . sys
95
- ) ;
77
+ imports . push . apply ( imports , info . importedFiles
78
+ . map ( file => file . fileName )
79
+ . map ( depName => {
80
+ let { resolvedModule } = ts . resolveModuleName ( depName , fileName , options , ts . sys ) ;
81
+ if ( resolvedModule ) {
82
+ deps . addModuleResolution ( fileName , depName , resolvedModule ) ;
83
+ return resolvedModule . resolvedFileName ;
84
+ }
85
+ } )
86
+ . filter ( Boolean ) ) ;
96
87
97
- let { resolvedModule } = resolution ;
88
+ imports . push . apply ( imports , info . referencedFiles
89
+ . map ( file => file . fileName )
90
+ . map ( depName => {
91
+ return / ^ [ a - z 0 - 9 ] .* \. d \. t s $ / . test ( depName ) ? './' + depName : depName ;
92
+ } )
93
+ . map ( depName => {
94
+ let { resolvedModule } = ts . resolveModuleName ( depName , fileName , options , ts . sys ) ;
95
+ if ( resolvedModule ) {
96
+ deps . addModuleResolution ( fileName , depName , resolvedModule ) ;
97
+ return resolvedModule . resolvedFileName ;
98
+ }
99
+ } )
100
+ . filter ( Boolean ) ) ;
98
101
99
- if ( resolvedModule ) {
100
- this . state . fileAnalyzer . dependencies . addResolution ( fileName , depName , resolvedModule ) ;
101
- }
102
+ imports . push . apply ( imports , info . typeReferenceDirectives
103
+ . map ( file => file . fileName )
104
+ . map ( depName => {
105
+ let { resolvedTypeReferenceDirective } = ts . resolveTypeReferenceDirective ( depName , fileName , options , ts . sys ) ;
106
+ if ( resolvedTypeReferenceDirective ) {
107
+ deps . addTypeReferenceResolution ( fileName , depName , resolvedTypeReferenceDirective ) ;
108
+ return resolvedTypeReferenceDirective . resolvedFileName ;
109
+ }
110
+ } )
111
+ . filter ( Boolean ) ) ;
102
112
103
- return resolvedModule ;
113
+ return imports ;
104
114
}
105
115
}
106
116
@@ -110,27 +120,35 @@ export interface IDependencyGraphItem {
110
120
}
111
121
112
122
export class DependencyManager {
113
- dependencies : { [ fileName : string ] : ts . ResolvedModule [ ] } ;
114
- resolutions : { [ cacheKey : string ] : ts . ResolvedModule } ;
115
- knownTypeDeclarations : FileSet ;
123
+ dependencies : { [ fileName : string ] : string [ ] } ;
124
+ moduleResolutions : { [ cacheKey : string ] : ts . ResolvedModule } ;
125
+ typeReferenceResolutions : { [ cacheKey : string ] : ts . ResolvedTypeReferenceDirective } ;
116
126
compiledModules : { [ fileName : string ] : string [ ] } ;
117
127
118
128
constructor ( ) {
119
129
this . dependencies = { } ;
120
- this . knownTypeDeclarations = { } ;
121
130
this . compiledModules = { } ;
122
- this . resolutions = { } ;
131
+ this . moduleResolutions = { } ;
132
+ this . typeReferenceResolutions = { } ;
133
+ }
134
+
135
+ addModuleResolution ( fileName : string , depName : string , resolvedModule : ts . ResolvedModule ) {
136
+ this . moduleResolutions [ `${ fileName } ::${ depName } ` ] = resolvedModule ;
123
137
}
124
138
125
- addResolution ( fileName : string , depName : string , resolvedModule : ts . ResolvedModule ) {
126
- this . resolutions [ `${ fileName } ::${ depName } ` ] = resolvedModule ;
139
+ addTypeReferenceResolution ( fileName : string , depName : string , resolvedModule : ts . ResolvedTypeReferenceDirective ) {
140
+ this . typeReferenceResolutions [ `${ fileName } ::${ depName } ` ] = resolvedModule ;
127
141
}
128
142
129
- getResolution ( fileName : string , depName : string ) : ts . ResolvedModule {
130
- return this . resolutions [ `${ fileName } ::${ depName } ` ] ;
143
+ getModuleResolution ( fileName : string , depName : string ) : ts . ResolvedModule {
144
+ return this . moduleResolutions [ `${ fileName } ::${ depName } ` ] ;
131
145
}
132
146
133
- addDependency ( fileName : string , dep : ts . ResolvedModule ) : void {
147
+ getTypeReferenceResolution ( fileName : string , depName : string ) : ts . ResolvedTypeReferenceDirective {
148
+ return this . typeReferenceResolutions [ `${ fileName } ::${ depName } ` ] ;
149
+ }
150
+
151
+ addDependency ( fileName : string , dep : string ) : void {
134
152
if ( ! this . dependencies . hasOwnProperty ( fileName ) ) {
135
153
this . clearDependencies ( fileName ) ;
136
154
}
@@ -158,26 +176,14 @@ export class DependencyManager {
158
176
this . compiledModules [ fileName ] = [ ] ;
159
177
}
160
178
161
- getDependencies ( fileName : string ) : ts . ResolvedModule [ ] {
179
+ getDependencies ( fileName : string ) : string [ ] {
162
180
if ( ! this . dependencies . hasOwnProperty ( fileName ) ) {
163
181
this . clearDependencies ( fileName ) ;
164
182
}
165
183
166
184
return this . dependencies [ fileName ] . slice ( ) ;
167
185
}
168
186
169
- addTypeDeclaration ( fileName : string ) {
170
- this . knownTypeDeclarations [ fileName ] = true ;
171
- }
172
-
173
- hasTypeDeclaration ( fileName : string ) : boolean {
174
- return this . knownTypeDeclarations . hasOwnProperty ( fileName ) ;
175
- }
176
-
177
- getTypeDeclarations ( ) : { [ fileName : string ] : boolean } {
178
- return objectAssign ( { } , this . knownTypeDeclarations ) ;
179
- }
180
-
181
187
getDependencyGraph ( fileName : string ) : IDependencyGraphItem {
182
188
let appliedDeps : { [ fileName : string ] : boolean } = { } ;
183
189
let result : IDependencyGraphItem = {
@@ -186,10 +192,9 @@ export class DependencyManager {
186
192
} ;
187
193
188
194
let walk = ( fileName : string , context : IDependencyGraphItem ) => {
189
- this . getDependencies ( fileName ) . forEach ( ( dep ) => {
190
- let fileName = dep . resolvedFileName ;
195
+ this . getDependencies ( fileName ) . forEach ( ( depFileName ) => {
191
196
let depContext = {
192
- fileName : dep . resolvedFileName ,
197
+ fileName : depFileName ,
193
198
dependencies : [ ]
194
199
} ;
195
200
context . dependencies . push ( depContext ) ;
0 commit comments