many: Initial 0.1.0 version.

This commit is contained in:
Jonatan Nilsson 2015-02-02 09:52:31 +00:00
parent 1e39e3b246
commit 4761ad6b34
8 changed files with 312 additions and 0 deletions

30
.jshintrc Normal file
View file

@ -0,0 +1,30 @@
{
"eqeqeq": true,
"forin": true,
"immed": true,
"newcap": true,
"noarg": true,
"noempty": true,
"nonew": true,
"undef": true,
"unused": true,
"strict": true,
"trailing": true,
"indent": 2,
"quotmark": "single",
"maxdepth": 4,
"boss": true,
"eqnull": true,
"globalstrict": true,
"smarttabs": true,
"browser": true,
"node": true,
"predef": [
"describe",
"it",
"before",
"beforeEach",
"after",
"afterEach"
]
}

8
LICENSE Normal file
View file

@ -0,0 +1,8 @@
Copyright (c) 2015 Jonatan Nilsson
This program is free software. It comes without any warranty, to
the extent permitted by applicable law. You can redistribute it
and/or modify it under the terms of the Do What The Fuck You Want
To Public License, Version 2, as published by Sam Hocevar. See
http://www.wtfpl.net/ for more details.

39
bin.js Normal file
View file

@ -0,0 +1,39 @@
#!/usr/bin/env node
'use strict';
var config = require('./lib/config');
var server = require('./lib/spserver');
var env = config.get('NODE_ENV');
//Check if we any
var displayHelp = config.get('help');
if (!config.get('file') && !config.get(env + ':file') &&
!config.get('serve') && !config.get(env + ':serve')) {
displayHelp = true;
}
if (displayHelp) {
console.log('Run static server for static files, simple servers or pure MVVM projects.');
console.log('Specifying either file or folder serving is required.');
console.log('');
console.log('Usage:');
console.log(' spserver [options]');
console.log('');
console.log(config.stores.argv.help());
console.log('Examples:');
console.log(' spserver -p 2000 -f base.html -s ./dist');
console.log('');
console.log(' Will run the server on port 2000 serving static files from the ./dist folder');
console.log(' with any unknown file being served the contents of base.html.');
console.log('');
console.log(' spserver -f base.html -t --custom test');
console.log('');
console.log(' Will run the server with the base.html as a template as well as');
console.log(' passing the contents of "test" argument into the template.');
process.exit(0);
}
//Run our server \o/
server();

40
lib/arguments.js Normal file
View file

@ -0,0 +1,40 @@
'use strict';
module.exports = {
config: {
alias: 'c',
describe: 'Location of the config file for the server [default: config.json]'
},
port: {
alias: 'p',
describe: 'The port server should bind to [default: 3001 or 80 in production mode]'
},
file: {
alias: 'f',
describe: 'Single static file the server should serve on all unknown requests'
},
bunyan: {
alias: 'b',
describe: 'Use bunyan instead of console to log to [default: true in production mode]'
},
template: {
alias: 't',
describe: 'Parse the static file as lodash template with all options/settings being passed to it'
},
name: {
alias: 'n',
describe: 'The name for this server for logging [default: spserver]'
},
serve: {
alias: 's',
describe: 'Folder path to serve static files from [default: public]'
},
prod: {
alias: 'P',
describe: 'Force run the server in production mode'
},
debug: {
alias: 'd',
describe: 'Force run the server in development mode'
}
};

58
lib/config.js Normal file
View file

@ -0,0 +1,58 @@
'use strict';
var nconf = require('nconf');
//Load arguments as highest priority
nconf.argv(require('./arguments'));
//Overrides
var overrides = {};
if (nconf.get('prod')) {
overrides.NODE_ENV = 'production';
}
else if (nconf.get('debug')) {
overrides.NODE_ENV = 'development';
}
//Load overrides as second priority
nconf.overrides(overrides);
//Load enviroment variables as third priority
nconf.env();
//Load the config if it exists.
nconf.file(nconf.get('config') || './config.json');
//Default variables
nconf.defaults({
name: nconf.get('name') || 'spserver',
NODE_ENV: 'development',
production: {
port: 80,
bunyan: {
name: nconf.get('name') || 'spserver',
streams: [{
stream: 'process.stdout',
level: 'info'
}
]
},
},
development: {
port: 3001,
bunyan: {
name: nconf.get('name') || 'spserver',
streams: [{
stream: 'process.stdout',
level: 'debug'
}
]
},
}
});
module.exports = nconf;

28
lib/logger.js Normal file
View file

@ -0,0 +1,28 @@
'use strict';
var _ = require('lodash');
var bunyan = require('bunyan');
//Get the config
var config = require('./config');
//Create our variables
var env = config.get('NODE_ENV');
var output;
if (config.get('bunyan') || config.get(env + ':use_bunyan')) {
var settings = _.cloneDeep(config.get(env + ':bunyan'));
for (var i = 0; i < settings.streams.length; i++) {
if (settings.streams[i].stream === 'process.stdout') {
settings.streams[i].stream = process.stdout;
}
}
output = bunyan.createLogger(settings);
} else {
output = console;
console.debug = console.log.bind(console);
}
module.exports = output;

80
lib/spserver.js Normal file
View file

@ -0,0 +1,80 @@
'use strict';
var fs = require('fs');
var http = require('http');
var _ = require('lodash');
var nStatic = require('node-static');
var config = require('./config');
var logger = require('./logger');
var env = config.get('NODE_ENV');
var fileServer = new nStatic.Server(config.get('serve') || config.get(env + ':serve'));
module.exports = function(settings) {
if (!settings) {
settings = config.get();
}
if (!settings[env]) {
settings[env] = {};
}
var base = generateBase(settings.file || settings[env].file, settings);
var server = http.createServer(function (req, res) {
logger.debug('[REQ] GET:', req.url);
var startTime = new Date().getTime();
var done = function() {
var requestTime = new Date().getTime() - startTime;
logger.debug('[RES] GET:', req.url, '(' + res.statusCode + ') took', requestTime, 'ms');
};
res.addListener('finish', done);
res.addListener('close', done);
//return base(req, res);
req.addListener('end', function () {
fileServer.serve(req, res, function(e) {
if (!e) return;
if (e && e.status === 404 && base) {
return base(req, res);
}
logger.error(e);
res.writeHead(404);
res.end();
});
}).resume();
});
server.listen(settings.port || settings[env].port);
logger.info('Static server',
settings.name,
'is listening on port',
settings.port || settings[env].port,
'with public folder',
settings.serve || settings[env].serve);
};
function generateBase(file, settings) {
if (!file) {
return null;
}
if (_.endsWith(file, 'js')) {
return require(file);
}
var contents = fs.readFileSync(file);
if (settings.template || settings[env].template) {
contents = _.template(contents)(settings);
}
return function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(contents);
};
}

29
package.json Normal file
View file

@ -0,0 +1,29 @@
{
"name": "node-spserver",
"version": "0.1.0",
"description": "Node static page server for running quick MVVM file server",
"main": "lib/spserver.js",
"scripts": {
"test": "mocha --reporter spec ./test/*.test.js"
},
"repository": {
"type": "git",
"url": "https://github.com/TheThing/node-spserver.git"
},
"keywords": [
"MVVM",
"server"
],
"author": "Jonatan Nilsson",
"license": "WTFPL",
"bugs": {
"url": "https://github.com/TheThing/node-spserver/issues"
},
"homepage": "https://github.com/TheThing/node-spserver",
"dependencies": {
"bunyan": "^1.3.3",
"lodash": "^3.0.1",
"node-static": "^0.7.6"
},
"bin": "./bin.js"
}