1 | var _ = require('lodash');
|
2 | var async = require('async');
|
3 | var path = require('path');
|
4 | var realPath = require('real-path');
|
5 | var resolve = require('resolve');
|
6 |
|
7 | function Resolver(options) {
|
8 | this.options = options;
|
9 | }
|
10 |
|
11 | Resolver.prototype.resolve = function(context, request, options, callback) {
|
12 | options = _.assign({basedir: context}, this.options, options || {});
|
13 |
|
14 | var requests = [request];
|
15 |
|
16 | _.each(requests, function(request) {
|
17 | var extension = path.extname(request);
|
18 | var alias = options.extensionAlias[extension];
|
19 |
|
20 | if (extension && alias) {
|
21 | alias = _.isArray(alias) ? alias : [alias];
|
22 |
|
23 | _.each(_.uniq(alias), function(item) {
|
24 | requests.push(request.replace(new RegExp(extension + '$'), item));
|
25 | });
|
26 | }
|
27 | });
|
28 |
|
29 | var complete = _.once(function () {
|
30 | completeTime && clearTimeout(completeTime);
|
31 |
|
32 | if (!result || realPath(result) !== result) {
|
33 | return callback(new Error(request + '未被查找到!'));
|
34 | }
|
35 |
|
36 | callback(null, result);
|
37 | });
|
38 |
|
39 | var completeTime = setTimeout(complete, 30e3);
|
40 |
|
41 | var result;
|
42 | async.detect(
|
43 | requests,
|
44 | function(request, callback) {
|
45 | resolve(request, options, function(err, res) {
|
46 | result = res;
|
47 |
|
48 | callback(!!res);
|
49 | });
|
50 | },
|
51 |
|
52 | complete);
|
53 | };
|
54 |
|
55 | module.exports = Resolver;
|