summaryrefslogtreecommitdiffstats
path: root/lib/fs/index.js
blob: 8a3ca1e3f8d9eaf1ca6097653e818aa04b171c5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
var _ = require('lodash');
var path = require('path');

var Promise = require('../utils/promise');

/*
A filesystem is an interface to read files
GitBook can works with a virtual filesystem, for example in the browser.
*/

// .readdir return files/folder as a list of string, folder ending with '/'
function pathIsFolder(filename) {
    return _.last(filename) == '/' || _.last(filename) == '\\';
}


function FS() {

}

// Check if a file exists, run a Promise(true) if that's the case, Promise(false) otherwise
FS.prototype.exists = function(filename) {
    // To implement for each fs
};

// Read a file and returns a promise with the content as a buffer
FS.prototype.read = function(filename) {
    // To implement for each fs
};

// Read stat infos about a file
FS.prototype.stat = function(filename) {
    // To implement for each fs
};

// List files/directories in a directory
FS.prototype.readdir = function(folder) {
    // To implement for each fs
};

// These methods don't require to be redefined, by default it uses .exists, .read, .write, .list
// For optmization, it can be redefined:

// List files in a directory
FS.prototype.listFiles = function(folder) {
    return this.readdir(folder)
    .then(function(files) {
        return _.reject(files, pathIsFolder);
    });
};

// List all files in the fs
FS.prototype.listAllFiles = function(folder) {
    var that = this;

    return this.readdir(folder)
    .then(function(files) {
        return _.reduce(files, function(prev, file) {
            return prev.then(function(output) {
                var isDirectory = pathIsFolder(file);

                if (!isDirectory) {
                    output.push(file);
                    return output;
                } else {
                    return that.listAllFiles(path.join(folder, file))
                    .then(function(files) {
                        return output.concat(_.map(files, function(_file) {
                            return path.join(file, _file);
                        }));
                    });
                }
            });
        }, Promise([]));
    });
};

// Read a file as a string (utf-8)
FS.prototype.readAsString = function(filename) {
    return this.read(filename)
    .then(function(buf) {
        return buf.toString('utf-8');
    });
};

// Find a file in a folder (case incensitive)
// Return the real filename
FS.prototype.findFile = function findFile(root, filename) {
    return this.listFiles(root)
    .then(function(files) {
        return _.find(files, function(file) {
            return (file.toLowerCase() == filename.toLowerCase());
        });
    });
};

// Load a JSON file
// By default, fs only supports JSON
FS.prototype.loadAsObject = function(filename) {
    return this.readAsString(filename)
    .then(function(str) {
        return JSON.parse(str);
    });
};

module.exports = FS;