donal
2018-03-26 c382abd0c94c0c58aaf68b848e427114e7d68be6
Moving stuff to more modern JS
1 files added
19 files modified
7222 ■■■■■ changed files
Gruntfile.js 44 ●●●●● patch | view | raw | blame | history
client/index.html 13 ●●●●● patch | view | raw | blame | history
package-lock.json 7018 ●●●●● patch | view | raw | blame | history
package.json 5 ●●●●● patch | view | raw | blame | history
server/api/todo/index.js 6 ●●●● patch | view | raw | blame | history
server/api/todo/todo.controller.js 8 ●●●● patch | view | raw | blame | history
server/api/todo/todo.model.js 4 ●●●● patch | view | raw | blame | history
server/api/todo/todo.spec.js 10 ●●●● patch | view | raw | blame | history
server/app.js 10 ●●●● patch | view | raw | blame | history
server/components/errors/index.js 6 ●●●● patch | view | raw | blame | history
server/config/environment/development.js 4 ●●● patch | view | raw | blame | history
server/config/environment/index.js 8 ●●●● patch | view | raw | blame | history
server/config/express.js 22 ●●●● patch | view | raw | blame | history
server/config/seed.js 2 ●●● patch | view | raw | blame | history
server/mocks/mock-routes.js 6 ●●●● patch | view | raw | blame | history
server/mocks/mock-routes.spec.js 10 ●●●● patch | view | raw | blame | history
server/routes.js 4 ●●●● patch | view | raw | blame | history
server/views/404.html 2 ●●● patch | view | raw | blame | history
tasks/blanket.js 4 ●●●● patch | view | raw | blame | history
tasks/perf-test.js 36 ●●●● patch | view | raw | blame | history
Gruntfile.js
@@ -2,7 +2,7 @@
'use strict';
module.exports = function (grunt) {
  var localConfig;
  let localConfig;
  try {
    localConfig = require('./server/config/local.env');
  } catch(e) {
@@ -100,19 +100,9 @@
    // Empties folders to start fresh
    clean: {
      server: '.tmp',
      karmareports: 'reports/client/karma/**',
      mochareports: 'reports/server/mocha/**',
      lint: 'reports/{server,client}/jshint/**',
      coverage: 'reports/{server,client}/coverage/**'
    },
    // Debugging with node inspector
    'node-inspector': {
      custom: {
        options: {
          'web-host': 'localhost'
        }
      }
      lint: 'reports/{server}/jshint/**',
      coverage: 'reports/{server}/coverage/**'
    },
    // Use nodemon to run server in debug mode with an initial breakpoint
@@ -149,7 +139,6 @@
      debug: {
        tasks: [
          'nodemon',
          'node-inspector'
        ],
        options: {
          logConcurrentOutput: true
@@ -231,7 +220,7 @@
  grunt.registerTask('wait', function () {
    grunt.log.ok('Waiting for server reload...');
    var done = this.async();
    const done = this.async();
    setTimeout(function () {
      grunt.log.writeln('Done waiting!');
@@ -244,12 +233,12 @@
  });
  grunt.registerTask('build-image', 'Build the image', function(imageId) {
    var shell = require("shelljs");
    const shell = require("shelljs");
    grunt.log.ok('BUILDING IMAGE');
    if (!imageId) {
      grunt.fail.warn('must supply an imageId to build');
    }
    var rc = shell.exec('docker build -t todolist:' + imageId + ' -f ./dist/Dockerfile ./dist').code;
    const rc = shell.exec('docker build -t todolist:' + imageId + ' -f ./dist/Dockerfile ./dist').code;
    if (rc > 0){
      grunt.fail.warn("DOCKER FAILURE")
    }
@@ -257,7 +246,7 @@
  grunt.registerTask('deploy', 'deploy the node js app to a docker container and start it in the correct mode', function(target_env, build_tag) {
    grunt.log.ok('this task must run on a host that has the Docker Daemon running on it');
    var ports = {
    const ports = {
      ci: '9001',
      si: '9002',
      production: '80'
@@ -266,24 +255,24 @@
    if (target_env === undefined || build_tag === undefined){
      grunt.fail.warn('Required param not set - use grunt deploy\:\<target\>\:\<tag\>');
    } else {
      var shell = require("shelljs");
      const shell = require("shelljs");
      grunt.log.ok('STOPPING AND REMOVING EXISTING CONTAINERS');
      shell.exec('docker stop todolist-'+ target_env + ' && docker rm todolist-'+ target_env);
      grunt.log.ok('DEPLOYING ' + target_env + ' CONTAINER');
      if (target_env === 'ci'){
        var rc = shell.exec('docker run -t -d --name todolist-' + target_env + ' -p ' + ports[target_env]+ ':'+ports[target_env]+' --env NODE_ENV=' + target_env + ' todolist:' + build_tag);
        const rc = shell.exec('docker run -t -d --name todolist-' + target_env + ' -p ' + ports[target_env]+ ':'+ports[target_env]+' --env NODE_ENV=' + target_env + ' todolist:' + build_tag);
        if (rc > 0){
          grunt.fail.warn("DOCKER FAILURE")
        }
      } else {
        // ensure mongo is up
        var isMongo = shell.exec('docker ps | grep devops-mongo').code;
        const isMongo = shell.exec('docker ps | grep devops-mongo').code;
        if (isMongo > 0){
          grunt.log.ok('DEPLOYING Mongodb CONTAINER FIRST');
          shell.exec('docker run --name devops-mongo -p 27017:27017 -d mongo');
        }
        var rc = shell.exec('docker run -t -d --name todolist-' + target_env + ' --link devops-mongo:mongo.server -p '
        const rc = shell.exec('docker run -t -d --name todolist-' + target_env + ' --link devops-mongo:mongo.server -p '
            + ports[target_env]+ ':' + ports[target_env] + ' --env NODE_ENV=' + target_env + ' todolist:' + build_tag).code;
        if (rc > 0){
          grunt.fail.warn("DOCKER FAILURE");
@@ -295,7 +284,7 @@
  grunt.registerTask('serve', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'env:all', 'env:prod', 'express:prod', 'wait', 'open', 'express-keepalive']);
      return grunt.task.run(['build', 'env:all', 'env:prod', 'express:prod', 'wait', 'express-keepalive']);
    }
    if (target === 'debug') {
@@ -313,20 +302,19 @@
      'env:' + (target || 'dev'),
      'express:dev',
      'wait',
      'open',
      'watch'
      'express-keepalive'
    ]);
  });
  grunt.registerTask('test', function(target, environ) {
    environ = environ !== undefined ? environ : 'test';
    var usePhantom = false;
    const usePhantom = false;
    if (environ === 'phantom') {
      environ = 'test';
      usePhantom = true;
    }
    var reporter = 'terminal';
    var coverage = 'travis';
    const reporter = 'terminal';
    const coverage = 'travis';
    if (target === 'server-jenkins') {
      target = 'server';
      reporter = 'junit';
client/index.html
New file
@@ -0,0 +1,13 @@
<!doctype html>
<html lang=en>
<head>
  <meta charset=utf-8>
  <title>todolist-api</title>
</head>
<body>
  <p>I am alive</p>
</body>
</html>
package-lock.json
Diff too large
package.json
@@ -3,6 +3,7 @@
  "version": "1.0.0",
  "main": "server/app.js",
  "dependencies": {
    "bench-rest": "^1.2.4",
    "body-parser": "1.18.2",
    "composable-middleware": "0.3.0",
    "compression": "1.7.2",
@@ -35,7 +36,6 @@
    "grunt-express-server": "0.5.4",
    "grunt-mocha-test": "0.13.3",
    "grunt-newer": "1.3.0",
    "grunt-node-inspector": "1.0.0",
    "grunt-nodemon": "0.4.2",
    "grunt-open": "0.2.3",
    "grunt-rev": "0.1.0",
@@ -63,7 +63,8 @@
  },
  "scripts": {
    "start": "node server/app.js",
    "test": "grunt test"
    "test": "grunt test",
    "dev": "./node_modules/.bin/grunt serve"
  },
  "private": true
}
server/api/todo/index.js
@@ -1,10 +1,10 @@
'use strict';
var express = require('express');
const express = require('express');
var router = express.Router();
const router = express.Router();
var controller = require('./todo.controller');
const controller = require('./todo.controller');
router.get('/', controller.index);
router.get('/:id', controller.show);
server/api/todo/todo.controller.js
@@ -1,11 +1,11 @@
'use strict';
var _ = require('lodash');
var Todo = require('./todo.model');
const _ = require('lodash');
const Todo = require('./todo.model');
// Get list of todos
exports.index = function(req, res) {
  var biscuits;
  let biscuits;
  Todo.find(function (err, todos) {
    if(err) { return handleError(res, err); }
    return res.status(200).json(todos);
@@ -37,7 +37,7 @@
  Todo.findById(req.params.id.toString(), function (err, todo) {
    if (err) { return handleError(res, err); }
    if(!todo) { return res.status(404).send('Not Found'); }
    var updated = _.merge(todo, req.body);
    const updated = _.merge(todo, req.body);
    updated.save(function (err) {
      if (err) { return handleError(res, err); }
      return res.status(200).json(todo);
server/api/todo/todo.model.js
@@ -1,9 +1,9 @@
'use strict';
var mongoose = require('mongoose'),
const mongoose = require('mongoose'),
    Schema = mongoose.Schema;
var TodoSchema = new Schema({
const TodoSchema = new Schema({
  title: String,
  completed: Boolean
});
server/api/todo/todo.spec.js
@@ -1,7 +1,7 @@
'use strict';
var app = require('../../app');
var request = require('supertest');
const app = require('../../app');
const request = require('supertest');
require('should');
describe('GET /api/todos', function() {
@@ -38,7 +38,7 @@
});
describe('GET /api/todos/:id', function() {
  var todoId;
  const todoId;
  beforeEach(function createObjectToUpdate(done) {
    request(app)
      .post('/api/todos')
@@ -86,7 +86,7 @@
});
describe('PUT /api/todos/:id', function() {
  var todoId;
  const todoId;
  beforeEach(function createObjectToUpdate(done){
    request(app)
      .post('/api/todos')
@@ -137,7 +137,7 @@
});
describe('DELETE /api/todos/:id', function() {
  var todoId;
  const todoId;
  beforeEach(function createObjectToUpdate(done){
    request(app)
      .post('/api/todos')
server/app.js
@@ -7,8 +7,8 @@
// Set default node environment to development
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
var express = require('express');
var config = require('./config/environment');
const express = require('express');
const config = require('./config/environment');
@@ -16,15 +16,15 @@
if(config.seedDB) { require('./config/seed'); }
// Setup server
var app = express();
var server = require('http').createServer(app);
const app = express();
const server = require('http').createServer(app);
require('./config/express')(app);
if (config.mocks && config.mocks.api) {
  //add stubs
  require('./mocks/mock-routes')(app);
} else {
  var mongoose = require('mongoose');
  const mongoose = require('mongoose');
  // Connect to database
  mongoose.connect(config.mongo.uri, config.mongo.options);
  mongoose.connection.on('error', function(err) {
server/components/errors/index.js
@@ -5,9 +5,9 @@
'use strict';
module.exports[404] = function pageNotFound(req, res) {
  var viewFilePath = '404';
  var statusCode = 404;
  var result = {
  const viewFilePath = '404';
  const statusCode = 404;
  const result = {
    status: statusCode
  };
server/config/environment/development.js
@@ -8,7 +8,9 @@
    uri: 'mongodb://mongo.server/todolist-dev'
  },
  mocks: {
    api: true
    // enable this for non mock api
    // api: true
    api: false
  },
  seedDB: true
};
server/config/environment/index.js
@@ -1,12 +1,12 @@
'use strict';
var path = require('path');
var _ = require('lodash');
const path = require('path');
const _ = require('lodash');
var config;
let config;
// All configurations will extend these options
// ============================================
var all = {
const all = {
  env: process.env.NODE_ENV,
  // Root path of server
server/config/express.js
@@ -4,19 +4,18 @@
'use strict';
var express = require('express');
var morgan = require('morgan');
var compression = require('compression');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var cookieParser = require('cookie-parser');
var errorHandler = require('errorhandler');
var path = require('path');
var config = require('./environment');
var passport = require('passport');
const express = require('express');
const morgan = require('morgan');
const compression = require('compression');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const cookieParser = require('cookie-parser');
const errorHandler = require('errorhandler');
const path = require('path');
const config = require('./environment');
module.exports = function(app) {
  var env = app.get('env');
  const env = app.get('env');
  app.set('views', config.root + '/server/views');
  app.engine('html', require('ejs').renderFile);
@@ -26,7 +25,6 @@
  app.use(bodyParser.json());
  app.use(methodOverride());
  app.use(cookieParser());
  app.use(passport.initialize());
  if ('production' === env  || 'si' === env  || 'ci' === env) {
    app.use(express.static(path.join(config.root, 'public')));
    app.set('appPath', path.join(config.root, 'public'));
server/config/seed.js
@@ -5,7 +5,7 @@
'use strict';
var Todo = require('../api/todo/todo.model');
const Todo = require('../api/todo/todo.model');
Todo.find({}).remove(function() {
  Todo.create({
server/mocks/mock-routes.js
@@ -4,9 +4,9 @@
'use strict';
var express = require('express');
const express = require('express');
var routerStub = express.Router();
const routerStub = express.Router();
function mockMongoId() {
  function s4() {
@@ -29,7 +29,7 @@
routerStub.get('/todos/:id', function (req, res) {
  setTimeout(function () {
    var id = req.params.id;
    const id = req.params.id;
    return res.status(200).send({
      "title": "Learn some stuff about Jenkins", "_id": id, "completed": true
    });
server/mocks/mock-routes.spec.js
@@ -1,7 +1,7 @@
'use strict';
var app = require('../app');
var request = require('supertest');
const app = require('../app');
const request = require('supertest');
require('should');
describe('GET /api/todos', function() {
@@ -38,7 +38,7 @@
});
describe('GET /api/todos/:id', function() {
  var todoId;
  const todoId;
  beforeEach(function createObjectToUpdate(done) {
    request(app)
      .post('/api/todos')
@@ -86,7 +86,7 @@
});
describe('PUT /api/todos/:id', function() {
  var todoId;
  const todoId;
  beforeEach(function createObjectToUpdate(done){
    request(app)
      .post('/api/todos')
@@ -137,7 +137,7 @@
});
describe('DELETE /api/todos/:id', function() {
  var todoId;
  const todoId;
  beforeEach(function createObjectToUpdate(done){
    request(app)
      .post('/api/todos')
server/routes.js
@@ -4,8 +4,8 @@
'use strict';
var errors = require('./components/errors');
var path = require('path');
const errors = require('./components/errors');
const path = require('path');
module.exports = function(app) {
server/views/404.html
@@ -149,7 +149,7 @@
        <li>an out-of-date link</li>
      </ul>
      <script>
        var GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;
        const GOOG_FIXURL_LANG = (navigator.language || '').slice(0,2),GOOG_FIXURL_SITE = location.host;
      </script>
      <script src="//linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js"></script>
    </div>
tasks/blanket.js
@@ -1,8 +1,8 @@
/**
 * Created by donal on 19/08/2016.
 */
var path = require('path');
var srcDir = path.join(__dirname, '..', 'server');
const path = require('path');
const srcDir = path.join(__dirname, '..', 'server');
// included as in the instructions here
// https://github.com/pghalliday/grunt-mocha-test#generating-coverage-reports
tasks/perf-test.js
@@ -1,7 +1,7 @@
var request = require('request');
var benchrest = require('bench-rest');
var grunt = require("grunt");
var Q = require('q');
const request = require('request');
const benchrest = require('bench-rest');
const grunt = require("grunt");
const Q = require('q');
// INFO ABOUT THE STATS
@@ -10,31 +10,31 @@
// stats.main.histogram.mean - the average time any iteration took (milliseconds)
// stats.main.histogram.p95 - the amount of time that 95% of all iterations completed within (milliseconds)
var options = {
const options = {
  limit: 10,     // concurrent connections
  iterations: 10000  // number of iterations to perform
};
var test = {
const test = {
  domain : 'http://localhost:9000',
  dir : './reports/server/perf/',
  route : '/api/todos/',
  nfr : 60
};
var si = {
const si = {
  domain : 'http://localhost:9002',
  dir : './reports/server/perf/',
  route : '/api/todos/',
  nfr : 60
};
var production = {
const production = {
  domain : 'http://localhost:80',
  dir : './reports/server/perf/',
  route : '/api/todos/',
  nfr : 50
};
var test_endpoint = function (flow, options) {
  var wait = Q.defer();
const test_endpoint = function (flow, options) {
  const wait = Q.defer();
  benchrest(flow, options)
    .on('error', function (err, ctxName) {
@@ -44,9 +44,9 @@
      console.log('\n\n###### ' +flow.filename +' - ' +flow.env.domain + flow.env.route);
      console.log('Error Count', errorCount);
      console.log('Stats', stats);
      var mean_score = stats.main.histogram.mean;
      var fs = require('fs-extra');
      var file = flow.env.dir + flow.filename + '-perf-score.csv';
      const mean_score = stats.main.histogram.mean;
      const fs = require('fs-extra');
      const file = flow.env.dir + flow.filename + '-perf-score.csv';
      fs.outputFileSync(file, 'mean,max,mix,p95\n'+  stats.main.histogram.mean +','
        + stats.main.histogram.max +','+ stats.main.histogram.min +','+ stats.main.histogram.p95);
      if (mean_score > flow.env.nfr){
@@ -65,8 +65,8 @@
    if (target === undefined || api === undefined){
      grunt.fail.fatal('Required param not set - use grunt perf-test\:\<target\>\:\<api\>');
    } else {
      var done = this.async();
      var create = {
      const done = this.async();
      const create = {
        filename: 'create',
        env: {},
        main: [{
@@ -78,7 +78,7 @@
        }]
      };
      var show = {
      const show = {
        filename: 'show',
        env: {},
        main: [{
@@ -105,7 +105,7 @@
      grunt.log.ok("Perf tests running against " + target);
      grunt.log.ok("This may take some time .... ");
      var all_tests = [];
      const all_tests = [];
      // console.log(create)
      // console.log(show)
@@ -117,7 +117,7 @@
            all_tests.push(test_endpoint(create, options));
          }
          else {
            var mongoid = JSON.parse(body)[0]._id;
            const mongoid = JSON.parse(body)[0]._id;
            show.main[0].get = si.domain + si.route + mongoid;
            all_tests.push(test_endpoint(show, options));
          }