UNPKG

4.79 kBJavaScriptView Raw
1let fs = require("fs-extra");
2let nodepath = require('path');
3let explore = require('./explore.js');
4var mimeTypes = require('mime-types')
5
6let checkFileType = (url) => {
7 return new Promise((resolve, reject) => {
8 fs.stat(url, (err, stats) => {
9 if (err) { reject(err); return; }
10 let mime = mimeTypes.lookup(url);
11
12 if (stats.isDirectory()) {
13 resolve({ type: 'dir', path: url });
14 } else if (stats.isFile()) {
15 resolve({
16 type: 'file',
17 path: url,
18 size: stats.size,
19 mime
20 });
21 } else {
22 resolve({
23 type: 'other',
24 path: url,
25 size: stats.size,
26 mime
27 })
28 }
29 });
30 });
31};
32
33
34let readDir = (path) => {
35 return new Promise((resolve, reject) => {
36 let out = [];
37 fs.readdir(path, (err, dirs) => {
38 if (err) {
39 reject(err);
40 return;
41 }
42 dirs.forEach((ph, ind) => {
43 out.push(nodepath.join(path, ph));
44 });
45 resolve(out);
46 })
47 });
48};
49
50
51
52
53let fsReadFiles = (url, {
54 filter,
55 callback,
56 fail,
57 exclude,
58 include
59}) => {
60
61 return new Promise((resolve, reject) => {
62
63 let exp = new explore();
64 exp.setCallback(() => {
65 if (typeof callback === "function") {
66 callback();
67 }
68 })
69 .setError((err) => {
70
71 if (typeof fail === "function") {
72 fail(err);
73 }
74 })
75 .parse((val, lastVal) => { //lastVal是解析过的val,resolve数组就继续下一次的运行,否则开始回溯,val为当前的内容,可以为字符串等等。
76 return new Promise(function(resolve, reject) {
77 checkFileType(val)
78 .then((data) => {
79 let { type, path, size, mime } = data;
80 if (url !== path) {
81 if (Array.isArray(exclude)) {
82 for (let val of exclude) {
83
84 if ((typeof val==="string")&&(path.indexOf(val) !== -1)) {
85 resolve();
86 return;
87 }
88 else if((typeof val==="object")&&(val.test(path))){//not t reg,after
89 resolve();
90 return;
91 }
92 }
93
94 }
95
96 if (Array.isArray(include)) {
97 for (let val of include) {
98 if ((typeof val==="string")&&(path.indexOf(val) === -1)) { //empty and reture
99 resolve();
100 return;
101 }
102 else if ((typeof val === "object") && (!val.test(path))) {
103 resolve();
104 return;
105 }
106 }
107 }
108 }
109
110 if (typeof filter === "function") {
111 filter(data);
112 }
113
114
115 if (type === 'dir') {
116 readDir(path)
117 .then((arr) => {
118
119 resolve(arr);
120 })
121 .catch((err) => {
122 console.log(err);
123 resolve();
124 });
125 } else { resolve(); }
126 })
127 .catch((err) => {
128 resolve();
129 });
130
131
132
133 });
134 })
135 .run({
136 input: url
137 });
138 });
139
140};
141
142
143module.exports = fsReadFiles;
144
145// fsReadFiles(nodepath.join(__dirname,'../routes'));
\No newline at end of file