grunt-hoodie

Start hoodie and delay grunting till it is ready.

Usage no npm install needed!

<script type="module">
  import gruntHoodie from 'https://cdn.skypack.dev/grunt-hoodie';
</script>

README

grunt-hoodie

Build Status NPM version Dependency Status devDependency Status

Start hoodie and delay grunting till it is ready. Triggers a callback with hosts and ports of couchDB, www and pocket.

Getting Started

This plugin requires Grunt ~0.4.1

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-hoodie --save-dev

Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:

grunt.loadNpmTasks('grunt-hoodie');

The "hoodie" task

Overview

In your project's Gruntfile, add a section named hoodie to the data object passed into grunt.initConfig().

grunt.initConfig({
  hoodie: {
    start: {
      options: {
        callback: function (config) {
          // For example, set the port of grunt-connect-proxy:
          // grunt.config.set('connect.proxies.0.port', config.stack.www.port);
        }
      }
    },
    stop: {}
  },
});

// Imagine you have a task `e2e` that runs end to end tests and needs hoodie
// server to be running.
grunt.registerTask('run_e2e', [ 'hoodie:start', 'e2e', 'hoodie:stop' ]);

So you can:

$ grunt run_e2e

Options

options.callback

Type: Function Default value: function(config) {}

A callback that is called when hoodie is up and running. Has one param called config which contains the host and port information.

options.childProcessOptions

Type: Object Default value: {silent: true}

Allows to pass options to the childProcess.fork where hoodie runs.

hoodie: {
  start: {
    options: {
      childProcessOptions: {
        cwd: process.cwd() + '/myapp',
        env: env
      }
    }
  },
  stop: {}
}

Usage Example

In this example, the port of grunt-connect-proxy for the /_api of hoodie is set after hoodie started.

grunt.initConfig({
  hoodie: {
    start: {
      options: {
        callback: function(config) {
          grunt.config.set('connect.proxies.0.port', config.stack.www.port);
        }
      }
    }
  },
  connect: {
    options: {
      port: 9000,
      hostname: 'localhost'
    },
    proxies: [
      {
        context: '/_api',
        host: 'localhost',
        port: false,
        https: false,
        changeOrigin: false
      }
    ],
    …
  },
})

In this other example we start the hoodie server, send an HTTP request to get the combined javascript and put it in a file. This can be useful as part of a build process.

grunt.initConfig({
  hoodie: {
    start: {
      options: {
        callback: function (config) {
          grunt.config.set('hoodiejs.options.port', config.stack.www.port);
        }
      }
    },
    stop: {}
  },
});

grunt.registerTask('hoodiejs', function () {
  // Dependens on successful execution of hoodie:start. Note that
  // grunt.task.requires won't actually RUN the other task(s). It'll just check
  // to see that it has run and not failed.
  grunt.task.requires('hoodie:start');

  var done = this.async();
  var options = this.options();
  var url = 'http://localhost:' + options.port + '/_api/_files/hoodie.js';
  http.get(url, function (res) {
    var fname = path.join(__dirname, 'some/path/hoodie.js');
    res.pipe(fs.createWriteStream(fname)).on('finish', function () {
      done();
    });
  }).on('error', function (err) {
    grunt.log.error(err);
    done(false);
  });
});

So you should now be able to run:

$ grunt hoodie:start hoodiejs

Contributing

Take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.