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 | this.forEachBail([basename(directory)], function(file, callback) {
|
25 | this.doResolve("file", {
|
26 | path: directory,
|
27 | query: request.query,
|
28 | request: file
|
29 | }, createInnerCallback(function(err, result) {
|
30 | if(!err && result) return callback(result);
|
31 | return callback();
|
32 | }, topLevelCallback, "directory default file " + file));
|
33 | }.bind(this), function(result) {
|
34 | if(!result) return callback();
|
35 | return callback(null, result);
|
36 | });
|
37 | }.bind(this));
|
38 | });
|
39 | };
|
40 |
|
41 | function createInnerCallback(callback, options, message) {
|
42 | var log = options.log;
|
43 | if(!log) {
|
44 | if(options.stack !== callback.stack) {
|
45 | function callbackWrapper() {
|
46 | return callback.apply(this, arguments);
|
47 | }
|
48 | callbackWrapper.stack = options.stack;
|
49 | }
|
50 | return callback;
|
51 | }
|
52 | function loggingCallbackWrapper() {
|
53 | log(message);
|
54 | for(var i = 0; i < theLog.length; i++)
|
55 | log(" " + theLog[i]);
|
56 | return callback.apply(this, arguments);
|
57 | }
|
58 | var theLog = [];
|
59 | loggingCallbackWrapper.log = function writeLog(msg) {
|
60 | theLog.push(msg);
|
61 | };
|
62 | loggingCallbackWrapper.stack = options.stack;
|
63 | return loggingCallbackWrapper;
|
64 | }
|