fs.js (2656B)
1 /** 2 * React Starter Kit (https://www.reactstarterkit.com/) 3 * 4 * Copyright © 2014-present Kriasoft, LLC. All rights reserved. 5 * 6 * This source code is licensed under the MIT license found in the 7 * LICENSE.txt file in the root directory of this source tree. 8 */ 9 10 import fs from 'fs'; 11 import path from 'path'; 12 import glob from 'glob'; 13 import mkdirp from 'mkdirp'; 14 import rimraf from 'rimraf'; 15 16 export const readFile = file => new Promise((resolve, reject) => { 17 fs.readFile(file, 'utf8', (err, data) => (err ? reject(err) : resolve(data))); 18 }); 19 20 export const writeFile = (file, contents) => new Promise((resolve, reject) => { 21 fs.writeFile(file, contents, 'utf8', err => (err ? reject(err) : resolve())); 22 }); 23 24 export const renameFile = (source, target) => new Promise((resolve, reject) => { 25 fs.rename(source, target, err => (err ? reject(err) : resolve())); 26 }); 27 28 export const copyFile = (source, target) => new Promise((resolve, reject) => { 29 let cbCalled = false; 30 function done(err) { 31 if (!cbCalled) { 32 cbCalled = true; 33 if (err) { 34 reject(err); 35 } else { 36 resolve(); 37 } 38 } 39 } 40 41 const rd = fs.createReadStream(source); 42 rd.on('error', err => done(err)); 43 const wr = fs.createWriteStream(target); 44 wr.on('error', err => done(err)); 45 wr.on('close', err => done(err)); 46 rd.pipe(wr); 47 }); 48 49 export const readDir = (pattern, options) => new Promise((resolve, reject) => 50 glob(pattern, options, (err, result) => (err ? reject(err) : resolve(result))), 51 ); 52 53 export const makeDir = name => new Promise((resolve, reject) => { 54 mkdirp(name, err => (err ? reject(err) : resolve())); 55 }); 56 57 export const moveDir = async (source, target) => { 58 const dirs = await readDir('**/*.*', { 59 cwd: source, 60 nosort: true, 61 dot: true, 62 }); 63 await Promise.all(dirs.map(async (dir) => { 64 const from = path.resolve(source, dir); 65 const to = path.resolve(target, dir); 66 await makeDir(path.dirname(to)); 67 await renameFile(from, to); 68 })); 69 }; 70 71 export const copyDir = async (source, target) => { 72 const dirs = await readDir('**/*.*', { 73 cwd: source, 74 nosort: true, 75 dot: true, 76 }); 77 await Promise.all(dirs.map(async (dir) => { 78 const from = path.resolve(source, dir); 79 const to = path.resolve(target, dir); 80 await makeDir(path.dirname(to)); 81 await copyFile(from, to); 82 })); 83 }; 84 85 export const cleanDir = (pattern, options) => new Promise((resolve, reject) => 86 rimraf(pattern, { glob: options }, (err, result) => (err ? reject(err) : resolve(result))), 87 ); 88 89 export default { 90 readFile, 91 writeFile, 92 renameFile, 93 copyFile, 94 readDir, 95 makeDir, 96 copyDir, 97 moveDir, 98 cleanDir, 99 };