Skip to content
This repository was archived by the owner on Aug 4, 2021. It is now read-only.

Commit 05bd0ef

Browse files
authored
Merge pull request #174 from rollup/refactor-promisify-resolveid-for-less-promise-boilerplate
refactor: promisify resolveId for less Promise boilerplate
2 parents 74f2e41 + 90423f6 commit 05bd0ef

File tree

1 file changed

+78
-84
lines changed

1 file changed

+78
-84
lines changed

Diff for: src/index.js

+78-84
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ function cachedIsFile (file, cb) {
3838
isFileCache[file].then(contents => cb(null, contents), cb);
3939
}
4040

41+
const resolveIdAsync = (file, opts) => new Promise((fulfil, reject) => resolveId(file, opts, (err, contents) => err ? reject(err) : fulfil(contents)));
42+
4143
export default function nodeResolve ( options = {} ) {
4244
const useModule = options.module !== false;
4345
const useMain = options.main !== false;
@@ -109,100 +111,92 @@ export default function nodeResolve ( options = {} ) {
109111

110112
if (only && !only.some(pattern => pattern.test(id))) return null;
111113

112-
return new Promise( ( fulfil, reject ) => {
113-
let disregardResult = false;
114-
let packageBrowserField = false;
115-
const extensions = options.extensions || DEFAULT_EXTS;
116-
117-
const resolveOptions = {
118-
basedir: dirname( importer ),
119-
packageFilter ( pkg, pkgPath ) {
120-
const pkgRoot = dirname( pkgPath );
121-
if (options.browser && typeof pkg[ 'browser' ] === 'object') {
122-
packageBrowserField = Object.keys(pkg[ 'browser' ]).reduce((browser, key) => {
123-
const resolved = pkg[ 'browser' ][ key ] === false ? false : resolve( pkgRoot, pkg[ 'browser' ][ key ] );
124-
browser[ key ] = resolved;
125-
if ( key[0] === '.' ) {
126-
const absoluteKey = resolve( pkgRoot, key );
127-
browser[ absoluteKey ] = resolved;
128-
if ( !extname(key) ) {
129-
extensions.reduce( ( browser, ext ) => {
130-
browser[ absoluteKey + ext ] = browser[ key ];
131-
return browser;
132-
}, browser );
133-
}
114+
let disregardResult = false;
115+
let packageBrowserField = false;
116+
const extensions = options.extensions || DEFAULT_EXTS;
117+
118+
const resolveOptions = {
119+
basedir: dirname( importer ),
120+
packageFilter ( pkg, pkgPath ) {
121+
const pkgRoot = dirname( pkgPath );
122+
if (options.browser && typeof pkg[ 'browser' ] === 'object') {
123+
packageBrowserField = Object.keys(pkg[ 'browser' ]).reduce((browser, key) => {
124+
const resolved = pkg[ 'browser' ][ key ] === false ? false : resolve( pkgRoot, pkg[ 'browser' ][ key ] );
125+
browser[ key ] = resolved;
126+
if ( key[0] === '.' ) {
127+
const absoluteKey = resolve( pkgRoot, key );
128+
browser[ absoluteKey ] = resolved;
129+
if ( !extname(key) ) {
130+
extensions.reduce( ( browser, ext ) => {
131+
browser[ absoluteKey + ext ] = browser[ key ];
132+
return browser;
133+
}, browser );
134134
}
135-
return browser;
136-
}, {});
137-
}
135+
}
136+
return browser;
137+
}, {});
138+
}
138139

139-
if (options.browser && typeof pkg[ 'browser' ] === 'string') {
140-
pkg[ 'main' ] = pkg[ 'browser' ];
141-
} else if ( useModule && pkg[ 'module' ] ) {
142-
pkg[ 'main' ] = pkg[ 'module' ];
143-
} else if ( useJsnext && pkg[ 'jsnext:main' ] ) {
144-
pkg[ 'main' ] = pkg[ 'jsnext:main' ];
145-
} else if ( ( useJsnext || useModule ) && !useMain ) {
146-
disregardResult = true;
147-
}
148-
return pkg;
149-
},
150-
readFile: cachedReadFile,
151-
isFile: cachedIsFile,
152-
extensions: extensions
153-
};
154-
155-
if (preserveSymlinks !== undefined) {
156-
resolveOptions.preserveSymlinks = preserveSymlinks;
157-
}
140+
if (options.browser && typeof pkg[ 'browser' ] === 'string') {
141+
pkg[ 'main' ] = pkg[ 'browser' ];
142+
} else if ( useModule && pkg[ 'module' ] ) {
143+
pkg[ 'main' ] = pkg[ 'module' ];
144+
} else if ( useJsnext && pkg[ 'jsnext:main' ] ) {
145+
pkg[ 'main' ] = pkg[ 'jsnext:main' ];
146+
} else if ( ( useJsnext || useModule ) && !useMain ) {
147+
disregardResult = true;
148+
}
149+
return pkg;
150+
},
151+
readFile: cachedReadFile,
152+
isFile: cachedIsFile,
153+
extensions: extensions
154+
};
155+
156+
if (preserveSymlinks !== undefined) {
157+
resolveOptions.preserveSymlinks = preserveSymlinks;
158+
}
158159

159-
resolveId(
160-
importee,
161-
Object.assign( resolveOptions, customResolveOptions ),
162-
( err, resolved ) => {
163-
if (options.browser && packageBrowserField) {
164-
if (packageBrowserField[ resolved ]) {
165-
resolved = packageBrowserField[ resolved ];
166-
}
167-
browserMapCache[resolved] = packageBrowserField;
160+
return resolveIdAsync(
161+
importee,
162+
Object.assign( resolveOptions, customResolveOptions )
163+
)
164+
.catch(() => false)
165+
.then(resolved => {
166+
if (options.browser && packageBrowserField) {
167+
if (packageBrowserField[ resolved ]) {
168+
resolved = packageBrowserField[ resolved ];
168169
}
170+
browserMapCache[resolved] = packageBrowserField;
171+
}
169172

170-
if ( !disregardResult && !err ) {
171-
if ( !preserveSymlinks && resolved && fs.existsSync( resolved ) ) {
172-
resolved = fs.realpathSync( resolved );
173-
}
173+
if ( !disregardResult && resolved !== false ) {
174+
if ( !preserveSymlinks && resolved && fs.existsSync( resolved ) ) {
175+
resolved = fs.realpathSync( resolved );
176+
}
174177

175-
if ( ~builtins.indexOf( resolved ) ) {
176-
fulfil( null );
177-
} else if ( ~builtins.indexOf( importee ) && preferBuiltins ) {
178-
if ( !isPreferBuiltinsSet ) {
179-
onwarn(
180-
`preferring built-in module '${importee}' over local alternative ` +
181-
`at '${resolved}', pass 'preferBuiltins: false' to disable this ` +
182-
`behavior or 'preferBuiltins: true' to disable this warning`
183-
);
184-
}
185-
fulfil( null );
186-
} else if ( jail && resolved.indexOf( normalize( jail.trim( sep ) ) ) !== 0 ) {
187-
fulfil( null );
178+
if ( ~builtins.indexOf( resolved ) ) {
179+
return null;
180+
} else if ( ~builtins.indexOf( importee ) && preferBuiltins ) {
181+
if ( !isPreferBuiltinsSet ) {
182+
onwarn(
183+
`preferring built-in module '${importee}' over local alternative ` +
184+
`at '${resolved}', pass 'preferBuiltins: false' to disable this ` +
185+
`behavior or 'preferBuiltins: true' to disable this warning`
186+
);
188187
}
188+
return null;
189+
} else if ( jail && resolved.indexOf( normalize( jail.trim( sep ) ) ) !== 0 ) {
190+
return null;
189191
}
192+
}
190193

191-
if ( resolved && options.modulesOnly ) {
192-
fs.readFile( resolved, 'utf-8', ( err, code ) => {
193-
if ( err ) {
194-
reject( err );
195-
} else {
196-
const valid = isModule( code );
197-
fulfil( valid ? resolved : null );
198-
}
199-
});
200-
} else {
201-
fulfil( resolved );
202-
}
194+
if ( resolved && options.modulesOnly ) {
195+
return readFileAsync( resolved, 'utf-8').then(code => isModule( code ) ? resolved : null);
196+
} else {
197+
return resolved === false ? null : resolved;
203198
}
204-
);
205-
});
199+
});
206200
}
207201
};
208202
}

0 commit comments

Comments
 (0)