@@ -46,80 +46,125 @@ import nodeModulesPaths from './node_modules_paths';
4646
4747const REGEX_RELATIVE_IMPORT = / ^ (?: \. \. ? (?: \/ | $ ) | \/ | ( [ A - Z a - z ] : ) ? [ \\ \/ ] ) / ;
4848
49- function resolveSync ( x : Path , options : ResolverOptions ) : Path {
50- const readFileSync = fs . readFileSync ;
51-
52- const extensions = options . extensions || [ '.js' ] ;
49+ function resolveSync ( target : Path , options : ResolverOptions ) : Path {
5350 const basedir = options . basedir ;
51+ const extensions = options . extensions || [ '.js' ] ;
52+ const paths = options . paths || [ ] ;
5453
55- options . paths = options . paths || [ ] ;
56-
57- if ( REGEX_RELATIVE_IMPORT . test ( x ) ) {
54+ if ( REGEX_RELATIVE_IMPORT . test ( target ) ) {
5855 // resolve relative import
59- let target = path . resolve ( basedir , x ) ;
60- if ( x === '..' ) target += '/' ;
61- const m = loadAsFileSync ( target ) || loadAsDirectorySync ( target ) ;
62- if ( m ) return m ;
56+ const resolveTarget = path . resolve ( basedir , target ) ;
57+ const result = tryResolve ( resolveTarget ) ;
58+ if ( result ) {
59+ return result ;
60+ }
6361 } else {
6462 // otherwise search for node_modules
6563 const dirs = nodeModulesPaths ( basedir , {
6664 moduleDirectory : options . moduleDirectory ,
67- paths : options . paths ,
65+ paths,
6866 } ) ;
6967 for ( let i = 0 ; i < dirs . length ; i ++ ) {
70- const dir = dirs [ i ] ;
71- const target = path . join ( dir , '/' , x ) ;
72- const m = loadAsFileSync ( target ) || loadAsDirectorySync ( target ) ;
73- if ( m ) return m ;
68+ const resolveTarget = path . join ( dirs [ i ] , target ) ;
69+ const result = tryResolve ( resolveTarget ) ;
70+ if ( result ) {
71+ return result ;
72+ }
7473 }
7574 }
7675
77- if ( isBuiltinModule ( x ) ) return x ;
76+ if ( isBuiltinModule ( target ) ) {
77+ return target ;
78+ }
7879
7980 const err : ErrorWithCode = new Error (
80- "Cannot find module '" + x + "' from '" + basedir + "'" ,
81+ "Cannot find module '" + target + "' from '" + basedir + "'" ,
8182 ) ;
8283 err . code = 'MODULE_NOT_FOUND' ;
8384 throw err ;
8485
8586 /*
86- * helper functions
87+ * contextual helper functions
8788 */
88- function isFile ( file : Path ) : boolean {
89- try {
90- const stat = fs . statSync ( file ) ;
91- return stat . isFile ( ) || stat . isFIFO ( ) ;
92- } catch ( e ) {
93- if ( e && e . code === 'ENOENT' ) return false ;
94- throw e ;
89+ function tryResolve ( name : Path ) : ?Path {
90+ const dir = path . dirname ( name ) ;
91+ let result ;
92+ if ( isDirectory ( dir ) ) {
93+ result = resolveAsFile ( name ) || resolveAsDirectory ( name ) ;
9594 }
95+ return result ;
9696 }
9797
98- function loadAsFileSync ( x : Path ) : ?Path {
99- if ( isFile ( x ) ) return x ;
98+ function resolveAsFile ( name : Path ) : ?Path {
99+ if ( isFile ( name ) ) {
100+ return name ;
101+ }
100102
101103 for ( let i = 0 ; i < extensions . length ; i ++ ) {
102- const file = x + extensions [ i ] ;
103- if ( isFile ( file ) ) return file ;
104+ const file = name + extensions [ i ] ;
105+ if ( isFile ( file ) ) {
106+ return file ;
107+ }
104108 }
105109
106110 return undefined ;
107111 }
108112
109- function loadAsDirectorySync ( x : Path ) : ?Path {
110- const pkgfile = path . join ( x , '/package.json' ) ;
111- if ( isFile ( pkgfile ) ) {
112- const body = readFileSync ( pkgfile , 'utf8' ) ;
113- try {
114- const pkgmain = JSON . parse ( body ) . main ;
115- if ( pkgmain ) {
116- const target = path . resolve ( x , pkgmain ) ;
117- const m = loadAsFileSync ( target ) || loadAsDirectorySync ( target ) ;
118- if ( m ) return m ;
119- }
120- } catch ( e ) { }
113+ function resolveAsDirectory ( name : Path ) : ?Path {
114+ if ( ! isDirectory ( name ) ) {
115+ return undefined ;
121116 }
122117
123- return loadAsFileSync ( path . join ( x , '/index' ) ) ;
118+ const pkgfile = path . join ( name , 'package.json' ) ;
119+ let pkgmain ;
120+ try {
121+ const body = fs . readFileSync ( pkgfile , 'utf8' ) ;
122+ pkgmain = JSON . parse ( body ) . main ;
123+ } catch ( e ) { }
124+
125+ if ( pkgmain ) {
126+ const resolveTarget = path . resolve ( name , pkgmain ) ;
127+ const result = tryResolve ( resolveTarget ) ;
128+ if ( result ) {
129+ return result ;
130+ }
131+ }
132+
133+ return resolveAsFile ( path . join ( name , 'index' ) ) ;
124134 }
125135}
136+
137+ /*
138+ * helper functions
139+ */
140+ function isFile ( file : Path ) : boolean {
141+ let result ;
142+
143+ try {
144+ const stat = fs . statSync ( file ) ;
145+ result = stat . isFile ( ) || stat . isFIFO ( ) ;
146+ } catch ( e ) {
147+ if ( ! ( e && e . code === 'ENOENT' ) ) {
148+ throw e ;
149+ }
150+ result = false ;
151+ }
152+
153+ return result ;
154+ }
155+
156+ function isDirectory ( dir : Path ) : boolean {
157+ let result ;
158+
159+ try {
160+ const stat = fs . statSync ( dir ) ;
161+ result = stat . isDirectory ( ) ;
162+ } catch ( e ) {
163+ if ( ! ( e && e . code === 'ENOENT' ) ) {
164+ throw e ;
165+ }
166+ result = false ;
167+ }
168+
169+ return result ;
170+ }
0 commit comments