├── README.md ├── views ├── footer.ejs ├── index.ejs ├── error.ejs └── header.ejs ├── index.html ├── .npmignore ├── .bowerrc ├── public └── css │ └── style.css ├── bower.json ├── routes ├── user.js └── index.js ├── bin └── www ├── package.json ├── .gitignore ├── app.js └── Gruntfile.js /README.md: -------------------------------------------------------------------------------- 1 | guessify 2 | ======== 3 | -------------------------------------------------------------------------------- /views/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | public/components 3 | .sass-cache -------------------------------------------------------------------------------- /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "public/components", 3 | "json": "bower.json" 4 | } 5 | -------------------------------------------------------------------------------- /views/index.ejs: -------------------------------------------------------------------------------- 1 | <% include header %> 2 | 3 |

<%-title %>

4 |

Welcome to <%-title %>

5 | 6 | <% include footer %> -------------------------------------------------------------------------------- /views/error.ejs: -------------------------------------------------------------------------------- 1 | <% include header %> 2 | 3 | <%- message %> 4 | <%- error.status %> 5 | <%- error.stack %> 6 | 7 | <% include footer %> -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "guessify-hack", 3 | "version": "0.0.1", 4 | "ignore": [ 5 | "**/.*", 6 | "node_modules", 7 | "components" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /routes/user.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET users listing. */ 5 | router.get('/', function(req, res) { 6 | res.send('respond with a resource'); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET home page. */ 5 | router.get('/', function(req, res) { 6 | res.render('index', { title: 'Express' }); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var debug = require('debug')('expressapp'); 3 | var app = require('../app'); 4 | 5 | app.set('port', process.env.PORT || 3000); 6 | 7 | var server = app.listen(app.get('port'), function() { 8 | debug('Express server listening on port ' + server.address().port); 9 | }); 10 | -------------------------------------------------------------------------------- /views/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <%-title %> 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "guessify-hack", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "express": "~4.4.5", 10 | "serve-favicon": "~2.0.1", 11 | "morgan": "~1.1.1", 12 | "cookie-parser": "~1.3.2", 13 | "body-parser": "~1.4.3", 14 | "debug": "~1.0.2", 15 | "ejs": "~1.0.0" 16 | }, 17 | "devDependencies": { 18 | "grunt": "~0.4.5", 19 | "grunt-develop": "~0.4.0", 20 | "grunt-contrib-watch": "~0.6.1", 21 | "request": "~2.36.0", 22 | "time-grunt": "~0.3.2", 23 | "load-grunt-tasks": "~0.6.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # Compiled binary addons (http://nodejs.org/api/addons.html) 20 | build/Release 21 | 22 | # Dependency directory 23 | # Deployed apps should consider commenting this line out: 24 | # see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 25 | node_modules 26 | public/js/app_config.js 27 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var favicon = require('serve-favicon'); 4 | var logger = require('morgan'); 5 | var cookieParser = require('cookie-parser'); 6 | var bodyParser = require('body-parser'); 7 | 8 | var routes = require('./routes/index'); 9 | var users = require('./routes/user'); 10 | 11 | var app = express(); 12 | 13 | // view engine setup 14 | app.set('views', path.join(__dirname, 'views')); 15 | app.set('view engine', 'ejs'); 16 | 17 | // app.use(favicon(__dirname + '/public/img/favicon.ico')); 18 | app.use(logger('dev')); 19 | app.use(bodyParser.json()); 20 | app.use(bodyParser.urlencoded()); 21 | app.use(cookieParser()); 22 | app.use(express.static(path.join(__dirname, 'public'))); 23 | 24 | app.use('/', routes); 25 | app.use('/users', users); 26 | 27 | /// catch 404 and forward to error handler 28 | app.use(function(req, res, next) { 29 | var err = new Error('Not Found'); 30 | err.status = 404; 31 | next(err); 32 | }); 33 | 34 | /// error handlers 35 | 36 | // development error handler 37 | // will print stacktrace 38 | if (app.get('env') === 'development') { 39 | app.use(function(err, req, res, next) { 40 | res.status(err.status || 500); 41 | res.render('error', { 42 | message: err.message, 43 | error: err, 44 | title: 'error' 45 | }); 46 | }); 47 | } 48 | 49 | // production error handler 50 | // no stacktraces leaked to user 51 | app.use(function(err, req, res, next) { 52 | res.status(err.status || 500); 53 | res.render('error', { 54 | message: err.message, 55 | error: {}, 56 | title: 'error' 57 | }); 58 | }); 59 | 60 | 61 | module.exports = app; 62 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var request = require('request'); 4 | 5 | module.exports = function (grunt) { 6 | // show elapsed time at the end 7 | require('time-grunt')(grunt); 8 | // load all grunt tasks 9 | require('load-grunt-tasks')(grunt); 10 | 11 | var reloadPort = 35729, files; 12 | 13 | grunt.initConfig({ 14 | pkg: grunt.file.readJSON('package.json'), 15 | develop: { 16 | server: { 17 | file: 'bin/www' 18 | } 19 | }, 20 | watch: { 21 | options: { 22 | nospawn: true, 23 | livereload: reloadPort 24 | }, 25 | server: { 26 | files: [ 27 | 'bin/www', 28 | 'app.js', 29 | 'routes/*.js' 30 | ], 31 | tasks: ['develop', 'delayed-livereload'] 32 | }, 33 | js: { 34 | files: ['public/js/*.js'], 35 | options: { 36 | livereload: reloadPort 37 | } 38 | }, 39 | css: { 40 | files: ['public/css/*.css'], 41 | options: { 42 | livereload: reloadPort 43 | } 44 | }, 45 | views: { 46 | files: ['views/*.ejs'], 47 | options: { 48 | livereload: reloadPort 49 | } 50 | } 51 | } 52 | }); 53 | 54 | grunt.config.requires('watch.server.files'); 55 | files = grunt.config('watch.server.files'); 56 | files = grunt.file.expand(files); 57 | 58 | grunt.registerTask('delayed-livereload', 'Live reload after the node server has restarted.', function () { 59 | var done = this.async(); 60 | setTimeout(function () { 61 | request.get('http://localhost:' + reloadPort + '/changed?files=' + files.join(','), function (err, res) { 62 | var reloaded = !err && res.statusCode === 200; 63 | if (reloaded) { 64 | grunt.log.ok('Delayed live reload successful.'); 65 | } else { 66 | grunt.log.error('Unable to make a delayed live reload.'); 67 | } 68 | done(reloaded); 69 | }); 70 | }, 500); 71 | }); 72 | 73 | grunt.registerTask('default', ['develop', 'watch']); 74 | }; 75 | --------------------------------------------------------------------------------