UNPKG

5.55 kBJavaScriptView Raw
1// Generated by CoffeeScript 2.3.2
2var S_IFDIR, S_IFLNK, S_IFMT, S_IFREG, errno, follow, fs, getMode, lchmodSync, lstatSync, mkdirSync, os, path, readFileSync, readdirSync, readlinkSync, removeTree, renameSync, resolve, rmdirSync, statSync, symlinkSync, uhoh, unlinkSync, utimesSync, writeFileSync;
3
4({lchmodSync, 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.read = function(name, enc) {
21 var mode;
22 name = resolve(name);
23 if (!(mode = 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 readFileSync(name, enc);
33};
34
35fs.readJson = function(name) {
36 return JSON.parse(fs.read(name));
37};
38
39fs.list = function(name) {
40 var mode;
41 name = resolve(name);
42 if (!(mode = getMode(name))) {
43 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
44 }
45 if (mode !== S_IFDIR) {
46 uhoh(`Path is not a directory: '${name}'`, 'NOT_DIR');
47 }
48 return readdirSync(name);
49};
50
51fs.follow = function(name, recursive) {
52 var mode;
53 name = resolve(name);
54 if (!(mode = getMode(name))) {
55 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
56 }
57 if (mode === S_IFLNK) {
58 return follow(name, recursive);
59 } else {
60 return name;
61 }
62};
63
64fs.exists = function(name) {
65 return getMode(resolve(name)) !== null;
66};
67
68fs.isFile = function(name) {
69 return getMode(resolve(name)) === S_IFREG;
70};
71
72fs.isDir = function(name) {
73 return getMode(resolve(name)) === S_IFDIR;
74};
75
76fs.isLink = function(name) {
77 return getMode(resolve(name)) === S_IFLNK;
78};
79
80fs.touch = function(name) {
81 var time;
82 name = resolve(name);
83 if (getMode(name) === null) {
84 return writeFileSync(name, '');
85 }
86 time = Date.now() / 1000;
87 return utimesSync(name, time, time);
88};
89
90fs.chmod = function(name, mode) {
91 name = resolve(name);
92 if (!(mode = getMode(name))) {
93 uhoh(`Path does not exist: '${name}'`, 'NOT_REAL');
94 }
95 if (mode === S_IFDIR) {
96 uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
97 }
98 return lchmodSync(name, mode);
99};
100
101fs.link = function(name, target) {
102 name = resolve(name);
103 if (getMode(name) === null) {
104 return symlinkSync(target, name);
105 }
106 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
107};
108
109fs.write = function(name, content) {
110 name = resolve(name);
111 if (getMode(name) !== S_IFDIR) {
112 return writeFileSync(name, content);
113 }
114 return uhoh(`Path is a directory: '${name}'`, 'NOT_FILE');
115};
116
117fs.mkdir = function(name) {
118 var mode;
119 name = resolve(name);
120 if (!(mode = getMode(name))) {
121 fs.mkdir(path.dirname(name));
122 return mkdirSync(name);
123 }
124 // no-op if the directory already exists
125 if (mode !== S_IFDIR) {
126 return uhoh(`Path already exists: '${name}'`, 'PATH_EXISTS');
127 }
128};
129
130fs.rename = function(src, dest) {
131 var mode;
132 src = resolve(src);
133 if (!(mode = getMode(src))) {
134 uhoh(`Path does not exist: '${src}'`, 'NOT_REAL');
135 }
136 dest = resolve(dest);
137 if (getMode(dest)) {
138 uhoh(`Path already exists: '${dest}'`, 'PATH_EXISTS');
139 }
140 fs.mkdir(path.dirname(dest));
141 return renameSync(src, dest);
142};
143
144fs.remove = function(name, recursive) {
145 var mode;
146 name = resolve(name);
147 if (mode = getMode(name)) {
148 if (mode === S_IFDIR) {
149 if (recursive) {
150 return removeTree(name);
151 } else {
152 return rmdirSync(name);
153 }
154 } else {
155 return unlinkSync(name);
156 }
157 }
158};
159
160
161// Internal
162
163uhoh = function(msg, why) {
164 var err;
165 err = Error(msg);
166 err.code = errno[why] || 0;
167 Error.captureStackTrace(err, uhoh);
168 throw err;
169};
170
171resolve = function(name) {
172 if (name[0] === '~') {
173 return os.homedir() + name.slice(1);
174 } else {
175 return path.resolve(name);
176 }
177};
178
179getMode = function(name) {
180 var e;
181 try {
182 return lstatSync(name).mode & S_IFMT;
183 } catch (error) {
184 e = error;
185 return null;
186 }
187};
188
189// Recursive symlink resolution
190follow = function(link, recursive) {
191 var mode, name, prev, reads, validate;
192 name = link;
193 reads = 0;
194 if (typeof recursive === 'function') {
195 validate = recursive;
196 recursive = true;
197 }
198 while (++reads) {
199 prev = name;
200 name = readlinkSync(prev);
201 if (!path.isAbsolute(name)) {
202 name = path.resolve(path.dirname(prev), name);
203 }
204 if (validate && !validate(name)) {
205 return prev;
206 }
207 if (!recursive) {
208 return name;
209 }
210 if (!(mode = getMode(name))) {
211 uhoh(`Symlink leads nowhere: '${link}'`, 'NOT_REAL');
212 }
213 if (mode !== S_IFLNK) {
214 return name;
215 }
216 if (reads === 10) {
217 uhoh(`Too many symlinks: '${link}'`, 'LINK_LIMIT');
218 }
219 }
220};
221
222// Recursive tree deletion.
223removeTree = function(name) {
224 var child, i, len, ref;
225 ref = readdirSync(name);
226 for (i = 0, len = ref.length; i < len; i++) {
227 child = ref[i];
228 child = path.join(name, child);
229 if (getMode(child) === S_IFDIR) {
230 removeTree(child);
231 } else {
232 unlinkSync(child);
233 }
234 }
235 return rmdirSync(name);
236};
237
238(function() { // Expose error codes.
239 var def, des, why;
240 def = Object.defineProperty;
241 des = {
242 value: 0
243 };
244 for (why in errno) {
245 des.value = errno[why];
246 def(fs, why, des);
247 }
248})();