deepsweet/grunt-freeport

View on GitHub
tasks/freeport.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';

var portscanner = require('portscanner');

module.exports = function(grunt) {
    grunt.registerMultiTask('freeport', 'Get a free port number on localhost from specified range', function() {
        var done = this.async();
        var options = this.options();
        var name = 'freeport' + (this.target ? '.' + this.target : '');
        var start = options.start || 1;
        var end = options.end || 65535;

        if (typeof start === 'undefined' || typeof end === 'undefined') {
            grunt.fail.warn('you must provide both start/end options.');
        }

        if (typeof start !== 'number' || typeof end !== 'number') {
            grunt.fail.warn('start/end ports must be numbers.');
        }

        if (start < 1 || start > 65535 || end < 1 || end > 65535) {
            grunt.fail.warn('start/end ports must be >= 1 and <= 65535.');
        }

        if (end < start) {
            grunt.fail.warn('end port must be >= start port.');
        }

        portscanner.findAPortNotInUse(start, end, '127.0.0.1', function(err, port) {
            if (err) {
                grunt.fail.fatal(err);
            }

            grunt.config.set(name, port);
            grunt.log.oklns(name + ' = ' + port);
            done();
        });
    });
};