UNPKG

7.52 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, value) {
99 var mode;
100 name = resolve(name);
101 if (!(mode = getMode(name))) {
102 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
103 }
104 if (mode === S_IFDIR) {
105 uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
106 }
107 return chmodSync(name, value);
108};
109
110fs.link = function(name, target) {
111 name = resolve(name);
112 if (getMode(name) === null) {
113 return symlinkSync(target, name);
114 }
115 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
116};
117
118fs.write = function(name, content) {
119 name = resolve(name);
120 if (getMode(name) !== S_IFDIR) {
121 return writeFileSync(name, content);
122 }
123 return uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
124};
125
126fs.mkdir = function(name) {
127 var mode;
128 name = resolve(name);
129 if (!(mode = getMode(name))) {
130 fs.mkdir(path.dirname(name));
131 return mkdirSync(name);
132 }
133 if (mode === S_IFLNK) {
134 mode = getMode(follow(name, true));
135 }
136 if (mode !== S_IFDIR) {
137 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
138 }
139};
140
141fs.rename = function(src, dest) {
142 src = resolve(src);
143 if (!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 return copyFile(srcPath, destPath);
193};
194
195
196// Internal
197
198uhoh = function(msg, why) {
199 var err;
200 err = Error(msg);
201 err.code = errno[why] || 0;
202 Error.captureStackTrace(err, uhoh);
203 throw err;
204};
205
206resolve = function(name) {
207 if (name[0] === '~') {
208 return os.homedir() + name.slice(1);
209 } else {
210 return path.resolve(name);
211 }
212};
213
214getMode = function(name) {
215 var e;
216 try {
217 return lstatSync(name).mode & S_IFMT;
218 } catch (error) {
219 e = error;
220 return null;
221 }
222};
223
224// Recursive symlink resolution
225follow = function(link, recursive) {
226 var mode, name, prev, reads, validate;
227 name = link;
228 reads = 0;
229 if (typeof recursive === 'function') {
230 validate = recursive;
231 recursive = true;
232 }
233 while (++reads) {
234 prev = name;
235 name = readlinkSync(prev);
236 if (!path.isAbsolute(name)) {
237 name = path.resolve(path.dirname(prev), name);
238 }
239 if (validate && !validate(name)) {
240 return prev;
241 }
242 if (!recursive) {
243 return name;
244 }
245 if (!(mode = getMode(name))) {
246 uhoh(`Symlink leads nowhere: '${link}'`, 'NOT_REAL');
247 }
248 if (mode !== S_IFLNK) {
249 return name;
250 }
251 if (reads === 10) {
252 uhoh(`Too many symlinks: '${link}'`, 'LINK_LIMIT');
253 }
254 }
255};
256
257copyFile = function(srcPath, destPath) {
258 fs.mkdir(path.dirname(destPath));
259 if (getMode(srcPath) === S_IFLNK) {
260 return symlinkSync(readlinkSync(srcPath), destPath);
261 }
262 writeFileSync(destPath, readFileSync(srcPath));
263 return chmodSync(destPath, fs.readPerms(srcPath));
264};
265
266// Recursive tree copies.
267copyTree = function(srcDir, destDir) {
268 var destMode;
269 destMode = getMode(destDir);
270 // Remove the file under our new path, if needed.
271 if (destMode && destMode !== S_IFDIR) {
272 unlinkSync(destDir);
273 }
274 // Create the directory, if needed.
275 if (destMode !== S_IFDIR) {
276 fs.mkdir(destDir);
277 }
278 return readdirSync(srcDir).forEach(function(file) {
279 var destPath, srcPath;
280 srcPath = path.join(srcDir, file);
281 destPath = path.join(destDir, file);
282 if (getMode(srcPath) === S_IFDIR) {
283 return copyTree(srcPath, destPath);
284 }
285 if (destMode = getMode(destPath)) {
286 if (destMode === S_IFDIR) {
287 removeTree(destPath);
288 } else {
289 unlinkSync(destPath);
290 }
291 }
292 return copyFile(srcPath, destPath);
293 });
294};
295
296// Recursive tree deletion.
297removeTree = function(name) {
298 var child, i, len, ref;
299 ref = readdirSync(name);
300 for (i = 0, len = ref.length; i < len; i++) {
301 child = ref[i];
302 child = path.join(name, child);
303 if (getMode(child) === S_IFDIR) {
304 removeTree(child);
305 } else {
306 unlinkSync(child);
307 }
308 }
309 return rmdirSync(name);
310};
311
312(function() { // Expose error codes.
313 var def, des, why;
314 def = Object.defineProperty;
315 des = {
316 value: 0
317 };
318 for (why in errno) {
319 des.value = errno[why];
320 def(fs, why, des);
321 }
322})();