0.1.5 • Public • Published

Cordell Walker - CI Ranger

One bad mother...

A walker, watcher, and CI utility that delivers a smooth roundhouse kick to your current development environment.

build status

What is this?

  • An event based file / directory walker utility
  • An event based file / directory watcher utility
  • A CI environment utility linter / tester / watcher

What about chokidar?

I like chokidar and it was inspiration for this project. However, I wanted a clean way to get a snapshot of the files that already existed and those files that were added later. I wanted a utility that was a bit more verbose when describing what it was doing when it was doing it. I wanted a utility that separated the recursive directory walking chocolate from the file watching peanut butter, but still come together in perfect harmony.

Finally, I wanted a utility that watched my files as I coded and immediately linted and tested them when there are changes... over and over again... while flushing the require cache and dynamically reloading modules in a single process.

I feel Cordell does all that and more.

What does Cordell do different?

  • walking and watching functionality cleanly separated
  • more events that you can shake a stick at
  • more configurable ignore and match options
  • crisp / clean coffeescript source
  • a built-in CI environment that makes use of the watcher / walker combo

How does it work?

Install Cordell

Cordell can be installed via the node.js package manager

    npm install cordell

Then just require the package like normal

Walking files & directories

var cordell = require('cordell');
var walker = cordell.walk('file, dir, or array', {ignore: /^\./, match: /*.\.js$/});
    .on('file', function(path, stat){ 
        console.log('File', path, '[', stat.size, ']', 'was found...'); });
    .on('dir', function(path, stat, list){ 
        console.log('Directory', path, 'has', list.length, 'files...'); });
    .on('error', function(path, error){
        console.log('Error happened at', path, error); });
    .on('end', function(files, stats){ 
        console.log('There were', files.length, 'total files found...');
        // To reset the walker and emit a new `end` event
        // walker.close();
// Add additional paths or wait till all your listeners are in place before walking
walker.walk('file', 'dir', paths...)

Watching files & directories

var watcher ='file, dir, or array', {ignore: /^\./, match: /*.\.js$/});
    .on('add', function(file, stat){
        console.log('File', path, 'has been added'); });
    .on('add:dir', function(file, stat, list){
        console.log('Directory', path, 'was added. With', list.length, 'files.'); });
    .on('rem', function(path){ // also emits 'unlink' for chokidar compatibility
        console.log('File', path, 'has been removed'); });
    .on('rem:dir', function(path){
        console.log('Directoy', path, 'has been removed'); });
    .on('change', function(file, stat){ 
        console.log('File', path, 'has been changed'); });
    .on('change:dir', function(path, stat, list){
        console.log('Directoy', path, 'has changed. Now', list.length, 'files.');); });
    // Plus all the walk events
    .on('file', function(path, stat){ 
        // file events are emitted while walking and when new files are added
        console.log('File', path, '[', stat.size, ']', 'was found...'); });
    .on('dir', function(path, stat, list){ 
        // dir events are emitted while walking and when new directories are added
        console.log('Directory', path, 'has', list.length, 'files...'); });
    .on('error', function(path, error){
        console.log('Error happened at', path, error); });
    .on('end', function(files, stats){ 
        console.log('There were', files.length, 'initial files found...'); });
// You can still add additional paths or wait till all your listeners are in place before watching
watcher.walk('file', 'dir', paths...)
// To stop watching files
// watcher.close();

Ranger CI functionality

options = {
    ignorePath: /fixtures/,
    persistent: true,
    linter: {
        enabled: on,
        coffeelint: {
            pattern: /.*\.coffee$/,
            options: { indentation: { value: 4, level: "error" } }
    tester: {
        enabled: on,
        mocha: {
            pattern: /^.*_test\.coffee$/,
            options: { reporter:'spec' }
ranger = cordell.ranger(['src', 'test'], options);

See the script, we eat our own dog food here...


coming soon... (read the test files for now)




npm i cordell

DownloadsWeekly Downloads






Last publish


  • jerfowler