1 |
|
2 |
|
3 |
|
4 |
|
5 | var basename = require('path').basename;
|
6 |
|
7 | function DirectoryDefaultFileResolveSelfPlugin() {}
|
8 | module.exports = DirectoryDefaultFileResolveSelfPlugin;
|
9 |
|
10 | DirectoryDefaultFileResolveSelfPlugin.prototype.apply = function(resolver) {
|
11 | resolver.plugin("directory", function(request, callback) {
|
12 | var fs = this.fileSystem;
|
13 | var topLevelCallback = callback;
|
14 | var directory = this.join(request.path, request.request);
|
15 | fs.stat(directory, function(err, stat) {
|
16 | if(err || !stat) {
|
17 | if(callback.log) callback.log(directory + " doesn't exist (directory default file)");
|
18 | return callback();
|
19 | }
|
20 | if(!stat.isDirectory()) {
|
21 | if(callback.log) callback.log(directory + " is not a directory (directory default file)");
|
22 | return callback();
|
23 | }
|
24 |
|
25 | fs.stat(this.join(directory, 'package.json'), function(err, packageStat) {
|
26 | if (packageStat) return callback();
|
27 |
|
28 | this.forEachBail([basename(directory)], function(file, callback) {
|
29 | this.doResolve("file", {
|
30 | path: directory,
|
31 | query: request.query,
|
32 | request: file
|
33 | }, createInnerCallback(function(err, result) {
|
34 | if(!err && result) return callback(result);
|
35 | return callback();
|
36 | }, topLevelCallback, "directory default file " + file));
|
37 | }.bind(this), function(result) {
|
38 | if(!result) return callback();
|
39 | return callback(null, result);
|
40 | });
|
41 | }.bind(this));
|
42 | }.bind(this));
|
43 | });
|
44 | };
|
45 |
|
46 | function createInnerCallback(callback, options, message) {
|
47 | var log = options.log;
|
48 | if(!log) {
|
49 | if(options.stack !== callback.stack) {
|
50 | function callbackWrapper() {
|
51 | return callback.apply(this, arguments);
|
52 | }
|
53 | callbackWrapper.stack = options.stack;
|
54 | }
|
55 | return callback;
|
56 | }
|
57 | function loggingCallbackWrapper() {
|
58 | log(message);
|
59 | for(var i = 0; i < theLog.length; i++)
|
60 | log(" " + theLog[i]);
|
61 | return callback.apply(this, arguments);
|
62 | }
|
63 | var theLog = [];
|
64 | loggingCallbackWrapper.log = function writeLog(msg) {
|
65 | theLog.push(msg);
|
66 | };
|
67 | loggingCallbackWrapper.stack = options.stack;
|
68 | return loggingCallbackWrapper;
|
69 | }
|