UNPKG

7.73 kBJavaScriptView Raw
1// Generated by CoffeeScript 2.3.2
2var S_IFDIR, S_IFLNK, S_IFMT, S_IFREG, chmodSync, copyFile, copyTree, errno, follow, fs, getMode, lstatSync, mkdirSync, os, path, readFileSync, readdirSync, readlinkSync, removeTree, renameSync, resolve, rmdirSync, statSync, symlinkSync, uhoh, unlinkSync, utimesSync, writeFileSync;
3
4({chmodSync, lstatSync, mkdirSync, readdirSync, readlinkSync, readFileSync, renameSync, rmdirSync, statSync, symlinkSync, unlinkSync, utimesSync, writeFileSync} = require('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 statSync(resolve(name));
18};
19
20fs.lstat = function(name) {
21 return lstatSync(resolve(name));
22};
23
24fs.read = function(name, enc) {
25 var mode;
26 name = resolve(name);
27 if (!(mode = getMode(name))) {
28 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
29 }
30 if (mode === S_IFDIR) {
31 uhoh(`Path is not readable: '${name}'`, 'NOT_FILE');
32 }
33 if (enc === void 0) {
34 enc = "utf8";
35 }
36 return readFileSync(name, enc);
37};
38
39fs.readJson = function(name) {
40 return JSON.parse(fs.read(name));
41};
42
43fs.list = function(name) {
44 var mode;
45 name = resolve(name);
46 if (!(mode = getMode(name))) {
47 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
48 }
49 if (mode !== S_IFDIR) {
50 uhoh(`Path is not a directory: '${name}'`, 'NOT_DIR');
51 }
52 return readdirSync(name);
53};
54
55fs.follow = function(name, recursive) {
56 var mode;
57 name = resolve(name);
58 if (!(mode = getMode(name))) {
59 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
60 }
61 if (mode === S_IFLNK) {
62 return follow(name, recursive);
63 } else {
64 return name;
65 }
66};
67
68fs.exists = function(name) {
69 return getMode(resolve(name)) !== null;
70};
71
72fs.isFile = function(name) {
73 return getMode(resolve(name)) === S_IFREG;
74};
75
76fs.isDir = function(name) {
77 return getMode(resolve(name)) === S_IFDIR;
78};
79
80fs.isLink = function(name) {
81 return getMode(resolve(name)) === S_IFLNK;
82};
83
84fs.readPerms = function(name) {
85 return '0' + (fs.stat(name).mode & parseInt('777', 8)).toString(8);
86};
87
88fs.touch = function(name) {
89 var time;
90 name = resolve(name);
91 if (getMode(name) === null) {
92 return writeFileSync(name, '');
93 }
94 time = Date.now() / 1000;
95 return utimesSync(name, time, time);
96};
97
98fs.chmod = function(name, mode) {
99 name = resolve(name);
100 if (!(mode = getMode(name))) {
101 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
102 }
103 if (mode === S_IFDIR) {
104 uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
105 }
106 return chmodSync(name, mode);
107};
108
109fs.link = function(name, target) {
110 name = resolve(name);
111 if (getMode(name) === null) {
112 return symlinkSync(target, name);
113 }
114 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
115};
116
117fs.write = function(name, content) {
118 name = resolve(name);
119 if (getMode(name) !== S_IFDIR) {
120 return writeFileSync(name, content);
121 }
122 return uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
123};
124
125fs.mkdir = function(name) {
126 var mode;
127 name = resolve(name);
128 if (!(mode = getMode(name))) {
129 fs.mkdir(path.dirname(name));
130 return mkdirSync(name);
131 }
132 if (mode === S_IFLNK) {
133 mode = getMode(follow(name, true));
134 }
135 if (mode !== S_IFDIR) {
136 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
137 }
138};
139
140fs.rename = function(src, dest) {
141 var mode;
142 src = resolve(src);
143 if (!(mode = getMode(src))) {
144 uhoh(`Path does not exist: '${src}'`, 'NOT_REAL');
145 }
146 dest = resolve(dest);
147 if (getMode(dest)) {
148 uhoh(`Path already exists: '${dest}'`, 'PATH_EXISTS');
149 }
150 fs.mkdir(path.dirname(dest));
151 return renameSync(src, dest);
152};
153
154fs.remove = function(name, recursive) {
155 var mode;
156 name = resolve(name);
157 if (mode = getMode(name)) {
158 if (mode === S_IFDIR) {
159 if (recursive) {
160 return removeTree(name);
161 } else {
162 return rmdirSync(name);
163 }
164 } else {
165 return unlinkSync(name);
166 }
167 }
168};
169
170fs.copy = function(srcPath, destPath) {
171 var destMode, mode;
172 srcPath = resolve(srcPath);
173 destPath = resolve(destPath);
174 if (!(mode = getMode(srcPath))) {
175 uhoh(`Cannot \`copy\` non-existent path: '${srcPath}'`, 'NOT_REAL');
176 }
177 if (mode === S_IFDIR) {
178 return copyTree(srcPath, destPath);
179 }
180 destMode = getMode(destPath);
181 if (destMode === S_IFDIR) {
182 destPath = path.join(destPath, path.basename(srcPath));
183 destMode = getMode(destPath);
184 }
185 if (destMode) {
186 if (destMode === S_IFDIR) {
187 uhoh(`Cannot overwrite directory path: '${destPath}'`, 'PATH_EXISTS');
188 } else {
189 unlinkSync(destPath);
190 }
191 }
192 // Create missing parent directories.
193 fs.mkdir(path.dirname(destPath));
194 if (mode === S_IFLNK) {
195 return symlinkSync(readlinkSync(srcPath), destPath);
196 } else {
197 return writeFileSync(destPath, readFileSync(srcPath));
198 }
199};
200
201
202// Internal
203
204uhoh = function(msg, why) {
205 var err;
206 err = Error(msg);
207 err.code = errno[why] || 0;
208 Error.captureStackTrace(err, uhoh);
209 throw err;
210};
211
212resolve = function(name) {
213 if (name[0] === '~') {
214 return os.homedir() + name.slice(1);
215 } else {
216 return path.resolve(name);
217 }
218};
219
220getMode = function(name) {
221 var e;
222 try {
223 return lstatSync(name).mode & S_IFMT;
224 } catch (error) {
225 e = error;
226 return null;
227 }
228};
229
230// Recursive symlink resolution
231follow = function(link, recursive) {
232 var mode, name, prev, reads, validate;
233 name = link;
234 reads = 0;
235 if (typeof recursive === 'function') {
236 validate = recursive;
237 recursive = true;
238 }
239 while (++reads) {
240 prev = name;
241 name = readlinkSync(prev);
242 if (!path.isAbsolute(name)) {
243 name = path.resolve(path.dirname(prev), name);
244 }
245 if (validate && !validate(name)) {
246 return prev;
247 }
248 if (!recursive) {
249 return name;
250 }
251 if (!(mode = getMode(name))) {
252 uhoh(`Symlink leads nowhere: '${link}'`, 'NOT_REAL');
253 }
254 if (mode !== S_IFLNK) {
255 return name;
256 }
257 if (reads === 10) {
258 uhoh(`Too many symlinks: '${link}'`, 'LINK_LIMIT');
259 }
260 }
261};
262
263// Overwrite the `destPath` with contents of the `srcPath`.
264copyFile = function(srcPath, destPath) {
265 var destMode, mode;
266 mode = getMode(srcPath);
267 if (mode === S_IFDIR) {
268 return copyTree(srcPath, destPath);
269 }
270 if (destMode = getMode(destPath)) {
271 if (destMode === S_IFDIR) {
272 removeTree(destPath);
273 } else {
274 unlinkSync(destPath);
275 }
276 }
277 // Create missing parent directories.
278 fs.mkdir(path.dirname(destPath));
279 if (mode === S_IFLNK) {
280 return symlinkSync(readlinkSync(srcPath), destPath);
281 } else {
282 return writeFileSync(destPath, readFileSync(srcPath));
283 }
284};
285
286// Recursive tree copies.
287copyTree = function(srcPath, destPath) {
288 var destMode;
289 destMode = getMode(destPath);
290 // Remove the file under our new path, if needed.
291 if (destMode && destMode !== S_IFDIR) {
292 unlinkSync(destPath);
293 }
294 // Create the directory, if needed.
295 if (destMode !== S_IFDIR) {
296 fs.mkdir(destPath);
297 }
298 return readdirSync(srcPath).forEach(function(file) {
299 return copyFile(path.join(srcPath, file), path.join(destPath, file));
300 });
301};
302
303// Recursive tree deletion.
304removeTree = function(name) {
305 var child, i, len, ref;
306 ref = readdirSync(name);
307 for (i = 0, len = ref.length; i < len; i++) {
308 child = ref[i];
309 child = path.join(name, child);
310 if (getMode(child) === S_IFDIR) {
311 removeTree(child);
312 } else {
313 unlinkSync(child);
314 }
315 }
316 return rmdirSync(name);
317};
318
319(function() { // Expose error codes.
320 var def, des, why;
321 def = Object.defineProperty;
322 des = {
323 value: 0
324 };
325 for (why in errno) {
326 des.value = errno[why];
327 def(fs, why, des);
328 }
329})();