├── test ├── fixtures │ └── msg.txt └── index.js ├── .gitignore ├── Makefile ├── History.md ├── Readme.md ├── examples ├── boot.js └── copy.js ├── package.json └── index.js /test/fixtures/msg.txt: -------------------------------------------------------------------------------- 1 | hello 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test.js 3 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | test: 3 | @./node_modules/.bin/mocha \ 4 | --require should \ 5 | --reporter spec \ 6 | --slow 2s \ 7 | --harmony \ 8 | --bail 9 | 10 | .PHONY: test 11 | -------------------------------------------------------------------------------- /History.md: -------------------------------------------------------------------------------- 1 | 2 | 1.2.0 / 2014-03-17 3 | ================== 4 | 5 | * wrap .createReadStream 6 | 7 | 1.1.1 / 2013-11-11 8 | ================== 9 | 10 | * ignore undefined methods. Closes #3 11 | 12 | 1.1.0 / 2013-10-14 13 | ================== 14 | 15 | * refactor with thunkify 16 | 17 | 1.0.1 / 2013-09-02 18 | ================== 19 | 20 | * fix receiver 21 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # co-fs 3 | 4 | Node core `fs` wrapped functions that return thunks for [co](https://github.com/visionmedia/co). 5 | 6 | ## Installation 7 | 8 | ``` 9 | $ npm install co-fs 10 | ``` 11 | 12 | ## Example 13 | 14 | Use all the regular async fs functions without callback hell: 15 | 16 | ```js 17 | var json = yield fs.readFile('package.json', 'utf8') 18 | var files = yield fs.readdir('/tmp') 19 | ``` 20 | 21 | ## License 22 | 23 | MIT 24 | 25 | -------------------------------------------------------------------------------- /examples/boot.js: -------------------------------------------------------------------------------- 1 | 2 | var co = require('co'); 3 | var fs = require('..'); 4 | 5 | co(function *(){ 6 | yield fs.mkdir('examples/apps'); 7 | 8 | for (var i = 0; i < 3; ++i) { 9 | console.log('creating app %s', i); 10 | yield fs.mkdir('examples/apps/' + i); 11 | yield fs.writeFile('examples/apps/' + i + '/index.js', ''); 12 | yield fs.writeFile('examples/apps/' + i + '/Makefile', ''); 13 | yield fs.writeFile('examples/apps/' + i + '/Readme.md', ''); 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "co-fs", 3 | "version": "1.2.0", 4 | "description": "fs wrappers for 'co'", 5 | "keywords": [ 6 | "async", 7 | "flow", 8 | "generator", 9 | "coro", 10 | "coroutine" 11 | ], 12 | "devDependencies": { 13 | "should": "~1.2.2", 14 | "mocha": "~1.10.0", 15 | "co": "~2.0.0" 16 | }, 17 | "license": "MIT", 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/visionmedia/co-fs.git" 21 | }, 22 | "dependencies": { 23 | "thunkify": "0.0.1", 24 | "co-from-stream": "0.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/copy.js: -------------------------------------------------------------------------------- 1 | 2 | var co = require('co'); 3 | var fs = require('..'); 4 | 5 | copy('.', 'examples/dest', function(err){ 6 | if (err) throw err; 7 | console.log('done'); 8 | }); 9 | 10 | function copy(src, dst, fn) { 11 | co(function *(){ 12 | var files = yield fs.readdir(src); 13 | 14 | yield fs.mkdir(dst); 15 | 16 | for (var i = 0; i < files.length; i++) { 17 | var file = files[i]; 18 | var stat = yield fs.stat(file); 19 | if (!stat.isFile()) continue; 20 | var buf = yield fs.readFile(file); 21 | console.log('copy %s -> %s', src + '/' + file, dst + '/' + file); 22 | yield fs.writeFile(dst + '/' + file, buf); 23 | } 24 | 25 | })(fn); 26 | } 27 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Module dependencies. 4 | */ 5 | 6 | var thunk = require('thunkify'); 7 | var fs = require('fs'); 8 | var stream = require('co-from-stream'); 9 | 10 | /** 11 | * Methods to wrap. 12 | */ 13 | 14 | var methods = [ 15 | 'rename', 16 | 'ftruncate', 17 | 'chown', 18 | 'fchown', 19 | 'lchown', 20 | 'chmod', 21 | 'fchmod', 22 | 'stat', 23 | 'lstat', 24 | 'fstat', 25 | 'link', 26 | 'symlink', 27 | 'readlink', 28 | 'realpath', 29 | 'unlink', 30 | 'rmdir', 31 | 'mkdir', 32 | 'readdir', 33 | 'close', 34 | 'open', 35 | 'utimes', 36 | 'futimes', 37 | 'fsync', 38 | 'write', 39 | 'read', 40 | 'readFile', 41 | 'writeFile', 42 | 'appendFile' 43 | ]; 44 | 45 | // wrap 46 | 47 | methods.forEach(function(name){ 48 | if (!fs[name]) return; 49 | exports[name] = thunk(fs[name]); 50 | }); 51 | 52 | // .exists is still messed 53 | 54 | exports.exists = function(path){ 55 | return function(done){ 56 | fs.stat(path, function(err, res){ 57 | done(null, !err); 58 | }); 59 | } 60 | }; 61 | 62 | // .createReadStream 63 | 64 | exports.createReadStream = function(){ 65 | return stream(fs.createReadStream.apply(null, arguments)); 66 | }; 67 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 2 | var co = require('co'); 3 | var fs = require('..'); 4 | var assert = require('assert'); 5 | 6 | describe('.exists()', function(){ 7 | it('should work', function(done){ 8 | co(function *(){ 9 | var ret = yield fs.exists('test/fixtures/msg.txt'); 10 | assert(true === ret); 11 | 12 | var ret = yield fs.exists('test/fixtures'); 13 | assert(true === ret); 14 | 15 | var ret = yield fs.exists('test/fixtures/hey'); 16 | assert(false === ret); 17 | })(done); 18 | }) 19 | }) 20 | 21 | describe('.createReadStream()', function(){ 22 | it('should work', function(done){ 23 | co(function *(){ 24 | var read = fs.createReadStream('test/fixtures/msg.txt'); 25 | assert('hello\n' == (yield read()).toString()); 26 | })(done); 27 | }) 28 | }) 29 | 30 | describe('others', function(){ 31 | it('should be wrapped', function(done){ 32 | co(function *(){ 33 | var ret = yield fs.stat('test/fixtures/msg.txt'); 34 | assert(ret.size); 35 | 36 | var ret = yield fs.readFile('test/fixtures/msg.txt'); 37 | assert(Buffer.isBuffer(ret)); 38 | 39 | var ret = yield fs.readFile('test/fixtures/msg.txt', 'utf8'); 40 | assert('hello\n' == ret); 41 | })(done); 42 | }) 43 | }) 44 | --------------------------------------------------------------------------------