UNPKG

10.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const _fs = require("fs");
5const util = require("util");
6const pathLib = require("path");
7const utils_1 = require("./utils");
8const ENOENT = 'ENOENT'; // not found
9function copy(src, dist, opts) {
10 return tslib_1.__awaiter(this, void 0, void 0, function* () {
11 opts = Object.assign({ override: true }, opts);
12 const srcStat = yield exports.fs.stat(src);
13 const isSkiped = opts.skip ? yield opts.skip(src, srcStat) : false;
14 if (isSkiped)
15 return;
16 if (srcStat.isDirectory()) {
17 yield exports.fs.mkdirp(dist);
18 let childs = yield exports.fs.readdir(src);
19 yield Promise.all(childs.map(child => copy(pathLib.join(src, child), pathLib.join(dist, child), opts)));
20 }
21 else if (srcStat.isFile() || srcStat.isSymbolicLink()) {
22 if (yield exports.fs.lexists(dist)) {
23 if (opts.override) {
24 yield exports.fs.rmrf(dist);
25 }
26 else {
27 return;
28 }
29 }
30 else {
31 let lastChar = dist[dist.length - 1];
32 if (lastChar === '/' || lastChar === '\\') {
33 yield exports.fs.mkdirp(dist);
34 dist = pathLib.join(dist, pathLib.basename(src));
35 }
36 else {
37 let dir = pathLib.dirname(dist);
38 yield exports.fs.mkdirp(dir);
39 }
40 }
41 yield exports.fs.copyFile(src, dist);
42 }
43 });
44}
45function watchDir(dir, options, cb) {
46 if (utils_1.Is.fn(options)) {
47 cb = options;
48 options = void 0;
49 }
50 options = Object.assign({ persistent: true, throttle: 300 }, options);
51 if (options.throttle) {
52 cb = cb && utils_1.throttle(cb, options.throttle);
53 }
54 if (process.platform === 'linux') {
55 exports.fs.iter(dir, (path) => {
56 exports.fs.watch(path, {
57 recursive: false,
58 persistent: options.persistent,
59 }, cb);
60 });
61 }
62 else {
63 exports.fs.watch(dir, { recursive: true, persistent: options.persistent }, cb);
64 }
65}
66exports.fs = Object.assign({}, _fs, { access: util.promisify(_fs.access), open: util.promisify(_fs.open), rename: util.promisify(_fs.rename), truncate: util.promisify(_fs.truncate), rmdir: util.promisify(_fs.rmdir), mkdir: util.promisify(_fs.mkdir), readdir: util.promisify(_fs.readdir), readlink: util.promisify(_fs.readlink), symlink: util.promisify(_fs.symlink), lstat: util.promisify(_fs.lstat), stat: util.promisify(_fs.stat), link: util.promisify(_fs.link), unlink: util.promisify(_fs.unlink), chmod: util.promisify(_fs.chmod), chown: util.promisify(_fs.chown), utimes: util.promisify(_fs.utimes), realpath: util.promisify(_fs.realpath), mkdtemp: util.promisify(_fs.mkdtemp), writeFile: util.promisify(_fs.writeFile), appendFile: util.promisify(_fs.appendFile), readFile: util.promisify(_fs.readFile), existsSync: _fs.existsSync, createReadString: _fs.createReadStream, createWriteStream: _fs.createWriteStream, constants: _fs.constants, watchDir,
67 copy,
68 exists(path) {
69 return tslib_1.__awaiter(this, void 0, void 0, function* () {
70 try {
71 yield exports.fs.stat(path);
72 }
73 catch (error) {
74 if (error.code === ENOENT) {
75 return false;
76 }
77 else {
78 throw error;
79 }
80 }
81 return true;
82 });
83 },
84 /** exists via lstat, if a symbolic link's target file doesn't exists, `fs.exists` will return false, but `fs.lexists` will return true. */
85 lexists(path) {
86 return tslib_1.__awaiter(this, void 0, void 0, function* () {
87 try {
88 yield exports.fs.lstat(path);
89 }
90 catch (error) {
91 if (error.code === ENOENT) {
92 return false;
93 }
94 else {
95 throw error;
96 }
97 }
98 return true;
99 });
100 },
101 isFile(path) {
102 return tslib_1.__awaiter(this, void 0, void 0, function* () {
103 try {
104 return (yield exports.fs.lstat(path)).isFile();
105 }
106 catch (error) {
107 if (error.code === ENOENT) {
108 return false;
109 }
110 else {
111 throw error;
112 }
113 }
114 });
115 },
116 isDirectory(path) {
117 return tslib_1.__awaiter(this, void 0, void 0, function* () {
118 try {
119 return (yield exports.fs.lstat(path)).isDirectory();
120 }
121 catch (error) {
122 if (error.code === ENOENT) {
123 return false;
124 }
125 else {
126 throw error;
127 }
128 }
129 });
130 },
131 isSymbolicLink(path) {
132 return tslib_1.__awaiter(this, void 0, void 0, function* () {
133 try {
134 return (yield exports.fs.lstat(path)).isSymbolicLink();
135 }
136 catch (error) {
137 if (error.code === ENOENT) {
138 return false;
139 }
140 else {
141 throw error;
142 }
143 }
144 });
145 }, copyFile: _fs.copyFile ? util.promisify(_fs.copyFile) : (src, dist) => tslib_1.__awaiter(this, void 0, void 0, function* () {
146 yield exports.fs.stat(src);
147 return new Promise((res, rej) => {
148 exports.fs
149 .createReadStream(src, { highWaterMark: 2 * 1024 * 1024 })
150 .pipe(exports.fs.createWriteStream(dist))
151 .on('error', rej)
152 .on('close', res);
153 });
154 }),
155 /**
156 * Make directory with parents, like `mkdir -p`
157 * @param dir
158 */
159 mkdirp(dir) {
160 return tslib_1.__awaiter(this, void 0, void 0, function* () {
161 let parent = pathLib.dirname(dir);
162 if (!(yield exports.fs.exists(parent))) {
163 yield exports.fs.mkdirp(parent);
164 }
165 if (!(yield exports.fs.exists(dir))) {
166 return exports.fs.mkdir(dir);
167 }
168 });
169 },
170 /**
171 * Make directory with parents, like `mkdir -p`
172 * @param dir
173 */
174 mkdirpSync(dir) {
175 if (dir === '/')
176 return;
177 let parent = pathLib.dirname(dir);
178 if (!exports.fs.existsSync(parent)) {
179 exports.fs.mkdirpSync(parent);
180 }
181 if (!exports.fs.existsSync(dir)) {
182 exports.fs.mkdirSync(dir);
183 }
184 },
185 /**
186 * Remove file or directory recursively, like `rm -rf`
187 * @param path The path to remove
188 * @param opts Options
189 */
190 rmrf(path) {
191 return tslib_1.__awaiter(this, void 0, void 0, function* () {
192 let stat;
193 try {
194 stat = yield exports.fs.lstat(path);
195 }
196 catch (error) {
197 if (error.code === ENOENT) {
198 return;
199 }
200 throw error;
201 }
202 if (stat.isDirectory()) {
203 const children = yield exports.fs.readdir(path);
204 yield Promise.all(children
205 .map(child => pathLib.join(path, child))
206 .map(exports.fs.rmrf));
207 }
208 else {
209 yield exports.fs.unlink(path);
210 }
211 });
212 },
213 outputFile(path, data, options) {
214 return tslib_1.__awaiter(this, void 0, void 0, function* () {
215 let dir = pathLib.dirname(path);
216 yield exports.fs.mkdirp(dir);
217 return exports.fs.writeFile(path, data, options);
218 });
219 },
220 outputFileSync(path, data, options) {
221 let dir = pathLib.dirname(path);
222 exports.fs.mkdirpSync(dir);
223 return exports.fs.writeFileSync(path, data, options);
224 },
225 outputJson(path, data, options) {
226 return tslib_1.__awaiter(this, void 0, void 0, function* () {
227 const [replacer, space] = utils_1.Is.obj(options)
228 ? [options.replacer, options.space]
229 : [void 0, void 0];
230 return exports.fs.outputFile(path, JSON.stringify(data, replacer, space), options);
231 });
232 },
233 outputJsonSync(path, data, options) {
234 const [replacer, space] = utils_1.Is.obj(options)
235 ? [options.replacer, options.space]
236 : [void 0, void 0];
237 return exports.fs.outputFileSync(path, JSON.stringify(data, replacer, space), options);
238 },
239 readJson(path, options) {
240 return tslib_1.__awaiter(this, void 0, void 0, function* () {
241 let data = yield exports.fs.readFile(path, options);
242 if (!utils_1.Is.str(data)) {
243 data = data.toString('utf8');
244 }
245 return JSON.parse(data);
246 });
247 },
248 readJsonSync(path, options) {
249 let data = exports.fs.readFileSync(path, options);
250 if (!utils_1.Is.str(data)) {
251 data = data.toString('utf8');
252 }
253 return JSON.parse(data);
254 },
255 iter(dir,
256 /** return true will skip */
257 skip) {
258 return tslib_1.__awaiter(this, void 0, void 0, function* () {
259 let children = yield exports.fs.readdir(dir);
260 yield Promise.all(children.map((child) => tslib_1.__awaiter(this, void 0, void 0, function* () {
261 let path = pathLib.join(dir, child);
262 let stat = yield exports.fs.stat(path);
263 let isSkipped = yield skip(path, stat);
264 if (isSkipped)
265 return;
266 if (stat.isDirectory()) {
267 yield exports.fs.iter(path, skip);
268 }
269 })));
270 });
271 } });
272//# sourceMappingURL=fs.js.map
\No newline at end of file