#!/usr/bin/env node
#!/usr/bin/env node
The Pult command line allows you to start any HTTP server on a local .dev
domain.
npm install -g pult
pult ./server
var fs = require('fs');
var spawn = require('child_process').spawn;
var splitargs = require('splitargs');
var pult = require('../lib');
var staticServer = require('../lib/static');
function log() {
if (!options.quiet)
console.error('[pult]', Array.prototype.join.call(arguments, ' '));
}
If .pultrc
exists in the current directory, read it and append its
contents to the command-line arguments list.
if (fs.existsSync('.pultrc')) {
var pultrc = fs.readFileSync('.pultrc', { encoding: 'utf8' });
Array.prototype.push.apply(process.argv, splitargs(pultrc.trim()));
}
The argv
array will be partially consumed by parsing any -
short or --
long options and their values, leaving the command to spawn the server
process.
var argv = process.argv.slice(2);
The options
object will hold the parsed values of the command line
arguments.
var options = {
The default method of passing the port number to the server process is
through the PORT
environment variable.
method: 'PORT'
};
while (argv[0] && argv[0][0] == '-') {
switch (argv[0]) {
--kill
, -k
: Kill the Pult server. case '-k':
case '--kill':
options.kill = argv.shift();
break;
--name
, -n
: Set domain name for the server. Value should not
contain the .dev
suffix. case '-n':
case '--name':
options.name = argv[1];
argv = argv.slice(2);
break;
--port
, -p
, -P
: Pass the port number to the server process by appending
a -p
, -P
or --port
argument. case '-p':
case '-P':
case '--port':
options.method = argv.shift();
break;
--static
, -s
: Start a static file HTTP server in the
current directory instead of a specific server process. case '-s':
case '--static':
options.static = argv.shift();
break;
--quiet
, -q
: Disable logging. case '-q':
case '--quiet':
options.quiet = argv.shift();
break;
--help
, -h
: Show help text. case '-h':
case '--help':
options.help = argv.shift();
break;
Output unknown option error even if quiet was set and exit.
default:
options.quiet = false;
log('unknown option', argv[0]);
process.exit(1);
}
}
if (options.help) {
options.quiet = false;
log('-k, --kill Kill Pult server');
log('-n, --name "name" Set domain name');
log('-p, -P, --port Set port by passing -p, -P or --port to server');
log('-s, --static Start a static file server');
log('-q, --quiet Disable logging');
process.exit();
}
if (options.kill) {
return pult.serverStatus(function(err, up) {
if (err) throw err;
if (up) {
pult.killServer(function(err) {
if (err) throw err;
process.exit();
});
} else {
log('server not running');
process.exit();
}
});
}
Deprecation warning: .pult
files are deprecated. Names should be set in
the more powerful .pultrc
using command-line syntax.
If a name has not been specified on the command line through --name
, try
to read one from .pult
in the current directory. If that does not exist,
use the name of the current directory.
if (!options.name) {
fs.readFile('.pult', { encoding: 'utf8' }, function(err, data) {
if (err && err.code != 'ENOENT') throw err;
if (data) {
options.name = data.trim();
log('deprecation warning: .pult is deprecated in favor of .pultrc');
log(' suggested .pultrc: -n', options.name, argv.join(' '));
} else {
options.name = process.cwd().split('/').reverse()[0];
}
ensurePultServer();
});
} else ensurePultServer();
function ensurePultServer() {
pult.serverStatus(function(err, up) {
if (err) throw err;
if (up)
checkVersion();
else {
log('starting server...');
pult.spawnServer(function(err) {
if (err) throw err;
checkVersion();
});
}
});
}
Check the version of the running Pult server and output a warning if it does not match.
function checkVersion() {
pult.serverVersion(function(err, serverVersion, clientVersion) {
if (err) throw err;
if (serverVersion != clientVersion)
log('warning: server version', serverVersion, '!=',
'client version', clientVersion);
getPorts();
});
}
Get the port number assigned to the domain name if there is a server to run
(in argv
or with --static
). Otherwise, list all Pult domains and ports.
function getPorts() {
if (argv.length || options.static) {
pult.getPort(options.name, function(err, port, domain) {
if (err) throw err;
log('http://' + domain, '-->', 'http://localhost:' + port);
spawnServer(port);
});
} else {
pult.getPorts(function(err, ports) {
if (err) throw err;
for (var domain in ports) {
var port = ports[domain];
Do not display next
as a link.
if (domain == 'next')
log('next:', port);
Do not display pult.dev link.
else if (domain != 'pult.dev')
log('http://' + domain, '-->', 'http://localhost:' + port);
}
process.exit();
});
}
}
Spawn the server process or the static file server, passing the port number
to it using options.method
.
function spawnServer(port) {
if (options.static) {
staticServer.listen(port);
} else {
if (options.method == 'PORT')
process.env.PORT = port;
else
argv.push(options.method, port);
var serverProcess = spawn(argv[0], argv.slice(1), { stdio: 'inherit' });
Exit with the same code as the server process.
serverProcess.on('exit', function(code, signal) {
process.exit(code);
});
}
}