Gruntfile.js

/**
 * Configure Grunt scripts
 * @module
 */

require('dotenvs')();
var loadGruntTasks = require('load-grunt-tasks');

module.exports = function(grunt) {
  'use strict';

  grunt.initConfig({
    clean: {
      jsdoc: 'docs'
    },
    eslint: {
      options: {
        configFile: '.eslintrc.js',
        fix: true
      },
      dev: [
        '**/*.js',
        '!docs/**/*.js',
        '!node_modules/**/*.js'
      ]
    },
    jsdoc: {
      build: {
        options: {
          configure : '.jsdoc.json'
        }
      }
    },
    mochaTest: {
      tests: {
        src: ['tests/**/*.js']
      }
    },
    nodemon: {
      dev: {
        script: 'app/server.js'
      }
    },
    rsync: {
      deploy: {
        options: {
          host: process.env.SYNC_SERVER_DEPLOY_HOST_USERNAME + '@' + process.env.SYNC_SERVER_DEPLOY_HOST,
          recursive: true
        }
      }
    },
    symlink: {
      modules: {
        files: [{
          expand: true,
          cwd: './',
          src: ['app', 'fixtures', 'data'],
          dest: 'node_modules'
        }]
      }
    },
    sshexec: {
      options: {
        agent: process.env.SSH_AUTH_SOCK,
        host: process.env.SYNC_SERVER_DEPLOY_HOST,
        username: process.env.SYNC_SERVER_DEPLOY_HOST_USERNAME,
        port: 22
      },
      npmInstall: {
        command: 'cd ' + process.env.SYNC_SERVER_DEPLOY_HOST_DIR + ' && npm install'
      },
      foreverRestart: {
        command: 'cd ' + process.env.SYNC_SERVER_DEPLOY_HOST_DIR + ' && forever restart server.js || forever start server.js'
      },
      systemdRestart: {
        command: 'sudo systemctl restart syncserver || sudo systemctl start syncserver'
      },
      repopulateCollections: {
        command: 'cd ' + process.env.SYNC_SERVER_DEPLOY_HOST_DIR + ' && grunt repopulate-collections'
      }
    },
    watch: {
      jsdoc: {
        files: [
          '.env*',
          '.jsdoc.json',
          '**/*.js',
          'README.md',
          '!**/node_modules/**',
          '!**/docs/**'
        ],
        tasks: ['jsdoc']
      }
    }
  });

  loadGruntTasks(grunt);
  grunt.task.loadTasks('app/lib/tasks');

  grunt.registerTask('jsdoc-rebuild', 'Delete and regenerate docs', [
    'clean:jsdoc',
    'jsdoc:build'
  ]);

  grunt.registerTask('jsdoc-dev', 'Regenerate docs upon changes', [
    'jsdoc-rebuild',
    'watch:jsdoc'
  ]);

  grunt.registerTask('dev', 'Run app locally and reload upon changes', [
    'jsdoc-rebuild',
    'nodemon:dev'
  ]);

  grunt.registerTask('deploy-all', 'Run tests and deploy all files', [
    'test',
    'deploy-dependencies',
    'deploy-app',
    'deploy-data'
  ]);

  grunt.registerTask('deploy-certs', 'Deploy certificates to host directory', [
    `deploy:${process.env.SYNC_SERVER_DEPLOY_HOST_DIR}:${process.env.SYNC_SERVER_DEPLOY_CERTS_DIR}:.certs`
  ]);

  grunt.registerTask('deploy-env', 'Deploy environment configuration to host directory', [
    `deploy:${process.env.SYNC_SERVER_DEPLOY_HOST_DIR}:.env-deploy:.env`
  ]);

  grunt.registerTask('deploy-data', 'Deploy data to host directory', [
    'deploy:${process.env.SYNC_SERVER_DEPLOY_HOST_DIR}:data-deploy:data'
  ]);

  grunt.registerTask('deploy-dependencies', 'Deploy environment config files and certificate files', [
    'deploy-certs',
    'deploy-env'
  ]);

  grunt.registerTask('deploy-app', 'Deploy app to host directory', [
    'deploy:${process.env.SYNC_SERVER_DEPLOY_HOST_DIR}:Gruntfile.js',
    'deploy:${process.env.SYNC_SERVER_DEPLOY_HOST_DIR}:package.json',
    'deploy:${process.env.SYNC_SERVER_DEPLOY_HOST_DIR}:app:app:--delete',
    'force:sshexec:npmInstall'
  ]);

  grunt.registerTask('restart-forever', 'Start/restart app remotely with forever', [
    'sshexec:foreverRestart'
  ]);

  grunt.registerTask('restart-systemd', 'Start/restart app remotely with systemd', [
    'sshexec:systemdRestart'
  ]);

  grunt.registerTask('remote-repopulate-collections', 'Remove database collections and repopulate them with resourceObjects stored in files', [
    'sshexec:repopulateCollections'
  ]);

  grunt.registerTask('test', 'Test code', [
    'eslint',
    'mochaTest:tests'
  ]);
};