UNPKG

5 kBJavaScriptView Raw
1// Generated by CoffeeScript 2.3.2
2var ReadStream, S_IFDIR, S_IFLNK, S_IFMT, S_IFREG, WriteStream, defer, errno, follow, fs, getMode, lstat, mkdir, os, path, readFile, readdir, readlink, resolve, stat, stream, uhoh, writeFile;
3
4({lstat, mkdir, readdir, readlink, readFile, ReadStream, stat, writeFile, WriteStream} = require('graceful-fs'));
5
6({S_IFMT, S_IFREG, S_IFDIR, S_IFLNK} = require('fs').constants);
7
8errno = require('./errno');
9
10path = require('path');
11
12os = require('os');
13
14fs = exports;
15
16fs.stat = function(name) {
17 return defer(stat, resolve(name));
18};
19
20fs.read = async function(name, enc) {
21 var mode;
22 name = resolve(name);
23 if (!(mode = (await getMode(name)))) {
24 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
25 }
26 if (mode === S_IFDIR) {
27 uhoh(`Path is not readable: '${name}'`, 'NOT_FILE');
28 }
29 if (enc === void 0) {
30 enc = "utf8";
31 }
32 return defer(readFile, name, enc);
33};
34
35fs.list = async function(name) {
36 var mode;
37 name = resolve(name);
38 if (!(mode = (await getMode(name)))) {
39 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
40 }
41 if (mode !== S_IFDIR) {
42 uhoh(`Path is not a directory: '${name}'`, 'NOT_DIR');
43 }
44 return defer(readdir, name);
45};
46
47fs.follow = async function(name, recursive) {
48 var mode;
49 name = resolve(name);
50 if (!(mode = (await getMode(name)))) {
51 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
52 }
53 if (mode === S_IFLNK) {
54 return follow(name, recursive);
55 } else {
56 return Promise.resolve(name);
57 }
58};
59
60fs.exists = async function(name) {
61 return ((await getMode(resolve(name)))) !== null;
62};
63
64fs.isFile = async function(name) {
65 return ((await getMode(resolve(name)))) === S_IFREG;
66};
67
68fs.isDir = async function(name) {
69 return ((await getMode(resolve(name)))) === S_IFDIR;
70};
71
72fs.write = async function(name, content) {
73 name = resolve(name);
74 if (((await getMode(name))) !== S_IFDIR) {
75 return defer(writeFile, name, content);
76 }
77 return uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
78};
79
80fs.mkdir = async function(name) {
81 var mode;
82 name = resolve(name);
83 if (!(mode = (await getMode(name)))) {
84 await fs.mkdir(path.dirname(name));
85 return defer(mkdir, name);
86 }
87 // no-op if the directory already exists
88 if (mode !== S_IFDIR) {
89 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
90 }
91};
92
93fs.reader = function(name, opts) {
94 return stream(ReadStream, name, opts);
95};
96
97fs.writer = function(name, opts) {
98 return stream(WriteStream, name, opts);
99};
100
101
102// Internal
103
104uhoh = function(msg, why) {
105 var err;
106 err = Error(msg);
107 err.code = errno[why] || 0;
108 Error.captureStackTrace(err, uhoh);
109 throw err;
110};
111
112resolve = function(name) {
113 if (name[0] === '~') {
114 return os.homedir() + name.slice(1);
115 } else {
116 return path.resolve(name);
117 }
118};
119
120getMode = async function(name) {
121 var e;
122 try {
123 return ((await defer(lstat, name))).mode & S_IFMT;
124 } catch (error) {
125 e = error;
126 return null;
127 }
128};
129
130defer = function(callee, $1, $2) {
131 var n;
132 n = arguments.length - 1;
133 return new Promise(function(resolve, reject) {
134 var done;
135 done = function(err, data) {
136 if (err) {
137 return reject(err);
138 } else {
139 return resolve(data);
140 }
141 };
142 switch (n) {
143 case 0:
144 return callee(done);
145 case 1:
146 return callee($1, done);
147 case 2:
148 return callee($1, $2, done);
149 }
150 });
151};
152
153// Recursive symlink resolution
154follow = function(link, recursive) {
155 return new Promise(function(resolve, reject) {
156 var next, prev, reads, validate;
157 prev = link;
158 reads = 1;
159 if (typeof recursive === 'function') {
160 validate = recursive;
161 recursive = true;
162 }
163 return readlink(link, next = async function(err, name) {
164 var mode;
165 if (err) {
166 return reject(err);
167 }
168 if (!path.isAbsolute(name)) {
169 name = path.resolve(path.dirname(prev), name);
170 }
171 if (validate && !((await validate(name)))) {
172 return resolve(prev);
173 } else if (!recursive) {
174 return resolve(name);
175 } else if (!(mode = (await getMode(name)))) {
176 err = Error(`Symlink leads nowhere: '${link}'`);
177 err.code = errno.NOT_REAL;
178 return reject(err);
179 } else if (mode !== S_IFLNK) {
180 return resolve(name);
181 } else if (reads !== 10) {
182 prev = name;
183 reads++;
184 return readlink(name, next);
185 } else {
186 err = Error(`Too many symlinks: '${link}'`);
187 err.code = errno.LINK_LIMIT;
188 return reject(err);
189 }
190 });
191 });
192};
193
194stream = function(ctr, name, opts) {
195 if (typeof name === 'number') {
196 opts && (opts.fd = name);
197 return new ctr(null, opts || {
198 fd: name
199 });
200 } else {
201 return new ctr(resolve(name), opts);
202 }
203};
204
205(function() { // Expose error codes.
206 var def, des, why;
207 def = Object.defineProperty;
208 des = {
209 value: 0
210 };
211 for (why in errno) {
212 des.value = errno[why];
213 def(fs, why, des);
214 }
215})();